InvitedForm.tsx 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  1. import React, { useCallback } 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 { invitedFormUsername, invitedFormName } = props;
  15. const submitHandler = useCallback(async(e) => {
  16. e.preventDefault();
  17. const formData = e.target.elements;
  18. const {
  19. 'invitedForm[name]': { value: name },
  20. 'invitedForm[password]': { value: password },
  21. 'invitedForm[username]': { value: username },
  22. } = formData;
  23. const invitedForm = {
  24. name,
  25. password,
  26. username,
  27. };
  28. try {
  29. const res = await apiv3Post('/invited', { invitedForm });
  30. const { redirectTo } = res.data;
  31. router.push(redirectTo);
  32. }
  33. catch (err) {
  34. // TODO: show errors
  35. }
  36. }, [router]);
  37. if (user == null) {
  38. return <></>;
  39. }
  40. return (
  41. <div className="noLogin-dialog p-3 mx-auto" id="noLogin-dialog">
  42. <p className="alert alert-success">
  43. <strong>{ t('invited.discription_heading') }</strong><br></br>
  44. <small>{ t('invited.discription') }</small>
  45. </p>
  46. <form role="form" onSubmit={submitHandler} id="invited-form">
  47. {/* Email Form */}
  48. <div className="input-group">
  49. <div className="input-group-prepend">
  50. <span className="input-group-text">
  51. <i className="icon-envelope"></i>
  52. </span>
  53. </div>
  54. <input
  55. type="text"
  56. className="form-control"
  57. disabled
  58. placeholder={t('Email')}
  59. name="invitedForm[email]"
  60. defaultValue={user.email}
  61. required
  62. />
  63. </div>
  64. {/* UserID Form */}
  65. <div className="input-group" id="input-group-username">
  66. <div className="input-group-prepend">
  67. <span className="input-group-text">
  68. <i className="icon-user"></i>
  69. </span>
  70. </div>
  71. <input
  72. type="text"
  73. className="form-control"
  74. placeholder={t('User ID')}
  75. name="invitedForm[username]"
  76. value={invitedFormUsername}
  77. required
  78. />
  79. </div>
  80. {/* Name Form */}
  81. <div className="input-group">
  82. <div className="input-group-prepend">
  83. <span className="input-group-text">
  84. <i className="icon-tag"></i>
  85. </span>
  86. </div>
  87. <input
  88. type="text"
  89. className="form-control"
  90. placeholder={t('Name')}
  91. name="invitedForm[name]"
  92. value={invitedFormName}
  93. required
  94. />
  95. </div>
  96. {/* Password Form */}
  97. <div className="input-group">
  98. <div className="input-group-prepend">
  99. <span className="input-group-text">
  100. <i className="icon-lock"></i>
  101. </span>
  102. </div>
  103. <input
  104. type="password"
  105. className="form-control"
  106. placeholder={t('Password')}
  107. name="invitedForm[password]"
  108. required
  109. />
  110. </div>
  111. {/* Create Button */}
  112. <div className="input-group justify-content-center d-flex mt-5">
  113. <button type="submit" className="btn btn-fill" id="register">
  114. <div className="eff"></div>
  115. <span className="btn-label"><i className="icon-user-follow"></i></span>
  116. <span className="btn-label-text">{t('Create')}</span>
  117. </button>
  118. </div>
  119. </form>
  120. <div className="input-group mt-5 d-flex justify-content-center">
  121. <a href="https://growi.org" className="link-growi-org">
  122. <span className="growi">GROWI</span>.<span className="org">ORG</span>
  123. </a>
  124. </div>
  125. </div>
  126. );
  127. };