BasicInfoSettings.tsx 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167
  1. import React from 'react';
  2. import { useTranslation, i18n } from 'next-i18next';
  3. import { i18n as i18nConfig } from '^/config/next-i18next.config';
  4. import { toastSuccess, toastError } from '~/client/util/toastr';
  5. import { useRegistrationWhitelist } from '~/stores/context';
  6. import { usePersonalSettings } from '~/stores/personal-settings';
  7. export const BasicInfoSettings = (): JSX.Element => {
  8. const { t } = useTranslation();
  9. const { data: registrationWhitelist } = useRegistrationWhitelist();
  10. const {
  11. data: personalSettingsInfo, mutate: mutatePersonalSettings, sync, updateBasicInfo, error,
  12. } = usePersonalSettings();
  13. const submitHandler = async() => {
  14. try {
  15. await updateBasicInfo();
  16. sync();
  17. toastSuccess(t('toaster.update_successed', { target: t('Basic Info'), ns: 'commons' }));
  18. }
  19. catch (err) {
  20. // toastError(err);
  21. if (err.message === 'User validation failed: email: Error, expected `email` to be unique. Value: `admin@example.com`') {
  22. toastError(t('alert.email_is_already_in_use', { ns: 'commons' }));
  23. }
  24. else {
  25. toastError(err);
  26. }
  27. }
  28. };
  29. const changePersonalSettingsHandler = (updateData) => {
  30. if (personalSettingsInfo == null) {
  31. return;
  32. }
  33. mutatePersonalSettings({ ...personalSettingsInfo, ...updateData });
  34. };
  35. return (
  36. <>
  37. <div className="form-group row">
  38. <label htmlFor="userForm[name]" className="text-left text-md-right col-md-3 col-form-label">{t('Name')}</label>
  39. <div className="col-md-6">
  40. <input
  41. className="form-control"
  42. type="text"
  43. name="userForm[name]"
  44. defaultValue={personalSettingsInfo?.name || ''}
  45. onChange={e => changePersonalSettingsHandler({ name: e.target.value })}
  46. />
  47. </div>
  48. </div>
  49. <div className="form-group row">
  50. <label htmlFor="userForm[email]" className="text-left text-md-right col-md-3 col-form-label">{t('Email')}</label>
  51. <div className="col-md-6">
  52. <input
  53. className="form-control"
  54. type="text"
  55. name="userForm[email]"
  56. defaultValue={personalSettingsInfo?.email || ''}
  57. onChange={e => changePersonalSettingsHandler({ email: e.target.value })}
  58. />
  59. {registrationWhitelist != null && registrationWhitelist.length !== 0 && (
  60. <div className="form-text text-muted">
  61. {t('page_register.form_help.email')}
  62. <ul>
  63. {registrationWhitelist.map(data => <li key={data}><code>{data}</code></li>)}
  64. </ul>
  65. </div>
  66. )}
  67. </div>
  68. </div>
  69. <div className="form-group row">
  70. <label className="text-left text-md-right col-md-3 col-form-label">{t('Disclose E-mail')}</label>
  71. <div className="col-md-6">
  72. <div className="custom-control custom-radio custom-control-inline">
  73. <input
  74. type="radio"
  75. id="radioEmailShow"
  76. className="custom-control-input"
  77. name="userForm[isEmailPublished]"
  78. checked={personalSettingsInfo?.isEmailPublished === true}
  79. onChange={() => changePersonalSettingsHandler({ isEmailPublished: true })}
  80. />
  81. <label className="custom-control-label" htmlFor="radioEmailShow">{t('Show')}</label>
  82. </div>
  83. <div className="custom-control custom-radio custom-control-inline">
  84. <input
  85. type="radio"
  86. id="radioEmailHide"
  87. className="custom-control-input"
  88. name="userForm[isEmailPublished]"
  89. checked={personalSettingsInfo?.isEmailPublished === false}
  90. onChange={() => changePersonalSettingsHandler({ isEmailPublished: false })}
  91. />
  92. <label className="custom-control-label" htmlFor="radioEmailHide">{t('Hide')}</label>
  93. </div>
  94. </div>
  95. </div>
  96. <div className="form-group row">
  97. <label className="text-left text-md-right col-md-3 col-form-label">{t('Language')}</label>
  98. <div className="col-md-6">
  99. {
  100. i18nConfig.locales.map((locale) => {
  101. if (i18n == null) { return }
  102. const fixedT = i18n.getFixedT(locale);
  103. return (
  104. <div key={locale} className="custom-control custom-radio custom-control-inline">
  105. <input
  106. type="radio"
  107. id={`radioLang${locale}`}
  108. className="custom-control-input"
  109. name="userForm[lang]"
  110. checked={personalSettingsInfo?.lang === locale}
  111. onChange={() => changePersonalSettingsHandler({ lang: locale })}
  112. />
  113. <label className="custom-control-label" htmlFor={`radioLang${locale}`}>{fixedT('meta.display_name') as string}</label>
  114. </div>
  115. );
  116. })
  117. }
  118. </div>
  119. </div>
  120. <div className="form-group row">
  121. <label htmlFor="userForm[slackMemberId]" className="text-left text-md-right col-md-3 col-form-label">{t('Slack Member ID')}</label>
  122. <div className="col-md-6">
  123. <input
  124. className="form-control"
  125. type="text"
  126. key="slackMemberId"
  127. name="userForm[slackMemberId]"
  128. defaultValue={personalSettingsInfo?.slackMemberId || ''}
  129. onChange={e => changePersonalSettingsHandler({ slackMemberId: e.target.value })}
  130. />
  131. </div>
  132. </div>
  133. <div className="row my-3">
  134. <div className="offset-4 col-5">
  135. <button
  136. data-testid="grw-besic-info-settings-update-button"
  137. type="button"
  138. className="btn btn-primary"
  139. onClick={submitHandler}
  140. disabled={error != null}
  141. >
  142. {t('Update')}
  143. </button>
  144. </div>
  145. </div>
  146. </>
  147. );
  148. };