import { useState } from 'preact/hooks'; import { ArrowLeft, Eye, EyeOff, KeyRound, LogIn, LogOut, Unlock, UserPlus } from 'lucide-preact'; import NetworkStatusBadge from '@/components/NetworkStatusBadge'; import StandalonePageFrame from '@/components/StandalonePageFrame'; import { t } from '@/lib/i18n'; interface LoginValues { email: string; password: string; } interface RegisterValues { name: string; email: string; password: string; password2: string; passwordHint: string; inviteCode: string; } interface AuthViewsProps { mode: 'login' | 'register' | 'locked'; relaxedLoginInput?: boolean; authPlaceholder?: string; unlockPlaceholder?: string; pendingAction: 'login' | 'passkey' | 'register' | 'unlock' | null; unlockReady: boolean; unlockPreparing: boolean; loginValues: LoginValues; pendingPasskeyPasswordEmail?: string | null; passkeyPassword: string; registerValues: RegisterValues; registrationInviteRequired?: boolean; unlockPassword: string; emailForLock: string; loginHintLoading: boolean; onChangeLogin: (next: LoginValues) => void; onChangePasskeyPassword: (password: string) => void; onChangeRegister: (next: RegisterValues) => void; onChangeUnlock: (password: string) => void; onSubmitLogin: () => void; onSubmitPasskey: () => void; onSubmitPasskeyPassword: () => void; onSubmitRegister: () => void; onSubmitUnlock: () => void; onGotoLogin: () => void; onGotoRegister: () => void; onLogout: () => void; onTogglePasswordHint: () => void; onShowLockedPasswordHint: () => void; } function PasswordField(props: { label: string; value: string; onInput: (v: string) => void; autoFocus?: boolean; autoComplete?: string; placeholder?: string; }) { const [show, setShow] = useState(false); return ( ); } export default function AuthViews(props: AuthViewsProps) { const loginBusy = props.pendingAction === 'login'; const passkeyBusy = props.pendingAction === 'passkey'; const registerBusy = props.pendingAction === 'register'; const unlockBusy = props.pendingAction === 'unlock'; const passkeyPasswordPending = !!props.pendingPasskeyPasswordEmail; const showInviteCodeField = props.registrationInviteRequired !== false || !!props.registerValues.inviteCode.trim(); if (props.mode === 'locked') { return (
}>
{ e.preventDefault(); props.onSubmitUnlock(); }} >

{props.emailForLock}

{props.unlockPreparing ? (

{t('txt_loading')}

) : null}
{t('txt_or')}
); } if (props.mode === 'register') { return (
}>
{ e.preventDefault(); props.onSubmitRegister(); }} > props.onChangeRegister({ ...props.registerValues, password: v })} /> props.onChangeRegister({ ...props.registerValues, password2: v })} /> {showInviteCodeField ? ( ) : null}
{t('txt_or')}
); } return (
}>
{ e.preventDefault(); if (passkeyPasswordPending) { props.onSubmitPasskeyPassword(); return; } props.onSubmitLogin(); }} > {passkeyPasswordPending ? ( <>

{props.pendingPasskeyPasswordEmail}

{t('txt_or')}
) : ( <> props.onChangeLogin({ ...props.loginValues, password: v })} />
{t('txt_or')}
{t('txt_or')}
)}
); }