OtherSettings.tsx 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. import {
  2. useState, useEffect, useCallback,
  3. } from 'react';
  4. import { useTranslation } from 'next-i18next';
  5. import { UncontrolledTooltip } from 'reactstrap';
  6. import { apiv3Put } from '~/client/util/apiv3-client';
  7. import { toastSuccess, toastError } from '~/client/util/toastr';
  8. import { useSWRxIsQuestionnaireEnabled } from '~/features/questionnaire/client/stores/questionnaire';
  9. import { useCurrentUser } from '~/stores/context';
  10. const OtherSettings = (): JSX.Element => {
  11. const { t } = useTranslation();
  12. const { data: currentUser, error: errorCurrentUser } = useCurrentUser();
  13. const { data: growiIsQuestionnaireEnabled } = useSWRxIsQuestionnaireEnabled();
  14. const [isQuestionnaireEnabled, setIsQuestionnaireEnabled] = useState(currentUser?.isQuestionnaireEnabled);
  15. const onChangeIsQuestionnaireEnabledHandler = useCallback(async() => {
  16. setIsQuestionnaireEnabled(prev => !prev);
  17. }, []);
  18. const onClickUpdateIsQuestionnaireEnabledHandler = useCallback(async() => {
  19. try {
  20. await apiv3Put('/personal-setting/questionnaire-settings', {
  21. isQuestionnaireEnabled,
  22. });
  23. toastSuccess(t('toaster.update_successed', { target: t('questionnaire.settings'), ns: 'commons' }));
  24. }
  25. catch (err) {
  26. toastError(err);
  27. }
  28. }, [isQuestionnaireEnabled, t]);
  29. // Sync currentUser and state
  30. useEffect(() => {
  31. setIsQuestionnaireEnabled(currentUser?.isQuestionnaireEnabled);
  32. }, [currentUser?.isQuestionnaireEnabled]);
  33. const isLoadingCurrentUser = currentUser === undefined && errorCurrentUser === undefined;
  34. return (
  35. <>
  36. <h2 className="border-bottom my-4">{t('questionnaire.settings')}</h2>
  37. {isLoadingCurrentUser && (
  38. <div className="text-muted text-center mb-5">
  39. <i className="fa fa-2x fa-spinner fa-pulse mr-1" />
  40. </div>
  41. )}
  42. <div className="form-group row">
  43. <div className="offset-md-3 col-md-6 text-left">
  44. {!isLoadingCurrentUser && (
  45. <div className="form-check form-switch form-check-primary">
  46. <span id="grw-questionnaire-settings-toggle-wrapper">
  47. <input
  48. type="checkbox"
  49. className="form-check-input"
  50. id="isQuestionnaireEnabled"
  51. checked={growiIsQuestionnaireEnabled && isQuestionnaireEnabled}
  52. onChange={onChangeIsQuestionnaireEnabledHandler}
  53. disabled={!growiIsQuestionnaireEnabled}
  54. />
  55. <label className="form-check-label" htmlFor="isQuestionnaireEnabled">
  56. {t('questionnaire.enable_questionnaire')}
  57. </label>
  58. </span>
  59. <p className="form-text text-muted small">
  60. {t('questionnaire.personal_settings_explanation')}
  61. </p>
  62. {!growiIsQuestionnaireEnabled && (
  63. <UncontrolledTooltip placement="bottom" target="grw-questionnaire-settings-toggle-wrapper">
  64. {t('questionnaire.disabled_by_admin')}
  65. </UncontrolledTooltip>
  66. ) }
  67. </div>
  68. )}
  69. </div>
  70. </div>
  71. <div className="row my-3">
  72. <div className="offset-4 col-5">
  73. <span className="d-inline-block" id="grw-questionnaire-settings-update-btn-wrapper">
  74. <button
  75. data-testid="grw-questionnaire-settings-update-btn"
  76. type="button"
  77. className="btn btn-primary"
  78. onClick={onClickUpdateIsQuestionnaireEnabledHandler}
  79. disabled={!growiIsQuestionnaireEnabled}
  80. style={growiIsQuestionnaireEnabled ? {} : { pointerEvents: 'none' }}
  81. >
  82. {t('Update')}
  83. </button>
  84. </span>
  85. {!growiIsQuestionnaireEnabled && (
  86. <UncontrolledTooltip placement="bottom" target="grw-questionnaire-settings-update-btn-wrapper">
  87. {t('questionnaire.disabled_by_admin')}
  88. </UncontrolledTooltip>
  89. )}
  90. </div>
  91. </div>
  92. </>
  93. );
  94. };
  95. export default OtherSettings;