This is just a technology testing project based on Create React App and TailwindCSS
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

133 lines
5.3KB

  1. import React, { useEffect } from 'react'
  2. import PropTypes from 'prop-types'
  3. import { Formik, Form } from 'formik'
  4. import { Persist } from 'formik-persist'
  5. import * as Yup from 'yup'
  6. import FormikControl from '../FormikControls'
  7. import ButtonPrimary from '../controls/ButtonPrimary'
  8. import ButtonSecondary from '../controls/ButtonSecondary'
  9. import { FormLogin } from './FormLogin'
  10. import { ServicePolicy } from '../ServicePolicy'
  11. import { SubmitFormResult } from '../SubmitFormResult';
  12. export const FormRegistration = (props) => {
  13. const { setPopupTitle, setPopupContent, setPopupOpened, close } = props
  14. useEffect(() => {
  15. if (setPopupTitle) { setPopupTitle('New user registration') }
  16. })
  17. const initialValues = {
  18. email: '',
  19. password: '',
  20. password_confirm: '',
  21. userconsent: false,
  22. }
  23. const validationSchema = Yup.object({
  24. email: Yup.string()
  25. .required('Required')
  26. .email('Must be a valid email address'),
  27. password: Yup.string()
  28. .required('Required')
  29. .min(8, val => `Minimum ${val.min} symbols`),
  30. password_confirm: Yup.string()
  31. .required('Required')
  32. .oneOf([Yup.ref('password'), null], 'Not matching with password'),
  33. userconsent: Yup.boolean()
  34. .oneOf([true], 'Required'),
  35. })
  36. const onSubmit = values => {
  37. setPopupOpened(false)
  38. setTimeout(() => {
  39. setPopupContent(<SubmitFormResult setPopupTitle={setPopupTitle} data={values} />)
  40. setPopupOpened(true)
  41. }, 200);
  42. }
  43. const goLogin = () => {
  44. setPopupOpened(false)
  45. setTimeout(() => {
  46. setPopupContent(<FormLogin setPopupTitle={setPopupTitle} setPopupContent={setPopupContent} setPopupOpened={setPopupOpened} close={close} />)
  47. setPopupOpened(true)
  48. }, 200);
  49. }
  50. const goServicePolicy = () => {
  51. setPopupOpened(false)
  52. setTimeout(() => {
  53. setPopupContent(<ServicePolicy setPopupTitle={setPopupTitle} setPopupContent={setPopupContent} setPopupOpened={setPopupOpened} close={close} />)
  54. setPopupOpened(true)
  55. }, 200);
  56. }
  57. return (
  58. <Formik
  59. initialValues={initialValues}
  60. validationSchema={validationSchema}
  61. onSubmit={onSubmit}
  62. >
  63. {formik => {
  64. return (
  65. <div className="overflow-y-auto max-h-screen-80">
  66. <Form className="registration-form">
  67. <div className="p-3">
  68. <FormikControl
  69. control='string'
  70. name='email'
  71. label='Email'
  72. placeholder='Enter valid email'
  73. required
  74. aria-required="true"
  75. aria-invalid={!!formik.errors.email}
  76. />
  77. <FormikControl
  78. control='password'
  79. name='password'
  80. label='Password'
  81. placeholder='Choose a strong password'
  82. required
  83. aria-required="true"
  84. aria-invalid={!!formik.errors.password}
  85. />
  86. <FormikControl
  87. control='password'
  88. name='password_confirm'
  89. label='Confirm password'
  90. placeholder='Enter same password'
  91. required
  92. aria-required="true"
  93. aria-invalid={!!formik.errors.password_confirm}
  94. />
  95. <FormikControl
  96. control='userconsent'
  97. name='userconsent'
  98. label_template='Accept #Service Policy#'
  99. label_action={goServicePolicy}
  100. required
  101. aria-required="true"
  102. aria-invalid={!!formik.errors.userconsent}
  103. />
  104. </div>
  105. <div className="px-2 pt-4 pb-1 mb-0 bg-primary-200 border-t rounded-b-lg">
  106. <ButtonPrimary type="submit" text="Register" disabled={!formik.isValid || !formik.dirty} />
  107. <div className="my-3">
  108. <ButtonSecondary type="button" text="Have account? - Sign In" action={goLogin} />
  109. </div>
  110. </div>
  111. <Persist name="registration-form" isSessionStorage />
  112. </Form>
  113. </div>
  114. )
  115. }}
  116. </Formik>
  117. )
  118. }
  119. FormRegistration.propTypes = {
  120. setPopupTitle: PropTypes.func,
  121. setPopupContent: PropTypes.func,
  122. setPopupOpened: PropTypes.func,
  123. close: PropTypes.func,
  124. }