import { ensure } from "@/utils/ensure"; import { wait } from "@/utils/promise"; import { changeEmail, sendOTTForEmailChange } from "@ente/accounts/api/user"; import { APP_HOMES } from "@ente/shared/apps/constants"; import type { PageProps } from "@ente/shared/apps/types"; import { VerticallyCentered } from "@ente/shared/components/Container"; import FormPaperFooter from "@ente/shared/components/Form/FormPaper/Footer"; import LinkButton from "@ente/shared/components/LinkButton"; import SubmitButton from "@ente/shared/components/SubmitButton"; import { LS_KEYS, getData, setData } 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 { useRef, useState } from "react"; import { Trans } from "react-i18next"; import OtpInput from "react-otp-input"; import * as Yup from "yup"; interface formValues { email: string; ott?: string; } function ChangeEmailForm({ appName }: PageProps) { const [loading, setLoading] = useState(false); const [ottInputVisible, setShowOttInputVisibility] = useState(false); const ottInputRef = useRef(null); 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); 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)); setData(LS_KEYS.USER, { ...getData(LS_KEYS.USER), email }); setLoading(false); setSuccess(true); await wait(1000); goToApp(); } catch (e) { setLoading(false); setFieldError("ott", t("INCORRECT_CODE")); } }; const goToApp = () => { // TODO: Refactor the type of APP_HOMES to not require the ?? router.push(APP_HOMES.get(appName) ?? "/"); }; 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")} )} ); } export default ChangeEmailForm;