'use client'; import { Anchor, Archive, Compass, MoreHorizontal, Pencil } from 'lucide-react'; import { Button } from '@/components/ui/button'; import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger, } from '@/components/ui/dropdown-menu'; import { TagBadge } from '@/components/shared/tag-badge'; import { ListCard, ListCardAvatar, ListCardMeta, deriveInitials, } from '@/components/shared/list-card'; import { cn } from '@/lib/utils'; import type { InterestRow } from './interest-columns'; const STAGE_LABELS: Record = { open: 'Open', details_sent: 'Details Sent', in_communication: 'In Communication', visited: 'Visited', signed_eoi_nda: 'Signed EOI/NDA', deposit_10pct: 'Deposit 10%', contract: 'Contract', completed: 'Completed', }; /** Pill colors (used for the stage badge in the meta row). */ const STAGE_PILL: Record = { open: 'bg-slate-100 text-slate-700', details_sent: 'bg-blue-100 text-blue-700', in_communication: 'bg-sky-100 text-sky-700', visited: 'bg-violet-100 text-violet-700', signed_eoi_nda: 'bg-amber-100 text-amber-700', deposit_10pct: 'bg-orange-100 text-orange-700', contract: 'bg-green-100 text-green-700', completed: 'bg-emerald-100 text-emerald-700', }; /** Accent-bar colors — saturate progressively so the pipeline depth reads at a glance. */ const STAGE_ACCENT: Record = { open: 'bg-slate-300', details_sent: 'bg-blue-400', in_communication: 'bg-sky-400', visited: 'bg-violet-400', signed_eoi_nda: 'bg-amber-400', deposit_10pct: 'bg-orange-400', contract: 'bg-green-500', completed: 'bg-emerald-500', }; const CATEGORY_LABELS: Record = { general_interest: 'General', specific_qualified: 'Qualified', hot_lead: 'Hot lead', }; const SOURCE_LABELS: Record = { website: 'Website', manual: 'Manual', referral: 'Referral', broker: 'Broker', }; interface InterestCardProps { interest: InterestRow; portSlug: string; onEdit: (interest: InterestRow) => void; onArchive: (interest: InterestRow) => void; } export function InterestCard({ interest, portSlug, onEdit, onArchive }: InterestCardProps) { const stageLabel = STAGE_LABELS[interest.pipelineStage] ?? interest.pipelineStage; const stagePill = STAGE_PILL[interest.pipelineStage] ?? 'bg-gray-100 text-gray-700'; const accentClass = STAGE_ACCENT[interest.pipelineStage] ?? 'bg-slate-300'; const isHotLead = interest.leadCategory === 'hot_lead'; const categoryLabel = interest.leadCategory ? CATEGORY_LABELS[interest.leadCategory] : null; const sourceLabel = interest.source ? (SOURCE_LABELS[interest.source] ?? interest.source) : null; const tags = interest.tags ?? []; const clientName = interest.clientName ?? 'Unknown client'; const berthLabel = interest.berthMooringNumber; return ( onEdit(interest)}> Edit onArchive(interest)}> Archive } >
{/* Title row: name + spacer for the absolutely-positioned actions menu */}

{clientName}

{/* Berth or general-interest line */}

{berthLabel ? ( <> {berthLabel} ) : ( <> General interest )}

{/* Stage pill + category + source */}
{stageLabel} {isHotLead ? ( Hot ) : null} {(categoryLabel && !isHotLead) || sourceLabel ? (
{categoryLabel && !isHotLead ? {categoryLabel} : null} {categoryLabel && !isHotLead && sourceLabel ? · : null} {sourceLabel ? {sourceLabel} : null}
) : null}
{tags.length > 0 ? (
{tags.slice(0, 2).map((tag) => ( ))} {tags.length > 2 ? ( +{tags.length - 2} ) : null}
) : null}
); }