'use client'; import React, { useState, useEffect } from 'react'; import { useParams, useRouter } from 'next/navigation'; import { Card } from 'primereact/card'; import { TabView, TabPanel } from 'primereact/tabview'; import { Button } from 'primereact/button'; import { Tag } from 'primereact/tag'; import { ProgressBar } from 'primereact/progressbar'; import { Divider } from 'primereact/divider'; import { Skeleton } from 'primereact/skeleton'; interface Chantier { id: number; nom: string; description: string; adresse: string; ville: string; codePostal: string; dateDebut: string; dateFin: string; dateLivraison: string; statut: string; budget: number; client: { id: number; nom: string; email: string; telephone: string; }; responsable: { id: number; nom: string; prenom: string; }; progression: number; } export default function ChantierDetailsPage() { const params = useParams(); const router = useRouter(); const id = params.id as string; const [chantier, setChantier] = useState(null); const [loading, setLoading] = useState(true); const [activeTab, setActiveTab] = useState(0); useEffect(() => { if (id) { loadChantier(); } }, [id]); const loadChantier = async () => { try { setLoading(true); const API_URL = process.env.NEXT_PUBLIC_API_URL || 'https://api.lions.dev/btpxpress'; const response = await fetch(`${API_URL}/api/v1/chantiers/${id}`); if (!response.ok) { throw new Error('Erreur lors du chargement du chantier'); } const data = await response.json(); setChantier(data); } catch (error) { console.error('Erreur:', error); // TODO: Afficher un toast d'erreur } finally { setLoading(false); } }; const getStatutSeverity = (statut: string) => { switch (statut?.toUpperCase()) { case 'PLANIFIE': return 'info'; case 'EN_COURS': return 'warning'; case 'TERMINE': return 'success'; case 'SUSPENDU': return 'danger'; case 'ANNULE': return 'secondary'; default: return 'info'; } }; const getStatutLabel = (statut: string) => { const labels: { [key: string]: string } = { 'PLANIFIE': 'Planifié', 'EN_COURS': 'En cours', 'TERMINE': 'Terminé', 'SUSPENDU': 'Suspendu', 'ANNULE': 'Annulé' }; return labels[statut] || statut; }; const formatDate = (dateString: string) => { if (!dateString) return 'N/A'; return new Date(dateString).toLocaleDateString('fr-FR'); }; const formatMontant = (montant: number) => { return new Intl.NumberFormat('fr-FR', { style: 'currency', currency: 'EUR' }).format(montant); }; if (loading) { return (
); } if (!chantier) { return (

Chantier non trouvé

Le chantier demandé n'existe pas ou a été supprimé.

); } return (
{/* En-tête du chantier */}

{chantier.description}

{chantier.adresse}, {chantier.codePostal} {chantier.ville}
Client: {chantier.client?.nom}
Responsable: {chantier.responsable?.prenom} {chantier.responsable?.nom}
Progression
Début
{formatDate(chantier.dateDebut)}
Fin prévue
{formatDate(chantier.dateFin)}
Budget
{formatMontant(chantier.budget)}
{/* Onglets */}
setActiveTab(e.index)}>
Durée
{Math.ceil((new Date(chantier.dateFin).getTime() - new Date(chantier.dateDebut).getTime()) / (1000 * 60 * 60 * 24))} jours
Avancement
{chantier.progression || 0}%
Budget
{formatMontant(chantier.budget)}
Équipe
0

Accès rapides

); }