import { Spinner } from "@medusajs/icons" import type { AuthTypes } from "@medusajs/types" import { Heading, InlineTip, Text } from "@medusajs/ui" import { useMemo, useState } from "react" import { Trans, useTranslation } from "react-i18next" import { Link, useLocation, useNavigate } from "react-router-dom" import AvatarBox from "../../components/common/logo-box/avatar-box" import { useAuthProviders } from "../../hooks/api" import { useExtension } from "../../providers/extension-provider" import { CloudAuthLogin } from "./components/cloud-auth-login" import { EmailPassLogin } from "./components/email-pass-login" import { MfaChallengeCard } from "./components/mfa-challenge-card" import { SsoLogin } from "./components/sso-login" import { hasEmailPassProvider } from "./utils" 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 { providers, isLoading: isProvidersLoading } = useAuthProviders() const providerList = useMemo(() => providers ?? [], [providers]) const isEmailPassInstalled = useMemo( () => hasEmailPassProvider(providerList), [providerList] ) const handleMfaChallenge = ( challenge: AuthTypes.AuthMfaChallengeDTO, onSuccess: (token: string) => void | Promise ) => { setMfaChallenge(challenge) setMfaSuccessHandler(() => onSuccess) } 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 })} {isProvidersLoading ? (
) : !providerList.length ? (
{t("auth.login.noProviders")}
) : ( isEmailPassInstalled && ( ) )} {getWidgets("login.after").map((Component, i) => { return })}
{isEmailPassInstalled && ( , ]} /> )}
) }