"use client"; import { useState, useEffect, useRef, useCallback } from "react"; import { STATUS_OPTIONS, STATUS_MAP } from "./StatusBadge"; interface Lead { id: string; domain: string | null; companyName: string | null; contactName: string | null; contactTitle: string | null; email: string | null; linkedinUrl: string | null; phone: string | null; industry: string | null; sourceTerm: string | null; address: string | null; status: string; notes: string | null; capturedAt: string; } interface LeadSidePanelProps { lead: Lead; onClose: () => void; onUpdate: (id: string, updates: Partial) => void; } function formatDate(iso: string) { return new Date(iso).toLocaleDateString("de-DE", { day: "2-digit", month: "2-digit", year: "numeric", }); } export function LeadSidePanel({ lead, onClose, onUpdate }: LeadSidePanelProps) { const [notes, setNotes] = useState(lead.notes || ""); const [status, setStatus] = useState(lead.status); const [saved, setSaved] = useState(false); const saveTimeout = useRef | null>(null); useEffect(() => { setNotes(lead.notes || ""); setStatus(lead.status); }, [lead.id, lead.notes, lead.status]); const saveNotes = useCallback( async (value: string) => { try { await fetch(`/api/leads/${lead.id}`, { method: "PATCH", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ notes: value }), }); onUpdate(lead.id, { notes: value }); setSaved(true); setTimeout(() => setSaved(false), 2000); } catch { // silently fail } }, [lead.id, onUpdate] ); function handleNotesChange(e: React.ChangeEvent) { const val = e.target.value; setNotes(val); if (saveTimeout.current) clearTimeout(saveTimeout.current); saveTimeout.current = setTimeout(() => saveNotes(val), 500); } async function handleStatusChange(e: React.ChangeEvent) { const newStatus = e.target.value; setStatus(newStatus); try { await fetch(`/api/leads/${lead.id}`, { method: "PATCH", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ status: newStatus }), }); onUpdate(lead.id, { status: newStatus }); } catch { // silently fail } } async function copyEmail() { if (lead.email) { await navigator.clipboard.writeText(lead.email); } } return ( <> {/* Backdrop */}
{/* Panel */}
{/* Header */}
{lead.companyName || lead.domain || "Unbekannt"}
{lead.domain && (
{lead.domain}
)}
{/* Status */}
{/* Email */}
{lead.email ? (
{lead.email}
) : ( — nicht gefunden )}
{/* LinkedIn */} {lead.linkedinUrl && ( )} {/* Phone */} {lead.phone && (
{lead.phone}
)} {/* Industry */} {lead.industry && (
{lead.industry}
)} {/* Region */} {(lead.sourceTerm || lead.address) && (
{lead.address ?? lead.sourceTerm}
)}
{/* Notes */}
{saved && ( Gespeichert ✓ )}