NotificationSetting.jsx 2.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. import React, {
  2. useCallback, useEffect, useMemo, useState,
  3. } from 'react';
  4. import PropTypes from 'prop-types';
  5. import { TabContent, TabPane } from 'reactstrap';
  6. import loggerFactory from '~/utils/logger';
  7. import { withUnstatedContainers } from '../../UnstatedUtils';
  8. import { toastError } from '~/client/util/apiNotification';
  9. import { toArrayIfNot } from '~/utils/array-utils';
  10. import { withLoadingSppiner } from '../../SuspenseUtils';
  11. import AdminNotificationContainer from '~/client/services/AdminNotificationContainer';
  12. import { CustomNavTab } from '../../CustomNavigation/CustomNav';
  13. import UserTriggerNotification from './UserTriggerNotification';
  14. import GlobalNotification from './GlobalNotification';
  15. const logger = loggerFactory('growi:NotificationSetting');
  16. let retrieveErrors = null;
  17. function NotificationSetting(props) {
  18. const { adminNotificationContainer } = props;
  19. const [activeTab, setActiveTab] = useState('user_trigger_notification');
  20. const [activeComponents, setActiveComponents] = useState(new Set(['user_trigger_notification']));
  21. const switchActiveTab = (selectedTab) => {
  22. setActiveTab(selectedTab);
  23. setActiveComponents(activeComponents.add(selectedTab));
  24. };
  25. const fetchData = useCallback(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. }
  35. }, [adminNotificationContainer]);
  36. useEffect(() => {
  37. fetchData();
  38. }, [fetchData]);
  39. const navTabMapping = useMemo(() => {
  40. return {
  41. user_trigger_notification: {
  42. Icon: () => <i className="icon-settings" />,
  43. i18n: 'User trigger notification',
  44. index: 0,
  45. },
  46. global_notification: {
  47. Icon: () => <i className="icon-settings" />,
  48. i18n: 'Global notification',
  49. index: 1,
  50. },
  51. };
  52. }, []);
  53. return (
  54. <>
  55. <CustomNavTab activeTab={activeTab} navTabMapping={navTabMapping} onNavSelected={switchActiveTab} hideBorderBottom />
  56. <TabContent activeTab={activeTab} className="p-5">
  57. <TabPane tabId="user_trigger_notification">
  58. {activeComponents.has('user_trigger_notification') && <UserTriggerNotification />}
  59. </TabPane>
  60. <TabPane tabId="global_notification">
  61. {activeComponents.has('global_notification') && <GlobalNotification />}
  62. </TabPane>
  63. </TabContent>
  64. </>
  65. );
  66. }
  67. const NotificationSettingWithUnstatedContainer = withUnstatedContainers(withLoadingSppiner(NotificationSetting), [AdminNotificationContainer]);
  68. NotificationSetting.propTypes = {
  69. adminNotificationContainer: PropTypes.instanceOf(AdminNotificationContainer).isRequired,
  70. };
  71. export default NotificationSettingWithUnstatedContainer;