This is just a technology testing project based on Create React App and TailwindCSS
Du kannst nicht mehr als 25 Themen auswählen Themen müssen entweder mit einem Buchstaben oder einer Ziffer beginnen. Sie können Bindestriche („-“) enthalten und bis zu 35 Zeichen lang sein.

133 Zeilen
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. }