import React, { useState, useEffect, useCallback } from 'react'; import { useTranslation } from 'react-i18next'; import PropTypes from 'prop-types'; import loggerFactory from '~/utils/logger'; import AppContainer from '~/client/services/AppContainer'; import { withUnstatedContainers } from '../../UnstatedUtils'; import { toastSuccess, toastError } from '~/client/util/apiNotification'; import CustomBotWithProxyConnectionStatus from './CustomBotWithProxyConnectionStatus'; import WithProxyAccordions from './WithProxyAccordions'; import DeleteSlackBotSettingsModal from './DeleteSlackBotSettingsModal'; import { SlackAppIntegrationControl } from './SlackAppIntegrationControl'; const logger = loggerFactory('growi:cli:SlackIntegration:CustomBotWithProxySettings'); const CustomBotWithProxySettings = (props) => { const { appContainer, slackAppIntegrations, proxyServerUri, onClickAddSlackWorkspaceBtn, onPrimaryUpdated, connectionStatuses, onUpdateTokens, onSubmitForm, } = props; const [newProxyServerUri, setNewProxyServerUri] = useState(); const [integrationIdToDelete, setIntegrationIdToDelete] = useState(null); const [siteName, setSiteName] = useState(''); const { t } = useTranslation(); // 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 appContainer.apiv3.put(`/slack-integration-settings/slack-app-integrations/${slackIntegrationToChange._id}/make-primary`); if (onPrimaryUpdated != null) { onPrimaryUpdated(); } toastSuccess(t('toaster.update_successed', { target: 'Primary' })); } catch (err) { toastError(err, 'Failed to change isPrimary'); logger.error('Failed to change isPrimary', err); } }, [appContainer.apiv3, t, onPrimaryUpdated]); const deleteSlackAppIntegrationHandler = async() => { try { await appContainer.apiv3.delete(`/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, 'Failed to delete'); logger.error('Failed to delete', err); } }; const updateProxyUri = async() => { try { await appContainer.apiv3.put('/slack-integration-settings/proxy-uri', { proxyUri: newProxyServerUri, }); toastSuccess(t('toaster.update_successed', { target: 'Proxy URL' })); } catch (err) { toastError(err, 'Failed to update'); logger.error('Failed to update', err); } }; useEffect(() => { const siteName = appContainer.config.crowi.title; setSiteName(siteName); }, [appContainer]); return ( <>