import React, { useCallback, useEffect, useMemo, useState, } from 'react'; import PropTypes from 'prop-types'; import { TabContent, TabPane, } from 'reactstrap'; import { useTranslation } from 'next-i18next'; import { SlackbotType } from '@growi/slack'; import loggerFactory from '~/utils/logger'; import { withUnstatedContainers } from '../../UnstatedUtils'; import { toastError } from '~/client/util/apiNotification'; import { toArrayIfNot } from '~/utils/array-utils'; import { withLoadingSppiner } from '../../SuspenseUtils'; import AdminNotificationContainer from '~/client/services/AdminNotificationContainer'; import { CustomNavTab } from '../../CustomNavigation/CustomNav'; import UserTriggerNotification from './UserTriggerNotification'; import GlobalNotification from './GlobalNotification'; const logger = loggerFactory('growi:NotificationSetting'); let retrieveErrors = null; // eslint-disable-next-line react/prop-types const Badge = ({ isEnabled }) => { const { t } = useTranslation(); return isEnabled ? {t('admin:external_notification.enabled')} : {t('admin:external_notification.disabled')}; }; const SkeltonListItem = () => (
  • ―― ...

  • ); // eslint-disable-next-line react/prop-types const SlackIntegrationListItem = ({ isEnabled, currentBotType }) => { const { t } = useTranslation(); const isCautionVisible = currentBotType === SlackbotType.OFFICIAL || currentBotType === SlackbotType.CUSTOM_WITH_PROXY; return (
  • {t('slack_integration')}

    { isCautionVisible && ( ) }
  • ); }; // eslint-disable-next-line react/prop-types const LegacySlackIntegrationListItem = ({ isEnabled }) => { const { t } = useTranslation(); return (
  • {t('legacy_slack_integration')}

    { isEnabled && ( ) }
  • ); }; function NotificationSetting(props) { const { adminNotificationContainer } = props; const { t } = useTranslation(); const [isMounted, setMounted] = useState(false); const [activeTab, setActiveTab] = useState('user_trigger_notification'); const [activeComponents, setActiveComponents] = useState(new Set(['user_trigger_notification'])); const switchActiveTab = (selectedTab) => { setActiveTab(selectedTab); setActiveComponents(activeComponents.add(selectedTab)); }; const fetchData = useCallback(async() => { try { await adminNotificationContainer.retrieveNotificationData(); } catch (err) { const errs = toArrayIfNot(err); toastError(errs); logger.error(errs); retrieveErrors = errs; } finally { setMounted(true); } }, [adminNotificationContainer]); useEffect(() => { fetchData(); }, [fetchData]); const navTabMapping = useMemo(() => { return { user_trigger_notification: { Icon: () => , i18n: 'User trigger notification', index: 0, }, global_notification: { Icon: () => , i18n: 'Global notification', index: 1, }, }; }, []); const { isSlackbotConfigured, isSlackLegacyConfigured, currentBotType } = adminNotificationContainer.state; const isSlackEnabled = isSlackbotConfigured; const isSlackLegacyEnabled = !isSlackbotConfigured && isSlackLegacyConfigured; return (

    {t('admin:external_notification.header_status')}

      { !isMounted && } { isMounted && ( <> {/* Legacy Slack Integration become visible only when new Slack Integration is disabled */} { !isSlackEnabled && } ) }

    {t('Notification Settings')}

    {activeComponents.has('user_trigger_notification') && } {activeComponents.has('global_notification') && }
    ); } const NotificationSettingWithUnstatedContainer = withUnstatedContainers(withLoadingSppiner(NotificationSetting), [AdminNotificationContainer]); NotificationSetting.propTypes = { adminNotificationContainer: PropTypes.instanceOf(AdminNotificationContainer).isRequired, }; export default NotificationSettingWithUnstatedContainer;