PasswordResetExecutionForm.tsx 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. import type { FC } from 'react';
  2. import React, { useState } from 'react';
  3. import Link from 'next/link';
  4. import { useTranslation } from 'next-i18next';
  5. import { apiv3Put } from '~/client/util/apiv3-client';
  6. import { toastError, toastSuccess } from '~/client/util/toastr';
  7. import loggerFactory from '~/utils/logger';
  8. const logger = loggerFactory('growi:passwordReset');
  9. const PasswordResetExecutionForm: FC = () => {
  10. const { t } = useTranslation(['translation', 'commons']);
  11. const [newPassword, setNewPassword] = useState('');
  12. const [newPasswordConfirm, setNewPasswordConfirm] = useState('');
  13. const [validationErrorI18n, setValidationErrorI18n] = useState('');
  14. // get token from URL
  15. const pathname = window.location.pathname.split('/');
  16. const token = pathname[2];
  17. const changePassword = async (e) => {
  18. e.preventDefault();
  19. if (newPassword === '' || newPasswordConfirm === '') {
  20. setValidationErrorI18n('personal_settings.password_is_not_set');
  21. return;
  22. }
  23. if (newPassword !== newPasswordConfirm) {
  24. setValidationErrorI18n(
  25. 'forgot_password.password_and_confirm_password_does_not_match',
  26. );
  27. return;
  28. }
  29. try {
  30. await apiv3Put('/forgot-password', {
  31. token,
  32. newPassword,
  33. newPasswordConfirm,
  34. });
  35. setValidationErrorI18n('');
  36. toastSuccess(
  37. t('toaster.update_successed', { target: t('Password'), ns: 'commons' }),
  38. );
  39. } catch (err) {
  40. toastError(err);
  41. logger.error(err);
  42. }
  43. };
  44. return (
  45. <form onSubmit={changePassword}>
  46. <div>
  47. <div className="input-group">
  48. <input
  49. name="password"
  50. placeholder={t('forgot_password.new_password')}
  51. className="form-control"
  52. type="password"
  53. onChange={(e) => setNewPassword(e.target.value)}
  54. />
  55. </div>
  56. </div>
  57. <div>
  58. <div className="input-group">
  59. <input
  60. name="password"
  61. placeholder={t('forgot_password.confirm_new_password')}
  62. className="form-control"
  63. type="password"
  64. onChange={(e) => setNewPasswordConfirm(e.target.value)}
  65. />
  66. </div>
  67. {validationErrorI18n !== '' && (
  68. <p className="text-danger mt-2">{t(validationErrorI18n)}</p>
  69. )}
  70. </div>
  71. <div>
  72. <input
  73. name="reset-password-btn"
  74. className="btn btn-lg btn-primary"
  75. value={t('forgot_password.reset_password')}
  76. type="submit"
  77. />
  78. </div>
  79. <Link href="/login" prefetch={false}>
  80. <span className="material-symbols-outlined">login</span>
  81. {t('forgot_password.sign_in_instead')}
  82. </Link>
  83. </form>
  84. );
  85. };
  86. export default PasswordResetExecutionForm;