import { zodResolver } from "@hookform/resolvers/zod" import type { AuthTypes } from "@medusajs/types" import { Alert, Button, Heading, Hint, Input, Text } from "@medusajs/ui" import { useState } from "react" import { useForm } from "react-hook-form" import { Trans, useTranslation } from "react-i18next" import { Link, useLocation, useNavigate } from "react-router-dom" import * as z from "zod" import { Form } from "../../components/common/form" import AvatarBox from "../../components/common/logo-box/avatar-box" import { useSignInWithEmailPass } from "../../hooks/api" import { isFetchError } from "../../lib/is-fetch-error" import { useExtension } from "../../providers/extension-provider" import { CloudAuthLogin } from "./components/cloud-auth-login" import { MfaChallengeCard } from "./components/mfa-challenge-card" const LoginSchema = z.object({ email: z.string().email(), password: z.string(), }) export const Login = () => { const { t } = useTranslation() const location = useLocation() const navigate = useNavigate() const { getWidgets } = useExtension() const [mfaChallenge, setMfaChallenge] = useState(null) const [mfaSuccessHandler, setMfaSuccessHandler] = useState< ((token: string) => void | Promise) | null >(null) const from = location.state?.from?.pathname || "/orders" const form = useForm>({ resolver: zodResolver(LoginSchema), defaultValues: { email: "", password: "", }, }) const { mutateAsync, isPending } = useSignInWithEmailPass() const handleSubmit = form.handleSubmit(async ({ email, password }) => { await mutateAsync( { email, password, }, { onError: (error) => { if (isFetchError(error)) { if (error.status === 401) { form.setError("email", { type: "manual", message: error.message, }) return } } form.setError("root.serverError", { type: "manual", message: error.message, }) }, onSuccess: (result) => { if (typeof result === "object" && "mfa_challenge" in result) { setMfaChallenge(result.mfa_challenge) setMfaSuccessHandler(() => () => { navigate(from, { replace: true }) }) return } navigate(from, { replace: true }) }, } ) }) const serverError = form.formState.errors?.root?.serverError?.message const validationError = form.formState.errors.email?.message || form.formState.errors.password?.message if (mfaChallenge) { return (
{ if (mfaSuccessHandler) { return mfaSuccessHandler(token) } navigate(from, { replace: true }) }} onBack={() => { setMfaChallenge(null) setMfaSuccessHandler(null) }} />
) } return (
{t("login.title")} {t("login.hint")}
{getWidgets("login.before").map((Component, i) => { return })}
{ return ( ) }} /> { return ( {} ) }} />
{validationError && (
{validationError}
)} {serverError && ( {serverError} )}
{getWidgets("login.after").map((Component, i) => { return })} { setMfaChallenge(challenge) setMfaSuccessHandler(() => onSuccess) }} />
, ]} />
) }