Advertisement
Guest User

Untitled

a guest
May 20th, 2019
231
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.20 KB | None | 0 0
  1. import React, { useState, useCallback } from 'react';
  2. import { isNull, capitalize, lowerCase } from 'lodash';
  3. import { Input, Button, Form } from 'antd';
  4. import { withFirebase } from 'react-redux-firebase';
  5. import { withRouter, SingletonRouter } from 'next/router';
  6. import firebase from 'firebase';
  7. import { callbackify } from 'util';
  8.  
  9. // import { CLIENT } from '../../pages/register';
  10.  
  11. export type RegisterFormProps = {
  12. role: string | null;
  13. firebase: firebase.app.App;
  14. router: SingletonRouter;
  15. };
  16.  
  17. const RegisterForm: React.FunctionComponent<RegisterFormProps> = props => {
  18. const { role, firebase, router } = props;
  19. const { getFieldDecorator } = props.form;
  20. if (isNull(role)) {
  21. return null; // renders nothing!
  22. }
  23.  
  24. const [email, setEmail] = useState('adoji92@gmail.com');
  25. const [password, setPassword] = useState('adjadj1234');
  26. const [password2, setPassword2] = useState('adjadj1234');
  27. // const [email, setEmail] = useState('');
  28. // const [password, setPassword] = useState('');
  29. // const [password2, setPassword2] = useState('');
  30.  
  31. const onChangeBase = (
  32. setter: React.Dispatch<React.SetStateAction<string>>,
  33. ) => (event: React.ChangeEvent<HTMLInputElement>) =>
  34. setter(event.target.value);
  35.  
  36. const isValidEmail = (email: string) => true; // TODO: replace dummy
  37. const isValidPassword = (password: string) => true; // TODO: replace dummy
  38.  
  39. const isFormValid = (email: string, password: string, password2: string) =>
  40. isValidEmail(email) && isValidPassword(password) && password === password2; // TODO: return [boolean, errorCode] to display proper errorCode
  41. // OR rename to validateForm, then return { isValid: boolean, errorCode: number }
  42.  
  43. let confirmDirty = false;
  44. // let message = '';
  45. // let message2 = 'Two passwords that you enter is inconsistent!';
  46.  
  47. // const handleConfirmBlur = e => {
  48. // const value = e.target.value;
  49. // confirmDirty = confirmDirty || !!value ;
  50. // };
  51.  
  52. const compareToFirstPassword = (value, callback) => {
  53. const form = props.form;
  54. if (value && value !== form.getFieldValue('password')) {
  55. callback('Two passwords that you enter is inconsistent!');
  56. } else {
  57. callback();
  58. }
  59. };
  60.  
  61. const validateToNextPassword = (value, callback) => {
  62. const form = props.form;
  63. if (value && confirmDirty) {
  64. form.validateFields(['confirm'], { force: true });
  65. }
  66. callback();
  67. };
  68.  
  69. const onSubmit = async (email: string, password: string, role: string) => {
  70. let hasError = false;
  71.  
  72. try {
  73. await firebase.auth().createUserWithEmailAndPassword(email, password);
  74. } catch (error) {
  75. // TODO: switch with error.code
  76. console.error('error', error); // TODO: delete on production build
  77. hasError = true;
  78. }
  79.  
  80. if (hasError) {
  81. // NOTE: return in catch clause is anti-pattern
  82. return;
  83. }
  84.  
  85. try {
  86. const user = firebase.auth().currentUser;
  87. if (!isNull(user)) {
  88. const uid = user.uid;
  89. const uRole = `${lowerCase(role)}s`;
  90. await firebase
  91. .firestore()
  92. .collection(uRole)
  93. .doc(uid)
  94. .set({});
  95. }
  96. } catch (error) {
  97. console.error('error2', error); // TODO: delete on production build
  98. hasError = true;
  99. }
  100.  
  101. if (hasError) {
  102. return;
  103. }
  104.  
  105. try {
  106. const user = firebase.auth().currentUser;
  107. if (!isNull(user)) {
  108. await user.sendEmailVerification();
  109. }
  110. } catch (error) {
  111. console.error('error3', error); // TODO: delete on production build
  112. hasError = true;
  113. }
  114.  
  115. if (hasError) {
  116. return;
  117. }
  118.  
  119. router.push('/email-verification-required');
  120. };
  121. return (
  122. <div>
  123. <h1>Register as {capitalize(role)}</h1>
  124. {/* TODO: refactor to antd.Form */}
  125. <Form>
  126. <Form.Item label="E-mail">
  127. {getFieldDecorator('email', {
  128. rules: [
  129. {
  130. type: 'email',
  131. message: 'The input is not valid E-mail!',
  132. },
  133. {
  134. required: true,
  135. message: 'Please input your E-mail!',
  136. },
  137. ],
  138. })
  139. (<Input
  140. placeholder="email"
  141. size="large"
  142. onChange={onChangeBase(setEmail)}
  143. />)}
  144. </Form.Item>
  145. {/* TODO: add password validation */}
  146. <Form.Item label="Password" hasFeedback>
  147. {getFieldDecorator('password', {
  148. rules: [
  149. {
  150. required: true,
  151. message: 'Please input your password!',
  152. },
  153. {
  154. validator: validateToNextPassword(setPassword, useCallback),
  155. },
  156. ],
  157. })(<Input.Password
  158. placeholder="password"
  159. size="large"
  160. onChange={onChangeBase(setPassword)}
  161. />)}
  162. </Form.Item>
  163. <Form.Item label="Confirm Password" hasFeedback>
  164. {getFieldDecorator('confirm', {
  165. rules: [
  166. {
  167. required: true,
  168. message: 'Please confirm your password!',
  169. },
  170. {
  171. validator: compareToFirstPassword(setPassword2, useCallback),
  172. },
  173. ],
  174. })(<Input.Password
  175. // onBlur={handleConfirmBlur}
  176. placeholder="password confirmation"
  177. size="large"
  178. onChange={onChangeBase(setPassword2)}
  179. />)}
  180. </Form.Item>
  181. </Form>
  182. <br />
  183. <br />
  184. <Button
  185. type="primary"
  186. disabled={!isFormValid(email, password, password2)}
  187. block={true}
  188. // tslint:disable-next-line jsx-no-lambda
  189. onClick={evt => {
  190. evt.preventDefault();
  191. onSubmit(email, password, role);
  192. }}
  193. >
  194. Register
  195. </Button>
  196. email: {email}
  197. <br />
  198. pw1: {password}
  199. <br />
  200. pw2: {password2}
  201. <br />
  202. </div>
  203. );
  204. };
  205.  
  206. const WrappedRegisterForm = Form.create({ name: 'register' })(RegisterForm);
  207.  
  208. // export default RegisterForm;
  209. export default withFirebase(withRouter(WrappedRegisterForm));
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement