'use client'; import { useState } from 'react'; import { useMutation, useQueryClient } from '@tanstack/react-query'; import { Archive, RotateCcw, Mail, Phone } from 'lucide-react'; import { Button } from '@/components/ui/button'; import { Badge } from '@/components/ui/badge'; import { TagBadge } from '@/components/shared/tag-badge'; import { ArchiveConfirmDialog } from '@/components/shared/archive-confirm-dialog'; import { PortalInviteButton } from '@/components/clients/portal-invite-button'; import { apiFetch } from '@/lib/api/client'; interface ClientDetailHeaderProps { client: { id: string; fullName: string; nationality?: string | null; preferredContactMethod?: string | null; preferredLanguage?: string | null; timezone?: string | null; source?: string | null; sourceDetails?: string | null; archivedAt?: string | null; contacts?: Array<{ channel: string; value: string; isPrimary: boolean; label?: string | null }>; tags?: Array<{ id: string; name: string; color: string }>; clientPortalEnabled?: boolean; }; } const SOURCE_LABELS: Record = { website: 'Website', manual: 'Manual', referral: 'Referral', broker: 'Broker', }; export function ClientDetailHeader({ client }: ClientDetailHeaderProps) { const queryClient = useQueryClient(); const [archiveOpen, setArchiveOpen] = useState(false); const isArchived = !!client.archivedAt; const archiveMutation = useMutation({ mutationFn: () => apiFetch(`/api/v1/clients/${client.id}`, { method: 'DELETE' }), onSuccess: () => { queryClient.invalidateQueries({ queryKey: ['clients', client.id] }); queryClient.invalidateQueries({ queryKey: ['clients'] }); setArchiveOpen(false); }, }); const restoreMutation = useMutation({ mutationFn: () => apiFetch(`/api/v1/clients/${client.id}/restore`, { method: 'POST' }), onSuccess: () => { queryClient.invalidateQueries({ queryKey: ['clients', client.id] }); queryClient.invalidateQueries({ queryKey: ['clients'] }); setArchiveOpen(false); }, }); const primaryEmail = client.contacts?.find((c) => c.channel === 'email' && c.isPrimary) ?? client.contacts?.find((c) => c.channel === 'email'); const primaryPhone = client.contacts?.find((c) => c.channel === 'phone' && c.isPrimary) ?? client.contacts?.find((c) => c.channel === 'phone'); return ( <>

{client.fullName}

{isArchived && ( Archived )}
{client.source && ( Source:{' '} {SOURCE_LABELS[client.source] ?? client.source} )} {primaryEmail && ( {primaryEmail.value} )} {primaryPhone && ( {primaryPhone.value} )}
{client.tags && client.tags.length > 0 && (
{client.tags.map((tag) => ( ))}
)}
{/* Actions */}
{!isArchived && client.clientPortalEnabled !== false && ( )}
{ if (isArchived) { restoreMutation.mutate(); } else { archiveMutation.mutate(); } }} isLoading={archiveMutation.isPending || restoreMutation.isPending} /> ); }