InAppNotificationSettings.tsx 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  1. import React, {
  2. FC, useState, useEffect, useCallback,
  3. } from 'react';
  4. import { useTranslation } from 'react-i18next';
  5. import AppContainer from '~/client/services/AppContainer';
  6. import { withUnstatedContainers } from '../UnstatedUtils';
  7. import { toastSuccess, toastError } from '~/client/util/apiNotification';
  8. type Props = {
  9. appContainer: AppContainer,
  10. };
  11. type SubscribeRule = {
  12. name: string,
  13. isEnabled: boolean,
  14. }
  15. const subscribeRulesMenuItems = [
  16. {
  17. name: 'PAGE_CREATE',
  18. description: 'in_app_notification_settings.default_subscribe_rules.page_create',
  19. },
  20. ];
  21. const InAppNotificationSettings: FC<Props> = (props: Props) => {
  22. const { appContainer } = props;
  23. const { t } = useTranslation();
  24. const [subscribeRules, setSubscribeRules] = useState<SubscribeRule[]>([]);
  25. const initializeInAppNotificationSettings = useCallback(async() => {
  26. const { data } = await appContainer.apiv3Get('/personal-setting/in-app-notification-settings');
  27. const retrievedRules: SubscribeRule[] = data?.subscribeRules;
  28. if (retrievedRules != null && retrievedRules.length > 0) {
  29. setSubscribeRules(retrievedRules);
  30. }
  31. else {
  32. const createRulesFormList = (rule: {name: string}) => (
  33. {
  34. name: rule.name,
  35. isEnabled: false,
  36. }
  37. );
  38. const initializedSubscribeRules = subscribeRulesMenuItems.map(rule => createRulesFormList(rule));
  39. setSubscribeRules(initializedSubscribeRules);
  40. }
  41. }, [appContainer]);
  42. const isCheckedRule = (ruleName: string) => (
  43. subscribeRules.find(stateRule => (
  44. stateRule.name === ruleName
  45. ))?.isEnabled || false
  46. );
  47. const ruleCheckboxHandler = (isChecked: boolean, ruleName: string) => {
  48. setSubscribeRules(prevState => (
  49. prevState.filter(rule => rule.name !== ruleName).concat({ name: ruleName, isEnabled: isChecked })
  50. ));
  51. };
  52. const updateSettingsHandler = async() => {
  53. try {
  54. const { data } = await appContainer.apiv3Put('/personal-setting/in-app-notification-settings', { subscribeRules });
  55. setSubscribeRules(data.subscribeRules);
  56. toastSuccess(t('toaster.update_successed', { target: 'InAppNotification Settings' }));
  57. }
  58. catch (err) {
  59. toastError(err);
  60. }
  61. };
  62. useEffect(() => {
  63. initializeInAppNotificationSettings();
  64. }, [initializeInAppNotificationSettings]);
  65. return (
  66. <>
  67. <h2 className="border-bottom my-4">{t('in_app_notification_settings.subscribe_settings')}</h2>
  68. <div className="form-group row">
  69. <div className="offset-md-3 col-md-6 text-left">
  70. {subscribeRulesMenuItems.map(rule => (
  71. <div
  72. key={rule.name}
  73. className="custom-control custom-switch custom-checkbox-success"
  74. >
  75. <input
  76. type="checkbox"
  77. className="custom-control-input"
  78. id={rule.name}
  79. checked={isCheckedRule(rule.name)}
  80. onChange={e => ruleCheckboxHandler(e.target.checked, rule.name)}
  81. />
  82. <label className="custom-control-label" htmlFor={rule.name}>
  83. <strong>{rule.name}</strong>
  84. </label>
  85. <p className="form-text text-muted small">
  86. {t(rule.description)}
  87. </p>
  88. </div>
  89. ))}
  90. </div>
  91. </div>
  92. <div className="row my-3">
  93. <div className="offset-4 col-5">
  94. <button
  95. type="button"
  96. className="btn btn-primary"
  97. onClick={updateSettingsHandler}
  98. >
  99. {t('Update')}
  100. </button>
  101. </div>
  102. </div>
  103. </>
  104. );
  105. };
  106. const InAppNotificationSettingWrapper = withUnstatedContainers(InAppNotificationSettings, [AppContainer]);
  107. export default InAppNotificationSettingWrapper;