import { changeEmail, sendOTTForEmailChange } from "@/accounts/api/user"; import { ensure } from "@/utils/ensure"; import { wait } from "@/utils/promise"; import { VerticallyCentered } from "@ente/shared/components/Container"; import FormPaper from "@ente/shared/components/Form/FormPaper"; import FormPaperFooter from "@ente/shared/components/Form/FormPaper/Footer"; import FormPaperTitle from "@ente/shared/components/Form/FormPaper/Title"; import LinkButton from "@ente/shared/components/LinkButton"; import SubmitButton from "@ente/shared/components/SubmitButton"; import { LS_KEYS, getData, setLSUser } from "@ente/shared/storage/localStorage"; import { Alert, Box, TextField } from "@mui/material"; import { Formik, type FormikHelpers } from "formik"; import { t } from "i18next"; import { useRouter } from "next/router"; import { useEffect, useState } from "react"; import { Trans } from "react-i18next"; import * as Yup from "yup"; import { appHomeRoute } from "../services/redirect"; import type { PageProps } from "../types/page"; const Page: React.FC = () => { const router = useRouter(); useEffect(() => { const user = getData(LS_KEYS.USER); if (!user?.token) { router.push("/"); } }, []); return ( {t("CHANGE_EMAIL")} ); }; export default Page; interface formValues { email: string; ott?: string; } const ChangeEmailForm: React.FC = () => { const [loading, setLoading] = useState(false); const [ottInputVisible, setShowOttInputVisibility] = useState(false); const [email, setEmail] = useState(null); const [showMessage, setShowMessage] = useState(false); const [success, setSuccess] = useState(false); const router = useRouter(); const requestOTT = async ( { email }: formValues, { setFieldError }: FormikHelpers, ) => { try { setLoading(true); await sendOTTForEmailChange(email); setEmail(email); setShowOttInputVisibility(true); setShowMessage(true); // TODO: What was this meant to focus on? The ref referred to an // Form element that was removed. Is this still needed. // setTimeout(() => { // ottInputRef.current?.focus(); // }, 250); } catch (e) { setFieldError("email", t("EMAIl_ALREADY_OWNED")); } setLoading(false); }; const requestEmailChange = async ( { email, ott }: formValues, { setFieldError }: FormikHelpers, ) => { try { setLoading(true); await changeEmail(email, ensure(ott)); await setLSUser({ ...getData(LS_KEYS.USER), email }); setLoading(false); setSuccess(true); await wait(1000); goToApp(); } catch (e) { setLoading(false); setFieldError("ott", t("INCORRECT_CODE")); } }; const goToApp = () => router.push(appHomeRoute); return ( initialValues={{ email: "" }} validationSchema={ ottInputVisible ? Yup.object().shape({ email: Yup.string() .email(t("EMAIL_ERROR")) .required(t("REQUIRED")), ott: Yup.string().required(t("REQUIRED")), }) : Yup.object().shape({ email: Yup.string() .email(t("EMAIL_ERROR")) .required(t("REQUIRED")), }) } validateOnChange={false} validateOnBlur={false} onSubmit={!ottInputVisible ? requestOTT : requestEmailChange} > {({ values, errors, handleChange, handleSubmit }) => ( <> {showMessage && ( setShowMessage(false)} > ), }} values={{ email }} /> )}
{ottInputVisible && ( )}
{ottInputVisible && ( setShowOttInputVisibility(false)} > {t("CHANGE_EMAIL")}? )} {t("GO_BACK")} )} ); };