import React, { useState, useEffect, useCallback } from 'react';
import PropTypes from 'prop-types';
import { useTranslation } from 'react-i18next';
import { SlackbotType } from '@growi/slack';
import AppContainer from '~/client/services/AppContainer';
import { withUnstatedContainers } from '../../UnstatedUtils';
import { toastSuccess, toastError } from '~/client/util/apiNotification';
import OfficialBotSettings from './OfficialBotSettings';
import CustomBotWithoutProxySettings from './CustomBotWithoutProxySettings';
import CustomBotWithProxySettings from './CustomBotWithProxySettings';
import ConfirmBotChangeModal from './ConfirmBotChangeModal';
import BotTypeCard from './BotTypeCard';
import DeleteSlackBotSettingsModal from './DeleteSlackBotSettingsModal';
const botTypes = Object.values(SlackbotType);
const SlackIntegration = (props) => {
const { appContainer } = props;
const { t } = useTranslation();
const [currentBotType, setCurrentBotType] = useState(null);
const [selectedBotType, setSelectedBotType] = useState(null);
const [slackSigningSecret, setSlackSigningSecret] = useState(null);
const [slackBotToken, setSlackBotToken] = useState(null);
const [slackSigningSecretEnv, setSlackSigningSecretEnv] = useState('');
const [slackBotTokenEnv, setSlackBotTokenEnv] = useState('');
const [commandPermission, setCommandPermission] = useState(null);
const [isDeleteConfirmModalShown, setIsDeleteConfirmModalShown] = useState(false);
const [slackAppIntegrations, setSlackAppIntegrations] = useState();
const [proxyServerUri, setProxyServerUri] = useState();
const [connectionStatuses, setConnectionStatuses] = useState({});
const [errorMsg, setErrorMsg] = useState(null);
const [errorCode, setErrorCode] = useState(null);
const [isLoading, setIsLoading] = useState(true);
const fetchSlackIntegrationData = useCallback(async() => {
try {
const { data } = await appContainer.apiv3.get('/slack-integration-settings');
const {
slackSigningSecret, slackBotToken, slackSigningSecretEnvVars, slackBotTokenEnvVars, slackAppIntegrations, proxyServerUri, commandPermission,
} = data.settings;
setErrorMsg(data.errorMsg);
setErrorCode(data.errorCode);
setConnectionStatuses(data.connectionStatuses);
setCurrentBotType(data.currentBotType);
setSlackSigningSecret(slackSigningSecret);
setSlackBotToken(slackBotToken);
setSlackSigningSecretEnv(slackSigningSecretEnvVars);
setSlackBotTokenEnv(slackBotTokenEnvVars);
setSlackAppIntegrations(slackAppIntegrations);
setProxyServerUri(proxyServerUri);
setCommandPermission(commandPermission);
console.log(commandPermission);
}
catch (err) {
toastError(err);
}
finally {
setIsLoading(false);
}
}, [appContainer.apiv3]);
const resetAllSettings = async() => {
try {
await appContainer.apiv3.delete('/slack-integration-settings/bot-type');
fetchSlackIntegrationData();
toastSuccess(t('admin:slack_integration.bot_all_reset_successful'));
}
catch (error) {
toastError(error);
}
};
const createSlackIntegrationData = async() => {
try {
await appContainer.apiv3.post('/slack-integration-settings/slack-app-integrations');
fetchSlackIntegrationData();
toastSuccess(t('admin:slack_integration.adding_slack_ws_integration_settings_successful'));
}
catch (error) {
toastError(error);
}
};
const changeSecretAndToken = (secret, token) => {
setSlackSigningSecret(secret);
setSlackBotToken(token);
};
useEffect(() => {
fetchSlackIntegrationData();
}, [fetchSlackIntegrationData]);
const changeCurrentBotSettings = async(botType) => {
try {
await appContainer.apiv3.put('/slack-integration-settings/bot-type', {
currentBotType: botType,
});
setSelectedBotType(null);
fetchSlackIntegrationData();
}
catch (err) {
toastError(err);
}
};
const botTypeSelectHandler = async(botType) => {
if (botType === currentBotType) {
return;
}
if (currentBotType == null) {
return changeCurrentBotSettings(botType);
}
setSelectedBotType(botType);
};
const changeCurrentBotSettingsHandler = async() => {
changeCurrentBotSettings(selectedBotType);
toastSuccess(t('admin:slack_integration.bot_reset_successful'));
};
const cancelBotChangeHandler = () => {
setSelectedBotType(null);
};
let settingsComponent = null;
switch (currentBotType) {
case SlackbotType.OFFICIAL:
settingsComponent = (