NotificationSetting.jsx 3.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. import React, { useMemo, useState } from 'react';
  2. import PropTypes from 'prop-types';
  3. import loggerFactory from '@alias/logger';
  4. import { TabContent, TabPane } from 'reactstrap';
  5. import { withUnstatedContainers } from '../../UnstatedUtils';
  6. import { toastError } from '../../../util/apiNotification';
  7. import toArrayIfNot from '../../../../../lib/util/toArrayIfNot';
  8. import { withLoadingSppiner } from '../../SuspenseUtils';
  9. import AdminNotificationContainer from '../../../services/AdminNotificationContainer';
  10. import { CustomNav } from '../../CustomNavigation';
  11. import SlackAppConfiguration from './SlackAppConfiguration';
  12. import UserTriggerNotification from './UserTriggerNotification';
  13. import GlobalNotification from './GlobalNotification';
  14. const logger = loggerFactory('growi:NotificationSetting');
  15. let retrieveErrors = null;
  16. function NotificationSetting(props) {
  17. const { adminNotificationContainer } = props;
  18. const [activeTab, setActiveTab] = useState('slack_configuration');
  19. const [activeComponents, setActiveComponents] = useState(new Set(['slack_configuration']));
  20. const switchActiveTab = (selectedTab) => {
  21. setActiveTab(selectedTab);
  22. setActiveComponents(activeComponents.add(selectedTab));
  23. };
  24. if (adminNotificationContainer.state.webhookUrl === adminNotificationContainer.dummyWebhookUrl) {
  25. throw (async() => {
  26. try {
  27. await adminNotificationContainer.retrieveNotificationData();
  28. }
  29. catch (err) {
  30. const errs = toArrayIfNot(err);
  31. toastError(errs);
  32. logger.error(errs);
  33. retrieveErrors = errs;
  34. adminNotificationContainer.setState({ webhookUrl: adminNotificationContainer.dummyWebhookUrlForError });
  35. }
  36. })();
  37. }
  38. if (adminNotificationContainer.state.webhookUrl === adminNotificationContainer.dummyWebhookUrlForError) {
  39. throw new Error(`${retrieveErrors.length} errors occured`);
  40. }
  41. const navTabMapping = useMemo(() => {
  42. return {
  43. slack_configuration: {
  44. Icon: () => <i className="icon-settings" />,
  45. i18n: 'Slack configuration',
  46. index: 0,
  47. },
  48. user_trigger_notification: {
  49. Icon: () => <i className="icon-settings" />,
  50. i18n: 'User trigger notification',
  51. index: 1,
  52. },
  53. global_notification: {
  54. Icon: () => <i className="icon-settings" />,
  55. i18n: 'Global notification',
  56. index: 2,
  57. },
  58. };
  59. }, []);
  60. return (
  61. <>
  62. <CustomNav activeTab={activeTab} navTabMapping={navTabMapping} onNavSelected={switchActiveTab} hideBorderBottom />
  63. <TabContent activeTab={activeTab} className="p-5">
  64. <TabPane tabId="slack_configuration">
  65. {activeComponents.has('slack_configuration') && <SlackAppConfiguration />}
  66. </TabPane>
  67. <TabPane tabId="user_trigger_notification">
  68. {activeComponents.has('user_trigger_notification') && <UserTriggerNotification />}
  69. </TabPane>
  70. <TabPane tabId="global_notification">
  71. {activeComponents.has('global_notification') && <GlobalNotification />}
  72. </TabPane>
  73. </TabContent>
  74. </>
  75. );
  76. }
  77. const NotificationSettingWithUnstatedContainer = withUnstatedContainers(withLoadingSppiner(NotificationSetting), [AdminNotificationContainer]);
  78. NotificationSetting.propTypes = {
  79. adminNotificationContainer: PropTypes.instanceOf(AdminNotificationContainer).isRequired,
  80. };
  81. export default NotificationSettingWithUnstatedContainer;