NotificationSetting.jsx 3.0 KB

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