import { zodResolver } from "@hookform/resolvers/zod" import { Alert, Button, Heading, Hint, Input, Text } from "@medusajs/ui" 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" 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 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: () => { navigate(from, { replace: true }) }, } ) }) const serverError = form.formState.errors?.root?.serverError?.message const validationError = form.formState.errors.email?.message || form.formState.errors.password?.message return (
{t("login.title")} {t("login.hint")}
{getWidgets("login.before").map((Component, i) => { return })}
{ return ( ) }} /> { return ( {} ) }} />
{validationError && (
{validationError}
)} {serverError && ( {serverError} )}
{[...getWidgets("login.after"), CloudAuthLogin].map( (Component, i) => { return } )}
, ]} />
) }