InvitedForm.tsx 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144
  1. import React, { useEffect, useState } from 'react';
  2. import { useTranslation } from 'next-i18next';
  3. import { apiv3Get } from '~/client/util/apiv3-client';
  4. import { useCsrfToken } from '~/stores/context';
  5. import { toastError } from '../client/util/apiNotification';
  6. type InvitedFormProps = {
  7. csrfToken: string,
  8. // isEmailAuthenticationEnabled: boolean,
  9. username: string,
  10. // isRegistering: boolean,
  11. name: string,
  12. email: string,
  13. // isMailerSetup: boolean,
  14. // isLocalOrLdapStrategiesEnabled: boolean,
  15. // isSomeExternalAuthEnabled: boolean,
  16. // isPasswordResetEnabled: boolean,
  17. // isRegistrationEnabled: boolean,
  18. }
  19. export const InvitedForm = (props: InvitedFormProps): JSX.Element => {
  20. const { t } = useTranslation();
  21. const { data: csrfToken } = useCsrfToken();
  22. const {
  23. username, name, email,
  24. } = props;
  25. const registerAction = '/login/activateInvited';
  26. // const [usernameAvailable, setUsernameAvailable] = useState(true);
  27. // useEffect(() => {
  28. // const delayDebounceFn = setTimeout(async() => {
  29. // try {
  30. // const { data } = await apiv3Get('/check-username', { username });
  31. // if (data.ok) {
  32. // setUsernameAvailable(data.valid);
  33. // }
  34. // }
  35. // catch (error) {
  36. // toastError(error, 'Error occurred when checking username');
  37. // }
  38. // }, 500);
  39. // return () => clearTimeout(delayDebounceFn);
  40. // }, [username]);
  41. // TODO: check flow
  42. // TODO: check noLoing-dialog
  43. return (
  44. <div className="noLogin-dialog p-3 mx-auto" id="noLogin-dialog">
  45. <p className="alert alert-success">
  46. <strong>{ t('invited.discription_heading') }</strong><br></br>
  47. <small>{ t('invited.discription') }</small>
  48. </p>
  49. <form role="form" action={registerAction} method="post" id="invited-form">
  50. {/* Email Form */}
  51. <div className="input-group">
  52. <div className="input-group-prepend">
  53. <span className="input-group-text">
  54. <i className="icon-envelope"></i>
  55. </span>
  56. </div>
  57. <input
  58. type="text"
  59. className="form-control"
  60. disabled
  61. placeholder={t('Email')}
  62. name="invitedForm[email]" // ?
  63. defaultValue={user.email} // value = user.email
  64. required
  65. />
  66. </div>
  67. {/* UserID Form */}
  68. <div className="input-group" id="input-group-username">
  69. <div className="input-group-prepend">
  70. <span className="input-group-text">
  71. <i className="icon-user"></i>
  72. </span>
  73. </div>
  74. <input
  75. type="text"
  76. className="form-control"
  77. placeholder={t('User ID')}
  78. name="invitedForm[username]"
  79. defaultValue={username} // value =req.body.invitedForm.username
  80. required
  81. />
  82. </div>
  83. {/* Name Form */}
  84. <div className="input-group">
  85. <div className="input-group-prepend">
  86. <span className="input-group-text">
  87. <i className="icon-tag"></i>
  88. </span>
  89. </div>
  90. <input
  91. type="text"
  92. className="form-control"
  93. placeholder={t('Name')}
  94. name="invitedForm[name]"
  95. defaultValue={name} // value = req.body.invitedForm.name
  96. required
  97. />
  98. </div>
  99. {/* Password Form */}
  100. <div className="input-group">
  101. <div className="input-group-prepend">
  102. <span className="input-group-text">
  103. <i className="icon-lock"></i>
  104. </span>
  105. </div>
  106. <input
  107. type="password"
  108. className="form-control"
  109. placeholder={t('Password')}
  110. name="invitedForm[password]"
  111. required
  112. />
  113. </div>
  114. {/* Create Button */}
  115. <div className="input-group justify-content-center d-flex mt-5">
  116. <input type="hidden" name="_csrf" value={csrfToken} />
  117. <button type="submit" className="btn btn-fill" id="register">
  118. <div className="eff"></div>
  119. <span className="btn-label"><i className="icon-user-follow"></i></span>
  120. <span className="btn-label-text">{t('Create')}</span>
  121. </button>
  122. </div>
  123. </form>
  124. <div className="input-group mt-5 d-flex justify-content-center">
  125. <a href="https://growi.org" className="link-growi-org">
  126. <span className="growi">GROWI</span>.<span className="org">ORG</span>
  127. </a>
  128. </div>
  129. </div>
  130. );
  131. };