This is just a technology testing project based on Create React App and TailwindCSS
Nie możesz wybrać więcej, niż 25 tematów Tematy muszą się zaczynać od litery lub cyfry, mogą zawierać myślniki ('-') i mogą mieć do 35 znaków.

116 lines
4.6KB

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