import type { FormEvent, ReactNode } from "react"; import { Alert, AlertDescription, AlertIcon, Button, FormControl, FormLabel, Input, Spinner, Stack, Text } from "@chakra-ui/react"; import type { PasswordResetMode, PasswordResetTokenState } from "./types"; type PasswordResetRequestTexts = { emailLabel: string; submitLabel: string; requestSentMessage: string; }; type PasswordResetRequestFormProps = { texts: PasswordResetRequestTexts; helperText: ReactNode; loading?: boolean; requestSent?: boolean; onSubmit: (values: { email: string }) => void | Promise; emailPlaceholder?: string; }; type PasswordResetConfirmTexts = { loadingLabel: string; passwordLabel: string; passwordConfirmLabel: string; invalidLinkLabel: string; resetSubmitLabel: string; createSubmitLabel: string; resetSuccessLabel: string; createSuccessLabel: string; }; type PasswordResetConfirmFormProps = { texts: PasswordResetConfirmTexts; tokenState: PasswordResetTokenState; loading?: boolean; completedMode?: PasswordResetMode | null; onSubmit: (values: { password: string; passwordConfirm: string }) => void | Promise; }; export function PasswordResetRequestForm({ texts, helperText, loading = false, requestSent = false, onSubmit, emailPlaceholder = "you@example.com" }: PasswordResetRequestFormProps) { function handleSubmit(event: FormEvent) { event.preventDefault(); const form = new FormData(event.currentTarget); void onSubmit({ email: String(form.get("email") ?? "") }); } return ( {requestSent ? ( {texts.requestSentMessage} ) : null}
{texts.emailLabel} {helperText}
); } export function PasswordResetConfirmForm({ texts, tokenState, loading = false, completedMode = null, onSubmit }: PasswordResetConfirmFormProps) { function handleSubmit(event: FormEvent) { event.preventDefault(); const form = new FormData(event.currentTarget); void onSubmit({ password: String(form.get("password") ?? ""), passwordConfirm: String(form.get("passwordConfirm") ?? "") }); } if (tokenState.status === "loading") { return ( {texts.loadingLabel} ); } if (tokenState.status === "invalid") { return ( {tokenState.error || texts.invalidLinkLabel} ); } if (completedMode !== null) { return ( {completedMode === "create" ? texts.createSuccessLabel : texts.resetSuccessLabel} ); } return ( {tokenState.email}
{texts.passwordLabel} {texts.passwordConfirmLabel}
); }