Advertisement
Guest User

Untitled

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