update change email form

This commit is contained in:
Abhinav 2022-05-20 19:26:21 +05:30
parent 7a64c45fd1
commit 8ef740e02e
3 changed files with 48 additions and 59 deletions

View file

@ -1,5 +1,5 @@
import { Formik, FormikHelpers } from 'formik'; import { Formik, FormikHelpers } from 'formik';
import React, { useContext, useEffect, useRef, useState } from 'react'; import React, { useContext, useRef, useState } from 'react';
import * as Yup from 'yup'; import * as Yup from 'yup';
import constants from 'utils/strings/constants'; import constants from 'utils/strings/constants';
import SubmitButton from 'components/SubmitButton'; import SubmitButton from 'components/SubmitButton';
@ -8,30 +8,24 @@ import { changeEmail, getOTTForEmailChange } from 'services/userService';
import { AppContext, FLASH_MESSAGE_TYPE } from 'pages/_app'; import { AppContext, FLASH_MESSAGE_TYPE } from 'pages/_app';
import { getData, LS_KEYS, setData } from 'utils/storage/localStorage'; import { getData, LS_KEYS, setData } from 'utils/storage/localStorage';
import { PAGES } from 'constants/pages'; import { PAGES } from 'constants/pages';
import { TextField } from '@mui/material'; import { Divider, TextField } from '@mui/material';
import Container from './Container'; import Container from './Container';
import LinkButton from './pages/gallery/LinkButton'; import LinkButton from './pages/gallery/LinkButton';
import { Alert } from 'react-bootstrap';
import FormPaperFooter from './Form/FormPaper/Footer';
interface formValues { interface formValues {
email: string; email: string;
ott?: string; ott?: string;
} }
interface Props { function ChangeEmailForm() {
showMessage: (value: boolean) => void;
setEmail: (email: string) => void;
}
function ChangeEmailForm(props: Props) {
const [loading, setLoading] = useState(false); const [loading, setLoading] = useState(false);
const [ottInputVisible, setShowOttInputVisibility] = useState(false); const [ottInputVisible, setShowOttInputVisibility] = useState(false);
const ottInputRef = useRef(null); const ottInputRef = useRef(null);
const appContext = useContext(AppContext); const appContext = useContext(AppContext);
const [email, setEmail] = useState(null);
useEffect(() => { const [showMessage, setShowMessage] = useState(false);
if (!ottInputVisible) {
props.showMessage(false);
}
}, [ottInputVisible]);
const requestOTT = async ( const requestOTT = async (
{ email }: formValues, { email }: formValues,
@ -40,9 +34,9 @@ function ChangeEmailForm(props: Props) {
try { try {
setLoading(true); setLoading(true);
await getOTTForEmailChange(email); await getOTTForEmailChange(email);
props.setEmail(email); setEmail(email);
setShowOttInputVisibility(true); setShowOttInputVisibility(true);
props.showMessage(true); setShowMessage(true);
setTimeout(() => { setTimeout(() => {
ottInputRef.current?.focus(); ottInputRef.current?.focus();
}, 250); }, 250);
@ -71,6 +65,8 @@ function ChangeEmailForm(props: Props) {
setLoading(false); setLoading(false);
}; };
const goToGallery = () => router.push(PAGES.GALLERY);
return ( return (
<Formik<formValues> <Formik<formValues>
initialValues={{ email: '' }} initialValues={{ email: '' }}
@ -84,6 +80,15 @@ function ChangeEmailForm(props: Props) {
onSubmit={!ottInputVisible ? requestOTT : requestEmailChange}> onSubmit={!ottInputVisible ? requestOTT : requestEmailChange}>
{({ values, errors, handleChange, handleSubmit }) => ( {({ values, errors, handleChange, handleSubmit }) => (
<> <>
<Alert
variant="success"
show={showMessage}
style={{ paddingBottom: 0 }}
transition
dismissible
onClose={() => setShowMessage(false)}>
{constants.EMAIL_SENT({ email })}
</Alert>
<form <form
noValidate noValidate
style={{ width: '100%' }} style={{ width: '100%' }}
@ -117,6 +122,7 @@ function ChangeEmailForm(props: Props) {
/> />
)} )}
<SubmitButton <SubmitButton
sx={{ mt: 2 }}
loading={loading} loading={loading}
buttonText={ buttonText={
!ottInputVisible !ottInputVisible
@ -126,12 +132,23 @@ function ChangeEmailForm(props: Props) {
/> />
</Container> </Container>
</form> </form>
{ottInputVisible && ( <Divider />
<LinkButton <FormPaperFooter
onClick={() => setShowOttInputVisibility(false)}> style={{
{constants.CHANGE_EMAIL}? justifyContent: ottInputVisible && 'space-between',
}}>
{ottInputVisible && (
<LinkButton
onClick={() =>
setShowOttInputVisibility(false)
}>
{constants.CHANGE_EMAIL}?
</LinkButton>
)}
<LinkButton onClick={goToGallery}>
{constants.GO_BACK}
</LinkButton> </LinkButton>
)} </FormPaperFooter>
</> </>
)} )}
</Formik> </Formik>

View file

@ -3,6 +3,7 @@ import { Paper, styled } from '@mui/material';
const FormPaper = styled(Paper)(({ theme }) => ({ const FormPaper = styled(Paper)(({ theme }) => ({
padding: theme.spacing(4, 2), padding: theme.spacing(4, 2),
maxWidth: '360px', maxWidth: '360px',
width: '100%',
textAlign: 'left', textAlign: 'left',
})); }));
export default FormPaper; export default FormPaper;

View file

@ -1,20 +1,15 @@
import VerticallyCentered from 'components/Container'; import VerticallyCentered from 'components/Container';
import LogoImg from 'components/LogoImg'; import LogoImg from 'components/LogoImg';
import React, { useEffect, useState } from 'react'; import React, { useEffect } from 'react';
import { Alert } from 'react-bootstrap';
import constants from 'utils/strings/constants'; import constants from 'utils/strings/constants';
import router from 'next/router'; import router from 'next/router';
import ChangeEmailForm from 'components/ChangeEmail'; import ChangeEmailForm from 'components/ChangeEmail';
import { PAGES } from 'constants/pages'; import { PAGES } from 'constants/pages';
import { getData, LS_KEYS } from 'utils/storage/localStorage'; import { getData, LS_KEYS } from 'utils/storage/localStorage';
import { Box, Card, CardContent } from '@mui/material'; import { Box } from '@mui/material';
import LinkButton from 'components/pages/gallery/LinkButton'; import FormPaper from 'components/Form/FormPaper';
function ChangeEmailPage() { function ChangeEmailPage() {
const [email, setEmail] = useState(null);
const [showMessage, setShowMessage] = useState(false);
const [showBigDialog, setShowBigDialog] = useState(false);
useEffect(() => { useEffect(() => {
const user = getData(LS_KEYS.USER); const user = getData(LS_KEYS.USER);
if (!user?.token) { if (!user?.token) {
@ -22,39 +17,15 @@ function ChangeEmailPage() {
} }
}, []); }, []);
const goToGallery = () => router.push(PAGES.GALLERY);
return ( return (
<VerticallyCentered> <VerticallyCentered>
<Card sx={{ minWidth: showBigDialog ? '460px' : '320px' }}> <FormPaper>
<CardContent> <Box mb={2}>
<VerticallyCentered disableGutters sx={{ py: 2 }}> <LogoImg src="/icon.svg" />
<Box mb={2}> {constants.CHANGE_EMAIL}
<LogoImg src="/icon.svg" /> </Box>
{constants.CHANGE_EMAIL} <ChangeEmailForm />
</Box> </FormPaper>
<Alert
variant="success"
show={showMessage}
style={{ paddingBottom: 0 }}
transition
dismissible
onClose={() => setShowMessage(false)}>
{constants.EMAIL_SENT({ email })}
</Alert>
<ChangeEmailForm
showMessage={(value) => {
setShowMessage(value);
setShowBigDialog(value);
}}
setEmail={setEmail}
/>
<LinkButton onClick={goToGallery}>
{constants.GO_BACK}
</LinkButton>
</VerticallyCentered>
</CardContent>
</Card>
</VerticallyCentered> </VerticallyCentered>
); );
} }