import { type ReactNode } from "react"; import { useCurrentUser } from "../store/index.tsx"; import { AccountIssueView } from "./AccountIssueView.tsx"; import { AlreadyLoggedInView } from "./AlreadyLoggedInView.tsx"; import { FailureFallbackView } from "./FailureFallbackView.tsx"; import { LoadingView } from "./LoadingView.tsx"; import { LoginView } from "./LoginView.tsx"; import { NoConnectionView } from "./NoConnectionView.tsx"; import type { AuthEventHandler, DefaultFormValues } from "./types.ts"; import { useFetchCurrentUser } from "./useFetchCurrentUser.tsx"; import { UserMismatchView } from "./UserMismatchView.tsx"; export type LoginCardProps = { /** * A description that will appear in the default login case (i.e. when an * unauthenticated user is prompted to log in). * * This should reinforce to the user the benefits that they are going to * get by signing in. Every app has slightly different capabilities, so this * should be tailored for each individual app. */ description: ReactNode; /** * Default values for the login form. * * You might want to provide a value from history state or query param, so * that if a user jumps between multiple pages with email field, the email * address is maintained across these locations. */ defaultValues?: DefaultFormValues; /** * Called when the login action succeeds. * * If no handler is provided, the component will will navigate to the * dashboard (as determined by `appConfig.hrefs.dashboard()` return value), * or a location provided in `redirectTo` query param if it is a valid * local path. */ onLogin?: AuthEventHandler; }; /** * Allows the user to log into Indie Tabletop Club. * * Will automatically use the `redirectTo` query param value as the redirect * location after successful login. * * Otherwise, the user will be redirected to the app's dashboard. */ export function LoginCard(props: LoginCardProps) { const currentUser = useCurrentUser(); const { result, latestAttemptTs, reload } = useFetchCurrentUser(); return result.unpack( (serverUser) => { if (currentUser && currentUser.id !== serverUser.id) { return ( ); } return ; }, (failure) => { if (failure.type === "API_ERROR") { if (failure.code === 401) { return ( ); } if (failure.code === 404) { return ; } } if (failure.type === "NETWORK_ERROR") { return ( reload()} /> ); } return ; }, () => { return ; }, ); }