"use client"; import { useState, useTransition } from "react"; import { useRouter } from "next/navigation"; import { Lead, Activity, Reminder, ClientTranscript } from "@/db/schema"; import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"; import { Badge } from "@/components/ui/badge"; import { Button } from "@/components/ui/button"; import { OptionMultiSelect } from "@/components/ui/option-multi-select"; import { addLeadTag, removeLeadTag, renameLeadTag, deleteTranscript, convertLeadToClient, } from "@/app/admin/pipeline/actions"; import { formatDistanceToNow, format } from "date-fns"; import { it } from "date-fns/locale"; import Link from "next/link"; import { LogActivityModal } from "./LogActivityModal"; import { SendQuoteModal } from "./SendQuoteModal"; import { EditLeadModal } from "./LeadForm"; import { TranscriptModal } from "./TranscriptModal"; const ACTIVITY_ICON: Record = { call: "📞", email: "📧", meeting: "📅", note: "📝", }; const STAGE_COLOR: Record = { contacted: "bg-blue-100 text-blue-800", qualified: "bg-purple-100 text-purple-800", proposal_sent: "bg-amber-100 text-amber-800", negotiating: "bg-orange-100 text-orange-800", won: "bg-green-100 text-green-800", lost: "bg-red-100 text-red-800", }; export function LeadDetail({ lead, activities, reminders, tags, tagOptions, transcripts, convertedClientId, }: { lead: Lead; activities: Activity[]; reminders: Reminder[]; tags: string[]; tagOptions: string[]; transcripts: ClientTranscript[]; convertedClientId?: string | null; }) { const router = useRouter(); const [, startTransition] = useTransition(); const [converting, startConvert] = useTransition(); const [tagError, setTagError] = useState(null); const [expandedIds, setExpandedIds] = useState>(new Set()); const [deletingId, setDeletingId] = useState(null); function handleConvert() { const ok = window.confirm( `Convertire "${lead.name}" in cliente?\n\nVerrà creato un cliente (con email, telefono e transcript del lead) e il lead verrà archiviato mantenendo lo stato "vinto".` ); if (!ok) return; startConvert(() => convertLeadToClient(lead.id)); } function run(fn: () => Promise) { setTagError(null); startTransition(async () => { try { await fn(); router.refresh(); } catch (e) { setTagError(e instanceof Error ? e.message : "Errore nel salvataggio"); } }); } function toggleExpand(id: string) { setExpandedIds((prev) => { const next = new Set(prev); if (next.has(id)) next.delete(id); else next.add(id); return next; }); } function handleDeleteTranscript(transcriptId: string) { setDeletingId(transcriptId); startTransition(async () => { try { await deleteTranscript(transcriptId, lead.id); router.refresh(); } catch (e) { console.error("deleteTranscript error:", e); } finally { setDeletingId(null); } }); } return (
{/* Header + Actions */}

{lead.name}

{lead.company || "Azienda non specificata"}

Genera preventivo {convertedClientId ? ( ✓ Convertito → Apri cliente ) : ( lead.status === "won" && ( ) )}
{/* Lead Profile Card */} Profilo
{lead.status.replace(/_/g, " ")}
run(() => addLeadTag(lead.id, v))} onRemove={(v) => run(() => removeLeadTag(lead.id, v))} onRename={(o, n) => run(() => renameLeadTag(o, n))} /> {tagError &&

{tagError}

}

{lead.email || "—"}

{lead.phone || "—"}

{lead.last_contact_date ? formatDistanceToNow(new Date(lead.last_contact_date), { addSuffix: true, locale: it, }) : "—"}

{lead.next_action || "—"}

{/* Upcoming Reminders Card */} Prossimi Follow-up {reminders.length > 0 ? (
    {reminders.map((r) => (
  • {r.title}

    {format(new Date(r.due_date), "dd MMM yyyy", { locale: it })}

  • ))}
) : (

Nessun reminder

)}
{/* Notes Card */} Note

{lead.notes || "Nessuna nota"}

{/* Activity Log */} Storico AttivitĂ  {activities.length > 0 ? (
{activities.map((activity) => (
{ACTIVITY_ICON[activity.type as keyof typeof ACTIVITY_ICON] || "📝"} {activity.type} {formatDistanceToNow(new Date(activity.activity_date), { addSuffix: true, locale: it, })}

{activity.notes}

{activity.duration_minutes && (

Durata: {activity.duration_minutes} minuti

)}
))}
) : (

Nessuna attivitĂ  registrata

)}
{/* Transcript Call */} Transcript Call {transcripts.length} {transcripts.length === 1 ? "transcript" : "transcript"} {transcripts.length > 0 ? (
{transcripts.map((t) => { const isExpanded = expandedIds.has(t.id); const formattedDate = format( new Date(t.call_date + "T00:00:00"), "d MMMM yyyy", { locale: it } ); const lines = t.content.split("\n"); const preview = lines.slice(0, 3).join("\n").slice(0, 200); const hasMore = t.content.length > preview.length || lines.length > 3; return (
{formattedDate} {t.title && ( — {t.title} )}
{isExpanded ? t.content : preview} {!isExpanded && hasMore && ( ... )}
{hasMore && ( )}
); })}
) : (

Nessun transcript registrato

)}
); }