QuestionnaireSettings.tsx 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. import {
  2. useState, useCallback, useEffect,
  3. } from 'react';
  4. import { useTranslation } from 'next-i18next';
  5. import { toastSuccess, toastError } from '~/client/util/apiNotification';
  6. import { apiv3Put } from '~/client/util/apiv3-client';
  7. import { useSWRxAppSettings } from '~/stores/admin/app-settings';
  8. import AdminUpdateButtonRow from '../Common/AdminUpdateButtonRow';
  9. const QuestionnaireSettings = (): JSX.Element => {
  10. const { t } = useTranslation(['admin', 'commons']);
  11. const { data, error, mutate } = useSWRxAppSettings();
  12. const [isQuestionnaireEnabled, setIsQuestionnaireEnabled] = useState(data?.isQuestionnaireEnabled);
  13. const onChangeIsQuestionnaireEnabledHandler = useCallback(() => {
  14. setIsQuestionnaireEnabled(prev => !prev);
  15. }, []);
  16. const [isAppSiteUrlHashed, setIsAppSiteUrlHashed] = useState(data?.isAppSiteUrlHashed);
  17. const onChangeisAppSiteUrlHashedHandler = useCallback(() => {
  18. setIsAppSiteUrlHashed(prev => !prev);
  19. }, []);
  20. const onSubmitHandler = useCallback(async() => {
  21. try {
  22. await apiv3Put('/app-settings/questionnaire-settings', {
  23. isQuestionnaireEnabled,
  24. isAppSiteUrlHashed,
  25. });
  26. toastSuccess(t('commons:toaster.update_successed', { target: t('admin:app_setting.questionnaire_settings') }));
  27. }
  28. catch (err) {
  29. toastError(err);
  30. }
  31. mutate();
  32. }, [isAppSiteUrlHashed, isQuestionnaireEnabled, mutate, t]);
  33. // Sync SWR value and state
  34. useEffect(() => {
  35. setIsQuestionnaireEnabled(data?.isQuestionnaireEnabled);
  36. setIsAppSiteUrlHashed(data?.isAppSiteUrlHashed);
  37. }, [data, data?.isAppSiteUrlHashed, data?.isQuestionnaireEnabled]);
  38. const isLoading = data === undefined && error === undefined;
  39. return (
  40. <div id="questionnaire-settings" className="mb-5">
  41. <p className="card well">
  42. {t('admin:app_setting.questionnaire_settings_explanation')}
  43. <br />
  44. <br />
  45. <span>
  46. <span className="text-info mr-2"><i className="icon-info icon-fw"></i>{t('admin:app_setting.about_data_sent')}</span>
  47. <a href={t('admin:app_setting.docs_link')} rel="noreferrer" target="_blank" className="d-inline">
  48. {t('admin:app_setting.learn_more')} <i className="icon-share-alt"></i>
  49. </a>
  50. <br />
  51. {t('admin:app_setting.other_info_will_be_sent')}<br />
  52. {t('admin:app_setting.we_will_use_the_data_to_improve_growi')}
  53. </span>
  54. </p>
  55. {isLoading && <div className="text-muted text-center mb-5">
  56. <i className="fa fa-2x fa-spinner fa-pulse mr-1" />
  57. </div>}
  58. {!isLoading && (
  59. <>
  60. <div className="row my-3">
  61. <div className="custom-control custom-switch custom-checkbox-primary col-md-5 offset-md-5">
  62. <input
  63. type="checkbox"
  64. className="custom-control-input"
  65. id="isQuestionnaireEnabled"
  66. checked={isQuestionnaireEnabled}
  67. onChange={onChangeIsQuestionnaireEnabledHandler}
  68. />
  69. <label className="custom-control-label" htmlFor="isQuestionnaireEnabled">
  70. {t('admin:app_setting.enable_questionnaire')}
  71. </label>
  72. </div>
  73. </div>
  74. <div className="row my-4">
  75. <div className="custom-control custom-checkbox custom-checkbox-primary col-md-5 offset-md-5">
  76. <input
  77. type="checkbox"
  78. className="custom-control-input"
  79. id="isAppSiteUrlHashed"
  80. checked={isAppSiteUrlHashed}
  81. onChange={onChangeisAppSiteUrlHashedHandler}
  82. disabled={!isQuestionnaireEnabled}
  83. />
  84. <label className="custom-control-label" htmlFor="isAppSiteUrlHashed">
  85. {t('admin:app_setting.anonymize_app_site_url')}
  86. </label>
  87. <p className="form-text text-muted small">
  88. {t('admin:app_setting.url_anonymization_explanation')}
  89. </p>
  90. </div>
  91. </div>
  92. <AdminUpdateButtonRow onClick={onSubmitHandler}/>
  93. </>
  94. )}
  95. </div>
  96. );
  97. };
  98. export default QuestionnaireSettings;