QuestionnaireSettings.tsx 4.0 KB

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