import { Formik, FormikHelpers } from 'formik'; import React, { useContext, useEffect, useRef, useState } from 'react'; import { Button, Col, Form, FormControl } from 'react-bootstrap'; import * as Yup from 'yup'; import constants from 'utils/strings/constants'; import SubmitButton from 'components/SubmitButton'; import router from 'next/router'; import { changeEmail, getOTTForEmailChange } from 'services/userService'; import styled from 'styled-components'; import { AppContext, FLASH_MESSAGE_TYPE } from 'pages/_app'; import { getData, LS_KEYS, setData } from 'utils/storage/localStorage'; interface formValues { email: string; ott?: string; } const EmailRow = styled.div` display: flex; flex-wrap: wrap; border: 1px solid grey; margin-bottom: 19px; align-items: center; text-align: left; color: #fff; `; interface Props { showMessage: (value: boolean) => void; setEmail: (email: string) => void; } function ChangeEmailForm(props: Props) { const [loading, setLoading] = useState(false); const [ottInputVisible, setShowOttInputVisibility] = useState(false); const emailInputElement = useRef(null); const ottInputRef = useRef(null); const appContext = useContext(AppContext); useEffect(() => { setTimeout(() => { emailInputElement.current?.focus(); }, 250); }, []); useEffect(() => { if (!ottInputVisible) { props.showMessage(false); } }, [ottInputVisible]); const requestOTT = async ( { email }: formValues, { setFieldError }: FormikHelpers ) => { try { setLoading(true); await getOTTForEmailChange(email); props.setEmail(email); setShowOttInputVisibility(true); props.showMessage(true); setTimeout(() => { ottInputRef.current?.focus(); }, 250); } catch (e) { setFieldError('email', `${constants.EMAIl_ALREADY_OWNED}`); } setLoading(false); }; const requestEmailChange = async ( { email, ott }: formValues, { setFieldError }: FormikHelpers ) => { try { setLoading(true); await changeEmail(email, ott); setData(LS_KEYS.USER, { ...getData(LS_KEYS.USER), email }); appContext.setDisappearingFlashMessage({ message: constants.EMAIL_UDPATE_SUCCESSFUL, type: FLASH_MESSAGE_TYPE.SUCCESS, }); router.push('/gallery'); } catch (e) { setFieldError('ott', `${constants.INCORRECT_CODE}`); } setLoading(false); }; return ( initialValues={{ email: '' }} validationSchema={Yup.object().shape({ email: Yup.string() .email(constants.EMAIL_ERROR) .required(constants.REQUIRED), })} validateOnChange={false} validateOnBlur={false} onSubmit={!ottInputVisible ? requestOTT : requestEmailChange}> {({ values, errors, touched, handleChange, handleSubmit }) => (
{!ottInputVisible ? ( {errors.email} ) : ( <> {values.email} {errors.ott} )}
)} ); } export default ChangeEmailForm;