import React, { useState, useEffect, useCallback } from 'react'; import { SlackbotType } from '@growi/slack'; import { useTranslation } from 'next-i18next'; import PropTypes from 'prop-types'; import { apiv3Delete, apiv3Put } from '~/client/util/apiv3-client'; import { toastSuccess, toastError } from '~/client/util/toastr'; import { useAppTitle } from '~/stores/context'; import loggerFactory from '~/utils/logger'; import CustomBotWithProxyConnectionStatus from './CustomBotWithProxyConnectionStatus'; import { DeleteSlackBotSettingsModal } from './DeleteSlackBotSettingsModal'; import { SlackAppIntegrationControl } from './SlackAppIntegrationControl'; import WithProxyAccordions from './WithProxyAccordions'; const logger = loggerFactory('growi:cli:SlackIntegration:OfficialBotSettings'); const OfficialBotSettings = (props) => { const { slackAppIntegrations, onClickAddSlackWorkspaceBtn, onPrimaryUpdated, connectionStatuses, onUpdateTokens, onSubmitForm, } = props; const [siteName, setSiteName] = useState(''); const [integrationIdToDelete, setIntegrationIdToDelete] = useState(null); const { t } = useTranslation(); const { data: appTitle } = useAppTitle(); const addSlackAppIntegrationHandler = async() => { if (onClickAddSlackWorkspaceBtn != null) { onClickAddSlackWorkspaceBtn(); } }; const isPrimaryChangedHandler = useCallback(async(slackIntegrationToChange, newValue) => { // do nothing when turning off if (!newValue) { return; } try { await apiv3Put(`/slack-integration-settings/slack-app-integrations/${slackIntegrationToChange._id}/make-primary`); if (onPrimaryUpdated != null) { onPrimaryUpdated(); } toastSuccess(t('toaster.update_successed', { target: 'Primary', ns: 'commons' })); } catch (err) { toastError(err); logger.error('Failed to change isPrimary', err); } }, [t, onPrimaryUpdated]); const deleteSlackAppIntegrationHandler = async() => { await apiv3Delete(`/slack-integration-settings/slack-app-integrations/${integrationIdToDelete}`); try { if (props.onDeleteSlackAppIntegration != null) { props.onDeleteSlackAppIntegration(); } toastSuccess(t('admin:slack_integration.toastr.delete_slack_integration_procedure')); } catch (err) { toastError('Failed to delete'); logger.error('Failed to delete', err); } }; useEffect(() => { setSiteName(appTitle); }, [appTitle]); return ( <>

{t('admin:slack_integration.official_bot_integration')} window.open(`${t('admin:slack_integration.docs_url.official_bot')}`, '_blank')} > external_link

{slackAppIntegrations.length !== 0 && ( <>

{t('admin:slack_integration.integration_procedure')}

)}
{slackAppIntegrations.map((slackAppIntegration, i) => { const { tokenGtoP, tokenPtoG, _id, permissionsForBroadcastUseCommands, permissionsForSingleUseCommands, permissionsForSlackEventActions, } = slackAppIntegration; const workspaceName = connectionStatuses[_id]?.workspaceName; return (

{(workspaceName != null) ? `${workspaceName} Work Space` : `Settings #${i}`}

setIntegrationIdToDelete(saiToDelete._id)} />
); })}
setIntegrationIdToDelete(null)} onClickDeleteButton={deleteSlackAppIntegrationHandler} /> ); }; OfficialBotSettings.defaultProps = { slackAppIntegrations: [], }; OfficialBotSettings.propTypes = { slackAppIntegrations: PropTypes.array, onClickAddSlackWorkspaceBtn: PropTypes.func, onPrimaryUpdated: PropTypes.func, onDeleteSlackAppIntegration: PropTypes.func, connectionStatuses: PropTypes.object.isRequired, onUpdateTokens: PropTypes.func, onSubmitForm: PropTypes.func, }; export default OfficialBotSettings;