"use client"; import { standardSchemaResolver } from "@hookform/resolvers/standard-schema"; import { memo, useCallback, useEffect, useState } from "react"; import { useForm } from "react-hook-form"; import { passwordSchema } from "@turbostarter/auth"; import { useTranslation } from "@turbostarter/i18n"; import { Button } from "@turbostarter/ui-web/button"; import { Form, FormControl, FormField, FormItem, FormLabel, FormMessage, } from "@turbostarter/ui-web/form"; import { Icons } from "@turbostarter/ui-web/icons"; import { PasswordInput } from "@turbostarter/ui-web/input"; import { Modal, ModalClose, ModalContent, ModalDescription, ModalFooter, ModalHeader, ModalTitle, ModalTrigger, } from "@turbostarter/ui-web/modal"; import { onPromise } from "~/utils"; import type { PasswordPayload } from "@turbostarter/auth"; import type { ComponentProps } from "react"; import type { UseFormReturn } from "react-hook-form"; interface PasswordFormProps { readonly form: UseFormReturn; readonly onSubmit: (data: PasswordPayload) => Promise; readonly children: React.ReactNode; } const PasswordForm = memo(({ form, onSubmit, children }) => { const { t } = useTranslation(["common", "auth"]); return (
( {t("password")} )} /> {children} ); }); PasswordForm.displayName = "PasswordForm"; interface RequirePasswordProps extends ComponentProps { readonly title?: string; readonly description?: string; readonly cta?: string; readonly onConfirm: (data: PasswordPayload) => Promise; } export const RequirePassword = memo( ({ title, description, onConfirm, cta, children, open: _open, onOpenChange: _onOpenChange, ...props }) => { const [open, setOpen] = useState(_open ?? false); const { t } = useTranslation(["common", "auth"]); const form = useForm({ resolver: standardSchemaResolver(passwordSchema), defaultValues: { password: "", }, }); const onSubmit = async (data: PasswordPayload) => { try { if (document.activeElement && "blur" in document.activeElement) { (document.activeElement as HTMLElement).blur(); } await onConfirm(data); form.reset(); setOpen(false); } catch (error) { setTimeout(() => form.setFocus("password"), 0); throw error; } }; const onOpenChange = useCallback( (open: boolean) => { setOpen(open); _onOpenChange?.(open); }, [_onOpenChange, setOpen], ); useEffect(() => { setOpen(_open ?? false); }, [_open]); return ( {children} {title ?? t("account.password.require.title")} {description ?? t("account.password.require.description")} ); }, ); RequirePassword.displayName = "RequirePassword";