'use client' import { useState, useEffect } from 'react' import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow, } from '@/components/ui/table' import { Button } from '@/components/ui/button' import { Input } from '@/components/ui/input' import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card' import { Dialog, DialogContent, DialogDescription, DialogHeader, DialogTitle, DialogTrigger, } from '@/components/ui/dialog' import { Badge } from '@/components/ui/badge' import { ScrollArea } from '@/components/ui/scroll-area' import { Search, Plus, Eye, Pencil, Phone, Mail, MapPin, Calendar, FileText, User } from 'lucide-react' import { ClientForm } from './client-form' import { ClientDetail } from './client-detail' interface Client { id: string nom: string prenom: string email: string | null telephone: string adresse: string | null ville: string | null codePostal: string | null dateNaissance: string | null notes: string | null createdAt: string patients?: Patient[] } interface Patient { id: string dateCreation: string odSphere: number | null odCylindre: number | null odAxe: number | null ogSphere: number | null ogCylindre: number | null ogAxe: number | null addition: number | null pd: number | null hauteur: number | null notes: string | null ordonnances?: Ordonnance[] } interface Ordonnance { id: string numero: string dateEmission: string medecin: string | null notes: string | null } export function ClientList() { const [clients, setClients] = useState([]) const [filteredClients, setFilteredClients] = useState([]) const [searchTerm, setSearchTerm] = useState('') const [loading, setLoading] = useState(true) const [selectedClient, setSelectedClient] = useState(null) const [editingClient, setEditingClient] = useState(null) const [isAddDialogOpen, setIsAddDialogOpen] = useState(false) const [isDetailDialogOpen, setIsDetailDialogOpen] = useState(false) useEffect(() => { fetchClients() }, []) useEffect(() => { if (searchTerm === '') { setFilteredClients(clients) } else { const term = searchTerm.toLowerCase() const filtered = clients.filter(client => client.nom.toLowerCase().includes(term) || client.prenom.toLowerCase().includes(term) || client.telephone.includes(term) || (client.email && client.email.toLowerCase().includes(term)) || (client.ville && client.ville.toLowerCase().includes(term)) ) setFilteredClients(filtered) } }, [searchTerm, clients]) const fetchClients = async () => { try { const response = await fetch('/api/clients') if (response.ok) { const data = await response.json() setClients(data) setFilteredClients(data) } } catch (error) { console.error('Error fetching clients:', error) } finally { setLoading(false) } } const handleClientSaved = async () => { setIsAddDialogOpen(false) setEditingClient(null) await fetchClients() } const handleViewClient = (client: Client) => { console.log('handleViewClient called with:', client.id, client.nom, client.prenom, client) // Force dialog to close first if already open with different client if (isDetailDialogOpen && selectedClient?.id !== client.id) { setIsDetailDialogOpen(false) // Small delay to ensure dialog closes setTimeout(() => { setSelectedClient(client) setIsDetailDialogOpen(true) }, 50) } else { setSelectedClient(client) setIsDetailDialogOpen(true) } } const handleEditClient = (client: Client) => { setEditingClient(client) setIsAddDialogOpen(true) } const formatDate = (dateString: string | null) => { if (!dateString) return '-' return new Date(dateString).toLocaleDateString('fr-FR') } const getAge = (dateNaissance: string | null) => { if (!dateNaissance) return null const today = new Date() const birth = new Date(dateNaissance) let age = today.getFullYear() - birth.getFullYear() const monthDiff = today.getMonth() - birth.getMonth() if (monthDiff < 0 || (monthDiff === 0 && today.getDate() < birth.getDate())) { age-- } return age } return (
{/* Header */}

Gestion des Clients

{clients.length} client{clients.length !== 1 ? 's' : ''} enregistré{clients.length !== 1 ? 's' : ''}

{editingClient ? 'Modifier le Client' : 'Nouveau Client'} {editingClient ? 'Modifiez les informations du client' : 'Remplissez les informations pour créer un nouveau client'} { setIsAddDialogOpen(false) setEditingClient(null) }} />
{/* Search */}
setSearchTerm(e.target.value)} className="pl-10" />
{/* Clients Table */} Client Contact Adresse Naissance Fiches Actions {loading ? ( Chargement... ) : filteredClients.length === 0 ? (

{searchTerm ? 'Aucun client trouvé' : 'Aucun client enregistré'}

) : ( filteredClients.map((client) => (
{client.prenom} {client.nom}
{getAge(client.dateNaissance) !== null && ( {getAge(client.dateNaissance)} ans )}
{client.email && (
{client.email}
)}
{client.telephone}
{client.adresse || client.ville || client.codePostal ? (
{client.adresse && (
{client.adresse}
)}
{client.codePostal && `${client.codePostal} `} {client.ville}
) : ( Non renseignée )}
{formatDate(client.dateNaissance)}
{client.patients?.length || 0}
)) )}
{/* Client Detail Dialog */} Détail du Client Informations complètes et fiches de vision {selectedClient && ( setIsDetailDialogOpen(false)} onUpdate={fetchClients} /> )}
) }