選択できるのは25トピックまでです。 トピックは、先頭が英数字で、英数字とダッシュ('-')を使用した35文字以内のものにしてください。

FirstPartOfRegistration.js 3.6KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. import React, { useEffect, useState } from "react";
  2. import PropTypes from "prop-types";
  3. import {
  4. FormContainer,
  5. RegisterDescription,
  6. } from "./FirstPartOfRegistration.styled";
  7. import { useFormik } from "formik";
  8. import * as Yup from "yup";
  9. import { useTranslation } from "react-i18next";
  10. import { TextField } from "../../../../components/TextFields/TextField/TextField";
  11. import { IconButton } from "../../../../components/Buttons/IconButton/IconButton";
  12. import { ReactComponent as VisibilityOn } from "../../../../assets/images/svg/eye.svg";
  13. import { ReactComponent as VisibilityOff } from "../../../../assets/images/svg/eye-striked.svg";
  14. import { PrimaryButton } from "../../../../components/Buttons/PrimaryButton/PrimaryButton";
  15. import selectedTheme from "../../../../themes";
  16. const FirstPartOfRegistration = (props) => {
  17. const [showPassword, setShowPassword] = useState(false);
  18. const [emailTakenStatus, setEmailTakenStatus] = useState(false);
  19. const { t } = useTranslation();
  20. useEffect(() => {
  21. console.log(props.error);
  22. if (props.error.length > 0) {
  23. setEmailTakenStatus(true);
  24. }
  25. }, [props.error]);
  26. const formik = useFormik({
  27. initialValues: {
  28. mail: "",
  29. password: "",
  30. },
  31. validationSchema: Yup.object().shape({
  32. mail: Yup.string().email().required(t("login.usernameRequired")),
  33. password: Yup.string().required(t("login.passwordRequired")).min(8),
  34. }),
  35. onSubmit: props.handleSubmit,
  36. validateOnBlur: true,
  37. enableReinitialize: true,
  38. });
  39. const handleClickShowPassword = () => {
  40. setShowPassword((prevState) => !prevState);
  41. };
  42. return (
  43. <FormContainer component="form" onSubmit={formik.handleSubmit}>
  44. <RegisterDescription component="p" variant="p">
  45. {t("register.descriptionFirst")}
  46. </RegisterDescription>
  47. <TextField
  48. name="mail"
  49. placeholder={t("common.labelEmail")}
  50. margin="normal"
  51. value={formik.values.mail}
  52. onChange={(value) =>
  53. formik.setFieldValue("mail", value.target.value)
  54. }
  55. error={(formik.touched.mail && Boolean(formik.errors.mail)) || emailTakenStatus}
  56. helperText={formik.touched.mail && formik.errors.mail}
  57. autoFocus
  58. fullWidth
  59. />
  60. <TextField
  61. name="password"
  62. placeholder={t("common.labelPassword")}
  63. margin="normal"
  64. type={showPassword ? "text" : "password"}
  65. value={formik.values.password}
  66. onChange={(value) =>
  67. formik.setFieldValue("password", value.target.value)
  68. }
  69. error={
  70. formik.touched.password &&
  71. Boolean(formik.errors.password)
  72. }
  73. helperText={
  74. formik.touched.password &&
  75. formik.errors.password
  76. }
  77. fullWidth
  78. InputProps={{
  79. endAdornment: (
  80. <IconButton onClick={handleClickShowPassword}>
  81. {showPassword ? <VisibilityOn /> : <VisibilityOff />}
  82. </IconButton>
  83. ),
  84. }}
  85. />
  86. <PrimaryButton
  87. type="submit"
  88. variant="contained"
  89. height="48px"
  90. fullWidth={true}
  91. buttoncolor={selectedTheme.primaryPurple}
  92. textcolor="white"
  93. disabled={
  94. formik.values.mail.length === 0 ||
  95. formik.values.password.length === 0 ||
  96. formik.values.mail === props.error
  97. }
  98. >
  99. {t("common.continue")}
  100. </PrimaryButton>
  101. </FormContainer>
  102. );
  103. };
  104. FirstPartOfRegistration.propTypes = {
  105. children: PropTypes.node,
  106. handleSubmit: PropTypes.func,
  107. error: PropTypes.string,
  108. };
  109. export default FirstPartOfRegistration;