"use client"; import { useEffect, useState } from "react"; import { useParams, useRouter } from "next/navigation"; import { ArrowLeft, FileDown, Loader2, Plus, Trash2 } from "lucide-react"; import { AppHeader } from "@/components/layout/app-header"; import { PageHeader } from "@/components/layout/page-header"; import { AssociateFormDialog } from "@/components/associations/associate-form-dialog"; import { AssociateTable } from "@/components/associations/associate-table"; import { AssociationInfoCard } from "@/components/associations/association-info-card"; import { EditAssociationDialog } from "@/components/associations/edit-association-dialog"; import { UserAccountsCard } from "@/components/associations/user-accounts-card"; import { UserFormDialog } from "@/components/associations/user-form-dialog"; import { Button } from "@/components/ui/button"; import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"; import { ConfirmDialog } from "@/components/ui/confirm-dialog"; import { deleteAssociation, downloadAttestato, getAssociation, updateAssociation } from "@/lib/api"; import type { Associate, Association, User } from "@/lib/models"; export default function AssociationDetailPage() { const router = useRouter(); const params = useParams(); const id = params.id as string; const [association, setAssociation] = useState(null); const [loading, setLoading] = useState(true); const [associateDialogOpen, setAssociateDialogOpen] = useState(false); const [editingAssociateIndex, setEditingAssociateIndex] = useState(undefined); const [userDialogOpen, setUserDialogOpen] = useState(false); const [editingUserIndex, setEditingUserIndex] = useState(undefined); const [generatingAttestato, setGeneratingAttestato] = useState(false); useEffect(() => { getAssociation(id) .then(setAssociation) .catch((error) => { console.error("Failed to load association:", error); router.push("/dashboard"); }) .finally(() => setLoading(false)); }, [id, router]); const persist = async (updated: Association) => { const saved = await updateAssociation(id, updated); setAssociation(saved); }; const openAddAssociate = () => { setEditingAssociateIndex(undefined); setAssociateDialogOpen(true); }; const openEditAssociate = (index: number) => { setEditingAssociateIndex(index); setAssociateDialogOpen(true); }; const handleAssociateSubmit = async (associate: Associate) => { if (!association) return; const associates = [...(association.associates ?? [])]; if (editingAssociateIndex !== undefined) { associates[editingAssociateIndex] = associate; } else { associates.push(associate); } await persist({ ...association, associates }); }; const handleAssociateDelete = async (index: number) => { if (!association) return; const associates = (association.associates ?? []).filter((_, i) => i !== index); await persist({ ...association, associates }); }; const openAddUser = () => { setEditingUserIndex(undefined); setUserDialogOpen(true); }; const openEditUser = (index: number) => { setEditingUserIndex(index); setUserDialogOpen(true); }; const handleUserSubmit = async (user: User) => { if (!association) return; const users = [...(association.users ?? [])]; if (editingUserIndex !== undefined) { const existing = users[editingUserIndex]; users[editingUserIndex] = { ...user, password: user.password || existing.password }; } else { users.push(user); } await persist({ ...association, users }); }; const handleUserDelete = async (index: number) => { if (!association) return; const users = (association.users ?? []).filter((_, i) => i !== index); await persist({ ...association, users }); }; const handleDeleteAssociation = async () => { await deleteAssociation(id); router.push("/dashboard"); }; const handleDownloadAttestato = async () => { if (!association) return; setGeneratingAttestato(true); try { await downloadAttestato(id, association.name); } catch (error) { console.error("Failed to generate attestato:", error); } finally { setGeneratingAttestato(false); } }; if (loading) { return (
); } if (!association) { return null; } return (
Elimina } title="Eliminare questa associazione?" description={`"${association.name}" e tutti i suoi soci verranno eliminati definitivamente. L'operazione non รจ reversibile.`} confirmLabel="Elimina definitivamente" onConfirm={handleDeleteAssociation} /> } />
Soci ({association.associates?.length ?? 0}) Aggiungi account } />
); }