import { useEffect, useState } from 'react'; import { useParams, useNavigate, Link } from 'react-router-dom'; import { useClientsStore } from '@/stores/clients'; import { api } from '@/lib/api'; import type { Event, Email } from '@/types'; import { ArrowLeft, Edit3, Trash2, Phone, Mail, MapPin, Building2, Briefcase, Gift, Heart, Star, Users, Calendar, Send, CheckCircle2, Sparkles, Clock, } from 'lucide-react'; import { cn, formatDate, getRelativeTime, getInitials } from '@/lib/utils'; import Badge, { EventTypeBadge, EmailStatusBadge } from '@/components/Badge'; import { PageLoader } from '@/components/LoadingSpinner'; import Modal from '@/components/Modal'; import ClientForm from '@/components/ClientForm'; import EmailComposeModal from '@/components/EmailComposeModal'; export default function ClientDetailPage() { const { id } = useParams<{ id: string }>(); const navigate = useNavigate(); const { selectedClient, isLoading, fetchClient, updateClient, deleteClient, markContacted } = useClientsStore(); const [events, setEvents] = useState([]); const [emails, setEmails] = useState([]); const [activeTab, setActiveTab] = useState<'info' | 'events' | 'emails'>('info'); const [showEdit, setShowEdit] = useState(false); const [showCompose, setShowCompose] = useState(false); const [deleting, setDeleting] = useState(false); useEffect(() => { if (id) { fetchClient(id); api.getEvents({ clientId: id }).then(setEvents).catch(() => {}); api.getEmails({ clientId: id }).then(setEmails).catch(() => {}); } }, [id, fetchClient]); if (isLoading || !selectedClient) return ; const client = selectedClient; const handleDelete = async () => { if (!confirm('Delete this client? This cannot be undone.')) return; setDeleting(true); try { await deleteClient(client.id); navigate('/clients'); } catch { setDeleting(false); } }; const handleMarkContacted = async () => { await markContacted(client.id); }; const handleUpdate = async (data: any) => { await updateClient(client.id, data); setShowEdit(false); }; const tabs: { key: 'info' | 'events' | 'emails'; label: string; count?: number; icon: typeof Users }[] = [ { key: 'info', label: 'Info', icon: Users }, { key: 'events', label: 'Events', count: events.length, icon: Calendar }, { key: 'emails', label: 'Emails', count: emails.length, icon: Mail }, ]; return (
{/* Header */}
{getInitials(client.firstName, client.lastName)}

{client.firstName} {client.lastName}

{client.company && (

{client.role ? `${client.role} at ` : ''}{client.company}

)} {client.tags && client.tags.length > 0 && (
{client.tags.map((tag) => {tag})}
)}
{/* Tabs */}
{tabs.map(({ key, label, count, icon: Icon }) => ( ))}
{/* Tab Content */} {activeTab === 'info' && (
{/* Contact Info */}

Contact Information

{client.email && ( )} {client.phone && (
{client.phone}
)} {(client.street || client.city) && (
{[client.street, client.city, client.state, client.zip].filter(Boolean).join(', ')}
)} {client.company && (
{client.company}
)} {client.industry && (
{client.industry}
)}
Last contacted: {getRelativeTime(client.lastContacted)}
{/* Personal */}

Personal Details

{client.birthday && (
Birthday: {formatDate(client.birthday)}
)} {client.anniversary && (
Anniversary: {formatDate(client.anniversary)}
)} {client.interests && client.interests.length > 0 && (
Interests
{client.interests.map((i) => {i})}
)} {client.family?.spouse && (
Spouse: {client.family.spouse}
)} {client.family?.children && client.family.children.length > 0 && (
Children: {client.family.children.join(', ')}
)}
{/* Notes */} {client.notes && (

Notes

{client.notes}

)}
)} {activeTab === 'events' && (
{events.length === 0 ? (

No events for this client

) : ( events.map((event) => (

{event.title}

{formatDate(event.date)} {event.recurring && 'ยท Recurring'}

)) )}
)} {activeTab === 'emails' && (
{emails.length === 0 ? (

No emails for this client

) : ( emails.map((email) => (

{email.subject}

{formatDate(email.createdAt)}

)) )}
)} {/* Edit Modal */} setShowEdit(false)} title="Edit Client" size="lg"> {/* Email Compose Modal */} setShowCompose(false)} clientId={client.id} clientName={`${client.firstName} ${client.lastName}`} onGenerated={(email) => setEmails((prev) => [email, ...prev])} />
); }