import * as yup from "yup" import {ReactElement} from "react" import {useMutation} from "@tanstack/react-query" import {ServerUser} from "~/server-types" import {AxiosError} from "axios" import {verifyOTP} from "~/apis" import {useTranslation} from "react-i18next" import {useFormik} from "formik" import {parseFastAPIError} from "~/utils" import {MultiStepFormElement} from "~/components" import {Box, Button, Grid, InputAdornment, TextField, Typography} from "@mui/material" import {BsPhone, BsShieldLockFill} from "react-icons/bs" import {LoadingButton} from "@mui/lab" import {MdChevronRight} from "react-icons/md" import {useErrorSuccessSnacks} from "~/hooks" import {Link as RouterLink} from "react-router-dom" interface Form { code: string } export interface OTPFormProps { corsToken: string onConfirm: (user: ServerUser) => void onCodeUnavailable: () => void } export default function OTPForm({ corsToken, onConfirm, onCodeUnavailable, }: OTPFormProps): ReactElement { const {t} = useTranslation() const {showError} = useErrorSuccessSnacks() const {mutateAsync} = useMutation( code => verifyOTP({ code, corsToken, }), { onSuccess: onConfirm, onError: error => { if (error.response?.status === 410 || error.response?.status === 404) { showError(t("routes.LoginRoute.forms.otp.unavailable").toString()) onCodeUnavailable() } }, }, ) const schema = yup.object().shape({ code: yup.string().required().label(t("routes.LoginRoute.forms.otp.code.label")), }) const formik = useFormik
({ validationSchema: schema, initialValues: { code: "", }, onSubmit: async (values, {setErrors}) => { try { await mutateAsync(values.code) // await mutateAsync(values) } catch (error) { const errors = parseFastAPIError(error as AxiosError) setErrors({code: errors.detail}) } }, }) return ( {t("routes.LoginRoute.forms.otp.title")} {t("routes.LoginRoute.forms.otp.description")} ), }} /> } > {t("routes.LoginRoute.forms.otp.submit")}
) }