InvitedForm.tsx 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171
  1. import React, { useCallback, useState } from 'react';
  2. import { useTranslation } from 'next-i18next';
  3. import { useRouter } from 'next/router';
  4. import { apiv3Post } from '~/client/util/apiv3-client';
  5. import { useCurrentUser } from '../stores/context';
  6. export type InvitedFormProps = {
  7. invitedFormUsername: string,
  8. invitedFormName: string,
  9. }
  10. export const InvitedForm = (props: InvitedFormProps): JSX.Element => {
  11. const { t } = useTranslation();
  12. const router = useRouter();
  13. const { data: user } = useCurrentUser();
  14. const [isConnectSuccess, setIsConnectSuccess] = useState<boolean>(false);
  15. const [loginErrors, setLoginErrors] = useState<Error[]>([]);
  16. const { invitedFormUsername, invitedFormName } = props;
  17. const submitHandler = useCallback(async(e) => {
  18. e.preventDefault();
  19. const formData = e.target.elements;
  20. const {
  21. 'invitedForm[name]': { value: name },
  22. 'invitedForm[password]': { value: password },
  23. 'invitedForm[username]': { value: username },
  24. } = formData;
  25. const invitedForm = {
  26. name,
  27. password,
  28. username,
  29. };
  30. try {
  31. const res = await apiv3Post('/invited', { invitedForm });
  32. setIsConnectSuccess(true);
  33. const { redirectTo } = res.data;
  34. router.push(redirectTo ?? '/');
  35. }
  36. catch (err) {
  37. setLoginErrors(err);
  38. }
  39. }, [router]);
  40. const formNotification = useCallback(() => {
  41. if (isConnectSuccess) {
  42. return (
  43. <p className="alert alert-success">
  44. <strong>{ t('message.successfully_connected') }</strong><br></br>
  45. </p>
  46. );
  47. }
  48. return (
  49. <>
  50. { loginErrors != null && loginErrors.length > 0 ? (
  51. <p className="alert alert-danger">
  52. { loginErrors.map((err, index) => {
  53. return <span key={index}>{ t(err.message) }<br/></span>;
  54. }) }
  55. </p>
  56. ) : (
  57. <p className="alert alert-success">
  58. <strong>{ t('invited.discription_heading') }</strong><br></br>
  59. <small>{ t('invited.discription') }</small>
  60. </p>
  61. ) }
  62. </>
  63. );
  64. }, [isConnectSuccess, loginErrors, t]);
  65. if (user == null) {
  66. return <></>;
  67. }
  68. return (
  69. <div className="noLogin-dialog px-3 pb-3 mx-auto" id="noLogin-dialog">
  70. { formNotification() }
  71. <form role="form" onSubmit={submitHandler} id="invited-form">
  72. {/* Email Form */}
  73. <div className="input-group">
  74. <div className="input-group-prepend">
  75. <span className="input-group-text">
  76. <i className="icon-envelope"></i>
  77. </span>
  78. </div>
  79. <input
  80. type="text"
  81. className="form-control"
  82. disabled
  83. placeholder={t('Email')}
  84. name="invitedForm[email]"
  85. defaultValue={user.email}
  86. required
  87. />
  88. </div>
  89. {/* UserID Form */}
  90. <div className="input-group" id="input-group-username">
  91. <div className="input-group-prepend">
  92. <span className="input-group-text">
  93. <i className="icon-user"></i>
  94. </span>
  95. </div>
  96. <input
  97. type="text"
  98. className="form-control"
  99. placeholder={t('User ID')}
  100. name="invitedForm[username]"
  101. value={invitedFormUsername}
  102. required
  103. />
  104. </div>
  105. {/* Name Form */}
  106. <div className="input-group">
  107. <div className="input-group-prepend">
  108. <span className="input-group-text">
  109. <i className="icon-tag"></i>
  110. </span>
  111. </div>
  112. <input
  113. type="text"
  114. className="form-control"
  115. placeholder={t('Name')}
  116. name="invitedForm[name]"
  117. value={invitedFormName}
  118. required
  119. />
  120. </div>
  121. {/* Password Form */}
  122. <div className="input-group">
  123. <div className="input-group-prepend">
  124. <span className="input-group-text">
  125. <i className="icon-lock"></i>
  126. </span>
  127. </div>
  128. <input
  129. type="password"
  130. className="form-control"
  131. placeholder={t('Password')}
  132. name="invitedForm[password]"
  133. required
  134. minLength={6}
  135. />
  136. </div>
  137. {/* Create Button */}
  138. <div className="input-group justify-content-center d-flex mt-4">
  139. <button type="submit" className="btn btn-fill" id="register">
  140. <div className="eff"></div>
  141. <span className="btn-label"><i className="icon-user-follow"></i></span>
  142. <span className="btn-label-text">{t('Create')}</span>
  143. </button>
  144. </div>
  145. </form>
  146. <div className="input-group mt-4 d-flex justify-content-center">
  147. <a href="https://growi.org" className="link-growi-org">
  148. <span className="growi">GROWI</span>.<span className="org">ORG</span>
  149. </a>
  150. </div>
  151. </div>
  152. );
  153. };