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 = ( ); break; case SlackbotType.CUSTOM_WITHOUT_PROXY: settingsComponent = ( ); break; case SlackbotType.CUSTOM_WITH_PROXY: settingsComponent = ( ); break; } if (isLoading) { return (
); } return ( <> setIsDeleteConfirmModalShown(false)} onClickDeleteButton={resetAllSettings} />

{t('admin:slack_integration.selecting_bot_types.slack_bot')} {t('admin:slack_integration.selecting_bot_types.detailed_explanation')}

{ errorCode && (
ERROR: {errorMsg} ({errorCode})
) }
{botTypes.map((botType) => { return (
); })}
{settingsComponent} ); }; const SlackIntegrationWrapper = withUnstatedContainers(SlackIntegration, [AppContainer]); SlackIntegration.propTypes = { appContainer: PropTypes.instanceOf(AppContainer).isRequired, }; export default SlackIntegrationWrapper;