import { useEffect } from 'react'; import { Navigate, useLocation, useNavigate } from 'react-router-dom'; import { useForm } from 'react-hook-form'; import { zodResolver } from '@hookform/resolvers/zod'; import { Gift, Loader2 } from 'lucide-react'; import { toast } from 'sonner'; import { loginSchema, type LoginInput } from '@family-wishlist/shared'; import { Button } from '@/components/ui/Button'; import { Input } from '@/components/ui/Input'; import { Label } from '@/components/ui/Label'; import { useAuthStore } from '@/features/auth/authStore'; import { ApiError } from '@/lib/api'; import { Footer } from '@/components/Layout/Footer'; export function LoginPage() { const { user, login } = useAuthStore(); const navigate = useNavigate(); const location = useLocation(); const from = (location.state as { from?: { pathname: string } } | null)?.from?.pathname ?? '/'; const { register, handleSubmit, formState: { errors, isSubmitting }, } = useForm({ resolver: zodResolver(loginSchema), defaultValues: { username: '', password: '' }, }); useEffect(() => { if (user) navigate(from, { replace: true }); }, [user, from, navigate]); if (user) return ; const submit = handleSubmit(async (values) => { try { await login(values.username, values.password); navigate(from, { replace: true }); } catch (err) { if (err instanceof ApiError) toast.error(err.message); else toast.error('Login failed'); } }); return (

Family Wishlist

Welcome back

Sign in to manage your wishlist. Credentials are set up via the server environment.

{errors.username && ( {errors.username.message} )}
{errors.password && ( {errors.password.message} )}
); }