import { useForm } from 'react-hook-form'; import { zodResolver } from '@hookform/resolvers/zod'; import { z } from 'zod'; import { useNavigate } from 'react-router-dom'; import { useAuthStore } from '../store/authStore'; import { formatErrorMessage } from '@/utils/apiErrorHandler'; import type { LoginRequest } from '@/services/api/auth'; import type { ApiError } from '@/types/api'; import { Input, Button } from '@veza/design-system'; import { logger } from '@/utils/logger'; const loginSchema = z.object({ email: z.string().email('Email invalide'), password: z.string().min(1, 'Le mot de passe est requis'), remember_me: z.boolean().optional(), }); type LoginFormData = z.infer; /** * LoginForm with Kōdō Design System * MIGRATED: Now using Kōdō Input and Button components */ export const LoginForm = () => { const navigate = useNavigate(); const { login: loginStore, isLoading, error } = useAuthStore(); const { register, handleSubmit, formState: { errors }, } = useForm({ resolver: zodResolver(loginSchema), defaultValues: { email: '', password: '', remember_me: false, }, }); const onSubmit = async (data: LoginFormData) => { try { const loginRequest: LoginRequest = { email: data.email, password: data.password, remember_me: data.remember_me || false, }; await loginStore(loginRequest); // Redirection après succès navigate('/dashboard'); } catch (err) { // L'erreur est déjà gérée par le store logger.error('Login error', { error: err instanceof Error ? err.message : String(err), stack: err instanceof Error ? err.stack : undefined, }); } }; return (

Connexion

{error && (
{formatErrorMessage(error as ApiError)}
)}
{errors.email && ( )}
{errors.password && ( )}
); };