'use client'; import { useRouter } from 'next/navigation'; import { useState } from 'react'; import { Archive, Bell, Mail, Phone, RotateCcw, Trash2 } from 'lucide-react'; import { WhatsAppIcon } from '@/components/icons/whatsapp'; import { format } from 'date-fns'; import { Button } from '@/components/ui/button'; import { Badge } from '@/components/ui/badge'; import { TagBadge } from '@/components/shared/tag-badge'; import { PermissionGate } from '@/components/shared/permission-gate'; import { SmartArchiveDialog } from '@/components/clients/smart-archive-dialog'; import { SmartRestoreDialog } from '@/components/clients/smart-restore-dialog'; import { HardDeleteDialog } from '@/components/clients/hard-delete-dialog'; import { ReminderForm } from '@/components/reminders/reminder-form'; import { useQueryClient } from '@tanstack/react-query'; import { DetailHeaderStrip } from '@/components/shared/detail-header-strip'; import { CountryFlag } from '@/components/shared/country-flag'; import { PortalInviteButton } from '@/components/clients/portal-invite-button'; import { GdprExportButton } from '@/components/clients/gdpr-export-button'; import { cn } from '@/lib/utils'; import { getCountryName } from '@/lib/i18n/countries'; interface ClientDetailHeaderProps { client: { id: string; fullName: string; nationalityIso?: string | null; archivedAt?: string | null; createdAt?: string; contacts?: Array<{ channel: string; value: string; valueE164?: string | null; isPrimary: boolean; label?: string | null; }>; tags?: Array<{ id: string; name: string; color: string }>; clientPortalEnabled?: boolean; }; } export function ClientDetailHeader({ client }: ClientDetailHeaderProps) { const router = useRouter(); const [archiveOpen, setArchiveOpen] = useState(false); const [hardDeleteOpen, setHardDeleteOpen] = useState(false); const [reminderOpen, setReminderOpen] = useState(false); const qc = useQueryClient(); const isArchived = !!client.archivedAt; const primaryEmail = client.contacts?.find((c) => c.channel === 'email' && c.isPrimary)?.value ?? client.contacts?.find((c) => c.channel === 'email')?.value; const primaryPhoneContact = client.contacts?.find((c) => c.channel === 'phone' && c.isPrimary) ?? client.contacts?.find((c) => c.channel === 'phone'); const primaryPhone = primaryPhoneContact?.value; // wa.me requires the E.164 number without the leading "+". Strip from the // canonical E.164 form when available; otherwise strip non-digits from the // display value as a best-effort fallback. const whatsappNumber = primaryPhoneContact?.valueE164 ? primaryPhoneContact.valueE164.replace(/^\+/, '') : primaryPhoneContact?.value ? primaryPhoneContact.value.replace(/[^\d]/g, '') : null; const country = client.nationalityIso ? getCountryName(client.nationalityIso, 'en') : null; const addedLabel = client.createdAt ? `Added ${format(new Date(client.createdAt), 'MMM d, yyyy')}` : null; return ( <> {client.fullName} {isArchived && ( Archived )} {country || addedLabel ? ( {country ? ( {country} ) : null} {country && addedLabel ? ยท : null} {addedLabel ? {addedLabel} : null} ) : null} {primaryEmail ? ( Email ) : null} {primaryPhone ? ( Call ) : null} {whatsappNumber ? ( WhatsApp ) : null} {!isArchived && client.clientPortalEnabled === true ? ( ) : null} {client.tags && client.tags.length > 0 && ( {client.tags.map((tag) => ( ))} )} {/* Top-right: archive/restore + (for archived clients with the right perm) permanently-delete. Destructive actions sit out of the primary action flow. */} {isArchived && ( setHardDeleteOpen(true)} aria-label="Permanently delete client" title="Permanently delete client" className="shrink-0 rounded-md p-1.5 text-muted-foreground/70 transition-colors hover:bg-destructive/10 hover:text-destructive" > )} setReminderOpen(true)} aria-label="Add reminder for this client" title="Add reminder for this client" className="shrink-0 rounded-md p-1.5 text-muted-foreground/70 transition-colors hover:bg-foreground/5 hover:text-primary" > setArchiveOpen(true)} aria-label={isArchived ? 'Restore client' : 'Archive client'} title={isArchived ? 'Restore client' : 'Archive client'} className={cn( 'shrink-0 rounded-md p-1.5 text-muted-foreground/70 transition-colors', 'hover:bg-foreground/5', isArchived ? 'hover:text-emerald-600' : 'hover:text-destructive', )} > {isArchived ? ( ) : ( )} qc.invalidateQueries({ queryKey: ['reminders'] })} /> {isArchived ? ( ) : ( )} {isArchived && ( router.back()} /> )} > ); }
{country ? ( {country} ) : null} {country && addedLabel ? ยท : null} {addedLabel ? {addedLabel} : null}