'use client'; import React, { useState, useRef } from 'react'; import { useRouter } from 'next/navigation'; import { Card } from 'primereact/card'; import { Button } from 'primereact/button'; import { InputText } from 'primereact/inputtext'; import { InputTextarea } from 'primereact/inputtextarea'; import { Toast } from 'primereact/toast'; import { Message } from 'primereact/message'; import { Divider } from 'primereact/divider'; import { Checkbox } from 'primereact/checkbox'; import { clientService } from '../../../../services/api'; import type { Client } from '../../../../types/btp'; const NouveauClientPage = () => { const router = useRouter(); const toast = useRef(null); const [loading, setLoading] = useState(false); const [submitted, setSubmitted] = useState(false); const [client, setClient] = useState({ id: '', nom: '', prenom: '', entreprise: '', email: '', telephone: '', adresse: '', codePostal: '', ville: '', numeroTVA: '', siret: '', actif: true }); const [errors, setErrors] = useState>({}); const validateForm = () => { const newErrors: Record = {}; if (!client.nom.trim()) { newErrors.nom = 'Le nom est obligatoire'; } if (!client.prenom.trim()) { newErrors.prenom = 'Le prénom est obligatoire'; } if (client.email && !/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(client.email)) { newErrors.email = 'Format d\'email invalide'; } if (client.codePostal && !/^\d{5}$/.test(client.codePostal)) { newErrors.codePostal = 'Le code postal doit contenir 5 chiffres'; } if (client.siret && !/^\d{14}$/.test(client.siret.replace(/\s/g, ''))) { newErrors.siret = 'Le SIRET doit contenir 14 chiffres'; } if (client.numeroTVA && !/^[A-Z]{2}\d{11}$/.test(client.numeroTVA.replace(/\s/g, ''))) { newErrors.numeroTVA = 'Format de TVA invalide (ex: FR12345678901)'; } setErrors(newErrors); return Object.keys(newErrors).length === 0; }; const handleSubmit = async (e: React.FormEvent) => { e.preventDefault(); setSubmitted(true); if (!validateForm()) { toast.current?.show({ severity: 'error', summary: 'Erreur', detail: 'Veuillez corriger les erreurs du formulaire', life: 3000 }); return; } setLoading(true); try { await clientService.create(client); toast.current?.show({ severity: 'success', summary: 'Succès', detail: 'Client créé avec succès', life: 3000 }); setTimeout(() => { router.push('/clients'); }, 1000); } catch (error: any) { console.error('Erreur lors de la création:', error); // Extraire le message d'erreur du backend let errorMessage = 'Impossible de créer le client'; if (error.response?.data?.message) { errorMessage = error.response.data.message; } else if (error.response?.data?.error) { errorMessage = error.response.data.error; } else if (error.response?.data) { errorMessage = JSON.stringify(error.response.data); } else if (error.response?.status === 400) { errorMessage = 'Données invalides. Vérifiez que tous les champs obligatoires sont remplis correctement.'; } toast.current?.show({ severity: 'error', summary: 'Erreur', detail: errorMessage, life: 5000 }); } finally { setLoading(false); } }; const handleCancel = () => { router.push('/clients'); }; const onInputChange = (e: React.ChangeEvent, name: string) => { const val = (e.target && e.target.value) || ''; let _client = { ...client }; (_client as any)[name] = val; setClient(_client); // Clear error when user starts typing if (errors[name]) { const newErrors = { ...errors }; delete newErrors[name]; setErrors(newErrors); } }; const onCheckboxChange = (e: any) => { setClient(prev => ({ ...prev, actif: e.checked })); }; return (

Nouveau Client

{/* Informations personnelles */}

Informations personnelles

onInputChange(e, 'nom')} className={errors.nom ? 'p-invalid' : ''} placeholder="Nom du client" /> {errors.nom && {errors.nom}}
onInputChange(e, 'prenom')} className={errors.prenom ? 'p-invalid' : ''} placeholder="Prénom du client" /> {errors.prenom && {errors.prenom}}
onInputChange(e, 'entreprise')} placeholder="Nom de l'entreprise" />
{/* Contact */}

Contact

onInputChange(e, 'email')} type="email" className={errors.email ? 'p-invalid' : ''} placeholder="email@exemple.com" /> {errors.email && {errors.email}}
onInputChange(e, 'telephone')} placeholder="01 23 45 67 89" />
{/* Adresse */}

Adresse

onInputChange(e, 'adresse')} rows={3} placeholder="Adresse complète" />
onInputChange(e, 'codePostal')} className={errors.codePostal ? 'p-invalid' : ''} placeholder="75000" /> {errors.codePostal && {errors.codePostal}}
onInputChange(e, 'ville')} placeholder="Ville" />
{/* Informations légales */}

Informations légales

onInputChange(e, 'numeroTVA')} className={errors.numeroTVA ? 'p-invalid' : ''} placeholder="FR12345678901" /> {errors.numeroTVA && {errors.numeroTVA}}
onInputChange(e, 'siret')} className={errors.siret ? 'p-invalid' : ''} placeholder="12345678901234" /> {errors.siret && {errors.siret}}
{/* Statut */}

Statut

Un client inactif n'apparaîtra pas dans les listes de sélection
{/* Boutons */}
); }; export default NouveauClientPage;