'use client'; export const dynamic = 'force-dynamic'; 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 { InputNumber } from 'primereact/inputnumber'; import { Dropdown } from 'primereact/dropdown'; import { Calendar } from 'primereact/calendar'; import { InputTextarea } from 'primereact/inputtextarea'; import { Toast } from 'primereact/toast'; import { materielService } from '../../../../services/api'; import { TypeMateriel, StatutMateriel } from '../../../../types/btp'; import { useApiCall } from '../../../../hooks/useApiCall'; const NouveauMaterielPage = () => { const router = useRouter(); const [materiel, setMateriel] = useState({ nom: '', marque: '', modele: '', numeroSerie: '', type: '' as TypeMateriel, description: '', dateAchat: null as Date | null, valeurAchat: 0, valeurActuelle: 0, statut: StatutMateriel.DISPONIBLE, localisation: '', proprietaire: '', quantiteStock: 0, seuilMinimum: 0, unite: 'unité', actif: true }); const [submitted, setSubmitted] = useState(false); // Utilisation du hook pour la création de matériel avec gestion d'erreurs automatique const createMaterielCall = useApiCall( (data: any) => materielService.create(data), { showSuccessToast: true, successMessage: 'Matériel créé avec succès', retryAttempts: 2, retryDelay: 2000, onSuccess: () => { // Rediriger vers la liste après succès setTimeout(() => { router.push('/materiels'); }, 2000); } } ); const typeOptions = Object.values(TypeMateriel).map(type => ({ label: type.replace('_', ' '), value: type })); const statutOptions = Object.values(StatutMateriel).map(statut => ({ label: statut.replace('_', ' '), value: statut })); const onInputChange = (e: React.ChangeEvent, name: string) => { const val = (e.target && e.target.value) || ''; setMateriel(prev => ({ ...prev, [name]: val })); }; const onInputNumberChange = (value: number | null, name: string) => { setMateriel(prev => ({ ...prev, [name]: value || 0 })); }; const onDropdownChange = (e: any, name: string) => { setMateriel(prev => ({ ...prev, [name]: e.value })); }; const onDateChange = (e: any, name: string) => { setMateriel(prev => ({ ...prev, [name]: e.value })); }; const saveMateriel = async () => { setSubmitted(true); if (materiel.nom?.trim() && materiel.type) { await createMaterielCall.execute(materiel); } }; const annuler = () => { router.back(); }; return (

Nouveau Matériel

onInputChange(e, 'nom')} required autoFocus className={submitted && !materiel.nom ? 'p-invalid' : ''} /> {submitted && !materiel.nom && Le nom est obligatoire.}
onDropdownChange(e, 'type')} options={typeOptions} placeholder="Sélectionner un type" className={submitted && !materiel.type ? 'p-invalid' : ''} /> {submitted && !materiel.type && Le type est obligatoire.}
onInputChange(e, 'marque')} />
onInputChange(e, 'modele')} />
onInputChange(e, 'numeroSerie')} />
onDropdownChange(e, 'statut')} options={statutOptions} placeholder="Sélectionner un statut" />
onDateChange(e, 'dateAchat')} dateFormat="dd/mm/yy" showIcon />
onInputNumberChange(e.value, 'valeurAchat')} mode="currency" currency="EUR" locale="fr-FR" min={0} />
onInputNumberChange(e.value, 'valeurActuelle')} mode="currency" currency="EUR" locale="fr-FR" min={0} />
onInputChange(e, 'localisation')} />
onInputChange(e, 'proprietaire')} />
onInputNumberChange(e.value, 'quantiteStock')} min={0} showButtons />
onInputNumberChange(e.value, 'seuilMinimum')} min={0} showButtons />
onInputChange(e, 'unite')} placeholder="ex: unité, kg, m, etc." />
onInputChange(e, 'description')} rows={3} cols={20} placeholder="Description détaillée du matériel..." />
); }; export default NouveauMaterielPage;