import React, { useState, useEffect, useCallback } from 'react'; 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-universal/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:CustomBotWithProxySettings'); const CustomBotWithProxySettings = (props) => { const { slackAppIntegrations, proxyServerUri, onClickAddSlackWorkspaceBtn, onPrimaryUpdated, connectionStatuses, onUpdateTokens, onSubmitForm, } = props; const [newProxyServerUri, setNewProxyServerUri] = useState(); const [integrationIdToDelete, setIntegrationIdToDelete] = useState(null); const [siteName, setSiteName] = useState(''); const { t } = useTranslation(); const { data: appTitle } = useAppTitle(); // componentDidUpdate useEffect(() => { setNewProxyServerUri(proxyServerUri); }, [proxyServerUri]); 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() => { try { await apiv3Delete(`/slack-integration-settings/slack-app-integrations/${integrationIdToDelete}`); if (props.onDeleteSlackAppIntegration != null) { props.onDeleteSlackAppIntegration(); } toastSuccess(t('admin:slack_integration.toastr.delete_slack_integration_procedure')); } catch (err) { toastError(err); logger.error('Failed to delete', err); } }; const updateProxyUri = async() => { try { await apiv3Put('/slack-integration-settings/proxy-uri', { proxyUri: newProxyServerUri, }); toastSuccess(t('toaster.update_successed', { target: 'Proxy URL', ns: 'commons' })); } catch (err) { toastError(err); logger.error('Failed to update', err); } }; useEffect(() => { setSiteName(appTitle); }, [appTitle]); return ( <>

{t('admin:slack_integration.custom_bot_with_proxy_integration')} external_link

{slackAppIntegrations.length !== 0 && ( <>
{ setNewProxyServerUri(e.target.value) }} />

{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)} />
); })} {slackAppIntegrations.length < 10 && (
)}
setIntegrationIdToDelete(null)} onClickDeleteButton={deleteSlackAppIntegrationHandler} /> ); }; CustomBotWithProxySettings.defaultProps = { slackAppIntegrations: [], }; CustomBotWithProxySettings.propTypes = { slackAppIntegrations: PropTypes.array, proxyServerUri: PropTypes.string, onClickAddSlackWorkspaceBtn: PropTypes.func, onPrimaryUpdated: PropTypes.func, onDeleteSlackAppIntegration: PropTypes.func, onSubmitForm: PropTypes.func, connectionStatuses: PropTypes.object.isRequired, onUpdateTokens: PropTypes.func, }; export default CustomBotWithProxySettings;