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.

130 lines
5.4KB

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