'use client'; import { useState, useEffect, useMemo } from 'react'; import { useRouter } from '@/i18n/navigation'; import { useForm } from 'react-hook-form'; import { zodResolver } from '@hookform/resolvers/zod'; import * as z from 'zod'; import { useTranslations } from 'next-intl'; import { Link } from '@/i18n/navigation'; import { Mail, Lock } from 'lucide-react'; import { useAuth } from '@/lib/hooks/useAuth'; import { getRememberedEmail } from '@/lib/auth/rememberMe'; import { Button } from '@/components/ui/shared/Button'; import { Input } from '@/components/ui/shared/Input'; import { TopBarControls } from '@/components/ui/shared/TopBarControls'; type LoginForm = { email: string; password: string; rememberMe: boolean; }; export default function LoginPage() { const t = useTranslations('auth'); const tCommon = useTranslations('common'); const tValidation = useTranslations('validation'); const { login, isLoading, user, isAuthReady } = useAuth(); const router = useRouter(); const [error, setError] = useState(null); const [savedEmail] = useState(() => getRememberedEmail()); const loginSchema = useMemo( () => z.object({ email: z.string().email(tValidation('emailInvalid')), password: z.string().min(1, tValidation('passwordRequired')), rememberMe: z.boolean(), }), [tValidation], ); useEffect(() => { if (isAuthReady && user) { router.push('/today'); } }, [user, isAuthReady, router]); const { register, handleSubmit, formState: { errors }, } = useForm({ resolver: zodResolver(loginSchema), defaultValues: { email: savedEmail, rememberMe: Boolean(savedEmail), }, }); const onSubmit = async (data: LoginForm) => { try { setError(null); await login(data.email, data.password, data.rememberMe); } catch (err: unknown) { const message = err instanceof Error ? err.message : t('invalidCredentials'); setError(message || t('invalidCredentials')); } }; if (!isAuthReady) { return (

{tCommon('loading')}

); } return (
{tCommon('appName')}

{t('signInTitle')}

{tCommon('or')}{' '} {t('startTrialLink')}

} /> } />
{t('forgotPassword')}
{error && (

{error}

)}
); }