@fluid-app/portal-sdk 0.1.76 → 0.1.78
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{AlertWidget-BrUi7EqF.cjs → AlertWidget-B2Qcisk7.cjs} +2 -2
- package/dist/{AlertWidget-BrUi7EqF.cjs.map → AlertWidget-B2Qcisk7.cjs.map} +1 -1
- package/dist/{AlertWidget-yjstYYw9.mjs → AlertWidget-C-7uX0HS.mjs} +2 -2
- package/dist/{AlertWidget-yjstYYw9.mjs.map → AlertWidget-C-7uX0HS.mjs.map} +1 -1
- package/dist/{AppDownloadScreen-B2Cfv-uS.cjs → AppDownloadScreen-BlfMkfi_.cjs} +5 -5
- package/dist/{AppDownloadScreen-0bjHFsn8.mjs → AppDownloadScreen-C_NGlFZa.mjs} +2 -2
- package/dist/{AppDownloadScreen-0bjHFsn8.mjs.map → AppDownloadScreen-C_NGlFZa.mjs.map} +1 -1
- package/dist/{AppDownloadScreen-BICgVr39.cjs → AppDownloadScreen-Cw1sGNNg.cjs} +2 -2
- package/dist/{AppDownloadScreen-BICgVr39.cjs.map → AppDownloadScreen-Cw1sGNNg.cjs.map} +1 -1
- package/dist/{ContactsScreen-BY_bV9hD.cjs → ContactsScreen-C6T8Vfz4.cjs} +5 -5
- package/dist/{ContactsScreen-B45I4fsu.cjs → ContactsScreen-CwBXsCW8.cjs} +2 -2
- package/dist/{ContactsScreen-B45I4fsu.cjs.map → ContactsScreen-CwBXsCW8.cjs.map} +1 -1
- package/dist/{ContactsScreen-fv44z4G1.mjs → ContactsScreen-D4Cj5AKH.mjs} +2 -2
- package/dist/{ContactsScreen-fv44z4G1.mjs.map → ContactsScreen-D4Cj5AKH.mjs.map} +1 -1
- package/dist/{FluidProvider-BPFbPldT.mjs → FluidProvider-6ARIhCTq.mjs} +7 -7
- package/dist/{FluidProvider-BPFbPldT.mjs.map → FluidProvider-6ARIhCTq.mjs.map} +1 -1
- package/dist/{FluidProvider-B7LKjuMi.cjs → FluidProvider-CidgidrK.cjs} +7 -7
- package/dist/{FluidProvider-B7LKjuMi.cjs.map → FluidProvider-CidgidrK.cjs.map} +1 -1
- package/dist/{LinkWidget-nstWDcsr.cjs → LinkWidget-JKkMn6Pt.cjs} +5 -4
- package/dist/LinkWidget-JKkMn6Pt.cjs.map +1 -0
- package/dist/{LinkWidget-DUxod35m.cjs → LinkWidget-RYHmBVzc.cjs} +1 -1
- package/dist/{LinkWidget-BdQSowRZ.mjs → LinkWidget-e0aFNkZJ.mjs} +5 -4
- package/dist/LinkWidget-e0aFNkZJ.mjs.map +1 -0
- package/dist/{MessagingScreen-ms1wGWHQ.cjs → MessagingScreen-BA8ujs72.cjs} +5 -5
- package/dist/{MessagingScreen-DGttFuoB.cjs → MessagingScreen-BshcZj2z.cjs} +3 -3
- package/dist/{MessagingScreen-DGttFuoB.cjs.map → MessagingScreen-BshcZj2z.cjs.map} +1 -1
- package/dist/{MessagingScreen-Bp5t4STI.mjs → MessagingScreen-DevHJI6g.mjs} +5 -5
- package/dist/{MessagingScreen-BHulaY7A.mjs → MessagingScreen-Dkm1cqJ8.mjs} +3 -3
- package/dist/{MessagingScreen-BHulaY7A.mjs.map → MessagingScreen-Dkm1cqJ8.mjs.map} +1 -1
- package/dist/{MySiteScreen-DY7PSqP6.cjs → MySiteScreen-BTGBB4-v.cjs} +2 -2
- package/dist/{MySiteScreen-DY7PSqP6.cjs.map → MySiteScreen-BTGBB4-v.cjs.map} +1 -1
- package/dist/{MySiteScreen-BfYDwE3C.mjs → MySiteScreen-O7m3F8bT.mjs} +2 -2
- package/dist/{MySiteScreen-BfYDwE3C.mjs.map → MySiteScreen-O7m3F8bT.mjs.map} +1 -1
- package/dist/{MySiteScreen-CEb9L0vp.cjs → MySiteScreen-i8J8Ttzz.cjs} +5 -5
- package/dist/{OrdersScreen-CB_VOlRI.cjs → OrdersScreen-BF86JWxG.cjs} +3 -3
- package/dist/{OrdersScreen-CB_VOlRI.cjs.map → OrdersScreen-BF86JWxG.cjs.map} +1 -1
- package/dist/{OrdersScreen-D5_PtRCp.cjs → OrdersScreen-CWIKWDTW.cjs} +5 -5
- package/dist/{OrdersScreen-CuQTI5f9.mjs → OrdersScreen-DoXE66il.mjs} +3 -3
- package/dist/{OrdersScreen-CuQTI5f9.mjs.map → OrdersScreen-DoXE66il.mjs.map} +1 -1
- package/dist/{ProductsScreen-DD07WW44.cjs → ProductsScreen-868va-qn.cjs} +6 -6
- package/dist/{ProductsScreen-SExV06P8.mjs → ProductsScreen-Bef0sSgj.mjs} +6 -6
- package/dist/{ProductsScreen-KLajmCLk.mjs → ProductsScreen-CFKSDJJ0.mjs} +4 -4
- package/dist/{ProductsScreen-KLajmCLk.mjs.map → ProductsScreen-CFKSDJJ0.mjs.map} +1 -1
- package/dist/{ProductsScreen-D1hLP4qn.cjs → ProductsScreen-D4dDVYFJ.cjs} +4 -4
- package/dist/{ProductsScreen-D1hLP4qn.cjs.map → ProductsScreen-D4dDVYFJ.cjs.map} +1 -1
- package/dist/{ProfileScreen-D6ie-eDm.cjs → ProfileScreen-B_I_A77d.cjs} +3 -3
- package/dist/{ProfileScreen-D6ie-eDm.cjs.map → ProfileScreen-B_I_A77d.cjs.map} +1 -1
- package/dist/{ProfileScreen-Y5zQgZL0.mjs → ProfileScreen-BsUzZmHF.mjs} +3 -3
- package/dist/{ProfileScreen-Y5zQgZL0.mjs.map → ProfileScreen-BsUzZmHF.mjs.map} +1 -1
- package/dist/{ProfileScreen-VBlfOlav.cjs → ProfileScreen-C168MNNR.cjs} +5 -5
- package/dist/{ShareablesScreen-CTruUco1.mjs → ShareablesScreen-2EJChSOH.mjs} +4 -4
- package/dist/{ShareablesScreen-CTruUco1.mjs.map → ShareablesScreen-2EJChSOH.mjs.map} +1 -1
- package/dist/{ShareablesScreen-C_aJXryA.mjs → ShareablesScreen-2N0DWP77.mjs} +6 -6
- package/dist/{ShareablesScreen-BKidUZz_.cjs → ShareablesScreen-BgUQxGzL.cjs} +6 -6
- package/dist/{ShareablesScreen-CA8sm7n_.cjs → ShareablesScreen-D9uPu6DJ.cjs} +4 -4
- package/dist/{ShareablesScreen-CA8sm7n_.cjs.map → ShareablesScreen-D9uPu6DJ.cjs.map} +1 -1
- package/dist/{ShopScreen-BZLvCzbI.mjs → ShopScreen-BaqN34iX.mjs} +6 -6
- package/dist/{ShopScreen-BZLvCzbI.mjs.map → ShopScreen-BaqN34iX.mjs.map} +1 -1
- package/dist/{ShopScreen-D0xqkK7W.cjs → ShopScreen-CTp2FaRe.cjs} +5 -5
- package/dist/{ShopScreen-saEPQJZ-.cjs → ShopScreen-DhbYFraU.cjs} +8 -8
- package/dist/{ShopScreen-saEPQJZ-.cjs.map → ShopScreen-DhbYFraU.cjs.map} +1 -1
- package/dist/{SubscriptionsScreen-D5oQ8bt1.cjs → SubscriptionsScreen-CwDH0DNT.cjs} +3 -3
- package/dist/{SubscriptionsScreen-D5oQ8bt1.cjs.map → SubscriptionsScreen-CwDH0DNT.cjs.map} +1 -1
- package/dist/{SubscriptionsScreen-CBoAwhKQ.mjs → SubscriptionsScreen-fliVeZk_.mjs} +3 -3
- package/dist/{SubscriptionsScreen-CBoAwhKQ.mjs.map → SubscriptionsScreen-fliVeZk_.mjs.map} +1 -1
- package/dist/{SubscriptionsScreen-DxYZJ0k6.cjs → SubscriptionsScreen-nkxjIDie.cjs} +5 -5
- package/dist/{TextWidget-GofZkamu.cjs → TextWidget-BCzx6OXG.cjs} +8 -7
- package/dist/TextWidget-BCzx6OXG.cjs.map +1 -0
- package/dist/{TextWidget-CJocBD6P.mjs → TextWidget-CADHRPPp.mjs} +8 -7
- package/dist/TextWidget-CADHRPPp.mjs.map +1 -0
- package/dist/index.cjs +38 -38
- package/dist/index.d.cts.map +1 -1
- package/dist/index.d.mts.map +1 -1
- package/dist/index.mjs +38 -38
- package/dist/{src-B-aQFEbA.cjs → src-fXyI4AWk.cjs} +36 -35
- package/dist/src-fXyI4AWk.cjs.map +1 -0
- package/dist/{src-CvQ9ezCI.mjs → src-nhqydD53.mjs} +36 -35
- package/dist/src-nhqydD53.mjs.map +1 -0
- package/dist/{use-account-clients-G3DvbvPH.mjs → use-account-clients-CDAazmHw.mjs} +2 -2
- package/dist/{use-account-clients-G3DvbvPH.mjs.map → use-account-clients-CDAazmHw.mjs.map} +1 -1
- package/dist/{use-account-clients-8yvdvTIC.cjs → use-account-clients-CgP9ZZbx.cjs} +2 -2
- package/dist/{use-account-clients-8yvdvTIC.cjs.map → use-account-clients-CgP9ZZbx.cjs.map} +1 -1
- package/dist/{use-current-user-CWnlXU8G.cjs → use-current-user-C3xp6f2-.cjs} +3 -3
- package/dist/{use-current-user-CWnlXU8G.cjs.map → use-current-user-C3xp6f2-.cjs.map} +1 -1
- package/dist/{use-current-user-DJW-ZwIi.mjs → use-current-user-CudhrJtA.mjs} +3 -3
- package/dist/{use-current-user-DJW-ZwIi.mjs.map → use-current-user-CudhrJtA.mjs.map} +1 -1
- package/dist/{use-customer-account-CJDZKn97.cjs → use-customer-account-72qR-BtL.cjs} +3 -3
- package/dist/{use-customer-account-CJDZKn97.cjs.map → use-customer-account-72qR-BtL.cjs.map} +1 -1
- package/dist/{use-customer-account-BhjZjCcF.mjs → use-customer-account-Dfyhs3LY.mjs} +3 -3
- package/dist/{use-customer-account-BhjZjCcF.mjs.map → use-customer-account-Dfyhs3LY.mjs.map} +1 -1
- package/dist/{use-fluid-api-YzLdiq5t.mjs → use-fluid-api-C53ZoBpG.mjs} +2 -2
- package/dist/{use-fluid-api-YzLdiq5t.mjs.map → use-fluid-api-C53ZoBpG.mjs.map} +1 -1
- package/dist/{use-fluid-api-BcfyUuOe.cjs → use-fluid-api-Cc0xHt74.cjs} +2 -2
- package/dist/{use-fluid-api-BcfyUuOe.cjs.map → use-fluid-api-Cc0xHt74.cjs.map} +1 -1
- package/package.json +23 -19
- package/dist/LinkWidget-BdQSowRZ.mjs.map +0 -1
- package/dist/LinkWidget-nstWDcsr.cjs.map +0 -1
- package/dist/TextWidget-CJocBD6P.mjs.map +0 -1
- package/dist/TextWidget-GofZkamu.cjs.map +0 -1
- package/dist/src-B-aQFEbA.cjs.map +0 -1
- package/dist/src-CvQ9ezCI.mjs.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ContactsScreen-B45I4fsu.cjs","names":["cn","Card","cn","CardContent","Avatar","AvatarImage","AvatarFallback","Badge","DropdownMenu","DropdownMenuTrigger","Button","EllipsisVertical","DropdownMenuContent","DropdownMenuItem","Pencil","DropdownMenuSeparator","Trash2","keepPreviousData","ArrowUpDown","DropdownMenuLabel","Search","Input","Skeleton","Table","TableHeader","TableRow","TableHead","TableBody","TableCell","PaginationFooter","parseApiErrors","AlertDialog","AlertDialogContent","AlertDialogHeader","AlertDialogTitle","AlertDialogDescription","AlertDialogFooter","AlertDialogCancel","AlertDialogAction","Button","Plus","Breadcrumb","BreadcrumbList","BreadcrumbItem","BreadcrumbPage","DropdownMenu","DropdownMenuTrigger","Button","EllipsisVertical","DropdownMenuContent","DropdownMenuItem","Breadcrumb","BreadcrumbList","BreadcrumbItem","BreadcrumbLink","BreadcrumbSeparator","BreadcrumbPage","AlertDialog","AlertDialogContent","AlertDialogHeader","AlertDialogTitle","AlertDialogDescription","AlertDialogFooter","AlertDialogCancel","AlertDialogAction","Button","Breadcrumb","BreadcrumbList","BreadcrumbItem","BreadcrumbLink","BreadcrumbSeparator","BreadcrumbPage","cn","TooltipProvider","Tooltip","TooltipTrigger","ListChecks","TooltipContent","StickyNote","CalendarDays","Mail","Phone","Building","Card","cn","CardHeader","CardTitle","CardContent","Label","Input","Select","SelectTrigger","SelectValue","SelectContent","SelectItem","Card","CardHeader","CardTitle","CardContent","StickyNote","usersContacts.listUserContactNotes","usersNotes.deleteUserNote","parseApiErrors","usersContacts.createUserContactNote","parseApiErrors","usersNotes.updateUserNote","parseApiErrors","useEditor","StarterKit","Heading","Placeholder","TextAlign","Underline","cn","AlignLeft","AlignCenter","AlignRight","AlignJustify","List","ListOrdered","Calendar","X","EditorContent","Sheet","SheetContent","SheetHeader","SheetTitle","Input","Calendar","X","SheetFooter","Button","formatDueDate","EmptyState","StickyNote","Pen","Plus","DropdownMenu","DropdownMenuTrigger","EllipsisVertical","DropdownMenuContent","DropdownMenuItem","Calendar","Paperclip","AlertDialog","AlertDialogContent","AlertDialogHeader","AlertDialogTitle","AlertDialogDescription","AlertDialogFooter","AlertDialogCancel","AlertDialogAction","ShoppingCart","MessageCircle","Play","UserPlus","Eye","Calendar","Star","SquareCheckBig","Bell","Trophy","User","EmptyState","Rocket","Share2","cn","usersContacts.listUserContactTasks","usersTasks.updateUserTask","parseApiErrors","usersTasks.deleteUserTask","parseApiErrors","usersContacts.createUserContactTask","parseApiErrors","usersTasks.updateUserTask","parseApiErrors","EmptyState","ClipboardList","SquareCheckBig","Plus","CircleCheck","cn","DropdownMenu","DropdownMenuTrigger","Button","EllipsisVertical","DropdownMenuContent","DropdownMenuItem","Calendar","AlertDialog","AlertDialogContent","AlertDialogHeader","AlertDialogTitle","AlertDialogDescription","AlertDialogFooter","AlertDialogCancel","AlertDialogAction","usersContacts.listUserContactActivities","usersContacts.markUserContactRead","Tabs","TabsList","TabsTrigger","TabsContent","ShoppingCart","Repeat2","ChevronLeft","ChevronRight","usersContacts.listUserContactOrders","keepPreviousData","formatLabel","formatDate","STATUS_FILTERS","EmptyState","ShoppingCart","Skeleton","usersContacts.listUserContactSubscriptionOrders","keepPreviousData","Repeat2","Skeleton","companyContacts.getCompanyContact","companyContacts.createCompanyContact","companyContacts.updateCompanyContact","companyContacts.deleteCompanyContact","usersContacts.getUserContact","usersContacts.createUserContact","usersContacts.updateUserContact","usersContacts.deleteUserContact","parseApiErrors","parseApiErrors","z","useZodForm","parseApiErrors","useFluidContext","createFetchClient","usersContacts.listUserContacts","usersContacts.bulkDeleteUserContacts","Button","ArrowLeft","FormProvider","useZodForm"],"sources":["../../../contacts/ui/src/shared/components/contacts/statusBadge.tsx","../../../contacts/ui/src/shared/components/contacts/allContacts/contactsTable.tsx","../../../contacts/ui/src/shared/query-keys.ts","../../../contacts/ui/src/shared/components/contacts/allContacts/contactsPage.tsx","../../../contacts/ui/src/screens/ContactsListScreen.tsx","../../../contacts/ui/src/screens/ContactDetailScreen.tsx","../../../contacts/ui/src/screens/ContactCreateScreen.tsx","../../../contacts/ui/src/shared/components/contacts/contactCard/palettes.ts","../../../contacts/ui/src/shared/components/contacts/contactCard/styles.tsx","../../../contacts/ui/src/shared/components/contacts/contactCard/contactInfoCard.tsx","../../../contacts/ui/src/shared/components/contacts/contactDetailsForm.tsx","../../../contacts/ui/src/portal/components/notes/notes-sidebar.tsx","../../../notes/fluid-user-notes-api-client/src/namespaces/users_notes.ts","../../../contacts/fluid-user-contacts-api-client/src/namespaces/users_contacts.ts","../../../contacts/ui/src/portal/hooks/notes/use-contact-notes.ts","../../../contacts/ui/src/portal/hooks/notes/use-delete-contact-note.ts","../../../contacts/ui/src/portal/hooks/notes/use-create-contact-note.ts","../../../contacts/ui/src/portal/hooks/notes/use-update-contact-note.ts","../../../contacts/ui/src/portal/utils/format-date.ts","../../../contacts/ui/src/portal/components/editor/note-task-editor.tsx","../../../contacts/ui/src/portal/components/editor/note-task-modal.tsx","../../../contacts/ui/src/portal/components/notes/notes-list.tsx","../../../contacts/ui/src/portal/components/activities/activity-feed.tsx","../../../tasks/fluid-user-tasks-api-client/src/namespaces/users_tasks.ts","../../../contacts/ui/src/portal/hooks/contacts/use-contact-tasks.ts","../../../contacts/ui/src/portal/hooks/contacts/use-toggle-task-completion.ts","../../../contacts/ui/src/portal/hooks/contacts/use-delete-contact-task.ts","../../../contacts/ui/src/portal/hooks/contacts/use-create-contact-task.ts","../../../contacts/ui/src/portal/hooks/contacts/use-update-contact-task.ts","../../../contacts/ui/src/portal/components/tasks/task-list.tsx","../../../contacts/ui/src/portal/hooks/contacts/use-contact-activities.ts","../../../contacts/ui/src/portal/hooks/contacts/use-mark-contact-read.ts","../../../contacts/ui/src/portal/components/contacts/rep-contact-detail-view.tsx","../../../contacts/ui/src/portal/components/shared/Pagination.tsx","../../../contacts/ui/src/portal/hooks/contacts/use-contact-orders.ts","../../../contacts/ui/src/portal/components/orders/ContactOrdersList.tsx","../../../contacts/ui/src/portal/hooks/contacts/use-contact-subscription-orders.ts","../../../contacts/ui/src/portal/components/subscriptions/ContactSubscriptionOrdersList.tsx","../../../contacts/fluid-company-contacts-api-client/src/namespaces/company_contacts.ts","../../../contacts/ui/src/shared/utils/createContactApi.ts","../../../contacts/ui/src/shared/hooks/useContactDetail.ts","../../../contacts/ui/src/shared/hooks/useUpdateContactMutation.ts","../../../contacts/ui/src/shared/hooks/useDeleteContactMutation.ts","../../../contacts/ui/src/shared/schemas/contactFormSchema.ts","../../../contacts/ui/src/shared/hooks/useContactDetailPage.ts","../../../contacts/ui/src/shared/hooks/useCreateContactMutation.ts","../src/contacts/use-contacts-config.ts","../src/screens/ContactsScreen.tsx"],"sourcesContent":["import React from \"react\";\nimport { cn } from \"@fluid-app/ui-primitives\";\n\nconst statusStyles: Record<string, string> = {\n // Contact statuses\n new: \"border-[var(--status-new-border)] bg-[var(--status-new)] text-[var(--status-new-foreground)]\",\n active:\n \"border-[var(--status-active-border)] bg-[var(--status-active)] text-[var(--status-active-foreground)]\",\n inactive: \"border-border bg-muted text-muted-foreground\",\n lead: \"border-[var(--status-lead-border)] bg-[var(--status-lead)] text-[var(--status-lead-foreground)]\",\n customer:\n \"border-[var(--status-customer-border)] bg-[var(--status-customer)] text-[var(--status-customer-foreground)]\",\n // Semantic categories (orders, subscriptions, etc.)\n success:\n \"border-[var(--badge-success-border)] bg-[var(--badge-success)] text-[var(--badge-success-foreground)]\",\n warning:\n \"border-[var(--badge-warning-border)] bg-[var(--badge-warning)] text-[var(--badge-warning-foreground)]\",\n danger:\n \"border-[var(--badge-danger-border)] bg-[var(--badge-danger)] text-[var(--badge-danger-foreground)]\",\n info: \"border-[var(--badge-info-border)] bg-[var(--badge-info)] text-[var(--badge-info-foreground)]\",\n neutral: \"border-border bg-muted text-muted-foreground\",\n notice:\n \"border-[var(--badge-notice-border)] bg-[var(--badge-notice)] text-[var(--badge-notice-foreground)]\",\n accent:\n \"border-[var(--badge-accent-border)] bg-[var(--badge-accent)] text-[var(--badge-accent-foreground)]\",\n};\n\nconst defaultStyle = \"border-border bg-muted text-muted-foreground\";\n\nexport type StatusBadgeVariant = keyof typeof statusStyles;\n\nexport function getStatusStyle(status: string): string {\n return statusStyles[status] ?? defaultStyle;\n}\n\nexport function StatusBadge({\n status,\n label,\n className,\n}: {\n status: string;\n label?: string;\n className?: string;\n}): React.JSX.Element {\n return (\n <span\n className={cn(\n \"inline-flex items-center rounded-full border px-2.5 py-0.5 text-xs font-semibold capitalize\",\n getStatusStyle(status),\n className,\n )}\n >\n {label ?? status}\n </span>\n );\n}\n","\"use client\";\n\nimport {\n useState,\n useEffect,\n useCallback,\n useRef,\n useMemo,\n type JSX,\n} from \"react\";\nimport { useQuery, keepPreviousData } from \"@tanstack/react-query\";\nimport {\n ArrowUpDown,\n EllipsisVertical,\n Pencil,\n Search,\n Trash2,\n} from \"lucide-react\";\nimport {\n Avatar,\n AvatarFallback,\n AvatarImage,\n Badge,\n Button,\n Card,\n CardContent,\n cn,\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuLabel,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n Input,\n Skeleton,\n Table,\n TableBody,\n TableCell,\n TableHead,\n TableHeader,\n TableRow,\n} from \"@fluid-app/ui-primitives\";\nimport { PaginationFooter } from \"@fluid-app/orders-ui\";\nimport { StatusBadge } from \"../statusBadge\";\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface Contact {\n id: number;\n full_name: string;\n email?: string | null;\n phone?: string | null;\n status: string | null;\n avatar_url?: string | null;\n lead_type?: string | null;\n metadata?: Record<string, unknown>;\n [key: string]: unknown;\n}\n\nexport interface ContactsTableProps {\n listContacts: (\n params: Record<string, unknown>,\n ) => Promise<{ contacts: Contact[]; meta: { total_count?: number } }>;\n queryKeyPrefix: string;\n setSelectedContacts: (contacts: Contact[]) => void;\n setOpenDeleteModal: (open: boolean) => void;\n onEditContact?: (contact: Contact) => void;\n onRowClick?: (contact: Contact) => void;\n /** Incrementing key to reset selection from parent (e.g. after bulk delete) */\n resetKey?: number;\n /**\n * `members` — members: one card per contact (avatar, name, email, phone, group).\n * `default` — admin-style table with ID and status.\n */\n tableLayout?: \"default\" | \"members\";\n}\n\n// ---------------------------------------------------------------------------\n// Group-badge helpers\n// ---------------------------------------------------------------------------\n\nfunction getInitials(fullName: string | null | undefined): string {\n const trimmed = fullName?.trim();\n if (!trimmed) return \"?\";\n const parts = trimmed.split(/\\s+/).filter(Boolean);\n if (parts.length >= 2) {\n const a = parts[0]?.[0];\n const b = parts[1]?.[0];\n return `${a ?? \"\"}${b ?? \"\"}`.toUpperCase() || \"?\";\n }\n return trimmed.slice(0, 2).toUpperCase();\n}\n\nfunction dedupeGroupLabels(labels: string[]): string[] {\n const seen = new Set<string>();\n const out: string[] = [];\n for (const label of labels) {\n const key = label.toLowerCase();\n if (seen.has(key)) continue;\n seen.add(key);\n out.push(label);\n }\n return out;\n}\n\n/** Pull a display label from one API group/tag object or string. */\nfunction labelFromGroupLikeItem(item: unknown): string {\n if (typeof item === \"string\") return item.trim();\n if (!item || typeof item !== \"object\") return \"\";\n const o = item as Record<string, unknown>;\n for (const k of [\"name\", \"title\", \"label\", \"display_name\"] as const) {\n const v = o[k];\n if (typeof v === \"string\" && v.trim()) return v.trim();\n }\n return \"\";\n}\n\nfunction labelsFromGroupArray(value: unknown): string[] {\n if (!Array.isArray(value) || value.length === 0) return [];\n return dedupeGroupLabels(\n value.map(labelFromGroupLikeItem).filter(Boolean) as string[],\n );\n}\n\nfunction labelsFromMetadata(m: Record<string, unknown>): string[] {\n const arrayKeys = [\n \"contact_groups\",\n \"contactGroups\",\n \"groups\",\n \"labels\",\n \"tags\",\n \"segments\",\n ] as const;\n for (const key of arrayKeys) {\n const found = labelsFromGroupArray(m[key]);\n if (found.length > 0) return found;\n }\n for (const key of [\"group_name\", \"contact_group\", \"group\"] as const) {\n const v = m[key];\n if (typeof v === \"string\" && v.trim()) return [v.trim()];\n const one = labelFromGroupLikeItem(v);\n if (one) return [one];\n }\n return [];\n}\n\nfunction firstNonEmptyGroupList(...candidates: unknown[]): string[] {\n for (const c of candidates) {\n const labels = labelsFromGroupArray(c);\n if (labels.length > 0) return labels;\n }\n return [];\n}\n\n/**\n * Ordered group labels for badges. Prefer plural/array sources before singular\n * `contact_group` so we don't drop additional groups when the API sends both.\n */\nfunction resolveContactGroupLabels(contact: Contact): string[] {\n const raw = contact as Record<string, unknown>;\n\n const fromPlural = firstNonEmptyGroupList(\n raw.contact_groups,\n raw.contactGroups,\n raw.groups,\n raw.labels,\n raw.tags,\n raw.segments,\n );\n if (fromPlural.length > 0) return fromPlural;\n\n const direct = raw.group;\n if (typeof direct === \"string\" && direct.trim()) return [direct.trim()];\n\n const nested = raw.contact_group;\n const singleNested = labelFromGroupLikeItem(nested);\n if (singleNested) return [singleNested];\n\n const meta = contact.metadata;\n if (meta && typeof meta === \"object\") {\n const fromMeta = labelsFromMetadata(meta as Record<string, unknown>);\n if (fromMeta.length > 0) return fromMeta;\n }\n\n const lead = contact.lead_type;\n if (lead && String(lead).trim()) {\n return [String(lead).replaceAll(\"_\", \" \")];\n }\n\n return [];\n}\n\n// ---------------------------------------------------------------------------\n// RepContactCard\n// ---------------------------------------------------------------------------\n\ninterface RepContactCardProps {\n contact: Contact;\n selected: boolean;\n onToggleSelect: (id: number) => void;\n onRowClick?: (contact: Contact) => void;\n onEditContact?: (contact: Contact) => void;\n setSelectedContacts: (contacts: Contact[]) => void;\n setOpenDeleteModal: (open: boolean) => void;\n}\n\nfunction RepContactCard({\n contact,\n selected,\n onToggleSelect,\n onRowClick,\n onEditContact,\n setSelectedContacts,\n setOpenDeleteModal,\n}: RepContactCardProps): JSX.Element {\n const groupLabels = resolveContactGroupLabels(contact);\n const groupTitle =\n groupLabels.length > 0 ? groupLabels.join(\", \") : undefined;\n\n return (\n <Card\n className={cn(\n \"border-border hover:bg-accent/30 h-[100px] w-full flex-col items-start justify-center gap-0 py-0 shadow-sm transition-colors\",\n selected && \"bg-accent/40 border-primary/25 ring-primary/20 ring-1\",\n )}\n >\n <CardContent className=\"w-full px-3 py-0\">\n <div className=\"flex items-center gap-2 sm:gap-3\">\n <div\n className=\"flex shrink-0 items-center\"\n onClick={(e) => e.stopPropagation()}\n >\n <input\n type=\"checkbox\"\n checked={selected}\n onChange={() => onToggleSelect(contact.id)}\n aria-label={`Select ${contact.full_name}`}\n className=\"accent-primary h-3.5 w-3.5 rounded sm:h-4 sm:w-4\"\n />\n </div>\n <button\n type=\"button\"\n className=\"text-foreground focus-visible:ring-ring flex min-w-0 flex-1 items-center gap-2 rounded-md text-left outline-none focus-visible:ring-2 sm:gap-3\"\n onClick={() => onRowClick?.(contact)}\n >\n <Avatar className=\"size-12 shrink-0\">\n {contact.avatar_url ? (\n <AvatarImage\n src={contact.avatar_url}\n alt={contact.full_name || \"Contact\"}\n />\n ) : null}\n <AvatarFallback className=\"border-border text-foreground bg-accent ring-border/80 text-xs font-semibold ring-1\">\n {getInitials(contact.full_name)}\n </AvatarFallback>\n </Avatar>\n <span\n className=\"max-w-[32%] min-w-0 shrink truncate text-sm leading-tight font-semibold sm:max-w-none sm:flex-[1.15]\"\n title={contact.full_name}\n >\n {contact.full_name || \"—\"}\n </span>\n <span\n className=\"text-muted-foreground min-w-0 flex-[1.35] truncate text-xs leading-tight\"\n title={contact.email ?? undefined}\n >\n {contact.email || \"—\"}\n </span>\n <span\n className=\"text-muted-foreground min-w-0 flex-[0.95] truncate text-xs leading-tight\"\n title={contact.phone ?? undefined}\n >\n {contact.phone || \"—\"}\n </span>\n <span\n className=\"text-muted-foreground flex min-w-0 flex-[0.95] items-center gap-1 text-xs leading-tight\"\n title={groupTitle}\n >\n {groupLabels.length > 0\n ? groupLabels.slice(0, 2).map((label, index) => (\n <Badge\n key={`${contact.id}-group-${index}-${label}`}\n variant=\"secondary\"\n className=\"max-w-[min(100%,10rem)] shrink truncate font-normal capitalize\"\n title={label}\n >\n {label}\n </Badge>\n ))\n : \"—\"}\n {groupLabels.length > 2 && (\n <span className=\"text-muted-foreground shrink-0 text-[10px]\">\n +{groupLabels.length - 2}\n </span>\n )}\n </span>\n </button>\n <div\n className=\"flex shrink-0 items-center\"\n onClick={(e) => e.stopPropagation()}\n >\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button\n variant=\"ghost\"\n size=\"icon-xs\"\n aria-label=\"Contact actions\"\n >\n <EllipsisVertical className=\"h-4 w-4\" />\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\">\n {onEditContact && (\n <>\n <DropdownMenuItem onClick={() => onEditContact(contact)}>\n <Pencil className=\"h-3.5 w-3.5\" />\n Edit\n </DropdownMenuItem>\n <DropdownMenuSeparator />\n </>\n )}\n <DropdownMenuItem\n className=\"text-destructive\"\n onClick={() => {\n setSelectedContacts([contact]);\n setOpenDeleteModal(true);\n }}\n >\n <Trash2 className=\"h-3.5 w-3.5\" />\n Delete\n </DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenu>\n </div>\n </div>\n </CardContent>\n </Card>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Constants\n// ---------------------------------------------------------------------------\n\nconst TABS = [\"All\", \"Leads\", \"Customers\"] as const;\ntype Tab = (typeof TABS)[number];\n\ntype ContactSortDir = \"asc\" | \"desc\";\ntype ContactSortFieldOption = \"name\" | \"email\";\n\nfunction getSortComparable(\n contact: Contact,\n field: ContactSortFieldOption,\n): string {\n if (field === \"name\") return contact.full_name ?? \"\";\n return contact.email ?? \"\";\n}\n\nconst PAGE_SIZE = 25;\n\nconst CONTACT_SORT_COLUMNS: { id: ContactSortFieldOption; name: string }[] = [\n { id: \"name\", name: \"Name\" },\n { id: \"email\", name: \"Email\" },\n];\n\n// ---------------------------------------------------------------------------\n// Component\n// ---------------------------------------------------------------------------\n\nexport function ContactsTable({\n listContacts,\n queryKeyPrefix,\n setSelectedContacts,\n setOpenDeleteModal,\n onEditContact,\n onRowClick,\n resetKey,\n tableLayout,\n}: ContactsTableProps): JSX.Element {\n const isMemberLayout = tableLayout === \"members\";\n const [currentPage, setCurrentPage] = useState(1);\n const [searchTerm, setSearchTerm] = useState(\"\");\n const [activeTab, setActiveTab] = useState<Tab>(\"All\");\n const [currentSort, setCurrentSort] = useState<{\n id: ContactSortFieldOption;\n desc: boolean;\n }>({ id: \"name\", desc: false });\n const [selectedIds, setSelectedIds] = useState<Set<number>>(new Set());\n\n // Reset page when filters change\n useEffect(() => {\n setCurrentPage(1);\n setSelectedIds(new Set());\n }, [searchTerm, activeTab, currentSort]);\n\n // Clear selection on page change\n useEffect(() => {\n setSelectedIds(new Set());\n }, [currentPage]);\n\n // Clear selection when parent signals (e.g. after bulk delete)\n useEffect(() => {\n setSelectedIds(new Set());\n }, [resetKey]);\n\n const resolvedStatus =\n activeTab === \"Leads\"\n ? \"lead\"\n : activeTab === \"Customers\"\n ? \"customer\"\n : null;\n\n const { data, isLoading } = useQuery({\n queryKey: [\n queryKeyPrefix,\n {\n searchTerm,\n currentPage,\n activeTab,\n sortField: currentSort.id,\n sortDesc: currentSort.desc,\n },\n ],\n queryFn: () =>\n listContacts({\n search_query: searchTerm || undefined,\n page: currentPage,\n per_page: PAGE_SIZE,\n ...(resolvedStatus ? { status: resolvedStatus } : {}),\n sort_by: currentSort.id,\n sort_direction: currentSort.desc ? \"desc\" : \"asc\",\n }),\n placeholderData: keepPreviousData,\n });\n\n const items = useMemo(() => data?.contacts ?? [], [data?.contacts]);\n\n // sort_by/sort_direction are passed to listContacts so the server returns\n // pre-sorted results. Client-side re-sort is kept as a fallback for API\n // consumers that don't yet honour those params.\n const displayItems = useMemo(() => {\n const sortField = currentSort.id;\n const sortDir: ContactSortDir = currentSort.desc ? \"desc\" : \"asc\";\n return [...items].sort((a, b) => {\n const av = getSortComparable(a, sortField).toLowerCase();\n const bv = getSortComparable(b, sortField).toLowerCase();\n const cmp = av.localeCompare(bv, undefined, { sensitivity: \"base\" });\n return sortDir === \"asc\" ? cmp : -cmp;\n });\n }, [items, currentSort]);\n\n const totalItems = data?.meta?.total_count ?? 0;\n const totalPages = Math.max(1, Math.ceil(totalItems / PAGE_SIZE));\n\n const allSelected =\n displayItems.length > 0 && displayItems.every((c) => selectedIds.has(c.id));\n const someSelected = selectedIds.size > 0 && !allSelected;\n\n const selectAllRef = useRef<HTMLInputElement>(null);\n useEffect(() => {\n if (selectAllRef.current) {\n selectAllRef.current.indeterminate = someSelected;\n }\n }, [someSelected]);\n\n const toggleSelectAll = useCallback(() => {\n setSelectedIds((prev) => {\n const next = new Set(prev);\n if (allSelected) {\n for (const item of displayItems) next.delete(item.id);\n } else {\n for (const item of displayItems) next.add(item.id);\n }\n return next;\n });\n }, [allSelected, displayItems]);\n\n const toggleSelect = useCallback((id: number) => {\n setSelectedIds((prev) => {\n const next = new Set(prev);\n if (next.has(id)) {\n next.delete(id);\n } else {\n next.add(id);\n }\n return next;\n });\n }, []);\n\n const handleBulkDelete = useCallback(() => {\n const selected = displayItems.filter((c) => selectedIds.has(c.id));\n if (selected.length > 0) {\n setSelectedContacts(selected);\n setOpenDeleteModal(true);\n }\n }, [displayItems, selectedIds, setSelectedContacts, setOpenDeleteModal]);\n\n return (\n <div className=\"border-border overflow-hidden rounded-lg border shadow-sm\">\n {/* Header: tabs + search + filters */}\n <div className=\"flex flex-col gap-2 p-3 sm:flex-row sm:items-center sm:justify-between\">\n <div className=\"flex flex-wrap items-center gap-2 sm:gap-3\">\n <div className=\"flex items-center gap-1\">\n {TABS.map((tab) => (\n <Button\n key={tab}\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => setActiveTab(tab)}\n className={cn(\n \"rounded-md text-xs\",\n activeTab === tab && \"bg-accent font-bold\",\n )}\n >\n {tab}\n </Button>\n ))}\n </div>\n </div>\n <div className=\"flex min-w-0 flex-1 items-center justify-end gap-2 sm:max-w-none\">\n <div className=\"shrink-0\">\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button\n variant=\"ghost\"\n size=\"icon-xs\"\n aria-label=\"Sort contacts\"\n >\n <ArrowUpDown className=\"h-4 w-4\" />\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\" className=\"w-48\">\n <DropdownMenuLabel className=\"text-xs font-medium\">\n Sort by\n </DropdownMenuLabel>\n <DropdownMenuSeparator />\n {CONTACT_SORT_COLUMNS.map((col) => (\n <DropdownMenuItem\n key={col.id}\n onClick={() =>\n setCurrentSort((prev) => ({\n id: col.id,\n desc: prev.id === col.id ? !prev.desc : false,\n }))\n }\n >\n <span className=\"flex-1\">{col.name}</span>\n {currentSort.id === col.id && (\n <span className=\"text-muted-foreground text-xs\">\n {currentSort.desc ? \"↓\" : \"↑\"}\n </span>\n )}\n </DropdownMenuItem>\n ))}\n </DropdownMenuContent>\n </DropdownMenu>\n </div>\n <div className=\"relative min-w-0 flex-1 sm:w-auto sm:min-w-[220px] sm:flex-initial\">\n <div className=\"pointer-events-none absolute inset-y-0 left-0 flex items-center pl-3\">\n <Search className=\"text-muted-foreground h-4 w-4\" />\n </div>\n <Input\n type=\"search\"\n value={searchTerm}\n onChange={(e) => setSearchTerm(e.target.value)}\n className=\"h-8 w-full pl-10 text-sm\"\n placeholder=\"Search contacts...\"\n />\n </div>\n </div>\n </div>\n\n {/* Rep layout: card list (all breakpoints) */}\n {isMemberLayout ? (\n <div className=\"space-y-3 p-3\">\n {!isLoading && items.length > 0 ? (\n <div className=\"bg-muted/40 border-border flex flex-wrap items-center justify-between gap-2 rounded-lg border px-3 py-2\">\n <div className=\"flex items-center gap-3\">\n <input\n ref={selectAllRef}\n type=\"checkbox\"\n checked={allSelected}\n onChange={toggleSelectAll}\n aria-label={\n allSelected ? \"Deselect all\" : \"Select all on this page\"\n }\n className=\"accent-primary h-4 w-4 shrink-0 rounded\"\n />\n {selectedIds.size > 0 ? (\n <span className=\"text-foreground text-sm font-medium\">\n {selectedIds.size} selected\n </span>\n ) : (\n <span className=\"text-muted-foreground text-sm\">\n Select all\n </span>\n )}\n </div>\n {selectedIds.size > 0 ? (\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className=\"h-8 gap-1 text-xs\"\n >\n <EllipsisVertical className=\"h-4 w-4\" />\n Actions\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\">\n <DropdownMenuItem\n className=\"text-destructive\"\n onClick={handleBulkDelete}\n >\n <Trash2 className=\"h-3.5 w-3.5\" />\n Delete {selectedIds.size}{\" \"}\n {selectedIds.size === 1 ? \"contact\" : \"contacts\"}\n </DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenu>\n ) : null}\n </div>\n ) : null}\n\n {isLoading ? (\n Array(5)\n .fill(0)\n .map((_, i) => (\n <Card\n key={`card-skel-${i}`}\n className=\"border-border h-[100px] w-full flex-col items-start justify-center gap-0 py-0 shadow-sm\"\n >\n <CardContent className=\"w-full px-3 py-0\">\n <div className=\"flex items-center gap-2 sm:gap-3\">\n <Skeleton className=\"h-3.5 w-3.5 shrink-0 rounded sm:h-4 sm:w-4\" />\n <Skeleton className=\"size-12 shrink-0 rounded-full\" />\n <Skeleton className=\"h-3.5 max-w-[32%] shrink sm:max-w-none sm:flex-[1.15]\" />\n <Skeleton className=\"h-3.5 min-w-0 flex-[1.35]\" />\n <Skeleton className=\"h-3.5 min-w-0 flex-[0.95]\" />\n <Skeleton className=\"h-3.5 min-w-0 flex-[0.95]\" />\n <Skeleton className=\"size-7 shrink-0 rounded-md\" />\n </div>\n </CardContent>\n </Card>\n ))\n ) : items.length === 0 ? (\n <div className=\"text-muted-foreground py-10 text-center text-sm\">\n No contacts found\n </div>\n ) : (\n displayItems.map((contact) => (\n <RepContactCard\n key={contact.id}\n contact={contact}\n selected={selectedIds.has(contact.id)}\n onToggleSelect={toggleSelect}\n onRowClick={onRowClick}\n onEditContact={onEditContact}\n setSelectedContacts={setSelectedContacts}\n setOpenDeleteModal={setOpenDeleteModal}\n />\n ))\n )}\n </div>\n ) : (\n <>\n {/* Mobile view (admin default) */}\n <div className=\"block md:hidden\">\n {isLoading ? (\n Array(5)\n .fill(0)\n .map((_, i) => (\n <div\n key={`skeleton-${i}`}\n className=\"border-border border-b p-4\"\n >\n <div className=\"space-y-2\">\n <Skeleton className=\"h-4 w-3/4\" />\n <Skeleton className=\"h-3 w-1/2\" />\n </div>\n </div>\n ))\n ) : items.length === 0 ? (\n <div className=\"text-muted-foreground px-3 py-8 text-center text-sm\">\n No contacts found\n </div>\n ) : (\n displayItems.map((contact) => (\n <div\n key={contact.id}\n className=\"border-border hover:bg-accent cursor-pointer border-b p-4 transition-colors last:border-b-0\"\n onClick={() => onRowClick?.(contact)}\n >\n <div className=\"flex items-center justify-between gap-3\">\n <div className=\"min-w-0 flex-1\">\n <p className=\"text-foreground truncate text-sm font-medium\">\n {contact.full_name || \"—\"}\n </p>\n <p className=\"text-muted-foreground truncate text-xs\">\n {contact.email || \"—\"}\n </p>\n </div>\n {contact.status && <StatusBadge status={contact.status} />}\n </div>\n </div>\n ))\n )}\n </div>\n\n {/* Desktop view (admin table) */}\n <div className=\"hidden md:block\">\n <Table className=\"min-w-full table-fixed\">\n <colgroup>\n <col className=\"w-[40px]\" />\n <col className=\"w-[60px]\" />\n <col className=\"w-[25%] min-w-[160px]\" />\n <col className=\"w-[25%] min-w-[160px]\" />\n <col className=\"w-[15%] min-w-[120px]\" />\n <col className=\"w-[15%] min-w-[100px]\" />\n <col className=\"w-[50px]\" />\n </colgroup>\n <TableHeader className=\"bg-muted\">\n {selectedIds.size > 0 ? (\n <TableRow>\n <TableHead className=\"px-3\">\n <input\n ref={selectAllRef}\n type=\"checkbox\"\n checked={allSelected}\n onChange={toggleSelectAll}\n aria-label=\"Deselect all\"\n className=\"accent-primary h-4 w-4 rounded\"\n />\n </TableHead>\n <TableHead colSpan={5} className=\"px-3\">\n <span className=\"text-foreground text-sm font-medium\">\n {selectedIds.size} selected\n </span>\n </TableHead>\n <TableHead className=\"px-3\">\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button variant=\"ghost\" size=\"icon-xs\">\n <EllipsisVertical className=\"h-4 w-4\" />\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\">\n <DropdownMenuItem\n className=\"text-destructive\"\n onClick={handleBulkDelete}\n >\n <Trash2 className=\"h-3.5 w-3.5\" />\n Delete {selectedIds.size}{\" \"}\n {selectedIds.size === 1 ? \"row\" : \"rows\"}\n </DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenu>\n </TableHead>\n </TableRow>\n ) : (\n <TableRow>\n <TableHead className=\"px-3\">\n <input\n ref={selectAllRef}\n type=\"checkbox\"\n checked={allSelected}\n onChange={toggleSelectAll}\n aria-label=\"Select all\"\n className=\"accent-primary h-4 w-4 rounded\"\n />\n </TableHead>\n <TableHead className=\"text-muted-foreground px-3 text-xs\">\n ID\n </TableHead>\n <TableHead className=\"text-muted-foreground px-3 text-xs\">\n Name\n </TableHead>\n <TableHead className=\"text-muted-foreground px-3 text-xs\">\n Email\n </TableHead>\n <TableHead className=\"text-muted-foreground px-3 text-xs\">\n Phone\n </TableHead>\n <TableHead className=\"text-muted-foreground px-3 text-xs\">\n Status\n </TableHead>\n <TableHead className=\"px-3\" />\n </TableRow>\n )}\n </TableHeader>\n <TableBody className=\"bg-background\">\n {isLoading ? (\n Array(5)\n .fill(0)\n .map((_, i) => (\n <TableRow key={`skeleton-${i}`}>\n <TableCell className=\"px-3 py-3\">\n <Skeleton className=\"h-4 w-4\" />\n </TableCell>\n <TableCell className=\"px-3 py-3\">\n <Skeleton className=\"h-4 w-8\" />\n </TableCell>\n <TableCell className=\"px-3 py-3\">\n <Skeleton className=\"h-4 w-24\" />\n </TableCell>\n <TableCell className=\"px-3 py-3\">\n <Skeleton className=\"h-4 w-32\" />\n </TableCell>\n <TableCell className=\"px-3 py-3\">\n <Skeleton className=\"h-4 w-20\" />\n </TableCell>\n <TableCell className=\"px-3 py-3\">\n <Skeleton className=\"h-4 w-16\" />\n </TableCell>\n <TableCell className=\"px-3 py-3\" />\n </TableRow>\n ))\n ) : items.length === 0 ? (\n <TableRow>\n <TableCell\n colSpan={7}\n className=\"text-muted-foreground px-3 py-8 text-center\"\n >\n No contacts found\n </TableCell>\n </TableRow>\n ) : (\n displayItems.map((contact) => (\n <TableRow\n key={contact.id}\n className={cn(\n \"cursor-pointer\",\n selectedIds.has(contact.id) && \"bg-accent\",\n )}\n onClick={() => onRowClick?.(contact)}\n >\n <TableCell\n className=\"px-3 py-3\"\n onClick={(e) => e.stopPropagation()}\n >\n <input\n type=\"checkbox\"\n checked={selectedIds.has(contact.id)}\n onChange={() => toggleSelect(contact.id)}\n aria-label={`Select ${contact.full_name}`}\n className=\"accent-primary h-4 w-4 rounded\"\n />\n </TableCell>\n <TableCell className=\"px-3 py-3 text-right\">\n {contact.id}\n </TableCell>\n <TableCell className=\"px-3 py-3\">\n <div\n className=\"max-w-32 truncate font-semibold\"\n title={contact.full_name}\n >\n {contact.full_name || \"—\"}\n </div>\n </TableCell>\n <TableCell className=\"px-3 py-3\">\n <div\n className=\"max-w-32 truncate\"\n title={contact.email ?? undefined}\n >\n {contact.email || \"—\"}\n </div>\n </TableCell>\n <TableCell className=\"px-3 py-3\">\n {contact.phone || \"—\"}\n </TableCell>\n <TableCell className=\"px-3 py-3\">\n {contact.status ? (\n <StatusBadge status={contact.status} />\n ) : (\n \"—\"\n )}\n </TableCell>\n <TableCell\n className=\"px-3 py-3\"\n onClick={(e) => e.stopPropagation()}\n >\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button variant=\"ghost\" size=\"icon-xs\">\n <EllipsisVertical className=\"h-4 w-4\" />\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\">\n {onEditContact && (\n <>\n <DropdownMenuItem\n onClick={() => onEditContact(contact)}\n >\n <Pencil className=\"h-3.5 w-3.5\" />\n Edit\n </DropdownMenuItem>\n <DropdownMenuSeparator />\n </>\n )}\n <DropdownMenuItem\n className=\"text-destructive\"\n onClick={() => {\n setSelectedContacts([contact]);\n setOpenDeleteModal(true);\n }}\n >\n <Trash2 className=\"h-3.5 w-3.5\" />\n Delete\n </DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenu>\n </TableCell>\n </TableRow>\n ))\n )}\n </TableBody>\n </Table>\n </div>\n </>\n )}\n\n <PaginationFooter\n currentPage={currentPage}\n totalPages={totalPages}\n pageSize={PAGE_SIZE}\n totalItems={totalItems}\n onPageChange={setCurrentPage}\n />\n </div>\n );\n}\n","export const CONTACTS_QUERY_KEYS = {\n all: (prefix: string) => [prefix] as const,\n list: (prefix: string) =>\n [...CONTACTS_QUERY_KEYS.all(prefix), \"list\"] as const,\n detail: (prefix: string, id: string) =>\n [...CONTACTS_QUERY_KEYS.all(prefix), \"detail\", id] as const,\n} as const;\n","\"use client\";\n\nimport { useState, useCallback } from \"react\";\nimport { useMutation, useQueryClient } from \"@tanstack/react-query\";\nimport {\n AlertDialog,\n AlertDialogAction,\n AlertDialogCancel,\n AlertDialogContent,\n AlertDialogDescription,\n AlertDialogFooter,\n AlertDialogHeader,\n AlertDialogTitle,\n fluidToast,\n} from \"@fluid-app/ui-primitives\";\nimport { parseApiErrors } from \"@fluid-app/api-client-core\";\nimport { ContactsTable, type Contact } from \"./contactsTable\";\nimport { CONTACTS_QUERY_KEYS } from \"../../../query-keys\";\n\nexport type { Contact };\n\nexport interface ContactsPageProps {\n /** Pre-bound function to list contacts. Client is already applied. */\n listContacts: (\n params: Record<string, unknown>,\n ) => Promise<{ contacts: Contact[]; meta: { total_count?: number } }>;\n /** Function to delete contacts by IDs */\n deleteContacts: (ids: number[]) => Promise<unknown>;\n /** Query key prefix for TanStack Query cache management */\n queryKeyPrefix: string;\n /** Header element (e.g. PageHeader with breadcrumbs and action buttons) */\n header?: React.ReactNode;\n /** Callback when edit action is triggered on a contact row */\n onEditContact?: (contact: Contact) => void;\n /** Callback when a contact row is clicked */\n onRowClick?: (contact: Contact) => void;\n /** @see ContactsTableProps[\"tableLayout\"] */\n tableLayout?: \"default\" | \"members\";\n}\n\nexport function ContactsPage({\n listContacts,\n deleteContacts,\n queryKeyPrefix,\n header,\n onEditContact,\n onRowClick,\n tableLayout,\n}: ContactsPageProps): React.JSX.Element {\n const [openDeleteModal, setOpenDeleteModal] = useState(false);\n const [selectedContacts, setSelectedContacts] = useState<Contact[]>([]);\n const [resetKey, setResetKey] = useState(0);\n const queryClient = useQueryClient();\n const bumpResetKey = useCallback(() => setResetKey((k) => k + 1), []);\n\n const deleteContactMutation = useMutation({\n mutationFn: (ids: number[]) => deleteContacts(ids),\n onSuccess: () => {\n fluidToast({ title: \"Contacts deleted successfully\", type: \"success\" });\n queryClient.invalidateQueries({\n queryKey: CONTACTS_QUERY_KEYS.all(queryKeyPrefix),\n });\n },\n onError: (error) => {\n fluidToast({\n title: \"Failed to delete contacts\",\n type: \"error\",\n description: parseApiErrors(error),\n });\n },\n onSettled: () => {\n setOpenDeleteModal(false);\n setSelectedContacts([]);\n bumpResetKey();\n },\n });\n\n return (\n <>\n {header}\n <div className=\"mx-auto max-w-7xl space-y-6 px-4 py-4 md:px-10 md:py-8\">\n <ContactsTable\n listContacts={listContacts}\n queryKeyPrefix={queryKeyPrefix}\n setSelectedContacts={setSelectedContacts}\n setOpenDeleteModal={setOpenDeleteModal}\n onEditContact={onEditContact}\n onRowClick={onRowClick}\n resetKey={resetKey}\n tableLayout={tableLayout}\n />\n </div>\n <AlertDialog open={openDeleteModal} onOpenChange={setOpenDeleteModal}>\n <AlertDialogContent>\n <AlertDialogHeader>\n <AlertDialogTitle>Delete contact?</AlertDialogTitle>\n <AlertDialogDescription>\n Are you sure you want to delete{\" \"}\n {selectedContacts.length === 1\n ? \"this contact\"\n : `${selectedContacts.length} contacts`}\n ? This action cannot be undone.\n </AlertDialogDescription>\n </AlertDialogHeader>\n <AlertDialogFooter>\n <AlertDialogCancel>Cancel</AlertDialogCancel>\n <AlertDialogAction\n variant=\"destructive\"\n onClick={() =>\n deleteContactMutation.mutate(selectedContacts.map((c) => c.id))\n }\n >\n Delete\n </AlertDialogAction>\n </AlertDialogFooter>\n </AlertDialogContent>\n </AlertDialog>\n </>\n );\n}\n","\"use client\";\n\nimport { useMemo, type ReactNode } from \"react\";\nimport {\n Breadcrumb,\n BreadcrumbList,\n BreadcrumbItem,\n BreadcrumbPage,\n Button,\n} from \"@fluid-app/ui-primitives\";\nimport { Plus } from \"lucide-react\";\nimport {\n useScreenHeaderActions,\n useScreenHeaderBreadcrumbs,\n} from \"@fluid-app/portal-react/shell/ScreenHeaderContext\";\nimport {\n ContactsPage,\n type Contact,\n} from \"../shared/components/contacts/allContacts/contactsPage\";\n\nexport type { Contact };\n\nexport interface ContactsListScreenProps {\n listContacts: (\n params: Record<string, unknown>,\n ) => Promise<{ contacts: Contact[]; meta: { total_count?: number } }>;\n deleteContacts: (ids: number[]) => Promise<unknown>;\n onEditContact?: (contact: Contact) => void;\n onRowClick?: (contact: Contact) => void;\n onAddContact: () => void;\n queryKeyPrefix?: string;\n tableLayout?: \"default\" | \"members\";\n /** Override the default header element rendered by ContactsPage */\n header?: ReactNode;\n}\n\nexport function ContactsListScreen({\n listContacts,\n deleteContacts,\n onEditContact,\n onRowClick,\n onAddContact,\n queryKeyPrefix = \"contacts\",\n tableLayout,\n header,\n}: ContactsListScreenProps) {\n const headerActions = useMemo(\n () => (\n <Button onClick={onAddContact} size=\"sm\">\n <Plus className=\"mr-1 h-4 w-4\" />\n Add Contact\n </Button>\n ),\n [onAddContact],\n );\n useScreenHeaderActions(headerActions);\n\n const headerBreadcrumbs = useMemo(\n () => (\n <Breadcrumb>\n <BreadcrumbList className=\"text-lg\">\n <BreadcrumbItem>\n <BreadcrumbPage className=\"font-semibold\">Contacts</BreadcrumbPage>\n </BreadcrumbItem>\n </BreadcrumbList>\n </Breadcrumb>\n ),\n [],\n );\n useScreenHeaderBreadcrumbs(headerBreadcrumbs);\n\n return (\n <ContactsPage\n listContacts={listContacts}\n deleteContacts={deleteContacts}\n queryKeyPrefix={queryKeyPrefix}\n tableLayout={tableLayout}\n header={header}\n onEditContact={onEditContact}\n onRowClick={onRowClick}\n />\n );\n}\n","\"use client\";\n\nimport { useState, useMemo, type ReactNode } from \"react\";\nimport {\n AlertDialog,\n AlertDialogAction,\n AlertDialogCancel,\n AlertDialogContent,\n AlertDialogDescription,\n AlertDialogFooter,\n AlertDialogHeader,\n AlertDialogTitle,\n Breadcrumb,\n BreadcrumbItem,\n BreadcrumbLink,\n BreadcrumbList,\n BreadcrumbPage,\n BreadcrumbSeparator,\n Button,\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuTrigger,\n} from \"@fluid-app/ui-primitives\";\nimport { EllipsisVertical } from \"lucide-react\";\nimport {\n useScreenHeaderActions,\n useScreenHeaderBreadcrumbs,\n} from \"@fluid-app/portal-react/shell/ScreenHeaderContext\";\n\nexport interface ContactDetailScreenProps {\n contactId: string;\n contact?: { full_name?: string | null } | null;\n onNavigateToList: () => void;\n onSave: () => void;\n onDelete: () => void;\n isDirty: boolean;\n isSubmitting: boolean;\n isDeleting: boolean;\n children: ReactNode;\n}\n\nexport function ContactDetailScreen({\n contact,\n onNavigateToList,\n onSave,\n onDelete,\n isDirty,\n isSubmitting,\n isDeleting,\n children,\n}: ContactDetailScreenProps) {\n const [showDeleteDialog, setShowDeleteDialog] = useState(false);\n\n const headerActions = useMemo(\n () => (\n <>\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button variant=\"outline\" size=\"icon\" className=\"border-border\">\n <EllipsisVertical className=\"h-4 w-4\" />\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\">\n <DropdownMenuItem\n className=\"text-destructive\"\n onClick={() => setShowDeleteDialog(true)}\n >\n Delete\n </DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenu>\n <Button\n onClick={onSave}\n disabled={!isDirty || isSubmitting || isDeleting}\n >\n {isSubmitting ? \"Saving...\" : \"Save\"}\n </Button>\n </>\n ),\n [onSave, isDirty, isSubmitting, isDeleting],\n );\n useScreenHeaderActions(headerActions);\n\n const headerBreadcrumbs = useMemo(\n () => (\n <Breadcrumb>\n <BreadcrumbList className=\"text-lg\">\n <BreadcrumbItem>\n <BreadcrumbLink\n href=\"#\"\n onClick={(e) => {\n e.preventDefault();\n onNavigateToList();\n }}\n >\n Contacts\n </BreadcrumbLink>\n </BreadcrumbItem>\n <BreadcrumbSeparator />\n <BreadcrumbItem>\n <BreadcrumbPage className=\"font-semibold\">\n {contact?.full_name ?? \"Contact\"}\n </BreadcrumbPage>\n </BreadcrumbItem>\n </BreadcrumbList>\n </Breadcrumb>\n ),\n [contact?.full_name, onNavigateToList],\n );\n useScreenHeaderBreadcrumbs(headerBreadcrumbs);\n\n return (\n <>\n {children}\n <AlertDialog open={showDeleteDialog} onOpenChange={setShowDeleteDialog}>\n <AlertDialogContent>\n <AlertDialogHeader>\n <AlertDialogTitle>Delete Contact</AlertDialogTitle>\n <AlertDialogDescription>\n Are you sure you want to delete{\" \"}\n {contact?.full_name ?? \"this contact\"}? This action cannot be\n undone.\n </AlertDialogDescription>\n </AlertDialogHeader>\n <AlertDialogFooter>\n <AlertDialogCancel disabled={isDeleting}>Cancel</AlertDialogCancel>\n <AlertDialogAction\n onClick={() => {\n onDelete();\n setShowDeleteDialog(false);\n }}\n disabled={isDeleting}\n className=\"bg-destructive text-destructive-foreground hover:bg-destructive/90\"\n >\n {isDeleting ? \"Deleting...\" : \"Delete\"}\n </AlertDialogAction>\n </AlertDialogFooter>\n </AlertDialogContent>\n </AlertDialog>\n </>\n );\n}\n","\"use client\";\n\nimport { useMemo, type ReactNode } from \"react\";\nimport {\n Breadcrumb,\n BreadcrumbItem,\n BreadcrumbLink,\n BreadcrumbList,\n BreadcrumbPage,\n BreadcrumbSeparator,\n Button,\n} from \"@fluid-app/ui-primitives\";\nimport {\n useScreenHeaderActions,\n useScreenHeaderBreadcrumbs,\n} from \"@fluid-app/portal-react/shell/ScreenHeaderContext\";\n\nexport interface ContactCreateScreenProps {\n onNavigateToList: () => void;\n onSubmit: () => void;\n isPending: boolean;\n children: ReactNode;\n}\n\nexport function ContactCreateScreen({\n onNavigateToList,\n onSubmit,\n isPending,\n children,\n}: ContactCreateScreenProps) {\n const headerActions = useMemo(\n () => (\n <>\n <Button\n variant=\"outline\"\n onClick={onNavigateToList}\n disabled={isPending}\n >\n Cancel\n </Button>\n <Button onClick={onSubmit} disabled={isPending}>\n {isPending ? \"Adding...\" : \"Add Contact\"}\n </Button>\n </>\n ),\n [onNavigateToList, onSubmit, isPending],\n );\n useScreenHeaderActions(headerActions);\n\n const headerBreadcrumbs = useMemo(\n () => (\n <Breadcrumb>\n <BreadcrumbList className=\"text-lg\">\n <BreadcrumbItem>\n <BreadcrumbLink\n href=\"#\"\n onClick={(e) => {\n e.preventDefault();\n onNavigateToList();\n }}\n >\n Contacts\n </BreadcrumbLink>\n </BreadcrumbItem>\n <BreadcrumbSeparator />\n <BreadcrumbItem>\n <BreadcrumbPage className=\"font-semibold\">\n New Contact\n </BreadcrumbPage>\n </BreadcrumbItem>\n </BreadcrumbList>\n </Breadcrumb>\n ),\n [onNavigateToList],\n );\n useScreenHeaderBreadcrumbs(headerBreadcrumbs);\n\n return <>{children}</>;\n}\n","/**\n * Color palettes for contact card backgrounds.\n * Raw CSS values bypass Tailwind's JIT purge for dynamic backgrounds.\n */\n\nexport type GradientPalette = {\n base: string;\n overlay: string;\n accent: string;\n orb1: string;\n orb2: string;\n orb3: string;\n};\n\nexport const gradientPalettes: GradientPalette[] = [\n {\n base: \"linear-gradient(to bottom right, #7e22ce, #7c3aed, #a21caf)\",\n overlay:\n \"linear-gradient(to top right, rgba(30,27,75,0.6), transparent, rgba(236,72,153,0.4))\",\n accent:\n \"linear-gradient(to bottom left, rgba(192,38,211,0.5), transparent, transparent)\",\n orb1: \"rgba(59,7,100,0.4)\",\n orb2: \"rgba(236,72,153,0.2)\",\n orb3: \"rgba(49,46,129,0.3)\",\n },\n {\n base: \"linear-gradient(to bottom right, #0f766e, #0891b2, #047857)\",\n overlay:\n \"linear-gradient(to top right, rgba(15,23,42,0.6), transparent, rgba(45,212,191,0.4))\",\n accent:\n \"linear-gradient(to bottom left, rgba(16,185,129,0.5), transparent, transparent)\",\n orb1: \"rgba(17,94,89,0.4)\",\n orb2: \"rgba(34,211,238,0.2)\",\n orb3: \"rgba(6,78,59,0.3)\",\n },\n {\n base: \"linear-gradient(to bottom right, #be123c, #db2777, #ea580c)\",\n overlay:\n \"linear-gradient(to top right, rgba(136,19,55,0.6), transparent, rgba(245,158,11,0.4))\",\n accent:\n \"linear-gradient(to bottom left, rgba(249,115,22,0.5), transparent, transparent)\",\n orb1: \"rgba(136,19,55,0.4)\",\n orb2: \"rgba(251,191,36,0.2)\",\n orb3: \"rgba(157,23,77,0.3)\",\n },\n {\n base: \"linear-gradient(to bottom right, #1d4ed8, #4f46e5, #6d28d9)\",\n overlay:\n \"linear-gradient(to top right, rgba(15,23,42,0.6), transparent, rgba(96,165,250,0.4))\",\n accent:\n \"linear-gradient(to bottom left, rgba(139,92,246,0.5), transparent, transparent)\",\n orb1: \"rgba(30,58,138,0.4)\",\n orb2: \"rgba(129,140,248,0.2)\",\n orb3: \"rgba(30,41,59,0.3)\",\n },\n {\n base: \"linear-gradient(to bottom right, #b45309, #ea580c, #b91c1c)\",\n overlay:\n \"linear-gradient(to top right, rgba(120,53,15,0.6), transparent, rgba(250,204,21,0.4))\",\n accent:\n \"linear-gradient(to bottom left, rgba(239,68,68,0.5), transparent, transparent)\",\n orb1: \"rgba(120,53,15,0.4)\",\n orb2: \"rgba(250,204,21,0.2)\",\n orb3: \"rgba(154,52,18,0.3)\",\n },\n {\n base: \"linear-gradient(to bottom right, #047857, #16a34a, #0f766e)\",\n overlay:\n \"linear-gradient(to top right, rgba(6,78,59,0.6), transparent, rgba(163,230,53,0.4))\",\n accent:\n \"linear-gradient(to bottom left, rgba(34,197,94,0.5), transparent, transparent)\",\n orb1: \"rgba(6,78,59,0.4)\",\n orb2: \"rgba(163,230,53,0.2)\",\n orb3: \"rgba(21,128,61,0.3)\",\n },\n];\n","/**\n * Background style renderers for the contact card.\n * Each style renders the background differently using the same palette.\n */\n\nimport React from \"react\";\nimport type { GradientPalette } from \"./palettes\";\n\nexport type BackgroundStyleRenderer = (\n palette: GradientPalette,\n) => React.ReactNode;\n\nconst NOISE_TEXTURE =\n \"url('data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyMDAiIGhlaWdodD0iMjAwIj48ZmlsdGVyIGlkPSJhIj48ZmVUdXJidWxlbmNlIHR5cGU9ImZyYWN0YWxOb2lzZSIgYmFzZUZyZXF1ZW5jeT0iLjc1IiBzdGl0Y2hUaWxlcz0ic3RpdGNoIi8+PC9maWx0ZXI+PHJlY3Qgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIgZmlsdGVyPSJ1cmwoI2EpIi8+PC9zdmc+')\";\n\n/** Floating blurred orbs on gradient — organic, painterly feel */\nexport const orbsStyle: BackgroundStyleRenderer = (palette) => (\n <>\n <div\n className=\"absolute inset-0\"\n style={{ backgroundImage: palette.base }}\n />\n <div\n className=\"absolute inset-0\"\n style={{ backgroundImage: palette.overlay }}\n />\n <div\n className=\"absolute top-0 right-0 h-full w-2/3\"\n style={{ backgroundImage: palette.accent }}\n />\n <div\n className=\"absolute right-0 bottom-0 h-1/2 w-1/2 rounded-full blur-2xl\"\n style={{ backgroundColor: palette.orb1 }}\n />\n <div\n className=\"absolute top-1/4 left-1/4 h-32 w-32 rounded-full blur-xl\"\n style={{ backgroundColor: palette.orb2 }}\n />\n <div\n className=\"absolute bottom-1/3 left-0 h-24 w-40 rounded-full blur-xl\"\n style={{ backgroundColor: palette.orb3 }}\n />\n <div\n className=\"absolute inset-0 opacity-[0.15] mix-blend-overlay\"\n style={{ backgroundImage: NOISE_TEXTURE }}\n />\n </>\n);\n\n/** Clean base gradient only — minimal and elegant */\nexport const cleanStyle: BackgroundStyleRenderer = (palette) => (\n <div className=\"absolute inset-0\" style={{ backgroundImage: palette.base }} />\n);\n\n/** Soft radial mesh — ethereal, aurora-like glow */\nexport const auroraStyle: BackgroundStyleRenderer = (palette) => (\n <>\n <div\n className=\"absolute inset-0\"\n style={{ backgroundImage: palette.base }}\n />\n <div\n className=\"absolute inset-0\"\n style={{\n backgroundImage: `radial-gradient(ellipse 80% 60% at 15% 80%, ${palette.orb1}, transparent)`,\n }}\n />\n <div\n className=\"absolute inset-0\"\n style={{\n backgroundImage: `radial-gradient(ellipse 70% 50% at 85% 25%, ${palette.orb2}, transparent)`,\n }}\n />\n <div\n className=\"absolute inset-0\"\n style={{\n backgroundImage: `radial-gradient(ellipse 60% 70% at 50% 50%, ${palette.orb3}, transparent)`,\n }}\n />\n <div\n className=\"absolute inset-0 opacity-[0.08] mix-blend-overlay\"\n style={{ backgroundImage: NOISE_TEXTURE }}\n />\n </>\n);\n\n/** Overlapping angled panels — sharp, crystalline, modern */\nexport const prismStyle: BackgroundStyleRenderer = (palette) => (\n <>\n <div\n className=\"absolute inset-0\"\n style={{ backgroundImage: palette.base }}\n />\n <div\n className=\"absolute -top-12 -right-12 h-4/5 w-4/5 origin-center rotate-12 rounded-3xl opacity-30\"\n style={{ backgroundImage: palette.accent }}\n />\n <div\n className=\"absolute -bottom-10 -left-10 h-3/5 w-3/5 origin-center -rotate-6 rounded-3xl opacity-25\"\n style={{ backgroundImage: palette.overlay }}\n />\n <div\n className=\"absolute top-1/3 right-1/4 h-40 w-28 rotate-45 rounded-2xl opacity-20\"\n style={{ backgroundColor: palette.orb1 }}\n />\n <div\n className=\"absolute bottom-1/4 left-1/3 h-24 w-36 -rotate-12 rounded-2xl opacity-15\"\n style={{ backgroundColor: palette.orb2 }}\n />\n </>\n);\n\nexport const backgroundStyles: BackgroundStyleRenderer[] = [\n orbsStyle,\n cleanStyle,\n auroraStyle,\n prismStyle,\n];\n","\"use client\";\n\nimport React, { useMemo } from \"react\";\nimport {\n Mail,\n Phone,\n Building,\n ListChecks,\n StickyNote,\n CalendarDays,\n} from \"lucide-react\";\nimport {\n cn,\n Tooltip,\n TooltipTrigger,\n TooltipContent,\n TooltipProvider,\n} from \"@fluid-app/ui-primitives\";\nimport { StatusBadge } from \"../statusBadge\";\nimport { gradientPalettes, type GradientPalette } from \"./palettes\";\nimport { backgroundStyles, type BackgroundStyleRenderer } from \"./styles\";\n\nexport type ContactInfoCardData = {\n firstName?: string | null;\n lastName?: string | null;\n email?: string | null;\n phone?: string | null;\n address?: string | null;\n city?: string | null;\n state?: string | null;\n postalCode?: string | null;\n status?: string | null;\n avatarUrl?: string | null;\n countryName?: string | null;\n};\n\ntype ContactInfoCardProps = {\n contact: ContactInfoCardData;\n className?: string;\n onEdit?: () => void;\n showActions?: boolean;\n onCreateTask?: () => void;\n onCreateNote?: () => void;\n onViewEvents?: () => void;\n};\n\nfunction CardBackground({\n palette,\n renderer,\n}: {\n palette: GradientPalette;\n renderer: BackgroundStyleRenderer;\n}) {\n return <>{renderer(palette)}</>;\n}\n\nexport const ContactInfoCard: React.FC<ContactInfoCardProps> = ({\n contact,\n className,\n onEdit,\n showActions = false,\n onCreateTask,\n onCreateNote,\n onViewEvents,\n}) => {\n const fullName =\n [contact.firstName, contact.lastName].filter(Boolean).join(\" \") ||\n \"Unknown\";\n const initials = [contact.firstName?.[0], contact.lastName?.[0]]\n .filter(Boolean)\n .join(\"\");\n const status = contact.status ?? \"new\";\n\n const hasAddress =\n contact.address ||\n contact.city ||\n contact.state ||\n contact.postalCode ||\n contact.countryName;\n\n // Derive palette deterministically from contact identity\n const { palette, renderBackground } = useMemo(() => {\n const seed = contact.firstName || contact.lastName || contact.email || \"\";\n const hash = seed\n .split(\"\")\n .reduce((acc, char) => acc + char.charCodeAt(0), 0);\n const pIdx = hash % gradientPalettes.length;\n const sIdx =\n Math.floor(hash / gradientPalettes.length) % backgroundStyles.length;\n return {\n palette: gradientPalettes[pIdx]!,\n renderBackground: backgroundStyles[sIdx]!,\n };\n }, [contact.firstName, contact.lastName, contact.email]);\n\n return (\n <div\n className={cn(\n \"relative min-w-[250px] overflow-hidden rounded-2xl bg-black text-white shadow-lg\",\n className,\n )}\n >\n {/* Background */}\n <div className=\"absolute inset-0 opacity-70\">\n <CardBackground palette={palette} renderer={renderBackground} />\n </div>\n\n {/* Content */}\n <div className=\"relative z-10 p-6\">\n {/* Header */}\n <div className=\"mb-5 flex items-center justify-between\">\n <h3 className=\"text-base font-semibold tracking-tight\">\n Contact Information\n </h3>\n {onEdit && (\n <button\n type=\"button\"\n onClick={onEdit}\n className=\"bg-card/90 text-card-foreground hover:bg-card rounded-lg px-4 py-1.5 text-sm font-medium shadow-sm backdrop-blur-sm transition-colors\"\n >\n Edit\n </button>\n )}\n </div>\n\n {/* Avatar + Name + Status */}\n <div className=\"mb-5 flex items-center gap-3\">\n {contact.avatarUrl ? (\n <img\n src={contact.avatarUrl}\n alt={fullName}\n className=\"h-14 w-14 rounded-full border-2 border-white/40 object-cover shadow-md\"\n />\n ) : (\n <div className=\"flex h-14 w-14 items-center justify-center rounded-full border-2 border-white/40 bg-white/20 text-lg font-semibold shadow-md backdrop-blur-sm\">\n {initials}\n </div>\n )}\n <div className=\"min-w-0 flex-1\">\n <span className=\"block truncate text-3xl font-semibold\">\n {fullName}\n </span>\n <StatusBadge status={status} className=\"mt-1\" />\n </div>\n </div>\n\n {showActions && (\n <TooltipProvider delayDuration={100}>\n <div className=\"mb-6 flex flex-wrap gap-4\">\n <Tooltip>\n <TooltipTrigger asChild>\n <button\n type=\"button\"\n onClick={onCreateTask}\n disabled={!onCreateTask}\n className=\"flex h-11 w-11 items-center justify-center rounded-lg bg-white/20 text-white/90 backdrop-blur-sm transition-colors hover:bg-white/30 disabled:cursor-not-allowed disabled:opacity-40\"\n >\n <ListChecks className=\"h-5 w-5\" />\n </button>\n </TooltipTrigger>\n <TooltipContent>New Task</TooltipContent>\n </Tooltip>\n <Tooltip>\n <TooltipTrigger asChild>\n <button\n type=\"button\"\n onClick={onCreateNote}\n disabled={!onCreateNote}\n className=\"flex h-11 w-11 items-center justify-center rounded-lg bg-white/20 text-white/90 backdrop-blur-sm transition-colors hover:bg-white/30 disabled:cursor-not-allowed disabled:opacity-40\"\n >\n <StickyNote className=\"h-5 w-5\" />\n </button>\n </TooltipTrigger>\n <TooltipContent>New Note</TooltipContent>\n </Tooltip>\n <Tooltip>\n <TooltipTrigger asChild>\n <button\n type=\"button\"\n onClick={onViewEvents}\n disabled={!onViewEvents}\n className=\"flex h-11 w-11 items-center justify-center rounded-lg bg-white/20 text-white/90 backdrop-blur-sm transition-colors hover:bg-white/30 disabled:cursor-not-allowed disabled:opacity-40\"\n >\n <CalendarDays className=\"h-5 w-5\" />\n </button>\n </TooltipTrigger>\n <TooltipContent>Events (coming soon)</TooltipContent>\n </Tooltip>\n </div>\n </TooltipProvider>\n )}\n\n {/* Divider */}\n <div className=\"mb-6 h-0.5 bg-white/20\" />\n\n {/* Contact details */}\n <div className=\"space-y-3.5\">\n <div className=\"flex min-w-0 items-center gap-3\">\n <Mail className=\"h-4 w-4 shrink-0 text-white/70\" />\n {contact.email ? (\n <span className=\"truncate text-sm\">{contact.email}</span>\n ) : (\n <span className=\"text-sm text-white/40 italic\">\n No email entered\n </span>\n )}\n </div>\n\n <div className=\"flex min-w-0 items-center gap-3\">\n <Phone className=\"h-4 w-4 shrink-0 text-white/70\" />\n {contact.phone ? (\n <span className=\"truncate text-sm\">{contact.phone}</span>\n ) : (\n <span className=\"text-sm text-white/40 italic\">\n No phone number entered\n </span>\n )}\n </div>\n\n <div className=\"flex items-start gap-3\">\n <Building className=\"mt-0.5 h-4 w-4 text-white/70\" />\n {hasAddress ? (\n <div className=\"text-sm leading-relaxed\">\n {contact.address && <div>{contact.address}</div>}\n {(contact.city || contact.state || contact.postalCode) && (\n <div>\n {[contact.city, contact.state].filter(Boolean).join(\", \")}\n {contact.postalCode && ` ${contact.postalCode}`}\n </div>\n )}\n {contact.countryName && <div>{contact.countryName}</div>}\n </div>\n ) : (\n <span className=\"text-sm text-white/40 italic\">\n No address entered\n </span>\n )}\n </div>\n </div>\n </div>\n </div>\n );\n};\n","\"use client\";\n\nimport React, { useMemo, type PropsWithChildren } from \"react\";\nimport { useController, useFormContext, useWatch } from \"react-hook-form\";\nimport {\n Card,\n CardContent,\n CardHeader,\n CardTitle,\n cn,\n Input,\n Label,\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from \"@fluid-app/ui-primitives\";\n\ntype SectionProps = PropsWithChildren<{\n title: string;\n cardClassName?: string;\n}>;\n\nconst Section: React.FC<SectionProps> = ({\n title,\n cardClassName,\n children,\n}) => {\n return (\n <Card className={cn(\"bg-white\", cardClassName)}>\n <div className=\"font-inter flex items-center justify-between\">\n <CardHeader className=\"px-6 pt-2 pb-4\">\n <CardTitle className=\"text-base leading-none font-semibold tracking-tight whitespace-nowrap\">\n {title}\n </CardTitle>\n </CardHeader>\n </div>\n <CardContent>{children}</CardContent>\n </Card>\n );\n};\n\nfunction FormTextField({\n name,\n label,\n placeholder,\n type,\n}: {\n name: string;\n label: string;\n placeholder?: string;\n type?: string;\n}) {\n const { control } = useFormContext();\n const {\n field,\n fieldState: { error },\n } = useController({ name, control });\n return (\n <div className=\"space-y-1\">\n <Label htmlFor={name} className=\"font-inter text-foreground font-medium\">\n {label}\n </Label>\n <Input\n {...field}\n id={name}\n placeholder={placeholder}\n type={type}\n value={field.value ?? \"\"}\n className={cn(\n \"ring-input bg-white shadow-sm\",\n error && \"ring-destructive\",\n )}\n />\n {error && <p className=\"text-destructive text-sm\">{error.message}</p>}\n </div>\n );\n}\n\nfunction FormSelectField({\n name,\n label,\n placeholder,\n options,\n}: {\n name: string;\n label: string;\n placeholder?: string;\n options?: { name: string; value: string }[];\n}) {\n const { control } = useFormContext();\n const {\n field,\n fieldState: { error },\n } = useController({ name, control });\n return (\n <div className=\"space-y-1\">\n <Label htmlFor={name} className=\"font-inter text-foreground font-medium\">\n {label}\n </Label>\n <Select value={field.value ?? \"\"} onValueChange={field.onChange}>\n <SelectTrigger\n id={name}\n className={cn(\n \"w-full bg-white shadow-sm\",\n error && \"ring-destructive\",\n )}\n >\n <SelectValue placeholder={placeholder} />\n </SelectTrigger>\n <SelectContent position=\"popper\" sideOffset={4}>\n {options?.map((opt) => (\n <SelectItem key={opt.value} value={opt.value}>\n {opt.name}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n {error && <p className=\"text-destructive text-sm\">{error.message}</p>}\n </div>\n );\n}\n\nconst DEFAULT_COUNTRIES: { name: string; value: string }[] = [];\n\nconst statusOptions = [\n { name: \"New\", value: \"new\" },\n { name: \"Active\", value: \"active\" },\n { name: \"Inactive\", value: \"inactive\" },\n { name: \"Cold\", value: \"cold\" },\n { name: \"Lead\", value: \"lead\" },\n { name: \"Customer\", value: \"customer\" },\n];\n\ntype ContactDetailsFormProps = {\n className?: string;\n cardClassName?: string;\n countries?: { name: string; value: string }[];\n};\n\nexport const ContactDetailsForm: React.FC<ContactDetailsFormProps> = ({\n className,\n cardClassName,\n countries = DEFAULT_COUNTRIES,\n}) => {\n const { control } = useFormContext();\n const currentStatus = useWatch({ control, name: \"status\" });\n\n const effectiveStatusOptions = useMemo(() => {\n if (\n currentStatus &&\n typeof currentStatus === \"string\" &&\n !statusOptions.some((o) => o.value === currentStatus)\n ) {\n return [\n {\n name:\n currentStatus.charAt(0).toUpperCase() +\n currentStatus.slice(1).replace(/_/g, \" \"),\n value: currentStatus,\n },\n ...statusOptions,\n ];\n }\n return statusOptions;\n }, [currentStatus]);\n\n return (\n <div className={cn(\"space-y-6\", className)}>\n <Section title=\"Basic Information\" cardClassName={cardClassName}>\n <div className=\"grid grid-cols-1 gap-6 md:grid-cols-2\">\n <FormTextField\n name=\"first_name\"\n label=\"First Name\"\n placeholder=\"Enter first name\"\n />\n\n <FormTextField\n name=\"last_name\"\n label=\"Last Name\"\n placeholder=\"Enter last name\"\n />\n\n <FormTextField\n name=\"email\"\n label=\"Email\"\n placeholder=\"Enter email address\"\n type=\"email\"\n />\n\n <FormTextField\n name=\"phone\"\n label=\"Phone\"\n placeholder=\"Enter phone number\"\n />\n\n <FormSelectField\n name=\"status\"\n label=\"Status\"\n placeholder=\"Select status\"\n options={effectiveStatusOptions}\n />\n </div>\n </Section>\n\n <Section title=\"Address Information\" cardClassName={cardClassName}>\n <div className=\"grid grid-cols-1 gap-6 md:grid-cols-2\">\n <FormTextField\n name=\"address\"\n label=\"Address\"\n placeholder=\"Enter address\"\n />\n\n <FormTextField name=\"city\" label=\"City\" placeholder=\"Enter city\" />\n\n <FormTextField\n name=\"state\"\n label=\"State/Province\"\n placeholder=\"Enter state or province\"\n />\n\n <FormTextField\n name=\"postal_code\"\n label=\"Postal Code\"\n placeholder=\"Enter postal code\"\n />\n\n <FormSelectField\n name=\"country_id\"\n label=\"Country\"\n placeholder=\"Select country\"\n options={countries}\n />\n </div>\n </Section>\n </div>\n );\n};\n","\"use client\";\n\nimport React from \"react\";\nimport {\n Card,\n CardContent,\n CardHeader,\n CardTitle,\n} from \"@fluid-app/ui-primitives\";\nimport { StickyNote } from \"lucide-react\";\nimport type { ContactNote } from \"../../hooks/notes/use-contact-notes\";\n\ninterface NotesSidebarProps {\n notes: ContactNote[];\n isLoading?: boolean;\n onNavigateToNotes?: () => void;\n}\n\nexport function NotesSidebar({\n notes,\n isLoading,\n onNavigateToNotes,\n}: NotesSidebarProps): React.JSX.Element {\n return (\n <Card className=\"gap-2 bg-white pt-2\">\n <CardHeader className=\"px-6 pt-4 pb-2\">\n <div className=\"flex items-center justify-between\">\n <CardTitle className=\"text-sm leading-none font-semibold tracking-tight\">\n Notes\n </CardTitle>\n {notes.length > 0 && onNavigateToNotes && (\n <button\n type=\"button\"\n onClick={onNavigateToNotes}\n className=\"text-primary hover:text-primary/80 text-xs font-medium\"\n >\n View all\n </button>\n )}\n </div>\n </CardHeader>\n <CardContent>\n {isLoading ? (\n <div className=\"space-y-2\">\n {[1, 2].map((i) => (\n <div\n key={i}\n className=\"bg-muted h-4 w-3/4 animate-pulse rounded\"\n />\n ))}\n </div>\n ) : notes.length === 0 ? (\n <p className=\"text-muted-foreground text-sm\">No notes yet</p>\n ) : (\n <ul className=\"space-y-2\">\n {notes.slice(0, 5).map((note) => (\n <li key={note.id} className=\"flex items-start gap-2\">\n <StickyNote className=\"text-muted-foreground mt-0.5 h-3.5 w-3.5 shrink-0\" />\n <span className=\"text-muted-foreground line-clamp-1 text-sm\">\n {note.title}\n </span>\n </li>\n ))}\n {notes.length > 5 && (\n <li className=\"text-muted-foreground text-xs\">\n +{notes.length - 5} more\n </li>\n )}\n </ul>\n )}\n </CardContent>\n </Card>\n );\n}\n","/**\n * Generated API client functions for users_notes\n *\n * DO NOT EDIT THIS FILE DIRECTLY\n * This file is auto-generated. To update:\n * 1. Update the OpenAPI spec file\n * 2. Run: pnpm generate\n */\n\nimport type { FetchClient } from \"../lib/fetch-client\";\nimport type { operations } from \"../generated/users_notes\";\n\n// ============================================================================\n// Users Notes\n// ============================================================================\n\n/**\n * Create a note for a contact\n *\n *\n * @param client - Fetch client instance\n * @param body - body\n */\nexport async function createUserNote(\n client: FetchClient,\n body: operations[\"createUserNote\"][\"requestBody\"][\"content\"][\"application/json\"],\n): Promise<\n operations[\"createUserNote\"][\"responses\"][201][\"content\"][\"application/json\"]\n> {\n return client.post(`/api/users/v2025-06/notes`, body);\n}\n\n/**\n * List notes for a contact\n *\n *\n * @param client - Fetch client instance\n * @param params - params\n */\nexport async function listUserNotes(\n client: FetchClient,\n params: operations[\"listUserNotes\"][\"parameters\"][\"query\"],\n): Promise<\n operations[\"listUserNotes\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.get(`/api/users/v2025-06/notes`, params);\n}\n\n/**\n * Delete a note\n *\n *\n * @param client - Fetch client instance\n * @param id - id\n * @param params - params\n */\nexport async function deleteUserNote(\n client: FetchClient,\n id: string | number,\n params: operations[\"deleteUserNote\"][\"parameters\"][\"query\"],\n): Promise<\n operations[\"deleteUserNote\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.delete(`/api/users/v2025-06/notes/${id}`, { params });\n}\n\n/**\n * Get a note\n *\n *\n * @param client - Fetch client instance\n * @param id - id\n * @param params - params\n */\nexport async function getUserNote(\n client: FetchClient,\n id: string | number,\n params: operations[\"getUserNote\"][\"parameters\"][\"query\"],\n): Promise<\n operations[\"getUserNote\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.get(`/api/users/v2025-06/notes/${id}`, params);\n}\n\n/**\n * Update a note\n *\n *\n * @param client - Fetch client instance\n * @param id - id\n * @param body - body\n */\nexport async function updateUserNote(\n client: FetchClient,\n id: string | number,\n body: operations[\"updateUserNote\"][\"requestBody\"][\"content\"][\"application/json\"],\n): Promise<\n operations[\"updateUserNote\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.patch(`/api/users/v2025-06/notes/${id}`, body);\n}\n","/**\n * Generated API client functions for users_contacts\n *\n * DO NOT EDIT THIS FILE DIRECTLY\n * This file is auto-generated. To update:\n * 1. Update the OpenAPI spec file\n * 2. Run: pnpm generate\n */\n\nimport type { FetchClient } from \"../lib/fetch-client\";\nimport type { operations } from \"../generated/users_contacts\";\n\n// ============================================================================\n// Users Contacts\n// ============================================================================\n\n/**\n * List activities for a contact\n *\n *\n * @param client - Fetch client instance\n * @param id - id\n * @param params? - params?\n */\nexport async function listUserContactActivities(\n client: FetchClient,\n id: string | number,\n params?: operations[\"listUserContactActivities\"][\"parameters\"][\"query\"],\n): Promise<\n operations[\"listUserContactActivities\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.get(`/api/users/v2025-06/contacts/${id}/activities`, params);\n}\n\n/**\n * Bulk delete contacts\n *\n *\n * @param client - Fetch client instance\n * @param body - body\n */\nexport async function bulkDeleteUserContacts(\n client: FetchClient,\n body: operations[\"bulkDeleteUserContacts\"][\"requestBody\"][\"content\"][\"application/json\"],\n): Promise<\n operations[\"bulkDeleteUserContacts\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.delete(`/api/users/v2025-06/contacts/bulk_delete`, { body });\n}\n\n/**\n * Bulk import contacts\n *\n *\n * @param client - Fetch client instance\n * @param body - body\n */\nexport async function bulkImportUserContacts(\n client: FetchClient,\n body: operations[\"bulkImportUserContacts\"][\"requestBody\"][\"content\"][\"application/json\"],\n): Promise<\n operations[\"bulkImportUserContacts\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.post(`/api/users/v2025-06/contacts/bulk`, body);\n}\n\n/**\n * Create a contact\n *\n *\n * @param client - Fetch client instance\n * @param body - body\n */\nexport async function createUserContact(\n client: FetchClient,\n body: operations[\"createUserContact\"][\"requestBody\"][\"content\"][\"application/json\"],\n): Promise<\n operations[\"createUserContact\"][\"responses\"][201][\"content\"][\"application/json\"]\n> {\n return client.post(`/api/users/v2025-06/contacts`, body);\n}\n\n/**\n * List user's contacts\n *\n *\n * @param client - Fetch client instance\n * @param params? - params?\n */\nexport async function listUserContacts(\n client: FetchClient,\n params?: operations[\"listUserContacts\"][\"parameters\"][\"query\"],\n): Promise<\n operations[\"listUserContacts\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.get(`/api/users/v2025-06/contacts`, params);\n}\n\n/**\n * Delete a contact\n *\n *\n * @param client - Fetch client instance\n * @param id - id\n */\nexport async function deleteUserContact(\n client: FetchClient,\n id: string | number,\n): Promise<\n operations[\"deleteUserContact\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.delete(`/api/users/v2025-06/contacts/${id}`);\n}\n\n/**\n * Get a contact\n *\n *\n * @param client - Fetch client instance\n * @param id - id\n */\nexport async function getUserContact(\n client: FetchClient,\n id: string | number,\n): Promise<\n operations[\"getUserContact\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.get(`/api/users/v2025-06/contacts/${id}`);\n}\n\n/**\n * Update a contact\n *\n *\n * @param client - Fetch client instance\n * @param id - id\n * @param body - body\n */\nexport async function updateUserContact(\n client: FetchClient,\n id: string | number,\n body: operations[\"updateUserContact\"][\"requestBody\"][\"content\"][\"application/json\"],\n): Promise<\n operations[\"updateUserContact\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.patch(`/api/users/v2025-06/contacts/${id}`, body);\n}\n\n/**\n * Create a note for a contact (deprecated)\n *\n *\n * @param client - Fetch client instance\n * @param id - id\n * @param body - body\n */\nexport async function createUserContactNote(\n client: FetchClient,\n id: string | number,\n body: operations[\"createUserContactNote\"][\"requestBody\"][\"content\"][\"application/json\"],\n): Promise<\n operations[\"createUserContactNote\"][\"responses\"][201][\"content\"][\"application/json\"]\n> {\n return client.post(`/api/users/v2025-06/contacts/${id}/notes`, body);\n}\n\n/**\n * List notes for a contact\n *\n *\n * @param client - Fetch client instance\n * @param id - id\n */\nexport async function listUserContactNotes(\n client: FetchClient,\n id: string | number,\n): Promise<\n operations[\"listUserContactNotes\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.get(`/api/users/v2025-06/contacts/${id}/notes`);\n}\n\n/**\n * List orders for a contact\n *\n *\n * @param client - Fetch client instance\n * @param id - id\n * @param params? - params?\n */\nexport async function listUserContactOrders(\n client: FetchClient,\n id: string | number,\n params?: operations[\"listUserContactOrders\"][\"parameters\"][\"query\"],\n): Promise<\n operations[\"listUserContactOrders\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.get(`/api/users/v2025-06/contacts/${id}/orders`, params);\n}\n\n/**\n * Mark contact's activities as read\n *\n *\n * @param client - Fetch client instance\n * @param id - id\n */\nexport async function markUserContactRead(\n client: FetchClient,\n id: string | number,\n): Promise<\n operations[\"markUserContactRead\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.post(`/api/users/v2025-06/contacts/${id}/read`);\n}\n\n/**\n * List subscription orders for a contact\n *\n *\n * @param client - Fetch client instance\n * @param id - id\n * @param params? - params?\n */\nexport async function listUserContactSubscriptionOrders(\n client: FetchClient,\n id: string | number,\n params?: operations[\"listUserContactSubscriptionOrders\"][\"parameters\"][\"query\"],\n): Promise<\n operations[\"listUserContactSubscriptionOrders\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.get(\n `/api/users/v2025-06/contacts/${id}/subscription_orders`,\n params,\n );\n}\n\n/**\n * Create a task for a contact\n *\n *\n * @param client - Fetch client instance\n * @param id - id\n * @param body - body\n */\nexport async function createUserContactTask(\n client: FetchClient,\n id: string | number,\n body: operations[\"createUserContactTask\"][\"requestBody\"][\"content\"][\"application/json\"],\n): Promise<\n operations[\"createUserContactTask\"][\"responses\"][201][\"content\"][\"application/json\"]\n> {\n return client.post(`/api/users/v2025-06/contacts/${id}/tasks`, body);\n}\n\n/**\n * List tasks for a contact\n *\n *\n * @param client - Fetch client instance\n * @param id - id\n */\nexport async function listUserContactTasks(\n client: FetchClient,\n id: string | number,\n): Promise<\n operations[\"listUserContactTasks\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.get(`/api/users/v2025-06/contacts/${id}/tasks`);\n}\n\n/**\n * Toggle pinned status of a note (deprecated)\n *\n *\n * @param client - Fetch client instance\n * @param id - id\n * @param note_id - note_id\n * @param body - body\n */\nexport async function toggleUserContactNotePin(\n client: FetchClient,\n id: string | number,\n note_id: string | number,\n body: operations[\"toggleUserContactNotePin\"][\"requestBody\"][\"content\"][\"application/json\"],\n): Promise<\n operations[\"toggleUserContactNotePin\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.post(\n `/api/users/v2025-06/contacts/${id}/notes/${note_id}/toggle_pinned`,\n body,\n );\n}\n","\"use client\";\n\nimport { useQuery } from \"@tanstack/react-query\";\nimport { usersContacts } from \"@fluid-app/user-contacts-api-client\";\nimport type { FetchClient } from \"@fluid-app/api-client-core\";\nimport type { components } from \"@fluid-app/user-contacts-api-client\";\n\nexport type ContactNote = components[\"schemas\"][\"Note\"];\n\nexport const CONTACT_NOTES_QUERY_KEY = (contactId: string) =>\n [\"portal-contacts\", \"notes\", contactId] as const;\n\nexport function useContactNotes(client: FetchClient, contactId: string) {\n return useQuery({\n queryKey: CONTACT_NOTES_QUERY_KEY(contactId),\n queryFn: () => usersContacts.listUserContactNotes(client, contactId),\n enabled: !!contactId,\n select: (data) => data.notes,\n });\n}\n","\"use client\";\n\nimport { useMutation, useQueryClient } from \"@tanstack/react-query\";\nimport { usersNotes } from \"@fluid-app/user-notes-api-client\";\nimport { fluidToast } from \"@fluid-app/ui-primitives\";\nimport { parseApiErrors, type FetchClient } from \"@fluid-app/api-client-core\";\nimport { CONTACT_NOTES_QUERY_KEY } from \"./use-contact-notes\";\n\nexport function useDeleteContactNote(\n client: FetchClient,\n contactId: string,\n options?: { onSuccess?: () => void },\n) {\n const queryClient = useQueryClient();\n\n return useMutation({\n mutationFn: (noteId: number) =>\n usersNotes.deleteUserNote(client, noteId, {\n contact_id: Number(contactId),\n }),\n onSuccess: () => {\n fluidToast({ title: \"Note deleted\", type: \"success\" });\n queryClient.invalidateQueries({\n queryKey: CONTACT_NOTES_QUERY_KEY(contactId),\n });\n options?.onSuccess?.();\n },\n onError: (error) => {\n fluidToast({\n title: \"Failed to delete note\",\n type: \"error\",\n description: parseApiErrors(error),\n });\n },\n });\n}\n","\"use client\";\n\nimport { useMutation, useQueryClient } from \"@tanstack/react-query\";\nimport { usersContacts } from \"@fluid-app/user-contacts-api-client\";\nimport { fluidToast } from \"@fluid-app/ui-primitives\";\nimport { parseApiErrors, type FetchClient } from \"@fluid-app/api-client-core\";\nimport { CONTACT_NOTES_QUERY_KEY } from \"./use-contact-notes\";\n\nexport type CreateNoteInput = {\n title: string;\n body: string;\n note_type?: string | null;\n pinned?: boolean | null;\n};\n\nexport function useCreateContactNote(\n client: FetchClient,\n contactId: string,\n options?: { onSuccess?: () => void },\n) {\n const queryClient = useQueryClient();\n\n return useMutation({\n mutationFn: (input: CreateNoteInput) =>\n usersContacts.createUserContactNote(client, contactId, {\n id: Number(contactId),\n note: input,\n }),\n onSuccess: () => {\n fluidToast({ title: \"Note created\", type: \"success\" });\n queryClient.invalidateQueries({\n queryKey: CONTACT_NOTES_QUERY_KEY(contactId),\n });\n options?.onSuccess?.();\n },\n onError: (error) => {\n fluidToast({\n title: \"Failed to create note\",\n type: \"error\",\n description: parseApiErrors(error),\n });\n },\n });\n}\n","\"use client\";\n\nimport { useMutation, useQueryClient } from \"@tanstack/react-query\";\nimport { usersNotes } from \"@fluid-app/user-notes-api-client\";\nimport { fluidToast } from \"@fluid-app/ui-primitives\";\nimport { parseApiErrors, type FetchClient } from \"@fluid-app/api-client-core\";\nimport { CONTACT_NOTES_QUERY_KEY } from \"./use-contact-notes\";\n\nexport type UpdateNoteInput = {\n title?: string;\n body?: string;\n note_type?: string | null;\n pinned?: boolean | null;\n};\n\nexport function useUpdateContactNote(\n client: FetchClient,\n contactId: string,\n options?: { onSuccess?: () => void },\n) {\n const queryClient = useQueryClient();\n\n return useMutation({\n mutationFn: ({\n noteId,\n input,\n }: {\n noteId: number;\n input: UpdateNoteInput;\n }) =>\n usersNotes.updateUserNote(client, noteId, {\n contact_id: Number(contactId),\n id: noteId,\n note: input,\n }),\n onSuccess: () => {\n fluidToast({ title: \"Note updated\", type: \"success\" });\n queryClient.invalidateQueries({\n queryKey: CONTACT_NOTES_QUERY_KEY(contactId),\n });\n options?.onSuccess?.();\n },\n onError: (error) => {\n fluidToast({\n title: \"Failed to update note\",\n type: \"error\",\n description: parseApiErrors(error),\n });\n },\n });\n}\n","export function formatDateForDisplay(dateStr: string): string {\n const date = new Date(dateStr);\n return date.toLocaleDateString(\"en-US\", {\n month: \"short\",\n day: \"numeric\",\n year: \"numeric\",\n });\n}\n","\"use client\";\n\nimport React, { useEffect, useRef, useState } from \"react\";\nimport { useEditor, EditorContent } from \"@tiptap/react\";\nimport StarterKit from \"@tiptap/starter-kit\";\nimport Heading from \"@tiptap/extension-heading\";\nimport Placeholder from \"@tiptap/extension-placeholder\";\nimport TextAlign from \"@tiptap/extension-text-align\";\nimport Underline from \"@tiptap/extension-underline\";\nimport {\n AlignLeft,\n AlignCenter,\n AlignRight,\n AlignJustify,\n List,\n ListOrdered,\n Calendar,\n X,\n} from \"lucide-react\";\nimport { cn } from \"@fluid-app/ui-primitives\";\nimport { formatDateForDisplay } from \"../../utils/format-date\";\n\nexport interface NoteTaskEditorProps {\n titlePlaceholder?: string;\n bodyPlaceholder?: string;\n onChange?: (content: {\n title: string;\n body: string;\n dueDate?: string;\n }) => void;\n className?: string;\n /** Pre-populate the title (for edit mode) */\n initialTitle?: string;\n /** Pre-populate the body (for edit mode) */\n initialBody?: string;\n /** Show due date picker */\n showDueDate?: boolean;\n /** Pre-populate the due date (ISO string, for edit mode) */\n initialDueDate?: string;\n /** When false, the editor is body-only (no H1 title). Default true. */\n showTitle?: boolean;\n /** Override for the editor content area min-height class */\n editorClassName?: string;\n}\n\nfunction extractTitleAndBody(editor: ReturnType<typeof useEditor>): {\n title: string;\n body: string;\n} {\n if (!editor) return { title: \"\", body: \"\" };\n\n const doc = editor.state.doc;\n let title = \"\";\n const bodyParts: string[] = [];\n\n doc.forEach((node) => {\n if (node.type.name === \"heading\" && !title) {\n title = node.textContent.trim();\n } else {\n const text = node.textContent.trim();\n if (text) bodyParts.push(text);\n }\n });\n\n return { title, body: bodyParts.join(\"\\n\") };\n}\n\nfunction extractBodyOnly(editor: ReturnType<typeof useEditor>): string {\n if (!editor) return \"\";\n const parts: string[] = [];\n editor.state.doc.forEach((node) => {\n const text = node.textContent.trim();\n if (text) parts.push(text);\n });\n return parts.join(\"\\n\");\n}\n\nexport function NoteTaskEditor({\n titlePlaceholder = \"New Note\",\n bodyPlaceholder = \"Start writing...\",\n onChange,\n className,\n initialTitle,\n initialBody,\n showDueDate = false,\n initialDueDate,\n showTitle = true,\n editorClassName,\n}: NoteTaskEditorProps): React.JSX.Element {\n const [dueDate, setDueDate] = useState<string | undefined>(initialDueDate);\n const dueDateRef = useRef(initialDueDate);\n const dateInputRef = useRef<HTMLInputElement>(null);\n\n // Keep ref in sync with state so onUpdate always reads the latest value\n useEffect(() => {\n dueDateRef.current = dueDate;\n }, [dueDate]);\n\n const initialContent = showTitle\n ? initialTitle || initialBody\n ? `<h1>${initialTitle ?? \"\"}</h1>${initialBody ?? \"\"}`\n : undefined\n : initialBody || undefined;\n\n const extensions = [\n StarterKit.configure({\n heading: showTitle ? false : { levels: [] as const },\n bulletList: {\n keepMarks: true,\n keepAttributes: false,\n },\n orderedList: {\n keepMarks: true,\n keepAttributes: false,\n },\n }),\n ...(showTitle ? [Heading.configure({ levels: [1] })] : []),\n Placeholder.configure({\n placeholder: ({ node }) => {\n if (node.type.name === \"heading\") {\n return titlePlaceholder;\n }\n return bodyPlaceholder;\n },\n }),\n TextAlign.configure({\n types: showTitle ? [\"heading\", \"paragraph\"] : [\"paragraph\"],\n alignments: [\"left\", \"center\", \"right\", \"justify\"],\n }),\n Underline,\n ];\n\n const defaultContent = showTitle\n ? {\n type: \"doc\" as const,\n content: [{ type: \"heading\" as const, attrs: { level: 1 } }],\n }\n : undefined;\n\n const editor = useEditor({\n extensions,\n content: initialContent ?? defaultContent,\n onUpdate: ({ editor }) => {\n if (showTitle) {\n const { title, body } = extractTitleAndBody(editor);\n onChange?.({ title, body, dueDate: dueDateRef.current });\n } else {\n const body = extractBodyOnly(editor);\n onChange?.({ title: \"\", body, dueDate: dueDateRef.current });\n }\n },\n });\n\n const fireOnChange = () => {\n if (!editor || !onChange) return;\n if (showTitle) {\n const { title, body } = extractTitleAndBody(editor);\n onChange({ title, body, dueDate });\n } else {\n const body = extractBodyOnly(editor);\n onChange({ title: \"\", body, dueDate });\n }\n };\n\n // Fire onChange once on mount so the parent's ref is populated with the\n // initial values before the user makes any edits.\n useEffect(() => {\n fireOnChange();\n // We only want this to run once after the editor is first created.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [editor]);\n\n // Notify parent when due date changes\n useEffect(() => {\n fireOnChange();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [dueDate]);\n\n const buttonBase =\n \"flex h-7 w-7 items-center justify-center rounded text-xs transition-colors\";\n const buttonActive = \"bg-gray-100 text-primary\";\n const buttonInactive = \"text-gray-400 hover:bg-gray-50\";\n\n const toolbarSeparator = <div className=\"mx-1 h-5 w-px bg-gray-200\" />;\n\n return (\n <div\n className={cn(\n \"border-border flex flex-col overflow-hidden rounded-lg border\",\n className,\n )}\n >\n {/* Toolbar */}\n <div className=\"border-border flex items-center gap-0.5 border-b bg-gray-50 px-2 py-1.5\">\n {/* Bold */}\n <button\n type=\"button\"\n onClick={() => editor?.chain().focus().toggleBold().run()}\n disabled={!editor?.can().chain().focus().toggleBold().run()}\n className={cn(\n buttonBase,\n \"font-bold\",\n editor?.isActive(\"bold\") ? buttonActive : buttonInactive,\n )}\n title=\"Bold\"\n >\n B\n </button>\n\n {/* Italic */}\n <button\n type=\"button\"\n onClick={() => editor?.chain().focus().toggleItalic().run()}\n disabled={!editor?.can().chain().focus().toggleItalic().run()}\n className={cn(\n buttonBase,\n \"italic\",\n editor?.isActive(\"italic\") ? buttonActive : buttonInactive,\n )}\n title=\"Italic\"\n >\n I\n </button>\n\n {/* Underline */}\n <button\n type=\"button\"\n onClick={() => editor?.chain().focus().toggleUnderline().run()}\n disabled={!editor?.can().chain().focus().toggleUnderline().run()}\n className={cn(\n buttonBase,\n \"underline\",\n editor?.isActive(\"underline\") ? buttonActive : buttonInactive,\n )}\n title=\"Underline\"\n >\n U\n </button>\n\n {toolbarSeparator}\n\n {/* Align left */}\n <button\n type=\"button\"\n onClick={() => editor?.chain().focus().setTextAlign(\"left\").run()}\n className={cn(\n buttonBase,\n editor?.isActive({ textAlign: \"left\" })\n ? buttonActive\n : buttonInactive,\n )}\n title=\"Align left\"\n >\n <AlignLeft className=\"h-3.5 w-3.5\" />\n </button>\n\n {/* Align center */}\n <button\n type=\"button\"\n onClick={() => editor?.chain().focus().setTextAlign(\"center\").run()}\n className={cn(\n buttonBase,\n editor?.isActive({ textAlign: \"center\" })\n ? buttonActive\n : buttonInactive,\n )}\n title=\"Align center\"\n >\n <AlignCenter className=\"h-3.5 w-3.5\" />\n </button>\n\n {/* Align right */}\n <button\n type=\"button\"\n onClick={() => editor?.chain().focus().setTextAlign(\"right\").run()}\n className={cn(\n buttonBase,\n editor?.isActive({ textAlign: \"right\" })\n ? buttonActive\n : buttonInactive,\n )}\n title=\"Align right\"\n >\n <AlignRight className=\"h-3.5 w-3.5\" />\n </button>\n\n {/* Align justify */}\n <button\n type=\"button\"\n onClick={() => editor?.chain().focus().setTextAlign(\"justify\").run()}\n className={cn(\n buttonBase,\n editor?.isActive({ textAlign: \"justify\" })\n ? buttonActive\n : buttonInactive,\n )}\n title=\"Justify\"\n >\n <AlignJustify className=\"h-3.5 w-3.5\" />\n </button>\n\n {toolbarSeparator}\n\n {/* Bullet list */}\n <button\n type=\"button\"\n onClick={() => editor?.chain().focus().toggleBulletList().run()}\n className={cn(\n buttonBase,\n editor?.isActive(\"bulletList\") ? buttonActive : buttonInactive,\n )}\n title=\"Bullet list\"\n >\n <List className=\"h-3.5 w-3.5\" />\n </button>\n\n {/* Ordered list */}\n <button\n type=\"button\"\n onClick={() => editor?.chain().focus().toggleOrderedList().run()}\n className={cn(\n buttonBase,\n editor?.isActive(\"orderedList\") ? buttonActive : buttonInactive,\n )}\n title=\"Ordered list\"\n >\n <ListOrdered className=\"h-3.5 w-3.5\" />\n </button>\n\n {showDueDate && (\n <>\n {toolbarSeparator}\n {/* Due date */}\n {dueDate ? (\n <div className=\"bg-primary/10 flex items-center gap-1 rounded px-2 py-1\">\n <Calendar className=\"text-primary h-3.5 w-3.5\" />\n <span className=\"text-primary text-xs font-medium\">\n {formatDateForDisplay(dueDate)}\n </span>\n <button\n type=\"button\"\n onClick={() => setDueDate(undefined)}\n className=\"text-primary/60 hover:text-primary ml-1\"\n title=\"Remove due date\"\n >\n <X className=\"h-3 w-3\" />\n </button>\n </div>\n ) : (\n <>\n <button\n type=\"button\"\n onClick={() => dateInputRef.current?.showPicker()}\n className=\"flex h-7 cursor-pointer items-center gap-1 rounded px-2 text-xs font-medium text-gray-400 transition-colors hover:bg-gray-50 hover:text-gray-600\"\n >\n <Calendar className=\"h-3.5 w-3.5\" />\n <span>Due date</span>\n </button>\n <input\n ref={dateInputRef}\n type=\"date\"\n className=\"invisible absolute h-0 w-0\"\n onChange={(e) => {\n if (e.target.value) {\n // Convert YYYY-MM-DD to ISO datetime at local midnight\n const localDate = new Date(e.target.value + \"T00:00:00\");\n setDueDate(localDate.toISOString());\n }\n }}\n />\n </>\n )}\n </>\n )}\n </div>\n\n {/* Editor area */}\n <EditorContent\n editor={editor}\n className={editorClassName ?? \"min-h-[60vh] flex-1 overflow-y-auto p-4\"}\n />\n\n <style>{`\n .ProseMirror {\n outline: none;\n }\n\n .ProseMirror h1 {\n font-size: 1.5rem;\n font-weight: 600;\n line-height: 1.3;\n margin-bottom: 0.5rem;\n }\n\n .ProseMirror h1.is-empty::before,\n .ProseMirror p.is-empty::before {\n color: #9ca3af;\n content: attr(data-placeholder);\n float: left;\n height: 0;\n pointer-events: none;\n }\n\n .ProseMirror ul {\n list-style-type: disc;\n padding-left: 1.5rem;\n margin: 0.5rem 0;\n }\n\n .ProseMirror ol {\n list-style-type: decimal;\n padding-left: 1.5rem;\n margin: 0.5rem 0;\n }\n\n .ProseMirror li {\n margin: 0.25rem 0;\n display: list-item;\n }\n\n .ProseMirror li > p {\n margin: 0;\n }\n `}</style>\n </div>\n );\n}\n","\"use client\";\n\nimport React, { useRef, useState } from \"react\";\nimport { Calendar, X } from \"lucide-react\";\nimport {\n Button,\n Input,\n Sheet,\n SheetContent,\n SheetFooter,\n SheetHeader,\n SheetTitle,\n} from \"@fluid-app/ui-primitives\";\nimport { NoteTaskEditor } from \"./note-task-editor\";\nimport { formatDateForDisplay } from \"../../utils/format-date\";\n\nexport interface NoteTaskModalProps {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n mode: \"create\" | \"edit\";\n type: \"note\" | \"task\";\n initialTitle?: string;\n initialBody?: string;\n initialDueDate?: string;\n showDueDate?: boolean;\n onSave: (data: { title: string; body: string; dueDate?: string }) => void;\n isPending?: boolean;\n isCompleted?: boolean;\n onToggleComplete?: () => void;\n isTogglePending?: boolean;\n}\n\nexport function NoteTaskModal({\n open,\n onOpenChange,\n mode,\n type,\n initialTitle = \"\",\n initialBody = \"\",\n initialDueDate,\n showDueDate = false,\n onSave,\n isPending = false,\n isCompleted,\n onToggleComplete,\n isTogglePending = false,\n}: NoteTaskModalProps): React.JSX.Element {\n const [title, setTitle] = useState(initialTitle);\n const [body, setBody] = useState(initialBody);\n const dateInputRef = useRef<HTMLInputElement>(null);\n const [dueDate, setDueDate] = useState<string | undefined>(initialDueDate);\n\n const typeLabel = type === \"note\" ? \"Note\" : \"Task\";\n const sheetTitle = mode === \"edit\" ? `Edit ${typeLabel}` : `New ${typeLabel}`;\n\n const requiresBody = type === \"note\";\n const canSave =\n !!title.trim() && (!requiresBody || !!body.trim()) && !isPending;\n\n const handleSave = () => {\n if (!canSave) return;\n onSave({\n title: title.trim(),\n body,\n dueDate,\n });\n };\n\n return (\n <Sheet open={open} onOpenChange={onOpenChange}>\n <SheetContent className=\"flex w-full flex-col sm:max-w-lg\">\n <SheetHeader>\n <SheetTitle>{sheetTitle}</SheetTitle>\n </SheetHeader>\n\n <div className=\"flex min-h-0 flex-1 flex-col gap-3\">\n <Input\n placeholder={`${typeLabel} title`}\n value={title}\n onChange={(e) => setTitle(e.target.value)}\n autoFocus\n />\n\n <NoteTaskEditor\n showTitle={false}\n bodyPlaceholder=\"Start writing...\"\n initialBody={initialBody}\n editorClassName=\"min-h-[200px] flex-1 overflow-y-auto p-4\"\n onChange={(content) => {\n setBody(content.body);\n }}\n />\n\n {showDueDate && (\n <div className=\"flex items-center gap-2\">\n {dueDate ? (\n <div className=\"bg-primary/10 inline-flex items-center gap-1.5 rounded-md px-2.5 py-1.5\">\n <Calendar className=\"text-primary h-3.5 w-3.5\" />\n <span className=\"text-primary text-sm font-medium\">\n Due {formatDateForDisplay(dueDate)}\n </span>\n <button\n type=\"button\"\n onClick={() => setDueDate(undefined)}\n className=\"text-primary/60 hover:text-primary ml-1\"\n title=\"Remove due date\"\n >\n <X className=\"h-3 w-3\" />\n </button>\n </div>\n ) : (\n <div className=\"relative\">\n <button\n type=\"button\"\n onClick={() => dateInputRef.current?.showPicker()}\n className=\"text-muted-foreground hover:text-foreground inline-flex cursor-pointer items-center gap-1.5 rounded-md px-2.5 py-1.5 text-sm font-medium transition-colors hover:bg-gray-50\"\n >\n <Calendar className=\"h-3.5 w-3.5\" />\n <span>Add due date</span>\n </button>\n <input\n ref={dateInputRef}\n type=\"date\"\n className=\"invisible absolute h-0 w-0\"\n onChange={(e) => {\n if (e.target.value) {\n const localDate = new Date(\n e.target.value + \"T00:00:00\",\n );\n setDueDate(localDate.toISOString());\n }\n }}\n />\n </div>\n )}\n </div>\n )}\n </div>\n\n <SheetFooter className=\"flex-row justify-end gap-2 border-t pt-4\">\n {mode === \"edit\" && onToggleComplete && (\n <Button\n variant=\"outline\"\n onClick={onToggleComplete}\n disabled={isTogglePending}\n className=\"mr-auto\"\n >\n {isCompleted ? \"Mark Incomplete\" : \"Mark Complete\"}\n </Button>\n )}\n <Button variant=\"outline\" onClick={() => onOpenChange(false)}>\n Cancel\n </Button>\n <Button onClick={handleSave} disabled={!canSave}>\n {isPending ? \"Saving...\" : \"Save\"}\n </Button>\n </SheetFooter>\n </SheetContent>\n </Sheet>\n );\n}\n","\"use client\";\n\nimport React, { useImperativeHandle, useState } from \"react\";\nimport {\n Calendar,\n Paperclip,\n Plus,\n StickyNote,\n Pen,\n EllipsisVertical,\n} from \"lucide-react\";\nimport {\n AlertDialog,\n AlertDialogAction,\n AlertDialogCancel,\n AlertDialogContent,\n AlertDialogDescription,\n AlertDialogFooter,\n AlertDialogHeader,\n AlertDialogTitle,\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuTrigger,\n} from \"@fluid-app/ui-primitives\";\nimport type { ContactNote } from \"../../hooks/notes/use-contact-notes\";\nimport { useDeleteContactNote } from \"../../hooks/notes/use-delete-contact-note\";\nimport { useCreateContactNote } from \"../../hooks/notes/use-create-contact-note\";\nimport { useUpdateContactNote } from \"../../hooks/notes/use-update-contact-note\";\nimport { NoteTaskModal } from \"../editor/note-task-modal\";\nimport type { FetchClient } from \"@fluid-app/api-client-core\";\n\n// ---------------------------------------------------------------------------\n// Date helpers\n// ---------------------------------------------------------------------------\n\nfunction formatDueDate(dateStr: string): string {\n const date = new Date(dateStr);\n return date.toLocaleDateString(\"en-US\", {\n month: \"short\",\n day: \"numeric\",\n year: \"numeric\",\n });\n}\n\n// ---------------------------------------------------------------------------\n// Empty state\n// ---------------------------------------------------------------------------\n\nfunction EmptyState({ onCreateNote }: { onCreateNote: () => void }) {\n return (\n <div className=\"flex flex-col items-center justify-center px-4 py-12 text-center\">\n <div className=\"relative mb-6\">\n <div className=\"flex h-20 w-20 items-center justify-center rounded-full bg-gradient-to-br from-amber-100 to-yellow-100\">\n <StickyNote className=\"h-9 w-9 text-amber-500\" />\n </div>\n <div className=\"absolute -right-2 -bottom-1 flex h-9 w-9 items-center justify-center rounded-full border-2 border-white bg-gradient-to-br from-orange-100 to-red-100 shadow-sm\">\n <Pen className=\"h-4 w-4 text-orange-500\" />\n </div>\n </div>\n <h4 className=\"text-foreground text-base font-semibold\">No notes yet</h4>\n <p className=\"text-muted-foreground mt-1.5 max-w-[260px] text-sm leading-relaxed\">\n Capture key details and insights about this contact to stay on top of\n every conversation\n </p>\n <button\n type=\"button\"\n onClick={onCreateNote}\n className=\"bg-primary text-primary-foreground hover:bg-primary/90 mt-4 inline-flex items-center gap-1.5 rounded-lg px-4 py-2 text-sm font-medium transition-colors\"\n >\n <Plus className=\"h-3.5 w-3.5\" />\n New Note\n </button>\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Note card\n// ---------------------------------------------------------------------------\n\nfunction NoteCard({\n note,\n onEdit,\n onDelete,\n}: {\n note: ContactNote;\n onEdit: (note: ContactNote) => void;\n onDelete: (note: ContactNote) => void;\n}) {\n const assetCount = note.assets?.length ?? 0;\n\n return (\n <div\n role=\"button\"\n tabIndex={0}\n onClick={() => onEdit(note)}\n onKeyDown={(e) => {\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n onEdit(note);\n }\n }}\n className=\"border-border bg-card hover:border-border/80 cursor-pointer rounded-xl border p-5 transition-colors\"\n >\n {/* Title row with ellipsis menu */}\n <div className=\"flex items-start justify-between gap-2\">\n <h4 className=\"text-foreground line-clamp-1 text-sm font-semibold\">\n {note.title}\n </h4>\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <button\n type=\"button\"\n onClick={(e) => e.stopPropagation()}\n className=\"text-muted-foreground inline-flex h-6 w-6 items-center justify-center rounded-md hover:opacity-70\"\n >\n <EllipsisVertical className=\"h-4 w-4\" />\n </button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\">\n <DropdownMenuItem\n className=\"text-destructive\"\n onClick={(e) => {\n e.stopPropagation();\n onDelete(note);\n }}\n >\n Delete\n </DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenu>\n </div>\n\n {/* Body */}\n <p className=\"text-muted-foreground mt-1.5 line-clamp-4 text-sm leading-relaxed\">\n {note.body}\n </p>\n\n {/* Meta row */}\n <div className=\"mt-3 flex flex-wrap items-center gap-4\">\n {note.due_at && (\n <div className=\"flex items-center gap-1.5\">\n <Calendar className=\"text-primary h-3.5 w-3.5\" />\n <span className=\"text-primary text-xs font-medium\">\n Due {formatDueDate(note.due_at)}\n </span>\n </div>\n )}\n {!note.due_at && note.due_date && (\n <div className=\"flex items-center gap-1.5\">\n <Calendar className=\"text-primary h-3.5 w-3.5\" />\n <span className=\"text-primary text-xs font-medium\">\n Due {formatDueDate(note.due_date)}\n </span>\n </div>\n )}\n {assetCount > 0 && (\n <div className=\"flex items-center gap-1.5\">\n <Paperclip className=\"text-muted-foreground h-3.5 w-3.5\" />\n <span className=\"text-muted-foreground text-xs\">\n {assetCount} {assetCount === 1 ? \"Attachment\" : \"Attachments\"}\n </span>\n </div>\n )}\n </div>\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Main component\n// ---------------------------------------------------------------------------\n\nexport interface NotesListProps {\n notes: ContactNote[];\n isLoading?: boolean;\n contactId: string;\n client: FetchClient;\n /** Notes API client for mutations */\n notesClient?: FetchClient;\n /** Ref that receives the openCreateModal callback for external triggering */\n ref?: React.Ref<(() => void) | null>;\n}\n\nexport function NotesList({\n notes,\n isLoading,\n contactId,\n client,\n notesClient,\n ref,\n}: NotesListProps): React.JSX.Element {\n const [noteToDelete, setNoteToDelete] = useState<ContactNote | null>(null);\n const [modalOpen, setModalOpen] = useState(false);\n const [editingNote, setEditingNote] = useState<ContactNote | null>(null);\n\n const effectiveClient = notesClient ?? client;\n\n const deleteNote = useDeleteContactNote(effectiveClient, contactId);\n const createNote = useCreateContactNote(effectiveClient, contactId, {\n onSuccess: () => setModalOpen(false),\n });\n const updateNote = useUpdateContactNote(effectiveClient, contactId, {\n onSuccess: () => setEditingNote(null),\n });\n\n const openCreateModal = () => {\n setEditingNote(null);\n setModalOpen(true);\n };\n\n // Expose openCreateModal to parent via ref\n useImperativeHandle(ref, () => openCreateModal);\n\n const handleSave = (data: {\n title: string;\n body: string;\n dueDate?: string;\n }) => {\n if (editingNote) {\n updateNote.mutate({\n noteId: editingNote.id,\n input: { title: data.title, body: data.body },\n });\n } else {\n createNote.mutate({ title: data.title, body: data.body });\n }\n };\n\n const isModalOpen = modalOpen || editingNote !== null;\n const handleModalOpenChange = (open: boolean) => {\n if (!open) {\n setModalOpen(false);\n setEditingNote(null);\n }\n };\n\n if (isLoading) {\n return (\n <div className=\"space-y-4\">\n <div className=\"flex items-center justify-between\">\n <div>\n <div className=\"bg-muted h-5 w-24 animate-pulse rounded\" />\n <div className=\"bg-muted mt-1 h-4 w-48 animate-pulse rounded\" />\n </div>\n <div className=\"bg-muted h-8 w-24 animate-pulse rounded-lg\" />\n </div>\n <div className=\"grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-3\">\n {[1, 2, 3].map((i) => (\n <div\n key={i}\n className=\"border-border bg-muted/50 h-40 animate-pulse rounded-xl border\"\n />\n ))}\n </div>\n </div>\n );\n }\n\n return (\n <div className=\"space-y-4\">\n {/* Header */}\n <div className=\"flex items-start justify-between\">\n <div>\n <h3 className=\"text-foreground text-base font-semibold\">\n Notes ({notes.length})\n </h3>\n <p className=\"text-muted-foreground mt-0.5 text-sm\">\n Capture key details and insights about this contact\n </p>\n </div>\n <button\n type=\"button\"\n onClick={openCreateModal}\n className=\"bg-primary text-primary-foreground hover:bg-primary/90 inline-flex items-center gap-1.5 rounded-lg px-3 py-1.5 text-sm font-medium transition-colors\"\n >\n <Plus className=\"h-3.5 w-3.5\" />\n Add Note\n </button>\n </div>\n\n {/* Content */}\n {notes.length === 0 ? (\n <EmptyState onCreateNote={openCreateModal} />\n ) : (\n <div className=\"grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-3\">\n {notes.map((note) => (\n <NoteCard\n key={note.id}\n note={note}\n onEdit={setEditingNote}\n onDelete={setNoteToDelete}\n />\n ))}\n </div>\n )}\n\n {/* Create/Edit modal */}\n <NoteTaskModal\n key={editingNote?.id ?? \"create\"}\n open={isModalOpen}\n onOpenChange={handleModalOpenChange}\n mode={editingNote ? \"edit\" : \"create\"}\n type=\"note\"\n initialTitle={editingNote?.title ?? \"\"}\n initialBody={editingNote?.body ?? \"\"}\n onSave={handleSave}\n isPending={createNote.isPending || updateNote.isPending}\n />\n\n {/* Delete confirmation modal */}\n <AlertDialog\n open={!!noteToDelete}\n onOpenChange={(open) => {\n if (!open) setNoteToDelete(null);\n }}\n >\n <AlertDialogContent>\n <AlertDialogHeader>\n <AlertDialogTitle>Delete Note</AlertDialogTitle>\n <AlertDialogDescription>\n Are you sure you want to delete "{noteToDelete?.title}"?\n This action cannot be undone.\n </AlertDialogDescription>\n </AlertDialogHeader>\n <AlertDialogFooter>\n <AlertDialogCancel>Cancel</AlertDialogCancel>\n <AlertDialogAction\n variant=\"destructive\"\n onClick={() => {\n if (noteToDelete) {\n deleteNote.mutate(noteToDelete.id);\n }\n }}\n >\n Delete\n </AlertDialogAction>\n </AlertDialogFooter>\n </AlertDialogContent>\n </AlertDialog>\n </div>\n );\n}\n","\"use client\";\n\nimport React, { useMemo, useState } from \"react\";\nimport type { LucideIcon } from \"lucide-react\";\nimport {\n Bell,\n Calendar,\n SquareCheckBig,\n Eye,\n MessageCircle,\n Play,\n ShoppingCart,\n Star,\n Trophy,\n UserPlus,\n User,\n Rocket,\n Share2,\n} from \"lucide-react\";\nimport { cn } from \"@fluid-app/ui-primitives\";\nimport type { ContactActivity } from \"../../hooks/contacts/use-contact-activities\";\n\n// ---------------------------------------------------------------------------\n// Slug → icon mapping\n// ---------------------------------------------------------------------------\n\nconst SLUG_ICON_MAP: Record<string, LucideIcon> = {\n order_placed: ShoppingCart,\n abandoned_cart: ShoppingCart,\n cart_items_added: ShoppingCart,\n new_cart_items_added: ShoppingCart,\n direct_message: MessageCircle,\n comment_reply: MessageCircle,\n message_received: MessageCircle,\n message_sent: MessageCircle,\n video: Play,\n video_complete: Play,\n video_contact: Play,\n video_complete_contact: Play,\n new_lead: UserPlus,\n page_views_contact: UserPlus,\n smart_link_clicked: UserPlus,\n page_views: Eye,\n upcoming_event: Calendar,\n review_left: Star,\n tasks: SquareCheckBig,\n announcements: Bell,\n fantasy_point: Trophy,\n};\n\nfunction getActivityIcon(slug: string | null | undefined): LucideIcon {\n return (slug && SLUG_ICON_MAP[slug]) || User;\n}\n\n// ---------------------------------------------------------------------------\n// Slug → type label mapping\n// ---------------------------------------------------------------------------\n\nfunction getTypeLabel(slug: string | null | undefined): string {\n if (!slug) return \"Notification\";\n if (\n slug.includes(\"message\") ||\n slug === \"direct_message\" ||\n slug === \"comment_reply\"\n )\n return \"Message\";\n if (slug.includes(\"page_view\")) return \"Alert from Fluid.app\";\n if (slug.includes(\"video\")) return \"Alert from Fluid.app\";\n if (\n slug.includes(\"order\") ||\n slug.includes(\"cart\") ||\n slug === \"abandoned_cart\"\n )\n return \"Alert from Fluid.app\";\n if (slug === \"tasks\") return \"Task\";\n if (slug === \"smart_link_clicked\" || slug === \"new_lead\")\n return \"Alert from Fluid.app\";\n if (slug === \"announcements\") return \"Announcement\";\n if (slug === \"upcoming_event\") return \"Event\";\n if (slug === \"review_left\") return \"Review\";\n if (slug === \"fantasy_point\") return \"Points\";\n return \"Notification\";\n}\n\n// ---------------------------------------------------------------------------\n// Slug → content card category\n// ---------------------------------------------------------------------------\n\nfunction getSlugCategory(slug: string | null | undefined): string {\n if (!slug) return \"other\";\n if (\n slug.includes(\"message\") ||\n slug === \"direct_message\" ||\n slug === \"comment_reply\"\n )\n return \"message\";\n if (slug === \"tasks\") return \"task\";\n if (slug.includes(\"page_view\") || slug === \"smart_link_clicked\")\n return \"page_view\";\n if (slug.includes(\"video\")) return \"video\";\n if (\n slug.includes(\"order\") ||\n slug.includes(\"cart\") ||\n slug === \"abandoned_cart\"\n )\n return \"order\";\n return \"other\";\n}\n\n// ---------------------------------------------------------------------------\n// Date helpers\n// ---------------------------------------------------------------------------\n\nfunction getDateKey(timestamp: string): string {\n return new Date(timestamp).toISOString().split(\"T\")[0] ?? timestamp;\n}\n\nfunction formatDateHeader(timestamp: string): string {\n const date = new Date(timestamp);\n const now = new Date();\n const todayKey = now.toISOString().split(\"T\")[0];\n const yesterdayKey = new Date(now.getTime() - 86400000)\n .toISOString()\n .split(\"T\")[0];\n const key = getDateKey(timestamp);\n\n if (key === todayKey) return \"Today\";\n if (key === yesterdayKey) return \"Yesterday\";\n return date.toLocaleDateString(\"en-US\", { month: \"long\", day: \"numeric\" });\n}\n\nfunction formatTimestamp(timestamp: string): string {\n return new Date(timestamp).toLocaleTimeString(\"en-US\", {\n hour: \"numeric\",\n minute: \"2-digit\",\n hour12: true,\n });\n}\n\n// ---------------------------------------------------------------------------\n// Filter\n// ---------------------------------------------------------------------------\n\nconst filterOptions = [\"All\", \"New\"] as const;\ntype FilterOption = (typeof filterOptions)[number];\n\nfunction filterActivities(\n activities: ContactActivity[],\n filter: FilterOption,\n): ContactActivity[] {\n if (filter === \"New\") return activities.filter((a) => !a.read_at);\n return activities;\n}\n\n// ---------------------------------------------------------------------------\n// Group by date\n// ---------------------------------------------------------------------------\n\ntype ActivityGroup = { label: string; items: ContactActivity[] };\n\nfunction groupByDate(activities: ContactActivity[]): ActivityGroup[] {\n const sorted = [...activities].sort(\n (a, b) =>\n new Date(b.created_at).getTime() - new Date(a.created_at).getTime(),\n );\n\n const map = new Map<string, ContactActivity[]>();\n for (const activity of sorted) {\n const key = getDateKey(activity.created_at);\n const existing = map.get(key);\n if (existing) {\n existing.push(activity);\n } else {\n map.set(key, [activity]);\n }\n }\n\n return Array.from(map.entries()).map(([, items]) => ({\n label: formatDateHeader(items[0]!.created_at),\n items,\n }));\n}\n\n// ---------------------------------------------------------------------------\n// Empty state\n// ---------------------------------------------------------------------------\n\nfunction EmptyState() {\n return (\n <div className=\"flex flex-col items-center justify-center px-4 py-12 text-center\">\n <div className=\"relative mb-6\">\n <div className=\"flex h-20 w-20 items-center justify-center rounded-full bg-gradient-to-br from-violet-100 to-indigo-100\">\n <Rocket className=\"h-9 w-9 text-violet-500\" />\n </div>\n <div className=\"absolute -right-2 -bottom-1 flex h-9 w-9 items-center justify-center rounded-full border-2 border-white bg-gradient-to-br from-pink-100 to-rose-100 shadow-sm\">\n <Share2 className=\"h-4 w-4 text-pink-500\" />\n </div>\n </div>\n <h4 className=\"text-foreground text-base font-semibold\">\n No activity yet\n </h4>\n <p className=\"text-muted-foreground mt-1.5 max-w-[240px] text-sm leading-relaxed\">\n Reach out and share a product or media to start building this\n contact's story\n </p>\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Content card - renders below header/subtitle based on slug category\n// ---------------------------------------------------------------------------\n\nfunction ContentCard({ activity }: { activity: ContactActivity }) {\n const category = getSlugCategory(activity.slug);\n const headerText = activity.formatted_description;\n\n // Extra data beyond what's shown in the header\n const extraDescription =\n activity.description && activity.description !== headerText\n ? activity.description\n : null;\n const extraTitle =\n activity.title && activity.title !== headerText ? activity.title : null;\n\n // Only render card when there's additional data\n if (!extraDescription && !extraTitle && category !== \"task\") return null;\n\n switch (category) {\n case \"message\":\n if (!extraDescription) return null;\n return (\n <div className=\"border-border bg-background mt-2 rounded-lg border p-3\">\n <p className=\"text-foreground text-sm leading-relaxed\">\n {extraDescription}\n </p>\n </div>\n );\n\n case \"task\":\n if (!extraDescription) return null;\n return (\n <div className=\"bg-muted/50 mt-2 rounded-lg p-3\">\n <p className=\"text-muted-foreground text-sm\">{extraDescription}</p>\n <div className=\"text-primary mt-2 flex items-center gap-1.5\">\n <Calendar className=\"h-3.5 w-3.5\" />\n <span className=\"text-xs font-medium\">\n Due {extraTitle || \"TBD\"}\n </span>\n </div>\n </div>\n );\n\n case \"page_view\":\n if (!extraTitle && !extraDescription) return null;\n return (\n <div className=\"bg-muted/50 mt-2 rounded-lg p-3\">\n <p className=\"text-foreground text-sm font-semibold\">\n {extraTitle || extraDescription}\n </p>\n <p className=\"text-muted-foreground text-xs\">\n {getTypeLabel(activity.slug)}\n </p>\n </div>\n );\n\n case \"video\":\n if (!extraTitle && !extraDescription) return null;\n return (\n <div className=\"bg-muted/50 mt-2 rounded-lg p-3\">\n {extraTitle && (\n <p className=\"text-foreground text-sm font-semibold\">\n {extraTitle}\n </p>\n )}\n {extraDescription && (\n <p className=\"text-muted-foreground mt-0.5 text-xs\">\n {extraDescription}\n </p>\n )}\n </div>\n );\n\n case \"order\":\n if (!extraTitle && !extraDescription) return null;\n return (\n <div className=\"bg-muted/50 mt-2 rounded-lg p-3\">\n <p className=\"text-foreground text-sm font-semibold\">\n {extraTitle || extraDescription}\n </p>\n </div>\n );\n\n default:\n return null;\n }\n}\n\n// ---------------------------------------------------------------------------\n// Activity item (redesigned)\n// ---------------------------------------------------------------------------\n\nfunction ActivityItem({\n activity,\n isFirst,\n isLast,\n}: {\n activity: ContactActivity;\n isFirst: boolean;\n isLast: boolean;\n}) {\n const Icon = getActivityIcon(activity.slug);\n const isUnread = !activity.read_at;\n const typeLabel = getTypeLabel(activity.slug);\n const headerText = activity.formatted_description;\n\n // Subtitle: show description if different from header, or title if different\n const subtitle =\n activity.description && activity.description !== headerText\n ? activity.description\n : activity.title && activity.title !== headerText\n ? activity.title\n : null;\n\n return (\n <div className=\"relative flex gap-3\">\n {/* Timeline column */}\n <div className=\"relative flex w-10 shrink-0 flex-col items-center\">\n {/* Vertical dashed line */}\n {!isFirst && !isLast && (\n <div className=\"absolute top-0 bottom-0 left-1/2 -translate-x-1/2 border-l-2 border-dashed border-blue-400\" />\n )}\n {!isFirst && isLast && (\n <div className=\"absolute top-0 left-1/2 h-5 -translate-x-1/2 border-l-2 border-dashed border-blue-400\" />\n )}\n {isFirst && !isLast && (\n <div className=\"absolute top-[44px] bottom-0 left-1/2 -translate-x-1/2 border-l-2 border-dashed border-blue-400\" />\n )}\n\n {/* Icon badge */}\n <div className=\"bg-background relative z-10 rounded-full\">\n <div className=\"bg-foreground text-background flex h-10 w-10 items-center justify-center rounded-full\">\n <Icon className=\"h-4 w-4\" />\n </div>\n {/* Unread dot */}\n {isUnread && (\n <div className=\"border-background absolute -top-0.5 -right-0.5 h-3 w-3 rounded-full border-2 bg-blue-600\" />\n )}\n </div>\n </div>\n\n {/* Content */}\n <div className=\"min-w-0 flex-1 pt-1 pb-8\">\n {/* Header row: formatted_description + type label + timestamp */}\n <div className=\"flex items-start gap-1.5\">\n <p className=\"text-foreground text-sm font-semibold\">{headerText}</p>\n <span className=\"text-muted-foreground mt-0.5 shrink-0 text-xs\">\n {typeLabel}\n </span>\n <span className=\"text-muted-foreground mt-0.5 flex-1 text-right text-xs\">\n {formatTimestamp(activity.created_at)}\n </span>\n </div>\n\n {/* Subtitle */}\n {subtitle && (\n <p className=\"text-muted-foreground mt-0.5 text-sm\">{subtitle}</p>\n )}\n\n {/* Content card */}\n <ContentCard activity={activity} />\n </div>\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Date separator\n// ---------------------------------------------------------------------------\n\nfunction DateSeparator({ label }: { label: string }) {\n return (\n <div className=\"py-3\">\n <p className=\"text-foreground text-base font-bold\">{label}</p>\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Main component\n// ---------------------------------------------------------------------------\n\nexport interface ActivityFeedProps {\n activities: ContactActivity[];\n isLoading?: boolean;\n /** Called when the user explicitly clicks \"Mark all read\" */\n onMarkRead?: () => void;\n}\n\nexport function ActivityFeed({\n activities,\n isLoading,\n onMarkRead,\n}: ActivityFeedProps): React.JSX.Element {\n const [activeFilter, setActiveFilter] = useState<FilterOption>(\"All\");\n\n const handleFilterChange = (option: FilterOption) => {\n setActiveFilter(option);\n };\n\n const hasUnread = activities.some((a) => !a.read_at);\n\n const filtered = useMemo(\n () => filterActivities(activities, activeFilter),\n [activities, activeFilter],\n );\n\n const grouped = useMemo(() => groupByDate(filtered), [filtered]);\n\n // Compute total item count for first/last logic\n const allItems = useMemo(() => grouped.flatMap((g) => g.items), [grouped]);\n\n if (isLoading) {\n return (\n <div className=\"space-y-4\">\n <div className=\"bg-muted h-5 w-24 animate-pulse rounded\" />\n <div className=\"flex gap-2\">\n {[1, 2, 3].map((i) => (\n <div\n key={i}\n className=\"bg-muted h-6 w-14 animate-pulse rounded-full\"\n />\n ))}\n </div>\n {[1, 2, 3].map((i) => (\n <div key={i} className=\"flex items-start gap-3\">\n <div className=\"bg-muted h-10 w-10 animate-pulse rounded-full\" />\n <div className=\"flex-1 space-y-1.5\">\n <div className=\"bg-muted h-4 w-3/4 animate-pulse rounded\" />\n <div className=\"bg-muted h-3 w-1/3 animate-pulse rounded\" />\n </div>\n </div>\n ))}\n </div>\n );\n }\n\n return (\n <div className=\"space-y-4\">\n {/* Header */}\n <h3 className=\"text-foreground text-lg font-semibold\">Recent Activity</h3>\n\n {/* Filter pills */}\n <div className=\"flex items-center gap-2\">\n {filterOptions.map((option) => (\n <button\n key={option}\n type=\"button\"\n onClick={() => handleFilterChange(option)}\n className={cn(\n \"rounded-full px-3 py-1 text-xs font-medium transition-colors\",\n activeFilter === option\n ? \"bg-primary text-primary-foreground\"\n : \"bg-muted text-muted-foreground hover:bg-muted/80\",\n )}\n >\n {option}\n </button>\n ))}\n {hasUnread && onMarkRead && (\n <button\n type=\"button\"\n onClick={onMarkRead}\n className=\"text-primary hover:text-primary/80 ml-auto text-xs font-medium transition-colors\"\n >\n Mark all read\n </button>\n )}\n </div>\n\n {/* Content */}\n {activities.length === 0 ? (\n <EmptyState />\n ) : filtered.length === 0 ? (\n <p className=\"text-muted-foreground py-8 text-center text-sm\">\n No {activeFilter.toLowerCase()} activities\n </p>\n ) : (\n <div>\n {grouped.map((group, groupIndex) => {\n // Calculate running index for first/last across all groups\n const itemsBefore = grouped\n .slice(0, groupIndex)\n .reduce((sum, g) => sum + g.items.length, 0);\n\n return (\n <div key={group.label}>\n {/* Date separator */}\n <DateSeparator label={group.label} />\n\n {/* Items */}\n {group.items.map((activity, itemIndex) => {\n const globalIndex = itemsBefore + itemIndex;\n return (\n <ActivityItem\n key={activity.id}\n activity={activity}\n isFirst={globalIndex === 0}\n isLast={globalIndex === allItems.length - 1}\n />\n );\n })}\n </div>\n );\n })}\n </div>\n )}\n </div>\n );\n}\n","/**\n * Generated API client functions for users_tasks\n *\n * DO NOT EDIT THIS FILE DIRECTLY\n * This file is auto-generated. To update:\n * 1. Update the OpenAPI spec file\n * 2. Run: pnpm generate\n */\n\nimport type { FetchClient } from \"../lib/fetch-client\";\nimport type { operations } from \"../generated/users_tasks\";\n\n// ============================================================================\n// Users Tasks\n// ============================================================================\n\n/**\n * Toggle task completion\n *\n *\n * @param client - Fetch client instance\n * @param id - id\n */\nexport async function completeUserTask(\n client: FetchClient,\n id: string | number,\n): Promise<\n operations[\"completeUserTask\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.post(`/api/users/v2025-06/tasks/${id}/complete`);\n}\n\n/**\n * Create a task\n *\n *\n * @param client - Fetch client instance\n * @param body - body\n */\nexport async function createUserTask(\n client: FetchClient,\n body: operations[\"createUserTask\"][\"requestBody\"][\"content\"][\"application/json\"],\n): Promise<\n operations[\"createUserTask\"][\"responses\"][201][\"content\"][\"application/json\"]\n> {\n return client.post(`/api/users/v2025-06/tasks`, body);\n}\n\n/**\n * List tasks for the current user\n *\n *\n * @param client - Fetch client instance\n * @param params? - params?\n */\nexport async function listUserTasks(\n client: FetchClient,\n params?: operations[\"listUserTasks\"][\"parameters\"][\"query\"],\n): Promise<\n operations[\"listUserTasks\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.get(`/api/users/v2025-06/tasks`, params);\n}\n\n/**\n * Delete a task\n *\n *\n * @param client - Fetch client instance\n * @param id - id\n */\nexport async function deleteUserTask(\n client: FetchClient,\n id: string | number,\n): Promise<\n operations[\"deleteUserTask\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.delete(`/api/users/v2025-06/tasks/${id}`);\n}\n\n/**\n * Get a task\n *\n *\n * @param client - Fetch client instance\n * @param id - id\n */\nexport async function getUserTask(\n client: FetchClient,\n id: string | number,\n): Promise<\n operations[\"getUserTask\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.get(`/api/users/v2025-06/tasks/${id}`);\n}\n\n/**\n * Update a task\n *\n *\n * @param client - Fetch client instance\n * @param id - id\n * @param body - body\n */\nexport async function updateUserTask(\n client: FetchClient,\n id: string | number,\n body: operations[\"updateUserTask\"][\"requestBody\"][\"content\"][\"application/json\"],\n): Promise<\n operations[\"updateUserTask\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.patch(`/api/users/v2025-06/tasks/${id}`, body);\n}\n","\"use client\";\n\nimport { useQuery } from \"@tanstack/react-query\";\nimport { usersContacts } from \"@fluid-app/user-contacts-api-client\";\nimport type { FetchClient } from \"@fluid-app/api-client-core\";\nimport type { components } from \"@fluid-app/user-contacts-api-client\";\n\nexport type ContactTask = components[\"schemas\"][\"Task\"];\n\nexport const CONTACT_TASKS_QUERY_KEY = (contactId: string) =>\n [\"portal-contacts\", \"tasks\", contactId] as const;\n\nexport function useContactTasks(client: FetchClient, contactId: string) {\n return useQuery({\n queryKey: CONTACT_TASKS_QUERY_KEY(contactId),\n queryFn: () => usersContacts.listUserContactTasks(client, contactId),\n enabled: !!contactId,\n select: (data) => data.tasks,\n });\n}\n","\"use client\";\n\nimport { useMutation, useQueryClient } from \"@tanstack/react-query\";\nimport { usersTasks } from \"@fluid-app/user-tasks-api-client\";\nimport { fluidToast } from \"@fluid-app/ui-primitives\";\nimport { parseApiErrors, type FetchClient } from \"@fluid-app/api-client-core\";\nimport { CONTACT_TASKS_QUERY_KEY } from \"./use-contact-tasks\";\n\nexport function useToggleTaskCompletion(\n client: FetchClient,\n contactId: string,\n) {\n const queryClient = useQueryClient();\n\n return useMutation({\n mutationFn: ({\n taskId,\n isCompleted,\n }: {\n taskId: number;\n isCompleted: boolean;\n }) =>\n usersTasks.updateUserTask(client, taskId, {\n id: taskId,\n task: {\n completed_at: isCompleted ? null : new Date().toISOString(),\n },\n }),\n onSuccess: () => {\n queryClient.invalidateQueries({\n queryKey: CONTACT_TASKS_QUERY_KEY(contactId),\n });\n },\n onError: (error) => {\n fluidToast({\n title: \"Failed to update task\",\n type: \"error\",\n description: parseApiErrors(error),\n });\n },\n });\n}\n","\"use client\";\n\nimport { useMutation, useQueryClient } from \"@tanstack/react-query\";\nimport { usersTasks } from \"@fluid-app/user-tasks-api-client\";\nimport { fluidToast } from \"@fluid-app/ui-primitives\";\nimport { parseApiErrors, type FetchClient } from \"@fluid-app/api-client-core\";\nimport { CONTACT_TASKS_QUERY_KEY } from \"./use-contact-tasks\";\n\nexport function useDeleteContactTask(\n client: FetchClient,\n contactId: string,\n options?: { onSuccess?: () => void },\n) {\n const queryClient = useQueryClient();\n\n return useMutation({\n mutationFn: (taskId: number) => usersTasks.deleteUserTask(client, taskId),\n onSuccess: () => {\n fluidToast({ title: \"Task deleted\", type: \"success\" });\n queryClient.invalidateQueries({\n queryKey: CONTACT_TASKS_QUERY_KEY(contactId),\n });\n options?.onSuccess?.();\n },\n onError: (error) => {\n fluidToast({\n title: \"Failed to delete task\",\n type: \"error\",\n description: parseApiErrors(error),\n });\n },\n });\n}\n","\"use client\";\n\nimport { useMutation, useQueryClient } from \"@tanstack/react-query\";\nimport { usersContacts } from \"@fluid-app/user-contacts-api-client\";\nimport { fluidToast } from \"@fluid-app/ui-primitives\";\nimport { parseApiErrors, type FetchClient } from \"@fluid-app/api-client-core\";\nimport { CONTACT_TASKS_QUERY_KEY } from \"./use-contact-tasks\";\n\nexport type CreateTaskInput = {\n body: string;\n due_at?: string | null;\n completed_at?: string | null;\n user_id?: number | null;\n};\n\nexport function useCreateContactTask(\n client: FetchClient,\n contactId: string,\n options?: { onSuccess?: () => void },\n) {\n const queryClient = useQueryClient();\n\n return useMutation({\n mutationFn: (input: CreateTaskInput) =>\n usersContacts.createUserContactTask(client, contactId, {\n id: Number(contactId),\n task: input,\n }),\n onSuccess: () => {\n fluidToast({ title: \"Task created\", type: \"success\" });\n queryClient.invalidateQueries({\n queryKey: CONTACT_TASKS_QUERY_KEY(contactId),\n });\n options?.onSuccess?.();\n },\n onError: (error) => {\n fluidToast({\n title: \"Failed to create task\",\n type: \"error\",\n description: parseApiErrors(error),\n });\n },\n });\n}\n","\"use client\";\n\nimport { useMutation, useQueryClient } from \"@tanstack/react-query\";\nimport { usersTasks } from \"@fluid-app/user-tasks-api-client\";\nimport { fluidToast } from \"@fluid-app/ui-primitives\";\nimport { parseApiErrors, type FetchClient } from \"@fluid-app/api-client-core\";\nimport { CONTACT_TASKS_QUERY_KEY } from \"./use-contact-tasks\";\n\nexport type UpdateTaskInput = {\n body?: string | null;\n due_at?: string | null;\n completed_at?: string | null;\n contact_id?: number | null;\n};\n\nexport function useUpdateContactTask(\n client: FetchClient,\n contactId: string,\n options?: { onSuccess?: () => void },\n) {\n const queryClient = useQueryClient();\n\n return useMutation({\n mutationFn: ({\n taskId,\n input,\n }: {\n taskId: number;\n input: UpdateTaskInput;\n }) =>\n usersTasks.updateUserTask(client, taskId, {\n id: taskId,\n task: input,\n }),\n onSuccess: () => {\n fluidToast({ title: \"Task updated\", type: \"success\" });\n queryClient.invalidateQueries({\n queryKey: CONTACT_TASKS_QUERY_KEY(contactId),\n });\n options?.onSuccess?.();\n },\n onError: (error) => {\n fluidToast({\n title: \"Failed to update task\",\n type: \"error\",\n description: parseApiErrors(error),\n });\n },\n });\n}\n","\"use client\";\n\nimport React, { useImperativeHandle, useState } from \"react\";\nimport {\n Calendar,\n Plus,\n ClipboardList,\n SquareCheckBig,\n CircleCheck,\n EllipsisVertical,\n} from \"lucide-react\";\nimport {\n cn,\n AlertDialog,\n AlertDialogAction,\n AlertDialogCancel,\n AlertDialogContent,\n AlertDialogDescription,\n AlertDialogFooter,\n AlertDialogHeader,\n AlertDialogTitle,\n Button,\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuTrigger,\n} from \"@fluid-app/ui-primitives\";\nimport type { FetchClient } from \"@fluid-app/api-client-core\";\nimport type { ContactTask } from \"../../hooks/contacts/use-contact-tasks\";\nimport { useToggleTaskCompletion } from \"../../hooks/contacts/use-toggle-task-completion\";\nimport { useDeleteContactTask } from \"../../hooks/contacts/use-delete-contact-task\";\nimport { useCreateContactTask } from \"../../hooks/contacts/use-create-contact-task\";\nimport { useUpdateContactTask } from \"../../hooks/contacts/use-update-contact-task\";\nimport { NoteTaskModal } from \"../editor/note-task-modal\";\n\n// ---------------------------------------------------------------------------\n// Date helpers\n// ---------------------------------------------------------------------------\n\nfunction formatDueDate(dateStr: string): string {\n const date = new Date(dateStr);\n return date.toLocaleDateString(\"en-US\", {\n month: \"short\",\n day: \"numeric\",\n year: \"numeric\",\n });\n}\n\nfunction formatRelativeTime(dateStr: string): string {\n const date = new Date(dateStr);\n const now = new Date();\n const diffMs = now.getTime() - date.getTime();\n const diffDays = Math.floor(diffMs / (1000 * 60 * 60 * 24));\n\n if (diffDays === 0) {\n return date.toLocaleTimeString(\"en-US\", {\n hour: \"numeric\",\n minute: \"2-digit\",\n });\n } else if (diffDays === 1) {\n return \"Yesterday\";\n } else {\n return `${diffDays} days ago`;\n }\n}\n\n/** Parse task body into title + body. First line is title, rest is body. */\nfunction parseTaskBody(body: string): { title: string; body: string } {\n const firstNewline = body.indexOf(\"\\n\\n\");\n if (firstNewline >= 0) {\n return {\n title: body.slice(0, firstNewline),\n body: body.slice(firstNewline + 2),\n };\n }\n return { title: body, body: \"\" };\n}\n\n// ---------------------------------------------------------------------------\n// Empty state\n// ---------------------------------------------------------------------------\n\nfunction EmptyState({ onCreateTask }: { onCreateTask: () => void }) {\n return (\n <div className=\"flex flex-col items-center justify-center px-4 py-12 text-center\">\n <div className=\"relative mb-6\">\n <div className=\"flex h-20 w-20 items-center justify-center rounded-full bg-gradient-to-br from-teal-100 to-emerald-100\">\n <ClipboardList className=\"h-9 w-9 text-teal-500\" />\n </div>\n <div className=\"absolute -right-2 -bottom-1 flex h-9 w-9 items-center justify-center rounded-full border-2 border-white bg-gradient-to-br from-blue-100 to-indigo-100 shadow-sm\">\n <SquareCheckBig className=\"h-4 w-4 text-blue-500\" />\n </div>\n </div>\n <h4 className=\"text-foreground text-base font-semibold\">No tasks yet</h4>\n <p className=\"text-muted-foreground mt-1.5 max-w-[260px] text-sm leading-relaxed\">\n Stay organized by creating tasks to track follow-ups for this contact\n </p>\n <button\n type=\"button\"\n onClick={onCreateTask}\n className=\"bg-primary text-primary-foreground hover:bg-primary/90 mt-4 inline-flex items-center gap-1.5 rounded-lg px-4 py-2 text-sm font-medium transition-colors\"\n >\n <Plus className=\"h-3.5 w-3.5\" />\n New Task\n </button>\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Task card\n// ---------------------------------------------------------------------------\n\ninterface TaskCardProps {\n task: ContactTask;\n toggleCompletion: ReturnType<typeof useToggleTaskCompletion>;\n onEdit: (task: ContactTask) => void;\n onDeleteClick: (task: ContactTask) => void;\n}\n\nfunction TaskCard({\n task,\n toggleCompletion,\n onEdit,\n onDeleteClick,\n}: TaskCardProps) {\n const isCompleted = !!task.completed_at;\n\n // Split the body into title (first line) and remaining body text\n const bodyLines = (task.body ?? \"\").split(\"\\n\");\n const title = bodyLines[0] ?? \"\";\n const bodyText = bodyLines.slice(1).join(\"\\n\").trim();\n\n const timestamp = task.created_at ? formatRelativeTime(task.created_at) : \"\";\n\n return (\n <div\n role=\"button\"\n tabIndex={0}\n onClick={() => onEdit(task)}\n onKeyDown={(e) => {\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n onEdit(task);\n }\n }}\n className=\"border-border bg-card min-w-[250px] cursor-pointer rounded-xl border p-4 transition-colors\"\n >\n <div className=\"flex items-start gap-3\">\n {/* Checkbox */}\n <button\n type=\"button\"\n onClick={(e) => {\n e.stopPropagation();\n toggleCompletion.mutate({\n taskId: task.id,\n isCompleted: isCompleted,\n });\n }}\n disabled={toggleCompletion.isPending}\n className=\"mt-0.5 shrink-0 transition-opacity hover:opacity-70 disabled:cursor-not-allowed disabled:opacity-50\"\n aria-label={isCompleted ? \"Mark as open\" : \"Mark as completed\"}\n >\n {isCompleted ? (\n <CircleCheck className=\"text-primary h-5 w-5\" />\n ) : (\n <div className=\"border-muted-foreground h-5 w-5 rounded-full border-2\" />\n )}\n </button>\n\n {/* Content */}\n <div className=\"min-w-0 flex-1\">\n {/* Title & menu row */}\n <div className=\"flex items-start justify-between gap-2\">\n <h4\n className={cn(\n \"text-foreground line-clamp-2 font-semibold\",\n isCompleted && \"text-muted-foreground line-through\",\n )}\n >\n {title}\n </h4>\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button\n variant=\"ghost\"\n size=\"icon-xs\"\n onClick={(e) => e.stopPropagation()}\n >\n <EllipsisVertical className=\"h-4 w-4\" />\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\">\n <DropdownMenuItem\n className=\"text-destructive\"\n onClick={(e) => {\n e.stopPropagation();\n onDeleteClick(task);\n }}\n >\n Delete\n </DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenu>\n </div>\n\n {/* Body text */}\n {bodyText && (\n <p\n className=\"text-muted-foreground mt-1 line-clamp-3 text-sm\"\n style={\n isCompleted ? { textDecoration: \"line-through\" } : undefined\n }\n >\n {bodyText}\n </p>\n )}\n\n {/* Due date & Timestamp */}\n <div className=\"mt-2 flex flex-row items-center gap-2\">\n <span className=\"text-muted-foreground text-xs\">{timestamp}</span>\n {task.due_at && (\n <div className=\"flex items-center gap-1\">\n <Calendar\n className={cn(\n \"h-3.5 w-3.5\",\n isCompleted ? \"text-muted-foreground\" : \"text-primary\",\n )}\n />\n <span\n className={cn(\n \"text-xs font-medium\",\n isCompleted ? \"text-muted-foreground\" : \"text-primary\",\n )}\n >\n Due {formatDueDate(task.due_at)}\n </span>\n </div>\n )}\n </div>\n </div>\n </div>\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Main component\n// ---------------------------------------------------------------------------\n\nexport interface TaskListProps {\n tasks: ContactTask[];\n isLoading?: boolean;\n contactId: string;\n client: FetchClient;\n /** Tasks API client for delete/toggle operations */\n tasksClient?: FetchClient;\n /** Ref that receives the openCreateModal callback for external triggering */\n ref?: React.Ref<(() => void) | null>;\n}\n\nexport function TaskList({\n tasks,\n isLoading,\n contactId,\n client,\n tasksClient,\n ref,\n}: TaskListProps): React.JSX.Element {\n const [taskToDelete, setTaskToDelete] = useState<ContactTask | null>(null);\n const [modalOpen, setModalOpen] = useState(false);\n const [editingTask, setEditingTask] = useState<ContactTask | null>(null);\n\n const effectiveClient = tasksClient ?? client;\n\n const toggleCompletion = useToggleTaskCompletion(effectiveClient, contactId);\n const deleteTask = useDeleteContactTask(effectiveClient, contactId, {\n onSuccess: () => setTaskToDelete(null),\n });\n const createTask = useCreateContactTask(effectiveClient, contactId, {\n onSuccess: () => setModalOpen(false),\n });\n const updateTask = useUpdateContactTask(effectiveClient, contactId, {\n onSuccess: () => setEditingTask(null),\n });\n\n const openCreateModal = () => {\n setEditingTask(null);\n setModalOpen(true);\n };\n\n // Expose openCreateModal to parent via ref\n useImperativeHandle(ref, () => openCreateModal);\n\n const handleSave = (data: {\n title: string;\n body: string;\n dueDate?: string;\n }) => {\n const taskBody = data.body ? `${data.title}\\n\\n${data.body}` : data.title;\n\n if (editingTask) {\n updateTask.mutate({\n taskId: editingTask.id,\n input: { body: taskBody, due_at: data.dueDate ?? null },\n });\n } else {\n createTask.mutate({ body: taskBody, due_at: data.dueDate ?? null });\n }\n };\n\n const editingParsed = editingTask\n ? parseTaskBody(editingTask.body ?? \"\")\n : null;\n\n const isModalOpen = modalOpen || editingTask !== null;\n const handleModalOpenChange = (open: boolean) => {\n if (!open) {\n setModalOpen(false);\n setEditingTask(null);\n }\n };\n\n if (isLoading) {\n return (\n <div className=\"space-y-4\">\n <div className=\"flex items-center justify-between\">\n <div>\n <div className=\"bg-muted h-5 w-24 animate-pulse rounded\" />\n <div className=\"bg-muted mt-1 h-4 w-48 animate-pulse rounded\" />\n </div>\n <div className=\"bg-muted h-8 w-24 animate-pulse rounded-lg\" />\n </div>\n <div className=\"grid grid-cols-1 gap-5 sm:grid-cols-2\">\n {[1, 2, 3].map((i) => (\n <div\n key={i}\n className=\"border-border bg-muted/50 h-32 animate-pulse rounded-xl border\"\n />\n ))}\n </div>\n </div>\n );\n }\n\n return (\n <div className=\"space-y-4\">\n {/* Header */}\n <div className=\"flex items-start justify-between\">\n <div>\n <h3 className=\"text-foreground text-base font-semibold\">\n Tasks ({tasks.length})\n </h3>\n <p className=\"text-muted-foreground mt-0.5 text-sm\">\n Manage tasks and follow-ups for this contact\n </p>\n </div>\n <button\n type=\"button\"\n onClick={openCreateModal}\n className=\"bg-primary text-primary-foreground hover:bg-primary/90 inline-flex items-center gap-1.5 rounded-lg px-3 py-1.5 text-sm font-medium transition-colors\"\n >\n <Plus className=\"h-3.5 w-3.5\" />\n Add Task\n </button>\n </div>\n\n {/* Content */}\n {tasks.length === 0 ? (\n <EmptyState onCreateTask={openCreateModal} />\n ) : (\n <div className=\"grid grid-cols-1 gap-5 sm:grid-cols-2\">\n {tasks.map((task) => (\n <TaskCard\n key={task.id}\n task={task}\n toggleCompletion={toggleCompletion}\n onEdit={setEditingTask}\n onDeleteClick={setTaskToDelete}\n />\n ))}\n </div>\n )}\n\n {/* Create/Edit modal */}\n <NoteTaskModal\n key={editingTask?.id ?? \"create\"}\n open={isModalOpen}\n onOpenChange={handleModalOpenChange}\n mode={editingTask ? \"edit\" : \"create\"}\n type=\"task\"\n initialTitle={editingParsed?.title ?? \"\"}\n initialBody={editingParsed?.body ?? \"\"}\n initialDueDate={editingTask?.due_at ?? undefined}\n showDueDate\n onSave={handleSave}\n isPending={createTask.isPending || updateTask.isPending}\n isCompleted={editingTask ? !!editingTask.completed_at : undefined}\n onToggleComplete={\n editingTask\n ? () =>\n toggleCompletion.mutate(\n {\n taskId: editingTask.id,\n isCompleted: !!editingTask.completed_at,\n },\n { onSuccess: () => setEditingTask(null) },\n )\n : undefined\n }\n isTogglePending={toggleCompletion.isPending}\n />\n\n {/* Delete confirmation modal */}\n <AlertDialog\n open={taskToDelete !== null}\n onOpenChange={(open) => {\n if (!open) setTaskToDelete(null);\n }}\n >\n <AlertDialogContent>\n <AlertDialogHeader>\n <AlertDialogTitle>Delete Task</AlertDialogTitle>\n <AlertDialogDescription>\n Are you sure you want to delete this task? This action cannot be\n undone.\n </AlertDialogDescription>\n </AlertDialogHeader>\n <AlertDialogFooter>\n <AlertDialogCancel>Cancel</AlertDialogCancel>\n <AlertDialogAction\n variant=\"destructive\"\n onClick={() => {\n if (taskToDelete) {\n deleteTask.mutate(taskToDelete.id);\n }\n }}\n >\n Delete\n </AlertDialogAction>\n </AlertDialogFooter>\n </AlertDialogContent>\n </AlertDialog>\n </div>\n );\n}\n","\"use client\";\n\nimport { useQuery } from \"@tanstack/react-query\";\nimport { usersContacts } from \"@fluid-app/user-contacts-api-client\";\nimport type { FetchClient } from \"@fluid-app/api-client-core\";\nimport type { components } from \"@fluid-app/user-contacts-api-client\";\n\nexport type ContactActivity = components[\"schemas\"][\"Activity\"];\n\nexport function useContactActivities(\n client: FetchClient,\n contactId: string,\n options?: { enabled?: boolean },\n) {\n return useQuery({\n queryKey: [\"portal-contacts\", \"activities\", contactId] as const,\n queryFn: () => usersContacts.listUserContactActivities(client, contactId),\n enabled: options?.enabled !== false && !!contactId,\n select: (data) => data.activities,\n });\n}\n","\"use client\";\n\nimport { useMutation, useQueryClient } from \"@tanstack/react-query\";\nimport { usersContacts } from \"@fluid-app/user-contacts-api-client\";\nimport type { FetchClient } from \"@fluid-app/api-client-core\";\nimport type { ContactActivity } from \"./use-contact-activities\";\n\nexport function useMarkContactRead(client: FetchClient, contactId: string) {\n const queryClient = useQueryClient();\n const queryKey = [\"portal-contacts\", \"activities\", contactId] as const;\n\n return useMutation({\n mutationFn: () => usersContacts.markUserContactRead(client, contactId),\n onMutate: () => {\n // Optimistically mark all activities as read in the cache.\n // The query stores the raw API response; `select` maps to activities[].\n const previous = queryClient.getQueryData<{\n activities: ContactActivity[];\n }>(queryKey);\n\n if (previous) {\n const now = new Date().toISOString();\n queryClient.setQueryData(queryKey, {\n ...previous,\n activities: previous.activities.map((a) =>\n a.read_at ? a : { ...a, read_at: now },\n ),\n });\n }\n\n return { previous };\n },\n onError: (_err, _vars, context) => {\n // Roll back on failure\n if (context?.previous) {\n queryClient.setQueryData(queryKey, context.previous);\n }\n },\n onSettled: () => {\n // Refetch to sync with server state\n queryClient.invalidateQueries({ queryKey });\n },\n });\n}\n","\"use client\";\n\nimport React, {\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport {\n Tabs,\n TabsContent,\n TabsList,\n TabsTrigger,\n} from \"@fluid-app/ui-primitives\";\nimport type { FetchClient } from \"@fluid-app/api-client-core\";\nimport { ContactInfoCard } from \"../../../shared/components/contacts/contactCard/contactInfoCard\";\nimport { ContactDetailsForm } from \"../../../shared/components/contacts/contactDetailsForm\";\nimport { NotesSidebar } from \"../notes/notes-sidebar\";\nimport { NotesList } from \"../notes/notes-list\";\nimport { ActivityFeed } from \"../activities/activity-feed\";\nimport { TaskList } from \"../tasks/task-list\";\nimport { useContactActivities } from \"../../hooks/contacts/use-contact-activities\";\nimport { useContactTasks } from \"../../hooks/contacts/use-contact-tasks\";\nimport { useContactNotes } from \"../../hooks/notes/use-contact-notes\";\nimport { useMarkContactRead } from \"../../hooks/contacts/use-mark-contact-read\";\nimport type { Contact } from \"../../../shared/types\";\nimport { ShoppingCart, Repeat2 } from \"lucide-react\";\n\nexport interface RepContactDetailViewProps {\n contact?: Contact;\n contactId: string;\n client: FetchClient;\n /** Notes API client for note mutations (delete) */\n notesClient?: FetchClient;\n /** Tasks API client for task mutations (delete, toggle) */\n tasksClient?: FetchClient;\n countryOptions?: { name: string; value: string }[];\n /** Slot for rendering orders content (provided by consumer) */\n ordersSlot?: React.ReactNode;\n /** Slot for rendering subscriptions content (provided by consumer) */\n subscriptionsSlot?: React.ReactNode;\n}\n\nconst DEFAULT_COUNTRY_OPTIONS: { name: string; value: string }[] = [];\n\nexport function RepContactDetailView({\n contact,\n contactId,\n client,\n notesClient,\n tasksClient,\n countryOptions = DEFAULT_COUNTRY_OPTIONS,\n ordersSlot,\n subscriptionsSlot,\n}: RepContactDetailViewProps): React.JSX.Element {\n const [activeTab, setActiveTab] = useState(\"activity\");\n\n const { data: activities = [], isLoading: isLoadingActivities } =\n useContactActivities(client, contactId);\n\n const { data: tasks = [], isLoading: isLoadingTasks } = useContactTasks(\n client,\n contactId,\n );\n\n const { data: notes = [], isLoading: isLoadingNotes } = useContactNotes(\n client,\n contactId,\n );\n\n const markRead = useMarkContactRead(client, contactId);\n const hasFiredRef = useRef(false);\n const prevHasUnreadRef = useRef(false);\n\n // Refs to imperatively open create modals from the sidebar\n const openNoteModalRef = useRef<(() => void) | null>(null);\n const openTaskModalRef = useRef<(() => void) | null>(null);\n const [pendingOpenModal, setPendingOpenModal] = useState<\n \"tasks\" | \"notes\" | null\n >(null);\n\n useEffect(() => {\n if (pendingOpenModal === \"tasks\" && openTaskModalRef.current) {\n openTaskModalRef.current();\n setPendingOpenModal(null);\n } else if (pendingOpenModal === \"notes\" && openNoteModalRef.current) {\n openNoteModalRef.current();\n setPendingOpenModal(null);\n }\n }, [pendingOpenModal]);\n\n // Reset the guard when new unread activities arrive\n const hasUnread = useMemo(\n () => activities.some((a) => !a.read_at),\n [activities],\n );\n\n // Reset the guard when new unread activities appear (inline sync)\n if (hasUnread && !prevHasUnreadRef.current) {\n hasFiredRef.current = false;\n }\n prevHasUnreadRef.current = hasUnread;\n\n const handleMarkRead = useCallback(() => {\n if (hasFiredRef.current || markRead.isPending) return;\n hasFiredRef.current = true;\n markRead.mutate();\n }, [markRead]);\n\n const contactInfo = useMemo(\n () => ({\n firstName: contact?.first_name ?? undefined,\n lastName: contact?.last_name ?? undefined,\n email: contact?.email ?? undefined,\n phone: contact?.phone ?? undefined,\n address: contact?.address ?? undefined,\n city: contact?.city ?? undefined,\n state: contact?.state ?? undefined,\n postalCode: contact?.postal_code ?? undefined,\n status: contact?.status ?? undefined,\n avatarUrl: contact?.avatar_url ?? undefined,\n countryName: contact?.country?.name ?? undefined,\n }),\n [contact],\n );\n\n return (\n <div className=\"mx-auto max-w-7xl px-4 py-4 sm:px-6 sm:py-6 lg:px-10 lg:py-8\">\n <div className=\"grid grid-cols-1 items-start gap-6 lg:grid-cols-3\">\n {/* Left column: Contact card + Notes */}\n <div className=\"space-y-6\">\n <ContactInfoCard\n contact={contactInfo}\n onEdit={() => setActiveTab(\"edit\")}\n showActions\n onCreateTask={() => {\n setActiveTab(\"tasks\");\n setPendingOpenModal(\"tasks\");\n }}\n onCreateNote={() => {\n setActiveTab(\"notes\");\n setPendingOpenModal(\"notes\");\n }}\n />\n <NotesSidebar\n notes={notes}\n isLoading={isLoadingNotes}\n onNavigateToNotes={() => setActiveTab(\"notes\")}\n />\n </div>\n\n {/* Right column: Tabs (Edit / Activity) */}\n <div className=\"lg:col-span-2\">\n <Tabs value={activeTab} onValueChange={setActiveTab}>\n <TabsList className=\"border-border w-full justify-start rounded-none border-b bg-transparent p-0\">\n <TabsTrigger\n value=\"edit\"\n className=\"text-muted-foreground data-[state=active]:border-b-primary data-[state=active]:text-foreground rounded-none border-0 border-b-2 border-b-transparent px-4 py-2.5 text-sm font-medium shadow-none focus-visible:ring-0 focus-visible:outline-none data-[state=active]:bg-transparent data-[state=active]:shadow-none\"\n >\n Edit\n </TabsTrigger>\n <TabsTrigger\n value=\"activity\"\n className=\"text-muted-foreground data-[state=active]:border-b-primary data-[state=active]:text-foreground rounded-none border-0 border-b-2 border-b-transparent px-4 py-2.5 text-sm font-medium shadow-none focus-visible:ring-0 focus-visible:outline-none data-[state=active]:bg-transparent data-[state=active]:shadow-none\"\n >\n Activity\n </TabsTrigger>\n <TabsTrigger\n value=\"tasks\"\n className=\"text-muted-foreground data-[state=active]:border-b-primary data-[state=active]:text-foreground rounded-none border-0 border-b-2 border-b-transparent px-4 py-2.5 text-sm font-medium shadow-none focus-visible:ring-0 focus-visible:outline-none data-[state=active]:bg-transparent data-[state=active]:shadow-none\"\n >\n Tasks\n </TabsTrigger>\n <TabsTrigger\n value=\"notes\"\n className=\"text-muted-foreground data-[state=active]:border-b-primary data-[state=active]:text-foreground rounded-none border-0 border-b-2 border-b-transparent px-4 py-2.5 text-sm font-medium shadow-none focus-visible:ring-0 focus-visible:outline-none data-[state=active]:bg-transparent data-[state=active]:shadow-none\"\n >\n Notes\n </TabsTrigger>\n <TabsTrigger\n value=\"orders\"\n className=\"text-muted-foreground data-[state=active]:border-b-primary data-[state=active]:text-foreground rounded-none border-0 border-b-2 border-b-transparent px-4 py-2.5 text-sm font-medium shadow-none focus-visible:ring-0 focus-visible:outline-none data-[state=active]:bg-transparent data-[state=active]:shadow-none\"\n >\n Orders\n </TabsTrigger>\n <TabsTrigger\n value=\"subscriptions\"\n className=\"text-muted-foreground data-[state=active]:border-b-primary data-[state=active]:text-foreground rounded-none border-0 border-b-2 border-b-transparent px-4 py-2.5 text-sm font-medium shadow-none focus-visible:ring-0 focus-visible:outline-none data-[state=active]:bg-transparent data-[state=active]:shadow-none\"\n >\n Subscriptions\n </TabsTrigger>\n </TabsList>\n\n <TabsContent value=\"edit\" className=\"mt-6\">\n <ContactDetailsForm countries={countryOptions} />\n </TabsContent>\n\n <TabsContent value=\"activity\" className=\"mt-6\">\n <ActivityFeed\n activities={activities}\n isLoading={isLoadingActivities}\n onMarkRead={handleMarkRead}\n />\n </TabsContent>\n\n <TabsContent value=\"tasks\" className=\"mt-6\">\n <TaskList\n tasks={tasks}\n isLoading={isLoadingTasks}\n contactId={contactId}\n client={client}\n tasksClient={tasksClient}\n ref={openTaskModalRef}\n />\n </TabsContent>\n\n <TabsContent value=\"notes\" className=\"mt-6\">\n <NotesList\n notes={notes}\n isLoading={isLoadingNotes}\n contactId={contactId}\n client={client}\n notesClient={notesClient}\n ref={openNoteModalRef}\n />\n </TabsContent>\n\n <TabsContent value=\"orders\" className=\"mt-6\">\n {ordersSlot ?? (\n <div className=\"flex flex-col items-center justify-center py-16 text-center\">\n <div className=\"bg-muted mb-4 flex h-14 w-14 items-center justify-center rounded-full\">\n <ShoppingCart className=\"text-muted-foreground h-6 w-6\" />\n </div>\n <h3 className=\"text-foreground text-sm font-medium\">\n No orders yet\n </h3>\n <p className=\"text-muted-foreground mt-1 text-sm\">\n Orders placed by this contact will appear here.\n </p>\n </div>\n )}\n </TabsContent>\n\n <TabsContent value=\"subscriptions\" className=\"mt-6\">\n {subscriptionsSlot ?? (\n <div className=\"flex flex-col items-center justify-center py-16 text-center\">\n <div className=\"bg-muted mb-4 flex h-14 w-14 items-center justify-center rounded-full\">\n <Repeat2 className=\"text-muted-foreground h-6 w-6\" />\n </div>\n <h3 className=\"text-foreground text-sm font-medium\">\n No subscriptions yet\n </h3>\n <p className=\"text-muted-foreground mt-1 text-sm\">\n Subscriptions for this contact will appear here.\n </p>\n </div>\n )}\n </TabsContent>\n </Tabs>\n </div>\n </div>\n </div>\n );\n}\n","\"use client\";\n\nimport React from \"react\";\nimport { ChevronLeft, ChevronRight } from \"lucide-react\";\n\nexport function Pagination({\n currentPage,\n totalPages,\n totalCount,\n onPageChange,\n}: {\n currentPage: number;\n totalPages: number;\n totalCount: number;\n onPageChange: (page: number) => void;\n}): React.JSX.Element | null {\n if (totalPages <= 1) return null;\n\n return (\n <div className=\"flex items-center justify-between pt-2\">\n <p className=\"text-muted-foreground text-xs\">\n Page {currentPage} of {totalPages} ({totalCount} total)\n </p>\n <div className=\"flex items-center gap-1\">\n <button\n type=\"button\"\n aria-label=\"Previous page\"\n disabled={currentPage <= 1}\n onClick={() => onPageChange(currentPage - 1)}\n className=\"text-muted-foreground hover:bg-muted inline-flex h-7 w-7 items-center justify-center rounded-md transition-colors disabled:opacity-40\"\n >\n <ChevronLeft className=\"h-3 w-3\" />\n </button>\n <button\n type=\"button\"\n aria-label=\"Next page\"\n disabled={currentPage >= totalPages}\n onClick={() => onPageChange(currentPage + 1)}\n className=\"text-muted-foreground hover:bg-muted inline-flex h-7 w-7 items-center justify-center rounded-md transition-colors disabled:opacity-40\"\n >\n <ChevronRight className=\"h-3 w-3\" />\n </button>\n </div>\n </div>\n );\n}\n","\"use client\";\n\nimport { useQuery, keepPreviousData } from \"@tanstack/react-query\";\nimport { usersContacts } from \"@fluid-app/user-contacts-api-client\";\nimport type { FetchClient } from \"@fluid-app/api-client-core\";\nimport type { components } from \"@fluid-app/user-contacts-api-client\";\n\nexport type ContactOrder = components[\"schemas\"][\"Order\"];\n\ntype OrderStatus = components[\"schemas\"][\"Order\"][\"status\"];\n\nexport const CONTACT_ORDERS_QUERY_KEY = (contactId: string) =>\n [\"rep-contacts\", \"orders\", contactId] as const;\n\nexport function useContactOrders(\n client: FetchClient,\n contactId: string,\n params?: { page?: number; per_page?: number; status?: OrderStatus },\n) {\n return useQuery({\n queryKey: [\n ...CONTACT_ORDERS_QUERY_KEY(contactId),\n params?.page,\n params?.per_page,\n params?.status,\n ] as const,\n queryFn: () =>\n usersContacts.listUserContactOrders(client, contactId, params),\n enabled: !!contactId,\n placeholderData: keepPreviousData,\n });\n}\n","\"use client\";\n\nimport React, { useState } from \"react\";\nimport { ShoppingCart } from \"lucide-react\";\nimport { Pagination } from \"../shared/Pagination\";\nimport { Skeleton } from \"@fluid-app/ui-primitives\";\nimport type { FetchClient } from \"@fluid-app/api-client-core\";\nimport {\n useContactOrders,\n type ContactOrder,\n} from \"../../hooks/contacts/use-contact-orders\";\nimport {\n StatusBadge,\n type StatusBadgeVariant,\n} from \"../../../shared/components/contacts/statusBadge\";\n\n// ---------------------------------------------------------------------------\n// Status → badge variant maps\n// ---------------------------------------------------------------------------\n\nconst financialStatusVariant: Record<string, StatusBadgeVariant> = {\n paid: \"success\",\n authorized: \"info\",\n partially_paid: \"warning\",\n partially_refunded: \"notice\",\n refunded: \"danger\",\n voided: \"neutral\",\n marked_free: \"success\",\n marked_paid: \"success\",\n pending: \"warning\",\n};\n\nconst fulfillmentStatusVariant: Record<string, StatusBadgeVariant> = {\n fulfilled: \"neutral\",\n in_progress: \"warning\",\n partially_fulfilled: \"warning\",\n scheduled: \"info\",\n on_hold: \"notice\",\n unfulfilled: \"warning\",\n};\n\n// order.status — the order-processing status used by filter pills\nconst statusVariant: Record<string, StatusBadgeVariant> = {\n awaiting_payment: \"warning\",\n awaiting_shipment: \"info\",\n shipped: \"success\",\n delivered: \"success\",\n archived: \"neutral\",\n cancelled: \"danger\",\n failed_payment: \"danger\",\n draft: \"neutral\",\n};\n\nconst sourceVariant: Record<string, StatusBadgeVariant> = {\n enrollment: \"accent\",\n subscription: \"info\",\n web: \"neutral\",\n mobile: \"neutral\",\n admin: \"neutral\",\n backoffice: \"neutral\",\n};\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction formatLabel(value: string): string {\n return value\n .split(\"_\")\n .map((word) => word.charAt(0).toUpperCase() + word.slice(1))\n .join(\" \");\n}\n\nfunction formatDate(dateStr: string): string {\n return new Date(dateStr).toLocaleDateString(\"en-US\", {\n month: \"short\",\n day: \"numeric\",\n year: \"numeric\",\n });\n}\n\nfunction formatAmount(order: ContactOrder): string {\n const amount = Number(order.amount ?? 0);\n const code = order.currency_code ?? \"USD\";\n try {\n return new Intl.NumberFormat(\"en-US\", {\n style: \"currency\",\n currency: code,\n }).format(amount);\n } catch {\n return `$${amount.toFixed(2)}`;\n }\n}\n\n// ---------------------------------------------------------------------------\n// Filter pills\n// ---------------------------------------------------------------------------\n\nconst STATUS_FILTERS = [\n { label: \"All\", value: null },\n { label: \"Awaiting Payment\", value: \"awaiting_payment\" as const },\n { label: \"Awaiting Shipment\", value: \"awaiting_shipment\" as const },\n { label: \"Shipped\", value: \"shipped\" as const },\n { label: \"Delivered\", value: \"delivered\" as const },\n { label: \"Cancelled\", value: \"cancelled\" as const },\n] as const;\n\n// ---------------------------------------------------------------------------\n// Empty state\n// ---------------------------------------------------------------------------\n\nfunction EmptyState() {\n return (\n <div className=\"flex flex-col items-center justify-center px-4 py-12 text-center\">\n <div className=\"relative mb-6\">\n <div className=\"from-primary/10 to-primary/5 flex h-20 w-20 items-center justify-center rounded-full bg-gradient-to-br\">\n <ShoppingCart className=\"text-primary/60 h-9 w-9\" />\n </div>\n </div>\n <h4 className=\"text-foreground text-base font-semibold\">No orders yet</h4>\n <p className=\"text-muted-foreground mt-1.5 max-w-[260px] text-sm leading-relaxed\">\n Orders placed by this contact will appear here\n </p>\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Loading skeleton\n// ---------------------------------------------------------------------------\n\nfunction OrderCardSkeleton() {\n return (\n <div className=\"border-border bg-card rounded-xl border p-5\">\n <div className=\"flex items-start justify-between\">\n <div className=\"space-y-3\">\n <Skeleton className=\"h-5 w-32\" />\n <div className=\"flex gap-2\">\n <Skeleton className=\"h-5 w-20 rounded-xl\" />\n <Skeleton className=\"h-5 w-16 rounded-xl\" />\n <Skeleton className=\"h-5 w-24 rounded-xl\" />\n </div>\n <Skeleton className=\"h-4 w-28\" />\n </div>\n <Skeleton className=\"h-6 w-16\" />\n </div>\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Order card\n// ---------------------------------------------------------------------------\n\nfunction OrderCard({ order }: { order: ContactOrder }) {\n return (\n <div className=\"border-border bg-card hover:border-border/80 hover:bg-accent/30 rounded-xl border p-5 transition-colors\">\n <div className=\"flex items-start justify-between gap-4\">\n {/* Left side: order info */}\n <div className=\"min-w-0 flex-1 space-y-3\">\n {/* Order number */}\n <p className=\"text-foreground text-sm font-semibold\">\n #{order.order_number ?? order.id}\n </p>\n\n {/* Status badges */}\n <div className=\"flex flex-wrap gap-1.5\">\n <StatusBadge\n status={statusVariant[order.status] ?? \"neutral\"}\n label={formatLabel(order.status)}\n />\n <StatusBadge\n status={\n financialStatusVariant[order.financial_status] ?? \"neutral\"\n }\n label={formatLabel(order.financial_status)}\n />\n <StatusBadge\n status={\n fulfillmentStatusVariant[order.fulfillment_status] ?? \"neutral\"\n }\n label={formatLabel(order.fulfillment_status)}\n />\n <StatusBadge\n status={sourceVariant[order.source] ?? \"neutral\"}\n label={formatLabel(order.source)}\n />\n </div>\n\n {/* Date */}\n <p className=\"text-muted-foreground text-xs\">\n {formatDate(order.created_at)}\n </p>\n </div>\n\n {/* Right side: amount */}\n <p className=\"text-foreground text-base font-semibold tabular-nums\">\n {formatAmount(order)}\n </p>\n </div>\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Main component\n// ---------------------------------------------------------------------------\n\nexport interface ContactOrdersListProps {\n client: FetchClient;\n contactId: string;\n pageSize?: number;\n}\n\nexport function ContactOrdersList({\n client,\n contactId,\n pageSize = 10,\n}: ContactOrdersListProps): React.JSX.Element {\n const [page, setPage] = useState(1);\n const [statusFilter, setStatusFilter] = useState<\n ContactOrder[\"status\"] | null\n >(null);\n\n const { data, isLoading, isError, isFetching } = useContactOrders(\n client,\n contactId,\n {\n page,\n per_page: pageSize,\n ...(statusFilter ? { status: statusFilter } : {}),\n },\n );\n\n const orders = data?.orders ?? [];\n const meta = data?.meta;\n const totalCount = meta?.total_count ?? 0;\n const totalPages = meta?.total_pages ?? 1;\n const currentPage = meta?.current_page ?? page;\n\n // Reset page when filter changes\n const handleStatusChange = (value: ContactOrder[\"status\"] | null) => {\n setStatusFilter(value);\n setPage(1);\n };\n\n if (isLoading) {\n return (\n <div className=\"space-y-4\">\n <div className=\"flex items-center justify-between\">\n <Skeleton className=\"h-6 w-24\" />\n </div>\n <div className=\"space-y-3\">\n {[1, 2, 3].map((i) => (\n <OrderCardSkeleton key={i} />\n ))}\n </div>\n </div>\n );\n }\n\n if (isError) {\n return (\n <div className=\"flex flex-col items-center justify-center px-4 py-12 text-center\">\n <p className=\"text-destructive text-sm font-medium\">\n Failed to load orders\n </p>\n <p className=\"text-muted-foreground mt-1 text-xs\">\n Please try again later\n </p>\n </div>\n );\n }\n\n if (totalCount === 0 && !statusFilter) {\n return <EmptyState />;\n }\n\n return (\n <div className=\"space-y-4\">\n {/* Header */}\n <div className=\"flex items-center justify-between\">\n <h3 className=\"text-foreground text-base font-semibold\">\n Orders\n <span className=\"text-muted-foreground ml-1.5 text-sm font-normal\">\n ({totalCount})\n </span>\n </h3>\n {isFetching && (\n <div className=\"bg-muted h-1.5 w-1.5 animate-pulse rounded-full\" />\n )}\n </div>\n\n {/* Filter pills */}\n <div className=\"flex flex-wrap gap-1.5\">\n {STATUS_FILTERS.map((filter) => (\n <button\n type=\"button\"\n key={filter.label}\n onClick={() => handleStatusChange(filter.value)}\n className={`rounded-full px-3 py-1 text-xs font-medium transition-colors ${\n statusFilter === filter.value\n ? \"bg-foreground text-background\"\n : \"bg-muted text-muted-foreground hover:bg-muted/80\"\n }`}\n >\n {filter.label}\n </button>\n ))}\n </div>\n\n {/* Orders list */}\n {orders.length === 0 ? (\n <div className=\"flex flex-col items-center justify-center py-8 text-center\">\n <p className=\"text-muted-foreground text-sm\">\n No orders match this filter\n </p>\n </div>\n ) : (\n <div className=\"space-y-3\">\n {orders.map((order) => (\n <OrderCard key={order.id} order={order} />\n ))}\n </div>\n )}\n\n {/* Pagination */}\n <Pagination\n currentPage={currentPage}\n totalPages={totalPages}\n totalCount={totalCount}\n onPageChange={setPage}\n />\n </div>\n );\n}\n","\"use client\";\n\nimport { useQuery, keepPreviousData } from \"@tanstack/react-query\";\nimport { usersContacts } from \"@fluid-app/user-contacts-api-client\";\nimport type { FetchClient } from \"@fluid-app/api-client-core\";\nimport type {\n components,\n operations,\n} from \"@fluid-app/user-contacts-api-client\";\n\nexport type ContactSubscriptionOrder =\n components[\"schemas\"][\"ListUserContactSubscriptionOrdersResponse200ApplicationJsonSchema\"][\"subscription_orders\"][number];\n\ntype SubscriptionOrderStatus = NonNullable<\n operations[\"listUserContactSubscriptionOrders\"][\"parameters\"][\"query\"]\n>[\"status\"];\n\nexport const CONTACT_SUBSCRIPTION_ORDERS_QUERY_KEY = (contactId: string) =>\n [\"rep-contacts\", \"subscription-orders\", contactId] as const;\n\nexport function useContactSubscriptionOrders(\n client: FetchClient,\n contactId: string,\n params?: {\n page?: number;\n per_page?: number;\n status?: SubscriptionOrderStatus;\n },\n) {\n return useQuery({\n queryKey: [\n ...CONTACT_SUBSCRIPTION_ORDERS_QUERY_KEY(contactId),\n params?.page,\n params?.per_page,\n params?.status,\n ] as const,\n queryFn: () =>\n usersContacts.listUserContactSubscriptionOrders(\n client,\n contactId,\n params,\n ),\n enabled: !!contactId,\n placeholderData: keepPreviousData,\n });\n}\n","\"use client\";\n\nimport React, { useState } from \"react\";\nimport { Repeat2 } from \"lucide-react\";\nimport { Pagination } from \"../shared/Pagination\";\nimport { Skeleton } from \"@fluid-app/ui-primitives\";\nimport type { FetchClient } from \"@fluid-app/api-client-core\";\nimport {\n useContactSubscriptionOrders,\n type ContactSubscriptionOrder,\n} from \"../../hooks/contacts/use-contact-subscription-orders\";\nimport {\n StatusBadge,\n type StatusBadgeVariant,\n} from \"../../../shared/components/contacts/statusBadge\";\n\n// ---------------------------------------------------------------------------\n// Subscription lifecycle status → badge variant map\n//\n// This maps the subscription's *lifecycle* status (sub.status) — NOT the\n// order-processing status used by the filter pills / API query parameter.\n// See the STATUS_FILTERS comment below for the full explanation.\n// ---------------------------------------------------------------------------\n\nconst lifecycleStatusVariant: Record<string, StatusBadgeVariant> = {\n active: \"success\",\n paused: \"warning\",\n cancelled: \"danger\",\n expired: \"neutral\",\n pending: \"warning\",\n trial: \"info\",\n past_due: \"notice\",\n failed: \"danger\",\n};\n\n// ---------------------------------------------------------------------------\n// Filter pills\n//\n// NOTE: The filter pills use *order-processing* statuses (awaiting_payment,\n// shipped, etc.) which map to the API's `status` query parameter. The badge\n// in each card displays the *subscription lifecycle* status (active, paused,\n// etc.) from `sub.status`. These are intentionally two different dimensions:\n// the filter narrows which subscription orders appear, while the badge shows\n// each subscription's lifecycle state.\n// ---------------------------------------------------------------------------\n\ntype SubscriptionOrderStatusFilter =\n | \"awaiting_payment\"\n | \"awaiting_shipment\"\n | \"shipped\"\n | \"delivered\"\n | \"archived\"\n | \"cancelled\"\n | \"failed_payment\"\n | \"draft\";\n\nconst STATUS_FILTERS: {\n label: string;\n value: SubscriptionOrderStatusFilter | null;\n}[] = [\n { label: \"All\", value: null },\n { label: \"Awaiting Payment\", value: \"awaiting_payment\" },\n { label: \"Awaiting Shipment\", value: \"awaiting_shipment\" },\n { label: \"Shipped\", value: \"shipped\" },\n { label: \"Delivered\", value: \"delivered\" },\n { label: \"Cancelled\", value: \"cancelled\" },\n];\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction formatLabel(value: string): string {\n return value\n .split(\"_\")\n .map((word) => word.charAt(0).toUpperCase() + word.slice(1))\n .join(\" \");\n}\n\nfunction formatDate(dateStr: string | null | undefined): string {\n if (!dateStr) return \"\\u2014\";\n return new Date(dateStr).toLocaleDateString(\"en-US\", {\n month: \"short\",\n day: \"numeric\",\n year: \"numeric\",\n });\n}\n\n// ---------------------------------------------------------------------------\n// Empty state\n// ---------------------------------------------------------------------------\n\nfunction EmptyState() {\n return (\n <div className=\"flex flex-col items-center justify-center px-4 py-12 text-center\">\n <div className=\"relative mb-6\">\n <div className=\"from-primary/10 to-primary/5 flex h-20 w-20 items-center justify-center rounded-full bg-gradient-to-br\">\n <Repeat2 className=\"text-primary/60 h-9 w-9\" />\n </div>\n </div>\n <h4 className=\"text-foreground text-base font-semibold\">\n No subscriptions yet\n </h4>\n <p className=\"text-muted-foreground mt-1.5 max-w-[260px] text-sm leading-relaxed\">\n Subscriptions for this contact will appear here\n </p>\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Loading skeleton\n// ---------------------------------------------------------------------------\n\nfunction SubscriptionCardSkeleton() {\n return (\n <div className=\"border-border bg-card rounded-xl border p-5\">\n <div className=\"flex items-start gap-4\">\n <Skeleton className=\"h-12 w-12 rounded-lg\" />\n <div className=\"flex-1 space-y-3\">\n <Skeleton className=\"h-5 w-32\" />\n <div className=\"flex gap-2\">\n <Skeleton className=\"h-5 w-16 rounded-xl\" />\n <Skeleton className=\"h-5 w-24 rounded-xl\" />\n </div>\n <Skeleton className=\"h-4 w-40\" />\n </div>\n <Skeleton className=\"h-6 w-16\" />\n </div>\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Subscription card\n// ---------------------------------------------------------------------------\n\nfunction SubscriptionCard({ sub }: { sub: ContactSubscriptionOrder }) {\n const displayAmount = sub.display_total ?? sub.display_amount ?? null;\n\n return (\n <div className=\"border-border bg-card hover:border-border/80 hover:bg-accent/30 rounded-xl border p-5 transition-colors\">\n <div className=\"flex items-start gap-4\">\n {/* Thumbnail */}\n {sub.order_thumbnail ? (\n <img\n src={sub.order_thumbnail}\n alt={`Subscription #${sub.order_number ?? sub.id}`}\n loading=\"lazy\"\n className=\"h-12 w-12 flex-shrink-0 rounded-lg object-cover\"\n />\n ) : (\n <div className=\"bg-muted flex h-12 w-12 flex-shrink-0 items-center justify-center rounded-lg\">\n <Repeat2 className=\"text-muted-foreground h-5 w-5\" />\n </div>\n )}\n\n {/* Info */}\n <div className=\"min-w-0 flex-1 space-y-2.5\">\n {/* Order number */}\n <p className=\"text-foreground text-sm font-semibold\">\n #{sub.order_number ?? sub.id}\n </p>\n\n {/* Status + interval */}\n <div className=\"flex flex-wrap items-center gap-1.5\">\n <StatusBadge\n status={lifecycleStatusVariant[sub.status] ?? \"neutral\"}\n label={formatLabel(sub.status)}\n />\n {sub.subscription_interval != null && (\n <StatusBadge\n status=\"accent\"\n label={`Every ${sub.subscription_interval} days`}\n />\n )}\n </div>\n\n {/* Dates */}\n <div className=\"text-muted-foreground flex flex-wrap gap-x-4 gap-y-1 text-xs\">\n {sub.next_bill_date && (\n <span>\n Next bill:{\" \"}\n <span className=\"text-foreground font-medium\">\n {formatDate(sub.next_bill_date)}\n </span>\n </span>\n )}\n {sub.created_at && (\n <span>Created {formatDate(sub.created_at)}</span>\n )}\n </div>\n </div>\n\n {/* Amount */}\n {displayAmount && (\n <p className=\"text-foreground flex-shrink-0 text-base font-semibold tabular-nums\">\n {displayAmount}\n </p>\n )}\n </div>\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Main component\n// ---------------------------------------------------------------------------\n\nexport interface ContactSubscriptionOrdersListProps {\n client: FetchClient;\n contactId: string;\n pageSize?: number;\n}\n\nexport function ContactSubscriptionOrdersList({\n client,\n contactId,\n pageSize = 10,\n}: ContactSubscriptionOrdersListProps): React.JSX.Element {\n const [page, setPage] = useState(1);\n const [statusFilter, setStatusFilter] =\n useState<SubscriptionOrderStatusFilter | null>(null);\n\n const { data, isLoading, isError, isFetching } = useContactSubscriptionOrders(\n client,\n contactId,\n {\n page,\n per_page: pageSize,\n ...(statusFilter ? { status: statusFilter } : {}),\n },\n );\n\n const subscriptions = data?.subscription_orders ?? [];\n const meta = data?.meta;\n const totalCount = meta?.total_count ?? 0;\n const totalPages = meta?.total_pages ?? 1;\n const currentPage = meta?.current_page ?? page;\n\n const handleStatusChange = (value: SubscriptionOrderStatusFilter | null) => {\n setStatusFilter(value);\n setPage(1);\n };\n\n if (isLoading) {\n return (\n <div className=\"space-y-4\">\n <div className=\"flex items-center justify-between\">\n <Skeleton className=\"h-6 w-32\" />\n </div>\n <div className=\"space-y-3\">\n {[1, 2, 3].map((i) => (\n <SubscriptionCardSkeleton key={i} />\n ))}\n </div>\n </div>\n );\n }\n\n if (isError) {\n return (\n <div className=\"flex flex-col items-center justify-center px-4 py-12 text-center\">\n <p className=\"text-destructive text-sm font-medium\">\n Failed to load subscriptions\n </p>\n <p className=\"text-muted-foreground mt-1 text-xs\">\n Please try again later\n </p>\n </div>\n );\n }\n\n if (totalCount === 0 && !statusFilter) {\n return <EmptyState />;\n }\n\n return (\n <div className=\"space-y-4\">\n {/* Header */}\n <div className=\"flex items-center justify-between\">\n <h3 className=\"text-foreground text-base font-semibold\">\n Subscriptions\n <span className=\"text-muted-foreground ml-1.5 text-sm font-normal\">\n ({totalCount})\n </span>\n </h3>\n {isFetching && (\n <div className=\"bg-muted h-1.5 w-1.5 animate-pulse rounded-full\" />\n )}\n </div>\n\n {/* Filter pills */}\n <div className=\"flex flex-wrap gap-1.5\">\n {STATUS_FILTERS.map((filter) => (\n <button\n type=\"button\"\n key={filter.label}\n onClick={() => handleStatusChange(filter.value)}\n className={`rounded-full px-3 py-1 text-xs font-medium transition-colors ${\n statusFilter === filter.value\n ? \"bg-foreground text-background\"\n : \"bg-muted text-muted-foreground hover:bg-muted/80\"\n }`}\n >\n {filter.label}\n </button>\n ))}\n </div>\n\n {/* Subscriptions list */}\n {subscriptions.length === 0 ? (\n <div className=\"flex flex-col items-center justify-center py-8 text-center\">\n <p className=\"text-muted-foreground text-sm\">\n No subscriptions match this filter\n </p>\n </div>\n ) : (\n <div className=\"space-y-3\">\n {subscriptions.map((sub) => (\n <SubscriptionCard key={sub.id} sub={sub} />\n ))}\n </div>\n )}\n\n {/* Pagination */}\n <Pagination\n currentPage={currentPage}\n totalPages={totalPages}\n totalCount={totalCount}\n onPageChange={setPage}\n />\n </div>\n );\n}\n","/**\n * Generated API client functions for company_contacts\n *\n * DO NOT EDIT THIS FILE DIRECTLY\n * This file is auto-generated. To update:\n * 1. Update the OpenAPI spec file\n * 2. Run: pnpm generate\n */\n\nimport type { FetchClient } from \"../lib/fetch-client\";\nimport type { operations } from \"../generated/company_contacts\";\n\n// ============================================================================\n// Company Contacts\n// ============================================================================\n\n/**\n * Create a company contact\n *\n *\n * @param client - Fetch client instance\n * @param body - body\n */\nexport async function createCompanyContact(\n client: FetchClient,\n body: operations[\"createCompanyContact\"][\"requestBody\"][\"content\"][\"application/json\"],\n): Promise<\n operations[\"createCompanyContact\"][\"responses\"][201][\"content\"][\"application/json\"]\n> {\n return client.post(`/api/company/contacts`, body);\n}\n\n/**\n * List company contacts\n *\n *\n * @param client - Fetch client instance\n * @param params? - params?\n */\nexport async function listCompanyContacts(\n client: FetchClient,\n params?: operations[\"listCompanyContacts\"][\"parameters\"][\"query\"],\n): Promise<\n operations[\"listCompanyContacts\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.get(`/api/company/contacts`, params);\n}\n\n/**\n * Delete a company contact\n *\n *\n * @param client - Fetch client instance\n * @param id - id\n */\nexport async function deleteCompanyContact(\n client: FetchClient,\n id: string | number,\n): Promise<\n operations[\"deleteCompanyContact\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.delete(`/api/company/contacts/${id}`);\n}\n\n/**\n * Get a company contact\n *\n *\n * @param client - Fetch client instance\n * @param id - id\n */\nexport async function getCompanyContact(\n client: FetchClient,\n id: string | number,\n): Promise<\n operations[\"getCompanyContact\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.get(`/api/company/contacts/${id}`);\n}\n\n/**\n * Update a company contact\n *\n *\n * @param client - Fetch client instance\n * @param id - id\n * @param body - body\n */\nexport async function updateCompanyContact(\n client: FetchClient,\n id: string | number,\n body: operations[\"updateCompanyContact\"][\"requestBody\"][\"content\"][\"application/json\"],\n): Promise<\n operations[\"updateCompanyContact\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.patch(`/api/company/contacts/${id}`, body);\n}\n","import { companyContacts } from \"@fluid-app/company-contacts-api-client\";\nimport { usersContacts } from \"@fluid-app/user-contacts-api-client\";\nimport type { Contact, ContactsApiConfig } from \"../types\";\n\nexport type ContactApi = ReturnType<typeof createContactApi>;\n\nexport function createContactApi(config: ContactsApiConfig) {\n const { mode, client } = config;\n\n if (mode === \"admin\") {\n return {\n getContact: (id: string) =>\n companyContacts.getCompanyContact(client, id) as Promise<{\n contact: Contact;\n }>,\n createContact: (data: Record<string, unknown>) =>\n companyContacts.createCompanyContact(client, {\n contact: data,\n } as Parameters<typeof companyContacts.createCompanyContact>[1]),\n updateContact: (id: string, data: Record<string, unknown>) =>\n companyContacts.updateCompanyContact(client, id, {\n id: Number(id),\n contact: data,\n } as Parameters<typeof companyContacts.updateCompanyContact>[2]),\n deleteContact: (id: string) =>\n companyContacts.deleteCompanyContact(client, id),\n };\n }\n\n return {\n getContact: (id: string) =>\n usersContacts.getUserContact(client, id) as Promise<{\n contact: Contact;\n }>,\n createContact: (data: Record<string, unknown>) =>\n usersContacts.createUserContact(client, {\n contact: data,\n } as Parameters<typeof usersContacts.createUserContact>[1]),\n updateContact: (id: string, data: Record<string, unknown>) =>\n usersContacts.updateUserContact(client, id, {\n contact: data,\n } as Parameters<typeof usersContacts.updateUserContact>[2]),\n deleteContact: (id: string) => usersContacts.deleteUserContact(client, id),\n };\n}\n","\"use client\";\n\nimport { useQuery } from \"@tanstack/react-query\";\nimport type { ContactsApiConfig } from \"../types\";\nimport { createContactApi } from \"../utils/createContactApi\";\nimport { CONTACTS_QUERY_KEYS } from \"../query-keys\";\n\nexport function useContactDetail(\n config: ContactsApiConfig,\n contactId: string,\n queryKeyPrefix = \"contacts\",\n) {\n const { getContact } = createContactApi(config);\n\n return useQuery({\n queryKey: CONTACTS_QUERY_KEYS.detail(queryKeyPrefix, contactId),\n queryFn: () => getContact(contactId),\n enabled: !!contactId,\n });\n}\n","\"use client\";\n\nimport { useMutation, useQueryClient } from \"@tanstack/react-query\";\nimport { fluidToast } from \"@fluid-app/ui-primitives\";\nimport { parseApiErrors } from \"@fluid-app/api-client-core\";\nimport type { ContactsApiConfig } from \"../types\";\nimport { createContactApi } from \"../utils/createContactApi\";\nimport { CONTACTS_QUERY_KEYS } from \"../query-keys\";\n\ntype UpdateInput = {\n id: string;\n data: Record<string, unknown>;\n};\n\nexport function useUpdateContactMutation(\n config: ContactsApiConfig,\n contactId: string,\n queryKeyPrefix = \"contacts\",\n options?: {\n onSuccess?: () => void;\n onError?: (error: unknown) => void;\n },\n) {\n const queryClient = useQueryClient();\n const { updateContact } = createContactApi(config);\n\n return useMutation({\n mutationFn: ({ id, data }: UpdateInput) => updateContact(id, data),\n onSuccess: () => {\n fluidToast({ title: \"Contact updated successfully\", type: \"success\" });\n queryClient.invalidateQueries({\n queryKey: CONTACTS_QUERY_KEYS.all(queryKeyPrefix),\n });\n options?.onSuccess?.();\n },\n onError: (error) => {\n fluidToast({\n title: \"Failed to save contact\",\n type: \"error\",\n description: parseApiErrors(error),\n });\n options?.onError?.(error);\n },\n });\n}\n","\"use client\";\n\nimport { useMutation, useQueryClient } from \"@tanstack/react-query\";\nimport { fluidToast } from \"@fluid-app/ui-primitives\";\nimport { parseApiErrors } from \"@fluid-app/api-client-core\";\nimport type { ContactsApiConfig } from \"../types\";\nimport { createContactApi } from \"../utils/createContactApi\";\nimport { CONTACTS_QUERY_KEYS } from \"../query-keys\";\n\nexport function useDeleteContactMutation(\n config: ContactsApiConfig,\n queryKeyPrefix = \"contacts\",\n options?: {\n onSuccess?: () => void;\n onError?: (error: unknown) => void;\n },\n) {\n const queryClient = useQueryClient();\n const { deleteContact } = createContactApi(config);\n\n return useMutation({\n mutationFn: (contactId: string) => deleteContact(contactId),\n onSuccess: () => {\n fluidToast({ title: \"Contact deleted successfully\", type: \"success\" });\n queryClient.invalidateQueries({\n queryKey: CONTACTS_QUERY_KEYS.all(queryKeyPrefix),\n });\n options?.onSuccess?.();\n },\n onError: (error) => {\n fluidToast({\n title: \"Failed to delete contact\",\n type: \"error\",\n description: parseApiErrors(error),\n });\n options?.onError?.(error);\n },\n });\n}\n","import { z } from \"zod\";\n\n/**\n * Form schema for creating a contact.\n * Matches CompanyContactCreate from the OpenAPI spec, except:\n * - Uses country_id/language_id (mapped to country_code/language_code on submit)\n *\n * @see CompanyContactCreate in company_contacts.d.ts\n */\nexport const createContactFormSchema = z.object({\n first_name: z.string().min(1, { message: \"First name is required\" }),\n last_name: z.string().min(1, { message: \"Last name is required\" }),\n status: z.string().nullable().optional(),\n email: z.string().email().or(z.literal(\"\")).nullable().optional(),\n phone: z.string().nullable().optional(),\n address: z.string().nullable().optional(),\n city: z.string().nullable().optional(),\n state: z.string().nullable().optional(),\n postal_code: z.string().nullable().optional(),\n country_id: z.coerce.string().nullable().optional(),\n language_id: z.coerce.string().nullable().optional(),\n affiliate: z.record(z.string(), z.unknown()).nullable().optional(),\n metadata: z.record(z.string(), z.unknown()).optional(),\n});\n\nexport type CreateContactFormData = z.infer<typeof createContactFormSchema>;\n\n/**\n * Form schema for editing a contact.\n * Same fields as create plus id. Uses .passthrough() so extra fields\n * from the Contact read model (full_name, avatar_url, etc.) don't\n * cause validation failures.\n *\n * @see CompanyContactUpdate in company_contacts.d.ts\n */\nexport const editContactFormSchema = createContactFormSchema.passthrough();\n\nexport type EditContactFormData = z.infer<typeof editContactFormSchema>;\n","\"use client\";\n\nimport { useMemo, useCallback } from \"react\";\nimport { useZodForm, fluidToast } from \"@fluid-app/ui-primitives\";\nimport type { UseFormReturn } from \"react-hook-form\";\nimport { useQuery } from \"@tanstack/react-query\";\nimport { useContactDetail } from \"./useContactDetail\";\nimport { useUpdateContactMutation } from \"./useUpdateContactMutation\";\nimport { useDeleteContactMutation } from \"./useDeleteContactMutation\";\nimport {\n createContactFormSchema,\n editContactFormSchema,\n type EditContactFormData,\n} from \"../schemas/contactFormSchema\";\nimport type { Contact, ContactsApiConfig } from \"../types\";\n\nconst mutableKeys = Object.keys(\n createContactFormSchema.shape,\n) as (keyof EditContactFormData)[];\n\nexport function useContactDetailPage(\n config: ContactsApiConfig,\n contactId: string,\n options?: {\n queryKeyPrefix?: string;\n getCountries?: () => Promise<{ id: number; name: string; iso?: string }[]>;\n onDeleteSuccess?: () => void;\n },\n): {\n contact: Contact | undefined;\n isLoading: boolean;\n methods: UseFormReturn<EditContactFormData>;\n countryOptions: { name: string; value: string }[];\n isDirty: boolean;\n isSubmitting: boolean;\n isDeleting: boolean;\n onSave: () => void;\n onDelete: () => void;\n} {\n const queryKeyPrefix = options?.queryKeyPrefix ?? \"contacts\";\n\n const { data, isLoading } = useContactDetail(\n config,\n contactId,\n queryKeyPrefix,\n );\n\n const { data: countries } = useQuery({\n queryKey: [\"countries\"],\n queryFn: options?.getCountries ?? (() => Promise.resolve([])),\n enabled: !!options?.getCountries,\n });\n\n const countryOptions = useMemo(\n () =>\n [\n ...(countries?.map((c) => ({\n name: c.name,\n value: c.iso ?? c.id.toString(),\n })) ?? []),\n ].sort((a, b) => a.name.localeCompare(b.name)),\n [countries],\n );\n\n const contact = data?.contact;\n\n // Map nested country object to the ISO code the form select expects\n const formValues = useMemo(() => {\n if (!contact) return undefined;\n return {\n ...contact,\n country_id:\n contact.country?.iso ?? contact.country_id?.toString() ?? null,\n } as unknown as EditContactFormData;\n }, [contact]);\n\n const methods = useZodForm<EditContactFormData>(editContactFormSchema, {\n values: formValues,\n mode: \"onBlur\",\n });\n\n const updateMutation = useUpdateContactMutation(\n config,\n contactId,\n queryKeyPrefix,\n {\n onSuccess: () => {\n methods.reset(methods.getValues());\n },\n },\n );\n\n const deleteMutation = useDeleteContactMutation(config, queryKeyPrefix, {\n onSuccess: () => {\n options?.onDeleteSuccess?.();\n },\n });\n\n const onSave = useCallback(() => {\n methods.handleSubmit(\n (formData) => {\n const payload: Record<string, unknown> = {};\n for (const key of mutableKeys) {\n if (key in formData) {\n payload[key] = formData[key];\n }\n }\n\n // API expects country_code/language_code (ISO strings) instead of country_id/language_id\n // Form value is already the ISO code (countryOptions maps c.iso ?? c.id.toString())\n if (payload.country_id) {\n payload.country_code = String(payload.country_id);\n delete payload.country_id;\n }\n if (payload.language_id) {\n payload.language_code = String(payload.language_id);\n delete payload.language_id;\n }\n\n updateMutation.mutate({\n id: contactId,\n data: payload,\n });\n },\n (errors) => {\n const errorMessages = Object.entries(errors)\n .map(([field, err]) => {\n const msg =\n typeof err?.message === \"string\" ? err.message : \"invalid\";\n return `${field.replace(/_/g, \" \")}: ${msg}`;\n })\n .join(\", \");\n fluidToast({\n title: \"Please fix the form errors before saving\",\n description: errorMessages || undefined,\n type: \"error\",\n });\n },\n )();\n }, [methods, updateMutation, contactId]);\n\n const onDelete = useCallback(() => {\n deleteMutation.mutate(contactId);\n }, [deleteMutation, contactId]);\n\n return {\n contact,\n isLoading,\n methods,\n countryOptions,\n isDirty: methods.formState.isDirty,\n isSubmitting: updateMutation.isPending,\n isDeleting: deleteMutation.isPending,\n onSave,\n onDelete,\n };\n}\n","\"use client\";\n\nimport { useMutation, useQueryClient } from \"@tanstack/react-query\";\nimport { fluidToast } from \"@fluid-app/ui-primitives\";\nimport { parseApiErrors } from \"@fluid-app/api-client-core\";\nimport type { ContactsApiConfig } from \"../types\";\nimport { createContactApi } from \"../utils/createContactApi\";\nimport { CONTACTS_QUERY_KEYS } from \"../query-keys\";\nimport type { CreateContactFormData } from \"../schemas/contactFormSchema\";\n\nexport function useCreateContactMutation(\n config: ContactsApiConfig,\n queryKeyPrefix = \"contacts\",\n options?: {\n onSuccess?: (data: { contact: { id: number } }) => void;\n onError?: (error: unknown) => void;\n },\n) {\n const queryClient = useQueryClient();\n const { createContact } = createContactApi(config);\n\n return useMutation({\n mutationFn: (data: CreateContactFormData) =>\n createContact(data as unknown as Record<string, unknown>),\n onSuccess: (data) => {\n fluidToast({ title: \"Contact created successfully\", type: \"success\" });\n queryClient.invalidateQueries({\n queryKey: CONTACTS_QUERY_KEYS.all(queryKeyPrefix),\n });\n options?.onSuccess?.(data as unknown as { contact: { id: number } });\n },\n onError: (error) => {\n if (options?.onError) {\n options.onError(error);\n } else {\n fluidToast({\n title: \"Failed to create contact\",\n type: \"error\",\n description: parseApiErrors(error),\n });\n }\n },\n });\n}\n","/**\n * Hook that derives a FetchClient from the portal SDK's FluidProvider context.\n *\n * Maps FluidSDKConfig fields to a FetchClient suitable for contacts, notes, and tasks APIs.\n * Follows the same pattern as useMessagingConfig.\n */\n\nimport { useMemo } from \"react\";\nimport { createFetchClient } from \"@fluid-app/api-client-core\";\nimport type { FetchClient } from \"@fluid-app/api-client-core\";\nimport { useFluidContext } from \"../providers/FluidProvider\";\n\nexport function useContactsConfig(): { client: FetchClient } {\n const { config } = useFluidContext();\n\n const client = useMemo(() => {\n // Don't append /api — the generated API client paths already include /api\n const baseUrl = config.baseUrl.replace(/\\/+$/, \"\").replace(/\\/api$/, \"\");\n\n return createFetchClient({\n baseUrl,\n getAuthToken: config.getAuthToken,\n onAuthError: config.onAuthError,\n defaultHeaders: config.defaultHeaders,\n });\n }, [\n config.baseUrl,\n config.getAuthToken,\n config.onAuthError,\n config.defaultHeaders,\n ]);\n\n return { client };\n}\n","import { useState, useCallback, useRef, useMemo } from \"react\";\nimport { useQuery } from \"@tanstack/react-query\";\nimport { FormProvider } from \"react-hook-form\";\nimport { useZodForm } from \"@fluid-app/ui-primitives\";\nimport { ArrowLeft } from \"lucide-react\";\nimport type { ComponentProps } from \"react\";\nimport type {\n BackgroundValue,\n BorderRadiusOptions,\n ColorOptions,\n PaddingOptions,\n} from \"../types\";\nimport type { WidgetPropertySchema } from \"../registries/property-schema-types\";\nimport { Button } from \"@fluid-app/portal-widgets/ui\";\nimport { ContactsListScreen } from \"@fluid-app/contacts-ui/screens/ContactsListScreen\";\nimport type { Contact } from \"@fluid-app/contacts-ui/shared/components/contacts/allContacts/contactsPage\";\nimport { ContactDetailScreen } from \"@fluid-app/contacts-ui/screens/ContactDetailScreen\";\nimport { ContactCreateScreen } from \"@fluid-app/contacts-ui/screens/ContactCreateScreen\";\nimport { RepContactDetailView } from \"@fluid-app/contacts-ui/portal/components/contacts/rep-contact-detail-view\";\nimport { ContactDetailsForm } from \"@fluid-app/contacts-ui/shared/components/contacts/contactDetailsForm\";\nimport { ContactOrdersList } from \"@fluid-app/contacts-ui/portal/components/orders/ContactOrdersList\";\nimport { ContactSubscriptionOrdersList } from \"@fluid-app/contacts-ui/portal/components/subscriptions/ContactSubscriptionOrdersList\";\nimport { useContactDetailPage } from \"@fluid-app/contacts-ui/shared/hooks/useContactDetailPage\";\nimport { useCreateContactMutation } from \"@fluid-app/contacts-ui/shared/hooks/useCreateContactMutation\";\nimport {\n createContactFormSchema,\n type CreateContactFormData,\n} from \"@fluid-app/contacts-ui/shared/schemas/contactFormSchema\";\nimport type { ContactsApiConfig } from \"@fluid-app/contacts-ui/shared/types\";\nimport { usersContacts } from \"@fluid-app/user-contacts-api-client\";\nimport { useContactsConfig } from \"../contacts/use-contacts-config\";\n\ntype NavState =\n | { view: \"list\" }\n | { view: \"detail\"; contactId: string }\n | { view: \"new\" };\n\ntype ContactsScreenProps = ComponentProps<\"div\"> & {\n // Styling\n background?: BackgroundValue;\n textColor?: ColorOptions;\n accentColor?: ColorOptions;\n padding?: PaddingOptions;\n borderRadius?: BorderRadiusOptions;\n\n // Display\n defaultViewMode?: \"list\" | \"grid\";\n\n // Callbacks\n onContactSelect?: (contactId: string) => void;\n onCreateContact?: () => void;\n};\n\nconst QUERY_KEY_PREFIX = \"sdk-contacts\";\n\nfunction fetchCountries(\n client: ContactsApiConfig[\"client\"],\n): Promise<{ id: number; name: string; iso?: string }[]> {\n return client.get(\"/api/countries\");\n}\n\nfunction ContactListView({\n client,\n onNavigate,\n onContactSelect,\n}: {\n client: ContactsApiConfig[\"client\"];\n onNavigate: (state: NavState) => void;\n onContactSelect?: (contactId: string) => void;\n}) {\n const handleSelectContact = useCallback(\n (contact: Contact) => {\n onContactSelect?.(String(contact.id));\n onNavigate({ view: \"detail\", contactId: String(contact.id) });\n },\n [onNavigate, onContactSelect],\n );\n\n const listContacts = useCallback(\n (params: Record<string, unknown>) =>\n usersContacts.listUserContacts(\n client,\n params as Parameters<typeof usersContacts.listUserContacts>[1],\n ),\n [client],\n );\n\n const deleteContacts = useCallback(\n (ids: number[]) =>\n usersContacts.bulkDeleteUserContacts(client, { contact_ids: ids }),\n [client],\n );\n\n const handleAddContact = useCallback(() => {\n onNavigate({ view: \"new\" });\n }, [onNavigate]);\n\n return (\n <ContactsListScreen\n listContacts={listContacts}\n deleteContacts={deleteContacts}\n queryKeyPrefix={QUERY_KEY_PREFIX}\n tableLayout=\"members\"\n onEditContact={handleSelectContact}\n onRowClick={handleSelectContact}\n onAddContact={handleAddContact}\n />\n );\n}\n\nfunction ContactDetailView({\n contactId,\n client,\n onNavigate,\n}: {\n contactId: string;\n client: ContactsApiConfig[\"client\"];\n onNavigate: (state: NavState) => void;\n}) {\n const config: ContactsApiConfig = useMemo(\n () => ({ mode: \"rep\" as const, client }),\n [client],\n );\n\n const getCountries = useCallback(() => fetchCountries(client), [client]);\n\n const {\n contact,\n isLoading,\n methods,\n countryOptions,\n isDirty,\n isSubmitting,\n isDeleting,\n onSave,\n onDelete,\n } = useContactDetailPage(config, contactId, {\n queryKeyPrefix: QUERY_KEY_PREFIX,\n getCountries,\n onDeleteSuccess: () => onNavigate({ view: \"list\" }),\n });\n\n const handleNavigateToList = useCallback(() => {\n onNavigate({ view: \"list\" });\n }, [onNavigate]);\n\n if (isLoading) {\n return (\n <div className=\"mx-auto max-w-7xl space-y-6 px-4 py-4 sm:px-6 sm:py-6 lg:px-10 lg:py-8\">\n <div className=\"bg-muted h-10 w-48 animate-pulse rounded-md\" />\n <div className=\"bg-muted h-8 w-64 animate-pulse rounded-md\" />\n <div className=\"grid grid-cols-1 gap-6 lg:grid-cols-3\">\n <div className=\"bg-muted h-80 animate-pulse rounded-2xl\" />\n <div className=\"bg-muted h-64 animate-pulse rounded-md lg:col-span-2\" />\n </div>\n </div>\n );\n }\n\n if (!contact) {\n return (\n <div className=\"mx-auto max-w-7xl px-4 py-4 sm:px-6 sm:py-6 lg:px-10 lg:py-8\">\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className=\"mb-6\"\n onClick={handleNavigateToList}\n >\n <ArrowLeft className=\"h-4 w-4\" />\n Back to Contacts\n </Button>\n <div className=\"border-border max-w-sm rounded-lg border border-dashed p-8 text-center\">\n <h2 className=\"text-foreground text-xl font-semibold\">\n Unable to load contact\n </h2>\n <p className=\"text-muted-foreground mt-2\">\n This contact may have been deleted, you may not have permission to\n view it, or there was a network error. Please try again.\n </p>\n </div>\n </div>\n );\n }\n\n return (\n <ContactDetailScreen\n contactId={contactId}\n contact={contact}\n onNavigateToList={handleNavigateToList}\n onSave={onSave}\n onDelete={onDelete}\n isDirty={isDirty}\n isSubmitting={isSubmitting}\n isDeleting={isDeleting}\n >\n <FormProvider {...methods}>\n <RepContactDetailView\n contact={contact}\n contactId={contactId}\n client={client}\n notesClient={client}\n tasksClient={client}\n countryOptions={countryOptions}\n ordersSlot={\n <ContactOrdersList client={client} contactId={contactId} />\n }\n subscriptionsSlot={\n <ContactSubscriptionOrdersList\n client={client}\n contactId={contactId}\n />\n }\n />\n </FormProvider>\n </ContactDetailScreen>\n );\n}\n\nconst CREATE_DEFAULT_VALUES: CreateContactFormData = {\n first_name: \"\",\n last_name: \"\",\n email: \"\",\n phone: \"\",\n status: \"new\",\n address: \"\",\n city: \"\",\n state: \"\",\n postal_code: \"\",\n country_id: null,\n language_id: null,\n metadata: {},\n affiliate: {},\n};\n\nfunction ContactCreateView({\n client,\n onNavigate,\n onCreateContact,\n}: {\n client: ContactsApiConfig[\"client\"];\n onNavigate: (state: NavState) => void;\n onCreateContact?: () => void;\n}) {\n const formRef = useRef<HTMLFormElement>(null);\n\n const config: ContactsApiConfig = useMemo(\n () => ({ mode: \"rep\" as const, client }),\n [client],\n );\n\n const { data: countries } = useQuery({\n queryKey: [\"countries\"],\n queryFn: () => fetchCountries(client),\n });\n\n const countryOptions = useMemo(\n () =>\n (countries ?? [])\n .map((c) => ({ name: c.name, value: c.iso ?? String(c.id) }))\n .sort((a, b) => a.name.localeCompare(b.name)),\n [countries],\n );\n\n const methods = useZodForm<CreateContactFormData>(createContactFormSchema, {\n defaultValues: CREATE_DEFAULT_VALUES,\n });\n\n const mutation = useCreateContactMutation(config, QUERY_KEY_PREFIX, {\n onSuccess: (data) => {\n onCreateContact?.();\n const newContactId = data?.contact?.id;\n if (newContactId) {\n onNavigate({ view: \"detail\", contactId: String(newContactId) });\n } else {\n onNavigate({ view: \"list\" });\n }\n },\n });\n\n const { mutate } = mutation;\n\n const onSubmit = useMemo(\n () =>\n methods.handleSubmit(\n (data) => {\n const { affiliate, country_id, language_id, ...contactFields } = data;\n const payload: Record<string, unknown> = {};\n\n for (const [key, value] of Object.entries(contactFields)) {\n if (value !== \"\" && value !== null && value !== undefined) {\n payload[key] = value;\n }\n }\n\n if (country_id) {\n payload.country_code = String(country_id);\n }\n if (language_id) {\n payload.language_code = String(language_id);\n }\n\n if (affiliate && Object.keys(affiliate).length > 0) {\n payload.affiliate = affiliate;\n }\n\n // The mutation accepts CreateContactFormData but internally casts to\n // Record<string, unknown>. Our payload substitutes country_code/language_code\n // for country_id/language_id (matching the rep API), so we cast through unknown.\n mutate(payload as unknown as CreateContactFormData);\n },\n () => {\n // Validation errors are shown inline by react-hook-form field controllers.\n // handleSubmit already populates field errors before calling this callback.\n },\n ),\n [methods, mutate],\n );\n\n const handleNavigateToList = useCallback(() => {\n onNavigate({ view: \"list\" });\n }, [onNavigate]);\n\n return (\n <ContactCreateScreen\n onNavigateToList={handleNavigateToList}\n onSubmit={() => formRef.current?.requestSubmit()}\n isPending={mutation.isPending}\n >\n <FormProvider {...methods}>\n <div className=\"mx-auto max-w-7xl space-y-12 md:px-10 md:py-8\">\n <form\n ref={formRef}\n onSubmit={onSubmit}\n className=\"mx-auto space-y-6 lg:max-w-2xl\"\n >\n <ContactDetailsForm\n countries={countryOptions}\n cardClassName=\"bg-transparent shadow-none\"\n />\n </form>\n </div>\n </FormProvider>\n </ContactCreateScreen>\n );\n}\n\nexport function ContactsScreen({\n onContactSelect,\n onCreateContact,\n /* eslint-disable @typescript-eslint/no-unused-vars -- destructured to exclude from divProps spread */\n background,\n textColor,\n accentColor,\n padding,\n borderRadius,\n defaultViewMode,\n /* eslint-enable @typescript-eslint/no-unused-vars */\n ...divProps\n}: ContactsScreenProps): React.JSX.Element {\n const { client } = useContactsConfig();\n const [nav, setNav] = useState<NavState>({ view: \"list\" });\n\n return (\n <div {...divProps} className={`h-full ${divProps.className ?? \"\"}`}>\n {nav.view === \"list\" && (\n <ContactListView\n client={client}\n onNavigate={setNav}\n onContactSelect={onContactSelect}\n />\n )}\n {nav.view === \"detail\" && (\n <ContactDetailView\n contactId={nav.contactId}\n client={client}\n onNavigate={setNav}\n />\n )}\n {nav.view === \"new\" && (\n <ContactCreateView\n client={client}\n onNavigate={setNav}\n onCreateContact={onCreateContact}\n />\n )}\n </div>\n );\n}\n\nexport const contactsScreenPropertySchema: WidgetPropertySchema = {\n widgetType: \"ContactsScreen\",\n displayName: \"Contacts Screen\",\n tabsConfig: [{ id: \"styling\", label: \"Styling\" }],\n fields: [],\n} as const satisfies WidgetPropertySchema;\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ContactsScreen-CwBXsCW8.cjs","names":["cn","Card","cn","CardContent","Avatar","AvatarImage","AvatarFallback","Badge","DropdownMenu","DropdownMenuTrigger","Button","EllipsisVertical","DropdownMenuContent","DropdownMenuItem","Pencil","DropdownMenuSeparator","Trash2","keepPreviousData","ArrowUpDown","DropdownMenuLabel","Search","Input","Skeleton","Table","TableHeader","TableRow","TableHead","TableBody","TableCell","PaginationFooter","parseApiErrors","AlertDialog","AlertDialogContent","AlertDialogHeader","AlertDialogTitle","AlertDialogDescription","AlertDialogFooter","AlertDialogCancel","AlertDialogAction","Button","Plus","Breadcrumb","BreadcrumbList","BreadcrumbItem","BreadcrumbPage","DropdownMenu","DropdownMenuTrigger","Button","EllipsisVertical","DropdownMenuContent","DropdownMenuItem","Breadcrumb","BreadcrumbList","BreadcrumbItem","BreadcrumbLink","BreadcrumbSeparator","BreadcrumbPage","AlertDialog","AlertDialogContent","AlertDialogHeader","AlertDialogTitle","AlertDialogDescription","AlertDialogFooter","AlertDialogCancel","AlertDialogAction","Button","Breadcrumb","BreadcrumbList","BreadcrumbItem","BreadcrumbLink","BreadcrumbSeparator","BreadcrumbPage","cn","TooltipProvider","Tooltip","TooltipTrigger","ListChecks","TooltipContent","StickyNote","CalendarDays","Mail","Phone","Building","Card","cn","CardHeader","CardTitle","CardContent","Label","Input","Select","SelectTrigger","SelectValue","SelectContent","SelectItem","Card","CardHeader","CardTitle","CardContent","StickyNote","usersContacts.listUserContactNotes","usersNotes.deleteUserNote","parseApiErrors","usersContacts.createUserContactNote","parseApiErrors","usersNotes.updateUserNote","parseApiErrors","useEditor","StarterKit","Heading","Placeholder","TextAlign","Underline","cn","AlignLeft","AlignCenter","AlignRight","AlignJustify","List","ListOrdered","Calendar","X","EditorContent","Sheet","SheetContent","SheetHeader","SheetTitle","Input","Calendar","X","SheetFooter","Button","formatDueDate","EmptyState","StickyNote","Pen","Plus","DropdownMenu","DropdownMenuTrigger","EllipsisVertical","DropdownMenuContent","DropdownMenuItem","Calendar","Paperclip","AlertDialog","AlertDialogContent","AlertDialogHeader","AlertDialogTitle","AlertDialogDescription","AlertDialogFooter","AlertDialogCancel","AlertDialogAction","ShoppingCart","MessageCircle","Play","UserPlus","Eye","Calendar","Star","SquareCheckBig","Bell","Trophy","User","EmptyState","Rocket","Share2","cn","usersContacts.listUserContactTasks","usersTasks.updateUserTask","parseApiErrors","usersTasks.deleteUserTask","parseApiErrors","usersContacts.createUserContactTask","parseApiErrors","usersTasks.updateUserTask","parseApiErrors","EmptyState","ClipboardList","SquareCheckBig","Plus","CircleCheck","cn","DropdownMenu","DropdownMenuTrigger","Button","EllipsisVertical","DropdownMenuContent","DropdownMenuItem","Calendar","AlertDialog","AlertDialogContent","AlertDialogHeader","AlertDialogTitle","AlertDialogDescription","AlertDialogFooter","AlertDialogCancel","AlertDialogAction","usersContacts.listUserContactActivities","usersContacts.markUserContactRead","Tabs","TabsList","TabsTrigger","TabsContent","ShoppingCart","Repeat2","ChevronLeft","ChevronRight","usersContacts.listUserContactOrders","keepPreviousData","formatLabel","formatDate","STATUS_FILTERS","EmptyState","ShoppingCart","Skeleton","usersContacts.listUserContactSubscriptionOrders","keepPreviousData","Repeat2","Skeleton","companyContacts.getCompanyContact","companyContacts.createCompanyContact","companyContacts.updateCompanyContact","companyContacts.deleteCompanyContact","usersContacts.getUserContact","usersContacts.createUserContact","usersContacts.updateUserContact","usersContacts.deleteUserContact","parseApiErrors","parseApiErrors","z","useZodForm","parseApiErrors","useFluidContext","createFetchClient","usersContacts.listUserContacts","usersContacts.bulkDeleteUserContacts","Button","ArrowLeft","FormProvider","useZodForm"],"sources":["../../../contacts/ui/src/shared/components/contacts/statusBadge.tsx","../../../contacts/ui/src/shared/components/contacts/allContacts/contactsTable.tsx","../../../contacts/ui/src/shared/query-keys.ts","../../../contacts/ui/src/shared/components/contacts/allContacts/contactsPage.tsx","../../../contacts/ui/src/screens/ContactsListScreen.tsx","../../../contacts/ui/src/screens/ContactDetailScreen.tsx","../../../contacts/ui/src/screens/ContactCreateScreen.tsx","../../../contacts/ui/src/shared/components/contacts/contactCard/palettes.ts","../../../contacts/ui/src/shared/components/contacts/contactCard/styles.tsx","../../../contacts/ui/src/shared/components/contacts/contactCard/contactInfoCard.tsx","../../../contacts/ui/src/shared/components/contacts/contactDetailsForm.tsx","../../../contacts/ui/src/portal/components/notes/notes-sidebar.tsx","../../../notes/fluid-user-notes-api-client/src/namespaces/users_notes.ts","../../../contacts/fluid-user-contacts-api-client/src/namespaces/users_contacts.ts","../../../contacts/ui/src/portal/hooks/notes/use-contact-notes.ts","../../../contacts/ui/src/portal/hooks/notes/use-delete-contact-note.ts","../../../contacts/ui/src/portal/hooks/notes/use-create-contact-note.ts","../../../contacts/ui/src/portal/hooks/notes/use-update-contact-note.ts","../../../contacts/ui/src/portal/utils/format-date.ts","../../../contacts/ui/src/portal/components/editor/note-task-editor.tsx","../../../contacts/ui/src/portal/components/editor/note-task-modal.tsx","../../../contacts/ui/src/portal/components/notes/notes-list.tsx","../../../contacts/ui/src/portal/components/activities/activity-feed.tsx","../../../tasks/fluid-user-tasks-api-client/src/namespaces/users_tasks.ts","../../../contacts/ui/src/portal/hooks/contacts/use-contact-tasks.ts","../../../contacts/ui/src/portal/hooks/contacts/use-toggle-task-completion.ts","../../../contacts/ui/src/portal/hooks/contacts/use-delete-contact-task.ts","../../../contacts/ui/src/portal/hooks/contacts/use-create-contact-task.ts","../../../contacts/ui/src/portal/hooks/contacts/use-update-contact-task.ts","../../../contacts/ui/src/portal/components/tasks/task-list.tsx","../../../contacts/ui/src/portal/hooks/contacts/use-contact-activities.ts","../../../contacts/ui/src/portal/hooks/contacts/use-mark-contact-read.ts","../../../contacts/ui/src/portal/components/contacts/rep-contact-detail-view.tsx","../../../contacts/ui/src/portal/components/shared/Pagination.tsx","../../../contacts/ui/src/portal/hooks/contacts/use-contact-orders.ts","../../../contacts/ui/src/portal/components/orders/ContactOrdersList.tsx","../../../contacts/ui/src/portal/hooks/contacts/use-contact-subscription-orders.ts","../../../contacts/ui/src/portal/components/subscriptions/ContactSubscriptionOrdersList.tsx","../../../contacts/fluid-company-contacts-api-client/src/namespaces/company_contacts.ts","../../../contacts/ui/src/shared/utils/createContactApi.ts","../../../contacts/ui/src/shared/hooks/useContactDetail.ts","../../../contacts/ui/src/shared/hooks/useUpdateContactMutation.ts","../../../contacts/ui/src/shared/hooks/useDeleteContactMutation.ts","../../../contacts/ui/src/shared/schemas/contactFormSchema.ts","../../../contacts/ui/src/shared/hooks/useContactDetailPage.ts","../../../contacts/ui/src/shared/hooks/useCreateContactMutation.ts","../src/contacts/use-contacts-config.ts","../src/screens/ContactsScreen.tsx"],"sourcesContent":["import React from \"react\";\nimport { cn } from \"@fluid-app/ui-primitives\";\n\nconst statusStyles: Record<string, string> = {\n // Contact statuses\n new: \"border-[var(--status-new-border)] bg-[var(--status-new)] text-[var(--status-new-foreground)]\",\n active:\n \"border-[var(--status-active-border)] bg-[var(--status-active)] text-[var(--status-active-foreground)]\",\n inactive: \"border-border bg-muted text-muted-foreground\",\n lead: \"border-[var(--status-lead-border)] bg-[var(--status-lead)] text-[var(--status-lead-foreground)]\",\n customer:\n \"border-[var(--status-customer-border)] bg-[var(--status-customer)] text-[var(--status-customer-foreground)]\",\n // Semantic categories (orders, subscriptions, etc.)\n success:\n \"border-[var(--badge-success-border)] bg-[var(--badge-success)] text-[var(--badge-success-foreground)]\",\n warning:\n \"border-[var(--badge-warning-border)] bg-[var(--badge-warning)] text-[var(--badge-warning-foreground)]\",\n danger:\n \"border-[var(--badge-danger-border)] bg-[var(--badge-danger)] text-[var(--badge-danger-foreground)]\",\n info: \"border-[var(--badge-info-border)] bg-[var(--badge-info)] text-[var(--badge-info-foreground)]\",\n neutral: \"border-border bg-muted text-muted-foreground\",\n notice:\n \"border-[var(--badge-notice-border)] bg-[var(--badge-notice)] text-[var(--badge-notice-foreground)]\",\n accent:\n \"border-[var(--badge-accent-border)] bg-[var(--badge-accent)] text-[var(--badge-accent-foreground)]\",\n};\n\nconst defaultStyle = \"border-border bg-muted text-muted-foreground\";\n\nexport type StatusBadgeVariant = keyof typeof statusStyles;\n\nexport function getStatusStyle(status: string): string {\n return statusStyles[status] ?? defaultStyle;\n}\n\nexport function StatusBadge({\n status,\n label,\n className,\n}: {\n status: string;\n label?: string;\n className?: string;\n}): React.JSX.Element {\n return (\n <span\n className={cn(\n \"inline-flex items-center rounded-full border px-2.5 py-0.5 text-xs font-semibold capitalize\",\n getStatusStyle(status),\n className,\n )}\n >\n {label ?? status}\n </span>\n );\n}\n","\"use client\";\n\nimport {\n useState,\n useEffect,\n useCallback,\n useRef,\n useMemo,\n type JSX,\n} from \"react\";\nimport { useQuery, keepPreviousData } from \"@tanstack/react-query\";\nimport {\n ArrowUpDown,\n EllipsisVertical,\n Pencil,\n Search,\n Trash2,\n} from \"lucide-react\";\nimport {\n Avatar,\n AvatarFallback,\n AvatarImage,\n Badge,\n Button,\n Card,\n CardContent,\n cn,\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuLabel,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n Input,\n Skeleton,\n Table,\n TableBody,\n TableCell,\n TableHead,\n TableHeader,\n TableRow,\n} from \"@fluid-app/ui-primitives\";\nimport { PaginationFooter } from \"@fluid-app/orders-ui\";\nimport { StatusBadge } from \"../statusBadge\";\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface Contact {\n id: number;\n full_name: string;\n email?: string | null;\n phone?: string | null;\n status: string | null;\n avatar_url?: string | null;\n lead_type?: string | null;\n metadata?: Record<string, unknown>;\n [key: string]: unknown;\n}\n\nexport interface ContactsTableProps {\n listContacts: (\n params: Record<string, unknown>,\n ) => Promise<{ contacts: Contact[]; meta: { total_count?: number } }>;\n queryKeyPrefix: string;\n setSelectedContacts: (contacts: Contact[]) => void;\n setOpenDeleteModal: (open: boolean) => void;\n onEditContact?: (contact: Contact) => void;\n onRowClick?: (contact: Contact) => void;\n /** Incrementing key to reset selection from parent (e.g. after bulk delete) */\n resetKey?: number;\n /**\n * `members` — members: one card per contact (avatar, name, email, phone, group).\n * `default` — admin-style table with ID and status.\n */\n tableLayout?: \"default\" | \"members\";\n}\n\n// ---------------------------------------------------------------------------\n// Group-badge helpers\n// ---------------------------------------------------------------------------\n\nfunction getInitials(fullName: string | null | undefined): string {\n const trimmed = fullName?.trim();\n if (!trimmed) return \"?\";\n const parts = trimmed.split(/\\s+/).filter(Boolean);\n if (parts.length >= 2) {\n const a = parts[0]?.[0];\n const b = parts[1]?.[0];\n return `${a ?? \"\"}${b ?? \"\"}`.toUpperCase() || \"?\";\n }\n return trimmed.slice(0, 2).toUpperCase();\n}\n\nfunction dedupeGroupLabels(labels: string[]): string[] {\n const seen = new Set<string>();\n const out: string[] = [];\n for (const label of labels) {\n const key = label.toLowerCase();\n if (seen.has(key)) continue;\n seen.add(key);\n out.push(label);\n }\n return out;\n}\n\n/** Pull a display label from one API group/tag object or string. */\nfunction labelFromGroupLikeItem(item: unknown): string {\n if (typeof item === \"string\") return item.trim();\n if (!item || typeof item !== \"object\") return \"\";\n const o = item as Record<string, unknown>;\n for (const k of [\"name\", \"title\", \"label\", \"display_name\"] as const) {\n const v = o[k];\n if (typeof v === \"string\" && v.trim()) return v.trim();\n }\n return \"\";\n}\n\nfunction labelsFromGroupArray(value: unknown): string[] {\n if (!Array.isArray(value) || value.length === 0) return [];\n return dedupeGroupLabels(\n value.map(labelFromGroupLikeItem).filter(Boolean) as string[],\n );\n}\n\nfunction labelsFromMetadata(m: Record<string, unknown>): string[] {\n const arrayKeys = [\n \"contact_groups\",\n \"contactGroups\",\n \"groups\",\n \"labels\",\n \"tags\",\n \"segments\",\n ] as const;\n for (const key of arrayKeys) {\n const found = labelsFromGroupArray(m[key]);\n if (found.length > 0) return found;\n }\n for (const key of [\"group_name\", \"contact_group\", \"group\"] as const) {\n const v = m[key];\n if (typeof v === \"string\" && v.trim()) return [v.trim()];\n const one = labelFromGroupLikeItem(v);\n if (one) return [one];\n }\n return [];\n}\n\nfunction firstNonEmptyGroupList(...candidates: unknown[]): string[] {\n for (const c of candidates) {\n const labels = labelsFromGroupArray(c);\n if (labels.length > 0) return labels;\n }\n return [];\n}\n\n/**\n * Ordered group labels for badges. Prefer plural/array sources before singular\n * `contact_group` so we don't drop additional groups when the API sends both.\n */\nfunction resolveContactGroupLabels(contact: Contact): string[] {\n const raw = contact as Record<string, unknown>;\n\n const fromPlural = firstNonEmptyGroupList(\n raw.contact_groups,\n raw.contactGroups,\n raw.groups,\n raw.labels,\n raw.tags,\n raw.segments,\n );\n if (fromPlural.length > 0) return fromPlural;\n\n const direct = raw.group;\n if (typeof direct === \"string\" && direct.trim()) return [direct.trim()];\n\n const nested = raw.contact_group;\n const singleNested = labelFromGroupLikeItem(nested);\n if (singleNested) return [singleNested];\n\n const meta = contact.metadata;\n if (meta && typeof meta === \"object\") {\n const fromMeta = labelsFromMetadata(meta as Record<string, unknown>);\n if (fromMeta.length > 0) return fromMeta;\n }\n\n const lead = contact.lead_type;\n if (lead && String(lead).trim()) {\n return [String(lead).replaceAll(\"_\", \" \")];\n }\n\n return [];\n}\n\n// ---------------------------------------------------------------------------\n// RepContactCard\n// ---------------------------------------------------------------------------\n\ninterface RepContactCardProps {\n contact: Contact;\n selected: boolean;\n onToggleSelect: (id: number) => void;\n onRowClick?: (contact: Contact) => void;\n onEditContact?: (contact: Contact) => void;\n setSelectedContacts: (contacts: Contact[]) => void;\n setOpenDeleteModal: (open: boolean) => void;\n}\n\nfunction RepContactCard({\n contact,\n selected,\n onToggleSelect,\n onRowClick,\n onEditContact,\n setSelectedContacts,\n setOpenDeleteModal,\n}: RepContactCardProps): JSX.Element {\n const groupLabels = resolveContactGroupLabels(contact);\n const groupTitle =\n groupLabels.length > 0 ? groupLabels.join(\", \") : undefined;\n\n return (\n <Card\n className={cn(\n \"border-border hover:bg-accent/30 h-[100px] w-full flex-col items-start justify-center gap-0 py-0 shadow-sm transition-colors\",\n selected && \"bg-accent/40 border-primary/25 ring-primary/20 ring-1\",\n )}\n >\n <CardContent className=\"w-full px-3 py-0\">\n <div className=\"flex items-center gap-2 sm:gap-3\">\n <div\n className=\"flex shrink-0 items-center\"\n onClick={(e) => e.stopPropagation()}\n >\n <input\n type=\"checkbox\"\n checked={selected}\n onChange={() => onToggleSelect(contact.id)}\n aria-label={`Select ${contact.full_name}`}\n className=\"accent-primary h-3.5 w-3.5 rounded sm:h-4 sm:w-4\"\n />\n </div>\n <button\n type=\"button\"\n className=\"text-foreground focus-visible:ring-ring flex min-w-0 flex-1 items-center gap-2 rounded-md text-left outline-none focus-visible:ring-2 sm:gap-3\"\n onClick={() => onRowClick?.(contact)}\n >\n <Avatar className=\"size-12 shrink-0\">\n {contact.avatar_url ? (\n <AvatarImage\n src={contact.avatar_url}\n alt={contact.full_name || \"Contact\"}\n />\n ) : null}\n <AvatarFallback className=\"border-border text-foreground bg-accent ring-border/80 text-xs font-semibold ring-1\">\n {getInitials(contact.full_name)}\n </AvatarFallback>\n </Avatar>\n <span\n className=\"max-w-[32%] min-w-0 shrink truncate text-sm leading-tight font-semibold sm:max-w-none sm:flex-[1.15]\"\n title={contact.full_name}\n >\n {contact.full_name || \"—\"}\n </span>\n <span\n className=\"text-muted-foreground min-w-0 flex-[1.35] truncate text-xs leading-tight\"\n title={contact.email ?? undefined}\n >\n {contact.email || \"—\"}\n </span>\n <span\n className=\"text-muted-foreground min-w-0 flex-[0.95] truncate text-xs leading-tight\"\n title={contact.phone ?? undefined}\n >\n {contact.phone || \"—\"}\n </span>\n <span\n className=\"text-muted-foreground flex min-w-0 flex-[0.95] items-center gap-1 text-xs leading-tight\"\n title={groupTitle}\n >\n {groupLabels.length > 0\n ? groupLabels.slice(0, 2).map((label, index) => (\n <Badge\n key={`${contact.id}-group-${index}-${label}`}\n variant=\"secondary\"\n className=\"max-w-[min(100%,10rem)] shrink truncate font-normal capitalize\"\n title={label}\n >\n {label}\n </Badge>\n ))\n : \"—\"}\n {groupLabels.length > 2 && (\n <span className=\"text-muted-foreground shrink-0 text-[10px]\">\n +{groupLabels.length - 2}\n </span>\n )}\n </span>\n </button>\n <div\n className=\"flex shrink-0 items-center\"\n onClick={(e) => e.stopPropagation()}\n >\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button\n variant=\"ghost\"\n size=\"icon-xs\"\n aria-label=\"Contact actions\"\n >\n <EllipsisVertical className=\"h-4 w-4\" />\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\">\n {onEditContact && (\n <>\n <DropdownMenuItem onClick={() => onEditContact(contact)}>\n <Pencil className=\"h-3.5 w-3.5\" />\n Edit\n </DropdownMenuItem>\n <DropdownMenuSeparator />\n </>\n )}\n <DropdownMenuItem\n className=\"text-destructive\"\n onClick={() => {\n setSelectedContacts([contact]);\n setOpenDeleteModal(true);\n }}\n >\n <Trash2 className=\"h-3.5 w-3.5\" />\n Delete\n </DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenu>\n </div>\n </div>\n </CardContent>\n </Card>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Constants\n// ---------------------------------------------------------------------------\n\nconst TABS = [\"All\", \"Leads\", \"Customers\"] as const;\ntype Tab = (typeof TABS)[number];\n\ntype ContactSortDir = \"asc\" | \"desc\";\ntype ContactSortFieldOption = \"name\" | \"email\";\n\nfunction getSortComparable(\n contact: Contact,\n field: ContactSortFieldOption,\n): string {\n if (field === \"name\") return contact.full_name ?? \"\";\n return contact.email ?? \"\";\n}\n\nconst PAGE_SIZE = 25;\n\nconst CONTACT_SORT_COLUMNS: { id: ContactSortFieldOption; name: string }[] = [\n { id: \"name\", name: \"Name\" },\n { id: \"email\", name: \"Email\" },\n];\n\n// ---------------------------------------------------------------------------\n// Component\n// ---------------------------------------------------------------------------\n\nexport function ContactsTable({\n listContacts,\n queryKeyPrefix,\n setSelectedContacts,\n setOpenDeleteModal,\n onEditContact,\n onRowClick,\n resetKey,\n tableLayout,\n}: ContactsTableProps): JSX.Element {\n const isMemberLayout = tableLayout === \"members\";\n const [currentPage, setCurrentPage] = useState(1);\n const [searchTerm, setSearchTerm] = useState(\"\");\n const [activeTab, setActiveTab] = useState<Tab>(\"All\");\n const [currentSort, setCurrentSort] = useState<{\n id: ContactSortFieldOption;\n desc: boolean;\n }>({ id: \"name\", desc: false });\n const [selectedIds, setSelectedIds] = useState<Set<number>>(new Set());\n\n // Reset page when filters change\n useEffect(() => {\n setCurrentPage(1);\n setSelectedIds(new Set());\n }, [searchTerm, activeTab, currentSort]);\n\n // Clear selection on page change\n useEffect(() => {\n setSelectedIds(new Set());\n }, [currentPage]);\n\n // Clear selection when parent signals (e.g. after bulk delete)\n useEffect(() => {\n setSelectedIds(new Set());\n }, [resetKey]);\n\n const resolvedStatus =\n activeTab === \"Leads\"\n ? \"lead\"\n : activeTab === \"Customers\"\n ? \"customer\"\n : null;\n\n const { data, isLoading } = useQuery({\n queryKey: [\n queryKeyPrefix,\n {\n searchTerm,\n currentPage,\n activeTab,\n sortField: currentSort.id,\n sortDesc: currentSort.desc,\n },\n ],\n queryFn: () =>\n listContacts({\n search_query: searchTerm || undefined,\n page: currentPage,\n per_page: PAGE_SIZE,\n ...(resolvedStatus ? { status: resolvedStatus } : {}),\n sort_by: currentSort.id,\n sort_direction: currentSort.desc ? \"desc\" : \"asc\",\n }),\n placeholderData: keepPreviousData,\n });\n\n const items = useMemo(() => data?.contacts ?? [], [data?.contacts]);\n\n // sort_by/sort_direction are passed to listContacts so the server returns\n // pre-sorted results. Client-side re-sort is kept as a fallback for API\n // consumers that don't yet honour those params.\n const displayItems = useMemo(() => {\n const sortField = currentSort.id;\n const sortDir: ContactSortDir = currentSort.desc ? \"desc\" : \"asc\";\n return [...items].sort((a, b) => {\n const av = getSortComparable(a, sortField).toLowerCase();\n const bv = getSortComparable(b, sortField).toLowerCase();\n const cmp = av.localeCompare(bv, undefined, { sensitivity: \"base\" });\n return sortDir === \"asc\" ? cmp : -cmp;\n });\n }, [items, currentSort]);\n\n const totalItems = data?.meta?.total_count ?? 0;\n const totalPages = Math.max(1, Math.ceil(totalItems / PAGE_SIZE));\n\n const allSelected =\n displayItems.length > 0 && displayItems.every((c) => selectedIds.has(c.id));\n const someSelected = selectedIds.size > 0 && !allSelected;\n\n const selectAllRef = useRef<HTMLInputElement>(null);\n useEffect(() => {\n if (selectAllRef.current) {\n selectAllRef.current.indeterminate = someSelected;\n }\n }, [someSelected]);\n\n const toggleSelectAll = useCallback(() => {\n setSelectedIds((prev) => {\n const next = new Set(prev);\n if (allSelected) {\n for (const item of displayItems) next.delete(item.id);\n } else {\n for (const item of displayItems) next.add(item.id);\n }\n return next;\n });\n }, [allSelected, displayItems]);\n\n const toggleSelect = useCallback((id: number) => {\n setSelectedIds((prev) => {\n const next = new Set(prev);\n if (next.has(id)) {\n next.delete(id);\n } else {\n next.add(id);\n }\n return next;\n });\n }, []);\n\n const handleBulkDelete = useCallback(() => {\n const selected = displayItems.filter((c) => selectedIds.has(c.id));\n if (selected.length > 0) {\n setSelectedContacts(selected);\n setOpenDeleteModal(true);\n }\n }, [displayItems, selectedIds, setSelectedContacts, setOpenDeleteModal]);\n\n return (\n <div className=\"border-border overflow-hidden rounded-lg border shadow-sm\">\n {/* Header: tabs + search + filters */}\n <div className=\"flex flex-col gap-2 p-3 sm:flex-row sm:items-center sm:justify-between\">\n <div className=\"flex flex-wrap items-center gap-2 sm:gap-3\">\n <div className=\"flex items-center gap-1\">\n {TABS.map((tab) => (\n <Button\n key={tab}\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => setActiveTab(tab)}\n className={cn(\n \"rounded-md text-xs\",\n activeTab === tab && \"bg-accent font-bold\",\n )}\n >\n {tab}\n </Button>\n ))}\n </div>\n </div>\n <div className=\"flex min-w-0 flex-1 items-center justify-end gap-2 sm:max-w-none\">\n <div className=\"shrink-0\">\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button\n variant=\"ghost\"\n size=\"icon-xs\"\n aria-label=\"Sort contacts\"\n >\n <ArrowUpDown className=\"h-4 w-4\" />\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\" className=\"w-48\">\n <DropdownMenuLabel className=\"text-xs font-medium\">\n Sort by\n </DropdownMenuLabel>\n <DropdownMenuSeparator />\n {CONTACT_SORT_COLUMNS.map((col) => (\n <DropdownMenuItem\n key={col.id}\n onClick={() =>\n setCurrentSort((prev) => ({\n id: col.id,\n desc: prev.id === col.id ? !prev.desc : false,\n }))\n }\n >\n <span className=\"flex-1\">{col.name}</span>\n {currentSort.id === col.id && (\n <span className=\"text-muted-foreground text-xs\">\n {currentSort.desc ? \"↓\" : \"↑\"}\n </span>\n )}\n </DropdownMenuItem>\n ))}\n </DropdownMenuContent>\n </DropdownMenu>\n </div>\n <div className=\"relative min-w-0 flex-1 sm:w-auto sm:min-w-[220px] sm:flex-initial\">\n <div className=\"pointer-events-none absolute inset-y-0 left-0 flex items-center pl-3\">\n <Search className=\"text-muted-foreground h-4 w-4\" />\n </div>\n <Input\n type=\"search\"\n value={searchTerm}\n onChange={(e) => setSearchTerm(e.target.value)}\n className=\"h-8 w-full pl-10 text-sm\"\n placeholder=\"Search contacts...\"\n />\n </div>\n </div>\n </div>\n\n {/* Rep layout: card list (all breakpoints) */}\n {isMemberLayout ? (\n <div className=\"space-y-3 p-3\">\n {!isLoading && items.length > 0 ? (\n <div className=\"bg-muted/40 border-border flex flex-wrap items-center justify-between gap-2 rounded-lg border px-3 py-2\">\n <div className=\"flex items-center gap-3\">\n <input\n ref={selectAllRef}\n type=\"checkbox\"\n checked={allSelected}\n onChange={toggleSelectAll}\n aria-label={\n allSelected ? \"Deselect all\" : \"Select all on this page\"\n }\n className=\"accent-primary h-4 w-4 shrink-0 rounded\"\n />\n {selectedIds.size > 0 ? (\n <span className=\"text-foreground text-sm font-medium\">\n {selectedIds.size} selected\n </span>\n ) : (\n <span className=\"text-muted-foreground text-sm\">\n Select all\n </span>\n )}\n </div>\n {selectedIds.size > 0 ? (\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className=\"h-8 gap-1 text-xs\"\n >\n <EllipsisVertical className=\"h-4 w-4\" />\n Actions\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\">\n <DropdownMenuItem\n className=\"text-destructive\"\n onClick={handleBulkDelete}\n >\n <Trash2 className=\"h-3.5 w-3.5\" />\n Delete {selectedIds.size}{\" \"}\n {selectedIds.size === 1 ? \"contact\" : \"contacts\"}\n </DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenu>\n ) : null}\n </div>\n ) : null}\n\n {isLoading ? (\n Array(5)\n .fill(0)\n .map((_, i) => (\n <Card\n key={`card-skel-${i}`}\n className=\"border-border h-[100px] w-full flex-col items-start justify-center gap-0 py-0 shadow-sm\"\n >\n <CardContent className=\"w-full px-3 py-0\">\n <div className=\"flex items-center gap-2 sm:gap-3\">\n <Skeleton className=\"h-3.5 w-3.5 shrink-0 rounded sm:h-4 sm:w-4\" />\n <Skeleton className=\"size-12 shrink-0 rounded-full\" />\n <Skeleton className=\"h-3.5 max-w-[32%] shrink sm:max-w-none sm:flex-[1.15]\" />\n <Skeleton className=\"h-3.5 min-w-0 flex-[1.35]\" />\n <Skeleton className=\"h-3.5 min-w-0 flex-[0.95]\" />\n <Skeleton className=\"h-3.5 min-w-0 flex-[0.95]\" />\n <Skeleton className=\"size-7 shrink-0 rounded-md\" />\n </div>\n </CardContent>\n </Card>\n ))\n ) : items.length === 0 ? (\n <div className=\"text-muted-foreground py-10 text-center text-sm\">\n No contacts found\n </div>\n ) : (\n displayItems.map((contact) => (\n <RepContactCard\n key={contact.id}\n contact={contact}\n selected={selectedIds.has(contact.id)}\n onToggleSelect={toggleSelect}\n onRowClick={onRowClick}\n onEditContact={onEditContact}\n setSelectedContacts={setSelectedContacts}\n setOpenDeleteModal={setOpenDeleteModal}\n />\n ))\n )}\n </div>\n ) : (\n <>\n {/* Mobile view (admin default) */}\n <div className=\"block md:hidden\">\n {isLoading ? (\n Array(5)\n .fill(0)\n .map((_, i) => (\n <div\n key={`skeleton-${i}`}\n className=\"border-border border-b p-4\"\n >\n <div className=\"space-y-2\">\n <Skeleton className=\"h-4 w-3/4\" />\n <Skeleton className=\"h-3 w-1/2\" />\n </div>\n </div>\n ))\n ) : items.length === 0 ? (\n <div className=\"text-muted-foreground px-3 py-8 text-center text-sm\">\n No contacts found\n </div>\n ) : (\n displayItems.map((contact) => (\n <div\n key={contact.id}\n className=\"border-border hover:bg-accent cursor-pointer border-b p-4 transition-colors last:border-b-0\"\n onClick={() => onRowClick?.(contact)}\n >\n <div className=\"flex items-center justify-between gap-3\">\n <div className=\"min-w-0 flex-1\">\n <p className=\"text-foreground truncate text-sm font-medium\">\n {contact.full_name || \"—\"}\n </p>\n <p className=\"text-muted-foreground truncate text-xs\">\n {contact.email || \"—\"}\n </p>\n </div>\n {contact.status && <StatusBadge status={contact.status} />}\n </div>\n </div>\n ))\n )}\n </div>\n\n {/* Desktop view (admin table) */}\n <div className=\"hidden md:block\">\n <Table className=\"min-w-full table-fixed\">\n <colgroup>\n <col className=\"w-[40px]\" />\n <col className=\"w-[60px]\" />\n <col className=\"w-[25%] min-w-[160px]\" />\n <col className=\"w-[25%] min-w-[160px]\" />\n <col className=\"w-[15%] min-w-[120px]\" />\n <col className=\"w-[15%] min-w-[100px]\" />\n <col className=\"w-[50px]\" />\n </colgroup>\n <TableHeader className=\"bg-muted\">\n {selectedIds.size > 0 ? (\n <TableRow>\n <TableHead className=\"px-3\">\n <input\n ref={selectAllRef}\n type=\"checkbox\"\n checked={allSelected}\n onChange={toggleSelectAll}\n aria-label=\"Deselect all\"\n className=\"accent-primary h-4 w-4 rounded\"\n />\n </TableHead>\n <TableHead colSpan={5} className=\"px-3\">\n <span className=\"text-foreground text-sm font-medium\">\n {selectedIds.size} selected\n </span>\n </TableHead>\n <TableHead className=\"px-3\">\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button variant=\"ghost\" size=\"icon-xs\">\n <EllipsisVertical className=\"h-4 w-4\" />\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\">\n <DropdownMenuItem\n className=\"text-destructive\"\n onClick={handleBulkDelete}\n >\n <Trash2 className=\"h-3.5 w-3.5\" />\n Delete {selectedIds.size}{\" \"}\n {selectedIds.size === 1 ? \"row\" : \"rows\"}\n </DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenu>\n </TableHead>\n </TableRow>\n ) : (\n <TableRow>\n <TableHead className=\"px-3\">\n <input\n ref={selectAllRef}\n type=\"checkbox\"\n checked={allSelected}\n onChange={toggleSelectAll}\n aria-label=\"Select all\"\n className=\"accent-primary h-4 w-4 rounded\"\n />\n </TableHead>\n <TableHead className=\"text-muted-foreground px-3 text-xs\">\n ID\n </TableHead>\n <TableHead className=\"text-muted-foreground px-3 text-xs\">\n Name\n </TableHead>\n <TableHead className=\"text-muted-foreground px-3 text-xs\">\n Email\n </TableHead>\n <TableHead className=\"text-muted-foreground px-3 text-xs\">\n Phone\n </TableHead>\n <TableHead className=\"text-muted-foreground px-3 text-xs\">\n Status\n </TableHead>\n <TableHead className=\"px-3\" />\n </TableRow>\n )}\n </TableHeader>\n <TableBody className=\"bg-background\">\n {isLoading ? (\n Array(5)\n .fill(0)\n .map((_, i) => (\n <TableRow key={`skeleton-${i}`}>\n <TableCell className=\"px-3 py-3\">\n <Skeleton className=\"h-4 w-4\" />\n </TableCell>\n <TableCell className=\"px-3 py-3\">\n <Skeleton className=\"h-4 w-8\" />\n </TableCell>\n <TableCell className=\"px-3 py-3\">\n <Skeleton className=\"h-4 w-24\" />\n </TableCell>\n <TableCell className=\"px-3 py-3\">\n <Skeleton className=\"h-4 w-32\" />\n </TableCell>\n <TableCell className=\"px-3 py-3\">\n <Skeleton className=\"h-4 w-20\" />\n </TableCell>\n <TableCell className=\"px-3 py-3\">\n <Skeleton className=\"h-4 w-16\" />\n </TableCell>\n <TableCell className=\"px-3 py-3\" />\n </TableRow>\n ))\n ) : items.length === 0 ? (\n <TableRow>\n <TableCell\n colSpan={7}\n className=\"text-muted-foreground px-3 py-8 text-center\"\n >\n No contacts found\n </TableCell>\n </TableRow>\n ) : (\n displayItems.map((contact) => (\n <TableRow\n key={contact.id}\n className={cn(\n \"cursor-pointer\",\n selectedIds.has(contact.id) && \"bg-accent\",\n )}\n onClick={() => onRowClick?.(contact)}\n >\n <TableCell\n className=\"px-3 py-3\"\n onClick={(e) => e.stopPropagation()}\n >\n <input\n type=\"checkbox\"\n checked={selectedIds.has(contact.id)}\n onChange={() => toggleSelect(contact.id)}\n aria-label={`Select ${contact.full_name}`}\n className=\"accent-primary h-4 w-4 rounded\"\n />\n </TableCell>\n <TableCell className=\"px-3 py-3 text-right\">\n {contact.id}\n </TableCell>\n <TableCell className=\"px-3 py-3\">\n <div\n className=\"max-w-32 truncate font-semibold\"\n title={contact.full_name}\n >\n {contact.full_name || \"—\"}\n </div>\n </TableCell>\n <TableCell className=\"px-3 py-3\">\n <div\n className=\"max-w-32 truncate\"\n title={contact.email ?? undefined}\n >\n {contact.email || \"—\"}\n </div>\n </TableCell>\n <TableCell className=\"px-3 py-3\">\n {contact.phone || \"—\"}\n </TableCell>\n <TableCell className=\"px-3 py-3\">\n {contact.status ? (\n <StatusBadge status={contact.status} />\n ) : (\n \"—\"\n )}\n </TableCell>\n <TableCell\n className=\"px-3 py-3\"\n onClick={(e) => e.stopPropagation()}\n >\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button variant=\"ghost\" size=\"icon-xs\">\n <EllipsisVertical className=\"h-4 w-4\" />\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\">\n {onEditContact && (\n <>\n <DropdownMenuItem\n onClick={() => onEditContact(contact)}\n >\n <Pencil className=\"h-3.5 w-3.5\" />\n Edit\n </DropdownMenuItem>\n <DropdownMenuSeparator />\n </>\n )}\n <DropdownMenuItem\n className=\"text-destructive\"\n onClick={() => {\n setSelectedContacts([contact]);\n setOpenDeleteModal(true);\n }}\n >\n <Trash2 className=\"h-3.5 w-3.5\" />\n Delete\n </DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenu>\n </TableCell>\n </TableRow>\n ))\n )}\n </TableBody>\n </Table>\n </div>\n </>\n )}\n\n <PaginationFooter\n currentPage={currentPage}\n totalPages={totalPages}\n pageSize={PAGE_SIZE}\n totalItems={totalItems}\n onPageChange={setCurrentPage}\n />\n </div>\n );\n}\n","export const CONTACTS_QUERY_KEYS = {\n all: (prefix: string) => [prefix] as const,\n list: (prefix: string) =>\n [...CONTACTS_QUERY_KEYS.all(prefix), \"list\"] as const,\n detail: (prefix: string, id: string) =>\n [...CONTACTS_QUERY_KEYS.all(prefix), \"detail\", id] as const,\n} as const;\n","\"use client\";\n\nimport { useState, useCallback } from \"react\";\nimport { useMutation, useQueryClient } from \"@tanstack/react-query\";\nimport {\n AlertDialog,\n AlertDialogAction,\n AlertDialogCancel,\n AlertDialogContent,\n AlertDialogDescription,\n AlertDialogFooter,\n AlertDialogHeader,\n AlertDialogTitle,\n fluidToast,\n} from \"@fluid-app/ui-primitives\";\nimport { parseApiErrors } from \"@fluid-app/api-client-core\";\nimport { ContactsTable, type Contact } from \"./contactsTable\";\nimport { CONTACTS_QUERY_KEYS } from \"../../../query-keys\";\n\nexport type { Contact };\n\nexport interface ContactsPageProps {\n /** Pre-bound function to list contacts. Client is already applied. */\n listContacts: (\n params: Record<string, unknown>,\n ) => Promise<{ contacts: Contact[]; meta: { total_count?: number } }>;\n /** Function to delete contacts by IDs */\n deleteContacts: (ids: number[]) => Promise<unknown>;\n /** Query key prefix for TanStack Query cache management */\n queryKeyPrefix: string;\n /** Header element (e.g. PageHeader with breadcrumbs and action buttons) */\n header?: React.ReactNode;\n /** Callback when edit action is triggered on a contact row */\n onEditContact?: (contact: Contact) => void;\n /** Callback when a contact row is clicked */\n onRowClick?: (contact: Contact) => void;\n /** @see ContactsTableProps[\"tableLayout\"] */\n tableLayout?: \"default\" | \"members\";\n}\n\nexport function ContactsPage({\n listContacts,\n deleteContacts,\n queryKeyPrefix,\n header,\n onEditContact,\n onRowClick,\n tableLayout,\n}: ContactsPageProps): React.JSX.Element {\n const [openDeleteModal, setOpenDeleteModal] = useState(false);\n const [selectedContacts, setSelectedContacts] = useState<Contact[]>([]);\n const [resetKey, setResetKey] = useState(0);\n const queryClient = useQueryClient();\n const bumpResetKey = useCallback(() => setResetKey((k) => k + 1), []);\n\n const deleteContactMutation = useMutation({\n mutationFn: (ids: number[]) => deleteContacts(ids),\n onSuccess: () => {\n fluidToast({ title: \"Contacts deleted successfully\", type: \"success\" });\n queryClient.invalidateQueries({\n queryKey: CONTACTS_QUERY_KEYS.all(queryKeyPrefix),\n });\n },\n onError: (error) => {\n fluidToast({\n title: \"Failed to delete contacts\",\n type: \"error\",\n description: parseApiErrors(error),\n });\n },\n onSettled: () => {\n setOpenDeleteModal(false);\n setSelectedContacts([]);\n bumpResetKey();\n },\n });\n\n return (\n <>\n {header}\n <div className=\"mx-auto max-w-7xl space-y-6 px-4 py-4 md:px-10 md:py-8\">\n <ContactsTable\n listContacts={listContacts}\n queryKeyPrefix={queryKeyPrefix}\n setSelectedContacts={setSelectedContacts}\n setOpenDeleteModal={setOpenDeleteModal}\n onEditContact={onEditContact}\n onRowClick={onRowClick}\n resetKey={resetKey}\n tableLayout={tableLayout}\n />\n </div>\n <AlertDialog open={openDeleteModal} onOpenChange={setOpenDeleteModal}>\n <AlertDialogContent>\n <AlertDialogHeader>\n <AlertDialogTitle>Delete contact?</AlertDialogTitle>\n <AlertDialogDescription>\n Are you sure you want to delete{\" \"}\n {selectedContacts.length === 1\n ? \"this contact\"\n : `${selectedContacts.length} contacts`}\n ? This action cannot be undone.\n </AlertDialogDescription>\n </AlertDialogHeader>\n <AlertDialogFooter>\n <AlertDialogCancel>Cancel</AlertDialogCancel>\n <AlertDialogAction\n variant=\"destructive\"\n onClick={() =>\n deleteContactMutation.mutate(selectedContacts.map((c) => c.id))\n }\n >\n Delete\n </AlertDialogAction>\n </AlertDialogFooter>\n </AlertDialogContent>\n </AlertDialog>\n </>\n );\n}\n","\"use client\";\n\nimport { useMemo, type ReactNode } from \"react\";\nimport {\n Breadcrumb,\n BreadcrumbList,\n BreadcrumbItem,\n BreadcrumbPage,\n Button,\n} from \"@fluid-app/ui-primitives\";\nimport { Plus } from \"lucide-react\";\nimport {\n useScreenHeaderActions,\n useScreenHeaderBreadcrumbs,\n} from \"@fluid-app/portal-react/shell/ScreenHeaderContext\";\nimport {\n ContactsPage,\n type Contact,\n} from \"../shared/components/contacts/allContacts/contactsPage\";\n\nexport type { Contact };\n\nexport interface ContactsListScreenProps {\n listContacts: (\n params: Record<string, unknown>,\n ) => Promise<{ contacts: Contact[]; meta: { total_count?: number } }>;\n deleteContacts: (ids: number[]) => Promise<unknown>;\n onEditContact?: (contact: Contact) => void;\n onRowClick?: (contact: Contact) => void;\n onAddContact: () => void;\n queryKeyPrefix?: string;\n tableLayout?: \"default\" | \"members\";\n /** Override the default header element rendered by ContactsPage */\n header?: ReactNode;\n}\n\nexport function ContactsListScreen({\n listContacts,\n deleteContacts,\n onEditContact,\n onRowClick,\n onAddContact,\n queryKeyPrefix = \"contacts\",\n tableLayout,\n header,\n}: ContactsListScreenProps) {\n const headerActions = useMemo(\n () => (\n <Button onClick={onAddContact} size=\"sm\">\n <Plus className=\"mr-1 h-4 w-4\" />\n Add Contact\n </Button>\n ),\n [onAddContact],\n );\n useScreenHeaderActions(headerActions);\n\n const headerBreadcrumbs = useMemo(\n () => (\n <Breadcrumb>\n <BreadcrumbList className=\"text-lg\">\n <BreadcrumbItem>\n <BreadcrumbPage className=\"font-semibold\">Contacts</BreadcrumbPage>\n </BreadcrumbItem>\n </BreadcrumbList>\n </Breadcrumb>\n ),\n [],\n );\n useScreenHeaderBreadcrumbs(headerBreadcrumbs);\n\n return (\n <ContactsPage\n listContacts={listContacts}\n deleteContacts={deleteContacts}\n queryKeyPrefix={queryKeyPrefix}\n tableLayout={tableLayout}\n header={header}\n onEditContact={onEditContact}\n onRowClick={onRowClick}\n />\n );\n}\n","\"use client\";\n\nimport { useState, useMemo, type ReactNode } from \"react\";\nimport {\n AlertDialog,\n AlertDialogAction,\n AlertDialogCancel,\n AlertDialogContent,\n AlertDialogDescription,\n AlertDialogFooter,\n AlertDialogHeader,\n AlertDialogTitle,\n Breadcrumb,\n BreadcrumbItem,\n BreadcrumbLink,\n BreadcrumbList,\n BreadcrumbPage,\n BreadcrumbSeparator,\n Button,\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuTrigger,\n} from \"@fluid-app/ui-primitives\";\nimport { EllipsisVertical } from \"lucide-react\";\nimport {\n useScreenHeaderActions,\n useScreenHeaderBreadcrumbs,\n} from \"@fluid-app/portal-react/shell/ScreenHeaderContext\";\n\nexport interface ContactDetailScreenProps {\n contactId: string;\n contact?: { full_name?: string | null } | null;\n onNavigateToList: () => void;\n onSave: () => void;\n onDelete: () => void;\n isDirty: boolean;\n isSubmitting: boolean;\n isDeleting: boolean;\n children: ReactNode;\n}\n\nexport function ContactDetailScreen({\n contact,\n onNavigateToList,\n onSave,\n onDelete,\n isDirty,\n isSubmitting,\n isDeleting,\n children,\n}: ContactDetailScreenProps) {\n const [showDeleteDialog, setShowDeleteDialog] = useState(false);\n\n const headerActions = useMemo(\n () => (\n <>\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button variant=\"outline\" size=\"icon\" className=\"border-border\">\n <EllipsisVertical className=\"h-4 w-4\" />\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\">\n <DropdownMenuItem\n className=\"text-destructive\"\n onClick={() => setShowDeleteDialog(true)}\n >\n Delete\n </DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenu>\n <Button\n onClick={onSave}\n disabled={!isDirty || isSubmitting || isDeleting}\n >\n {isSubmitting ? \"Saving...\" : \"Save\"}\n </Button>\n </>\n ),\n [onSave, isDirty, isSubmitting, isDeleting],\n );\n useScreenHeaderActions(headerActions);\n\n const headerBreadcrumbs = useMemo(\n () => (\n <Breadcrumb>\n <BreadcrumbList className=\"text-lg\">\n <BreadcrumbItem>\n <BreadcrumbLink\n href=\"#\"\n onClick={(e) => {\n e.preventDefault();\n onNavigateToList();\n }}\n >\n Contacts\n </BreadcrumbLink>\n </BreadcrumbItem>\n <BreadcrumbSeparator />\n <BreadcrumbItem>\n <BreadcrumbPage className=\"font-semibold\">\n {contact?.full_name ?? \"Contact\"}\n </BreadcrumbPage>\n </BreadcrumbItem>\n </BreadcrumbList>\n </Breadcrumb>\n ),\n [contact?.full_name, onNavigateToList],\n );\n useScreenHeaderBreadcrumbs(headerBreadcrumbs);\n\n return (\n <>\n {children}\n <AlertDialog open={showDeleteDialog} onOpenChange={setShowDeleteDialog}>\n <AlertDialogContent>\n <AlertDialogHeader>\n <AlertDialogTitle>Delete Contact</AlertDialogTitle>\n <AlertDialogDescription>\n Are you sure you want to delete{\" \"}\n {contact?.full_name ?? \"this contact\"}? This action cannot be\n undone.\n </AlertDialogDescription>\n </AlertDialogHeader>\n <AlertDialogFooter>\n <AlertDialogCancel disabled={isDeleting}>Cancel</AlertDialogCancel>\n <AlertDialogAction\n onClick={() => {\n onDelete();\n setShowDeleteDialog(false);\n }}\n disabled={isDeleting}\n className=\"bg-destructive text-destructive-foreground hover:bg-destructive/90\"\n >\n {isDeleting ? \"Deleting...\" : \"Delete\"}\n </AlertDialogAction>\n </AlertDialogFooter>\n </AlertDialogContent>\n </AlertDialog>\n </>\n );\n}\n","\"use client\";\n\nimport { useMemo, type ReactNode } from \"react\";\nimport {\n Breadcrumb,\n BreadcrumbItem,\n BreadcrumbLink,\n BreadcrumbList,\n BreadcrumbPage,\n BreadcrumbSeparator,\n Button,\n} from \"@fluid-app/ui-primitives\";\nimport {\n useScreenHeaderActions,\n useScreenHeaderBreadcrumbs,\n} from \"@fluid-app/portal-react/shell/ScreenHeaderContext\";\n\nexport interface ContactCreateScreenProps {\n onNavigateToList: () => void;\n onSubmit: () => void;\n isPending: boolean;\n children: ReactNode;\n}\n\nexport function ContactCreateScreen({\n onNavigateToList,\n onSubmit,\n isPending,\n children,\n}: ContactCreateScreenProps) {\n const headerActions = useMemo(\n () => (\n <>\n <Button\n variant=\"outline\"\n onClick={onNavigateToList}\n disabled={isPending}\n >\n Cancel\n </Button>\n <Button onClick={onSubmit} disabled={isPending}>\n {isPending ? \"Adding...\" : \"Add Contact\"}\n </Button>\n </>\n ),\n [onNavigateToList, onSubmit, isPending],\n );\n useScreenHeaderActions(headerActions);\n\n const headerBreadcrumbs = useMemo(\n () => (\n <Breadcrumb>\n <BreadcrumbList className=\"text-lg\">\n <BreadcrumbItem>\n <BreadcrumbLink\n href=\"#\"\n onClick={(e) => {\n e.preventDefault();\n onNavigateToList();\n }}\n >\n Contacts\n </BreadcrumbLink>\n </BreadcrumbItem>\n <BreadcrumbSeparator />\n <BreadcrumbItem>\n <BreadcrumbPage className=\"font-semibold\">\n New Contact\n </BreadcrumbPage>\n </BreadcrumbItem>\n </BreadcrumbList>\n </Breadcrumb>\n ),\n [onNavigateToList],\n );\n useScreenHeaderBreadcrumbs(headerBreadcrumbs);\n\n return <>{children}</>;\n}\n","/**\n * Color palettes for contact card backgrounds.\n * Raw CSS values bypass Tailwind's JIT purge for dynamic backgrounds.\n */\n\nexport type GradientPalette = {\n base: string;\n overlay: string;\n accent: string;\n orb1: string;\n orb2: string;\n orb3: string;\n};\n\nexport const gradientPalettes: GradientPalette[] = [\n {\n base: \"linear-gradient(to bottom right, #7e22ce, #7c3aed, #a21caf)\",\n overlay:\n \"linear-gradient(to top right, rgba(30,27,75,0.6), transparent, rgba(236,72,153,0.4))\",\n accent:\n \"linear-gradient(to bottom left, rgba(192,38,211,0.5), transparent, transparent)\",\n orb1: \"rgba(59,7,100,0.4)\",\n orb2: \"rgba(236,72,153,0.2)\",\n orb3: \"rgba(49,46,129,0.3)\",\n },\n {\n base: \"linear-gradient(to bottom right, #0f766e, #0891b2, #047857)\",\n overlay:\n \"linear-gradient(to top right, rgba(15,23,42,0.6), transparent, rgba(45,212,191,0.4))\",\n accent:\n \"linear-gradient(to bottom left, rgba(16,185,129,0.5), transparent, transparent)\",\n orb1: \"rgba(17,94,89,0.4)\",\n orb2: \"rgba(34,211,238,0.2)\",\n orb3: \"rgba(6,78,59,0.3)\",\n },\n {\n base: \"linear-gradient(to bottom right, #be123c, #db2777, #ea580c)\",\n overlay:\n \"linear-gradient(to top right, rgba(136,19,55,0.6), transparent, rgba(245,158,11,0.4))\",\n accent:\n \"linear-gradient(to bottom left, rgba(249,115,22,0.5), transparent, transparent)\",\n orb1: \"rgba(136,19,55,0.4)\",\n orb2: \"rgba(251,191,36,0.2)\",\n orb3: \"rgba(157,23,77,0.3)\",\n },\n {\n base: \"linear-gradient(to bottom right, #1d4ed8, #4f46e5, #6d28d9)\",\n overlay:\n \"linear-gradient(to top right, rgba(15,23,42,0.6), transparent, rgba(96,165,250,0.4))\",\n accent:\n \"linear-gradient(to bottom left, rgba(139,92,246,0.5), transparent, transparent)\",\n orb1: \"rgba(30,58,138,0.4)\",\n orb2: \"rgba(129,140,248,0.2)\",\n orb3: \"rgba(30,41,59,0.3)\",\n },\n {\n base: \"linear-gradient(to bottom right, #b45309, #ea580c, #b91c1c)\",\n overlay:\n \"linear-gradient(to top right, rgba(120,53,15,0.6), transparent, rgba(250,204,21,0.4))\",\n accent:\n \"linear-gradient(to bottom left, rgba(239,68,68,0.5), transparent, transparent)\",\n orb1: \"rgba(120,53,15,0.4)\",\n orb2: \"rgba(250,204,21,0.2)\",\n orb3: \"rgba(154,52,18,0.3)\",\n },\n {\n base: \"linear-gradient(to bottom right, #047857, #16a34a, #0f766e)\",\n overlay:\n \"linear-gradient(to top right, rgba(6,78,59,0.6), transparent, rgba(163,230,53,0.4))\",\n accent:\n \"linear-gradient(to bottom left, rgba(34,197,94,0.5), transparent, transparent)\",\n orb1: \"rgba(6,78,59,0.4)\",\n orb2: \"rgba(163,230,53,0.2)\",\n orb3: \"rgba(21,128,61,0.3)\",\n },\n];\n","/**\n * Background style renderers for the contact card.\n * Each style renders the background differently using the same palette.\n */\n\nimport React from \"react\";\nimport type { GradientPalette } from \"./palettes\";\n\nexport type BackgroundStyleRenderer = (\n palette: GradientPalette,\n) => React.ReactNode;\n\nconst NOISE_TEXTURE =\n \"url('data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyMDAiIGhlaWdodD0iMjAwIj48ZmlsdGVyIGlkPSJhIj48ZmVUdXJidWxlbmNlIHR5cGU9ImZyYWN0YWxOb2lzZSIgYmFzZUZyZXF1ZW5jeT0iLjc1IiBzdGl0Y2hUaWxlcz0ic3RpdGNoIi8+PC9maWx0ZXI+PHJlY3Qgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIgZmlsdGVyPSJ1cmwoI2EpIi8+PC9zdmc+')\";\n\n/** Floating blurred orbs on gradient — organic, painterly feel */\nexport const orbsStyle: BackgroundStyleRenderer = (palette) => (\n <>\n <div\n className=\"absolute inset-0\"\n style={{ backgroundImage: palette.base }}\n />\n <div\n className=\"absolute inset-0\"\n style={{ backgroundImage: palette.overlay }}\n />\n <div\n className=\"absolute top-0 right-0 h-full w-2/3\"\n style={{ backgroundImage: palette.accent }}\n />\n <div\n className=\"absolute right-0 bottom-0 h-1/2 w-1/2 rounded-full blur-2xl\"\n style={{ backgroundColor: palette.orb1 }}\n />\n <div\n className=\"absolute top-1/4 left-1/4 h-32 w-32 rounded-full blur-xl\"\n style={{ backgroundColor: palette.orb2 }}\n />\n <div\n className=\"absolute bottom-1/3 left-0 h-24 w-40 rounded-full blur-xl\"\n style={{ backgroundColor: palette.orb3 }}\n />\n <div\n className=\"absolute inset-0 opacity-[0.15] mix-blend-overlay\"\n style={{ backgroundImage: NOISE_TEXTURE }}\n />\n </>\n);\n\n/** Clean base gradient only — minimal and elegant */\nexport const cleanStyle: BackgroundStyleRenderer = (palette) => (\n <div className=\"absolute inset-0\" style={{ backgroundImage: palette.base }} />\n);\n\n/** Soft radial mesh — ethereal, aurora-like glow */\nexport const auroraStyle: BackgroundStyleRenderer = (palette) => (\n <>\n <div\n className=\"absolute inset-0\"\n style={{ backgroundImage: palette.base }}\n />\n <div\n className=\"absolute inset-0\"\n style={{\n backgroundImage: `radial-gradient(ellipse 80% 60% at 15% 80%, ${palette.orb1}, transparent)`,\n }}\n />\n <div\n className=\"absolute inset-0\"\n style={{\n backgroundImage: `radial-gradient(ellipse 70% 50% at 85% 25%, ${palette.orb2}, transparent)`,\n }}\n />\n <div\n className=\"absolute inset-0\"\n style={{\n backgroundImage: `radial-gradient(ellipse 60% 70% at 50% 50%, ${palette.orb3}, transparent)`,\n }}\n />\n <div\n className=\"absolute inset-0 opacity-[0.08] mix-blend-overlay\"\n style={{ backgroundImage: NOISE_TEXTURE }}\n />\n </>\n);\n\n/** Overlapping angled panels — sharp, crystalline, modern */\nexport const prismStyle: BackgroundStyleRenderer = (palette) => (\n <>\n <div\n className=\"absolute inset-0\"\n style={{ backgroundImage: palette.base }}\n />\n <div\n className=\"absolute -top-12 -right-12 h-4/5 w-4/5 origin-center rotate-12 rounded-3xl opacity-30\"\n style={{ backgroundImage: palette.accent }}\n />\n <div\n className=\"absolute -bottom-10 -left-10 h-3/5 w-3/5 origin-center -rotate-6 rounded-3xl opacity-25\"\n style={{ backgroundImage: palette.overlay }}\n />\n <div\n className=\"absolute top-1/3 right-1/4 h-40 w-28 rotate-45 rounded-2xl opacity-20\"\n style={{ backgroundColor: palette.orb1 }}\n />\n <div\n className=\"absolute bottom-1/4 left-1/3 h-24 w-36 -rotate-12 rounded-2xl opacity-15\"\n style={{ backgroundColor: palette.orb2 }}\n />\n </>\n);\n\nexport const backgroundStyles: BackgroundStyleRenderer[] = [\n orbsStyle,\n cleanStyle,\n auroraStyle,\n prismStyle,\n];\n","\"use client\";\n\nimport React, { useMemo } from \"react\";\nimport {\n Mail,\n Phone,\n Building,\n ListChecks,\n StickyNote,\n CalendarDays,\n} from \"lucide-react\";\nimport {\n cn,\n Tooltip,\n TooltipTrigger,\n TooltipContent,\n TooltipProvider,\n} from \"@fluid-app/ui-primitives\";\nimport { StatusBadge } from \"../statusBadge\";\nimport { gradientPalettes, type GradientPalette } from \"./palettes\";\nimport { backgroundStyles, type BackgroundStyleRenderer } from \"./styles\";\n\nexport type ContactInfoCardData = {\n firstName?: string | null;\n lastName?: string | null;\n email?: string | null;\n phone?: string | null;\n address?: string | null;\n city?: string | null;\n state?: string | null;\n postalCode?: string | null;\n status?: string | null;\n avatarUrl?: string | null;\n countryName?: string | null;\n};\n\ntype ContactInfoCardProps = {\n contact: ContactInfoCardData;\n className?: string;\n onEdit?: () => void;\n showActions?: boolean;\n onCreateTask?: () => void;\n onCreateNote?: () => void;\n onViewEvents?: () => void;\n};\n\nfunction CardBackground({\n palette,\n renderer,\n}: {\n palette: GradientPalette;\n renderer: BackgroundStyleRenderer;\n}) {\n return <>{renderer(palette)}</>;\n}\n\nexport const ContactInfoCard: React.FC<ContactInfoCardProps> = ({\n contact,\n className,\n onEdit,\n showActions = false,\n onCreateTask,\n onCreateNote,\n onViewEvents,\n}) => {\n const fullName =\n [contact.firstName, contact.lastName].filter(Boolean).join(\" \") ||\n \"Unknown\";\n const initials = [contact.firstName?.[0], contact.lastName?.[0]]\n .filter(Boolean)\n .join(\"\");\n const status = contact.status ?? \"new\";\n\n const hasAddress =\n contact.address ||\n contact.city ||\n contact.state ||\n contact.postalCode ||\n contact.countryName;\n\n // Derive palette deterministically from contact identity\n const { palette, renderBackground } = useMemo(() => {\n const seed = contact.firstName || contact.lastName || contact.email || \"\";\n const hash = seed\n .split(\"\")\n .reduce((acc, char) => acc + char.charCodeAt(0), 0);\n const pIdx = hash % gradientPalettes.length;\n const sIdx =\n Math.floor(hash / gradientPalettes.length) % backgroundStyles.length;\n return {\n palette: gradientPalettes[pIdx]!,\n renderBackground: backgroundStyles[sIdx]!,\n };\n }, [contact.firstName, contact.lastName, contact.email]);\n\n return (\n <div\n className={cn(\n \"relative min-w-[250px] overflow-hidden rounded-2xl bg-black text-white shadow-lg\",\n className,\n )}\n >\n {/* Background */}\n <div className=\"absolute inset-0 opacity-70\">\n <CardBackground palette={palette} renderer={renderBackground} />\n </div>\n\n {/* Content */}\n <div className=\"relative z-10 p-6\">\n {/* Header */}\n <div className=\"mb-5 flex items-center justify-between\">\n <h3 className=\"text-base font-semibold tracking-tight\">\n Contact Information\n </h3>\n {onEdit && (\n <button\n type=\"button\"\n onClick={onEdit}\n className=\"bg-card/90 text-card-foreground hover:bg-card rounded-lg px-4 py-1.5 text-sm font-medium shadow-sm backdrop-blur-sm transition-colors\"\n >\n Edit\n </button>\n )}\n </div>\n\n {/* Avatar + Name + Status */}\n <div className=\"mb-5 flex items-center gap-3\">\n {contact.avatarUrl ? (\n <img\n src={contact.avatarUrl}\n alt={fullName}\n className=\"h-14 w-14 rounded-full border-2 border-white/40 object-cover shadow-md\"\n />\n ) : (\n <div className=\"flex h-14 w-14 items-center justify-center rounded-full border-2 border-white/40 bg-white/20 text-lg font-semibold shadow-md backdrop-blur-sm\">\n {initials}\n </div>\n )}\n <div className=\"min-w-0 flex-1\">\n <span className=\"block truncate text-3xl font-semibold\">\n {fullName}\n </span>\n <StatusBadge status={status} className=\"mt-1\" />\n </div>\n </div>\n\n {showActions && (\n <TooltipProvider delayDuration={100}>\n <div className=\"mb-6 flex flex-wrap gap-4\">\n <Tooltip>\n <TooltipTrigger asChild>\n <button\n type=\"button\"\n onClick={onCreateTask}\n disabled={!onCreateTask}\n className=\"flex h-11 w-11 items-center justify-center rounded-lg bg-white/20 text-white/90 backdrop-blur-sm transition-colors hover:bg-white/30 disabled:cursor-not-allowed disabled:opacity-40\"\n >\n <ListChecks className=\"h-5 w-5\" />\n </button>\n </TooltipTrigger>\n <TooltipContent>New Task</TooltipContent>\n </Tooltip>\n <Tooltip>\n <TooltipTrigger asChild>\n <button\n type=\"button\"\n onClick={onCreateNote}\n disabled={!onCreateNote}\n className=\"flex h-11 w-11 items-center justify-center rounded-lg bg-white/20 text-white/90 backdrop-blur-sm transition-colors hover:bg-white/30 disabled:cursor-not-allowed disabled:opacity-40\"\n >\n <StickyNote className=\"h-5 w-5\" />\n </button>\n </TooltipTrigger>\n <TooltipContent>New Note</TooltipContent>\n </Tooltip>\n <Tooltip>\n <TooltipTrigger asChild>\n <button\n type=\"button\"\n onClick={onViewEvents}\n disabled={!onViewEvents}\n className=\"flex h-11 w-11 items-center justify-center rounded-lg bg-white/20 text-white/90 backdrop-blur-sm transition-colors hover:bg-white/30 disabled:cursor-not-allowed disabled:opacity-40\"\n >\n <CalendarDays className=\"h-5 w-5\" />\n </button>\n </TooltipTrigger>\n <TooltipContent>Events (coming soon)</TooltipContent>\n </Tooltip>\n </div>\n </TooltipProvider>\n )}\n\n {/* Divider */}\n <div className=\"mb-6 h-0.5 bg-white/20\" />\n\n {/* Contact details */}\n <div className=\"space-y-3.5\">\n <div className=\"flex min-w-0 items-center gap-3\">\n <Mail className=\"h-4 w-4 shrink-0 text-white/70\" />\n {contact.email ? (\n <span className=\"truncate text-sm\">{contact.email}</span>\n ) : (\n <span className=\"text-sm text-white/40 italic\">\n No email entered\n </span>\n )}\n </div>\n\n <div className=\"flex min-w-0 items-center gap-3\">\n <Phone className=\"h-4 w-4 shrink-0 text-white/70\" />\n {contact.phone ? (\n <span className=\"truncate text-sm\">{contact.phone}</span>\n ) : (\n <span className=\"text-sm text-white/40 italic\">\n No phone number entered\n </span>\n )}\n </div>\n\n <div className=\"flex items-start gap-3\">\n <Building className=\"mt-0.5 h-4 w-4 text-white/70\" />\n {hasAddress ? (\n <div className=\"text-sm leading-relaxed\">\n {contact.address && <div>{contact.address}</div>}\n {(contact.city || contact.state || contact.postalCode) && (\n <div>\n {[contact.city, contact.state].filter(Boolean).join(\", \")}\n {contact.postalCode && ` ${contact.postalCode}`}\n </div>\n )}\n {contact.countryName && <div>{contact.countryName}</div>}\n </div>\n ) : (\n <span className=\"text-sm text-white/40 italic\">\n No address entered\n </span>\n )}\n </div>\n </div>\n </div>\n </div>\n );\n};\n","\"use client\";\n\nimport React, { useMemo, type PropsWithChildren } from \"react\";\nimport { useController, useFormContext, useWatch } from \"react-hook-form\";\nimport {\n Card,\n CardContent,\n CardHeader,\n CardTitle,\n cn,\n Input,\n Label,\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from \"@fluid-app/ui-primitives\";\n\ntype SectionProps = PropsWithChildren<{\n title: string;\n cardClassName?: string;\n}>;\n\nconst Section: React.FC<SectionProps> = ({\n title,\n cardClassName,\n children,\n}) => {\n return (\n <Card className={cn(\"bg-white\", cardClassName)}>\n <div className=\"font-inter flex items-center justify-between\">\n <CardHeader className=\"px-6 pt-2 pb-4\">\n <CardTitle className=\"text-base leading-none font-semibold tracking-tight whitespace-nowrap\">\n {title}\n </CardTitle>\n </CardHeader>\n </div>\n <CardContent>{children}</CardContent>\n </Card>\n );\n};\n\nfunction FormTextField({\n name,\n label,\n placeholder,\n type,\n}: {\n name: string;\n label: string;\n placeholder?: string;\n type?: string;\n}) {\n const { control } = useFormContext();\n const {\n field,\n fieldState: { error },\n } = useController({ name, control });\n return (\n <div className=\"space-y-1\">\n <Label htmlFor={name} className=\"font-inter text-foreground font-medium\">\n {label}\n </Label>\n <Input\n {...field}\n id={name}\n placeholder={placeholder}\n type={type}\n value={field.value ?? \"\"}\n className={cn(\n \"ring-input bg-white shadow-sm\",\n error && \"ring-destructive\",\n )}\n />\n {error && <p className=\"text-destructive text-sm\">{error.message}</p>}\n </div>\n );\n}\n\nfunction FormSelectField({\n name,\n label,\n placeholder,\n options,\n}: {\n name: string;\n label: string;\n placeholder?: string;\n options?: { name: string; value: string }[];\n}) {\n const { control } = useFormContext();\n const {\n field,\n fieldState: { error },\n } = useController({ name, control });\n return (\n <div className=\"space-y-1\">\n <Label htmlFor={name} className=\"font-inter text-foreground font-medium\">\n {label}\n </Label>\n <Select value={field.value ?? \"\"} onValueChange={field.onChange}>\n <SelectTrigger\n id={name}\n className={cn(\n \"w-full bg-white shadow-sm\",\n error && \"ring-destructive\",\n )}\n >\n <SelectValue placeholder={placeholder} />\n </SelectTrigger>\n <SelectContent position=\"popper\" sideOffset={4}>\n {options?.map((opt) => (\n <SelectItem key={opt.value} value={opt.value}>\n {opt.name}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n {error && <p className=\"text-destructive text-sm\">{error.message}</p>}\n </div>\n );\n}\n\nconst DEFAULT_COUNTRIES: { name: string; value: string }[] = [];\n\nconst statusOptions = [\n { name: \"New\", value: \"new\" },\n { name: \"Active\", value: \"active\" },\n { name: \"Inactive\", value: \"inactive\" },\n { name: \"Cold\", value: \"cold\" },\n { name: \"Lead\", value: \"lead\" },\n { name: \"Customer\", value: \"customer\" },\n];\n\ntype ContactDetailsFormProps = {\n className?: string;\n cardClassName?: string;\n countries?: { name: string; value: string }[];\n};\n\nexport const ContactDetailsForm: React.FC<ContactDetailsFormProps> = ({\n className,\n cardClassName,\n countries = DEFAULT_COUNTRIES,\n}) => {\n const { control } = useFormContext();\n const currentStatus = useWatch({ control, name: \"status\" });\n\n const effectiveStatusOptions = useMemo(() => {\n if (\n currentStatus &&\n typeof currentStatus === \"string\" &&\n !statusOptions.some((o) => o.value === currentStatus)\n ) {\n return [\n {\n name:\n currentStatus.charAt(0).toUpperCase() +\n currentStatus.slice(1).replace(/_/g, \" \"),\n value: currentStatus,\n },\n ...statusOptions,\n ];\n }\n return statusOptions;\n }, [currentStatus]);\n\n return (\n <div className={cn(\"space-y-6\", className)}>\n <Section title=\"Basic Information\" cardClassName={cardClassName}>\n <div className=\"grid grid-cols-1 gap-6 md:grid-cols-2\">\n <FormTextField\n name=\"first_name\"\n label=\"First Name\"\n placeholder=\"Enter first name\"\n />\n\n <FormTextField\n name=\"last_name\"\n label=\"Last Name\"\n placeholder=\"Enter last name\"\n />\n\n <FormTextField\n name=\"email\"\n label=\"Email\"\n placeholder=\"Enter email address\"\n type=\"email\"\n />\n\n <FormTextField\n name=\"phone\"\n label=\"Phone\"\n placeholder=\"Enter phone number\"\n />\n\n <FormSelectField\n name=\"status\"\n label=\"Status\"\n placeholder=\"Select status\"\n options={effectiveStatusOptions}\n />\n </div>\n </Section>\n\n <Section title=\"Address Information\" cardClassName={cardClassName}>\n <div className=\"grid grid-cols-1 gap-6 md:grid-cols-2\">\n <FormTextField\n name=\"address\"\n label=\"Address\"\n placeholder=\"Enter address\"\n />\n\n <FormTextField name=\"city\" label=\"City\" placeholder=\"Enter city\" />\n\n <FormTextField\n name=\"state\"\n label=\"State/Province\"\n placeholder=\"Enter state or province\"\n />\n\n <FormTextField\n name=\"postal_code\"\n label=\"Postal Code\"\n placeholder=\"Enter postal code\"\n />\n\n <FormSelectField\n name=\"country_id\"\n label=\"Country\"\n placeholder=\"Select country\"\n options={countries}\n />\n </div>\n </Section>\n </div>\n );\n};\n","\"use client\";\n\nimport React from \"react\";\nimport {\n Card,\n CardContent,\n CardHeader,\n CardTitle,\n} from \"@fluid-app/ui-primitives\";\nimport { StickyNote } from \"lucide-react\";\nimport type { ContactNote } from \"../../hooks/notes/use-contact-notes\";\n\ninterface NotesSidebarProps {\n notes: ContactNote[];\n isLoading?: boolean;\n onNavigateToNotes?: () => void;\n}\n\nexport function NotesSidebar({\n notes,\n isLoading,\n onNavigateToNotes,\n}: NotesSidebarProps): React.JSX.Element {\n return (\n <Card className=\"gap-2 bg-white pt-2\">\n <CardHeader className=\"px-6 pt-4 pb-2\">\n <div className=\"flex items-center justify-between\">\n <CardTitle className=\"text-sm leading-none font-semibold tracking-tight\">\n Notes\n </CardTitle>\n {notes.length > 0 && onNavigateToNotes && (\n <button\n type=\"button\"\n onClick={onNavigateToNotes}\n className=\"text-primary hover:text-primary/80 text-xs font-medium\"\n >\n View all\n </button>\n )}\n </div>\n </CardHeader>\n <CardContent>\n {isLoading ? (\n <div className=\"space-y-2\">\n {[1, 2].map((i) => (\n <div\n key={i}\n className=\"bg-muted h-4 w-3/4 animate-pulse rounded\"\n />\n ))}\n </div>\n ) : notes.length === 0 ? (\n <p className=\"text-muted-foreground text-sm\">No notes yet</p>\n ) : (\n <ul className=\"space-y-2\">\n {notes.slice(0, 5).map((note) => (\n <li key={note.id} className=\"flex items-start gap-2\">\n <StickyNote className=\"text-muted-foreground mt-0.5 h-3.5 w-3.5 shrink-0\" />\n <span className=\"text-muted-foreground line-clamp-1 text-sm\">\n {note.title}\n </span>\n </li>\n ))}\n {notes.length > 5 && (\n <li className=\"text-muted-foreground text-xs\">\n +{notes.length - 5} more\n </li>\n )}\n </ul>\n )}\n </CardContent>\n </Card>\n );\n}\n","/**\n * Generated API client functions for users_notes\n *\n * DO NOT EDIT THIS FILE DIRECTLY\n * This file is auto-generated. To update:\n * 1. Update the OpenAPI spec file\n * 2. Run: pnpm generate\n */\n\nimport type { FetchClient } from \"../lib/fetch-client\";\nimport type { operations } from \"../generated/users_notes\";\n\n// ============================================================================\n// Users Notes\n// ============================================================================\n\n/**\n * Create a note for a contact\n *\n *\n * @param client - Fetch client instance\n * @param body - body\n */\nexport async function createUserNote(\n client: FetchClient,\n body: operations[\"createUserNote\"][\"requestBody\"][\"content\"][\"application/json\"],\n): Promise<\n operations[\"createUserNote\"][\"responses\"][201][\"content\"][\"application/json\"]\n> {\n return client.post(`/api/users/v2025-06/notes`, body);\n}\n\n/**\n * List notes for a contact\n *\n *\n * @param client - Fetch client instance\n * @param params - params\n */\nexport async function listUserNotes(\n client: FetchClient,\n params: operations[\"listUserNotes\"][\"parameters\"][\"query\"],\n): Promise<\n operations[\"listUserNotes\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.get(`/api/users/v2025-06/notes`, params);\n}\n\n/**\n * Delete a note\n *\n *\n * @param client - Fetch client instance\n * @param id - id\n * @param params - params\n */\nexport async function deleteUserNote(\n client: FetchClient,\n id: string | number,\n params: operations[\"deleteUserNote\"][\"parameters\"][\"query\"],\n): Promise<\n operations[\"deleteUserNote\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.delete(`/api/users/v2025-06/notes/${id}`, { params });\n}\n\n/**\n * Get a note\n *\n *\n * @param client - Fetch client instance\n * @param id - id\n * @param params - params\n */\nexport async function getUserNote(\n client: FetchClient,\n id: string | number,\n params: operations[\"getUserNote\"][\"parameters\"][\"query\"],\n): Promise<\n operations[\"getUserNote\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.get(`/api/users/v2025-06/notes/${id}`, params);\n}\n\n/**\n * Update a note\n *\n *\n * @param client - Fetch client instance\n * @param id - id\n * @param body - body\n */\nexport async function updateUserNote(\n client: FetchClient,\n id: string | number,\n body: operations[\"updateUserNote\"][\"requestBody\"][\"content\"][\"application/json\"],\n): Promise<\n operations[\"updateUserNote\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.patch(`/api/users/v2025-06/notes/${id}`, body);\n}\n","/**\n * Generated API client functions for users_contacts\n *\n * DO NOT EDIT THIS FILE DIRECTLY\n * This file is auto-generated. To update:\n * 1. Update the OpenAPI spec file\n * 2. Run: pnpm generate\n */\n\nimport type { FetchClient } from \"../lib/fetch-client\";\nimport type { operations } from \"../generated/users_contacts\";\n\n// ============================================================================\n// Users Contacts\n// ============================================================================\n\n/**\n * List activities for a contact\n *\n *\n * @param client - Fetch client instance\n * @param id - id\n * @param params? - params?\n */\nexport async function listUserContactActivities(\n client: FetchClient,\n id: string | number,\n params?: operations[\"listUserContactActivities\"][\"parameters\"][\"query\"],\n): Promise<\n operations[\"listUserContactActivities\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.get(`/api/users/v2025-06/contacts/${id}/activities`, params);\n}\n\n/**\n * Bulk delete contacts\n *\n *\n * @param client - Fetch client instance\n * @param body - body\n */\nexport async function bulkDeleteUserContacts(\n client: FetchClient,\n body: operations[\"bulkDeleteUserContacts\"][\"requestBody\"][\"content\"][\"application/json\"],\n): Promise<\n operations[\"bulkDeleteUserContacts\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.delete(`/api/users/v2025-06/contacts/bulk_delete`, { body });\n}\n\n/**\n * Bulk import contacts\n *\n *\n * @param client - Fetch client instance\n * @param body - body\n */\nexport async function bulkImportUserContacts(\n client: FetchClient,\n body: operations[\"bulkImportUserContacts\"][\"requestBody\"][\"content\"][\"application/json\"],\n): Promise<\n operations[\"bulkImportUserContacts\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.post(`/api/users/v2025-06/contacts/bulk`, body);\n}\n\n/**\n * Create a contact\n *\n *\n * @param client - Fetch client instance\n * @param body - body\n */\nexport async function createUserContact(\n client: FetchClient,\n body: operations[\"createUserContact\"][\"requestBody\"][\"content\"][\"application/json\"],\n): Promise<\n operations[\"createUserContact\"][\"responses\"][201][\"content\"][\"application/json\"]\n> {\n return client.post(`/api/users/v2025-06/contacts`, body);\n}\n\n/**\n * List user's contacts\n *\n *\n * @param client - Fetch client instance\n * @param params? - params?\n */\nexport async function listUserContacts(\n client: FetchClient,\n params?: operations[\"listUserContacts\"][\"parameters\"][\"query\"],\n): Promise<\n operations[\"listUserContacts\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.get(`/api/users/v2025-06/contacts`, params);\n}\n\n/**\n * Delete a contact\n *\n *\n * @param client - Fetch client instance\n * @param id - id\n */\nexport async function deleteUserContact(\n client: FetchClient,\n id: string | number,\n): Promise<\n operations[\"deleteUserContact\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.delete(`/api/users/v2025-06/contacts/${id}`);\n}\n\n/**\n * Get a contact\n *\n *\n * @param client - Fetch client instance\n * @param id - id\n */\nexport async function getUserContact(\n client: FetchClient,\n id: string | number,\n): Promise<\n operations[\"getUserContact\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.get(`/api/users/v2025-06/contacts/${id}`);\n}\n\n/**\n * Update a contact\n *\n *\n * @param client - Fetch client instance\n * @param id - id\n * @param body - body\n */\nexport async function updateUserContact(\n client: FetchClient,\n id: string | number,\n body: operations[\"updateUserContact\"][\"requestBody\"][\"content\"][\"application/json\"],\n): Promise<\n operations[\"updateUserContact\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.patch(`/api/users/v2025-06/contacts/${id}`, body);\n}\n\n/**\n * Create a note for a contact (deprecated)\n *\n *\n * @param client - Fetch client instance\n * @param id - id\n * @param body - body\n */\nexport async function createUserContactNote(\n client: FetchClient,\n id: string | number,\n body: operations[\"createUserContactNote\"][\"requestBody\"][\"content\"][\"application/json\"],\n): Promise<\n operations[\"createUserContactNote\"][\"responses\"][201][\"content\"][\"application/json\"]\n> {\n return client.post(`/api/users/v2025-06/contacts/${id}/notes`, body);\n}\n\n/**\n * List notes for a contact\n *\n *\n * @param client - Fetch client instance\n * @param id - id\n */\nexport async function listUserContactNotes(\n client: FetchClient,\n id: string | number,\n): Promise<\n operations[\"listUserContactNotes\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.get(`/api/users/v2025-06/contacts/${id}/notes`);\n}\n\n/**\n * List orders for a contact\n *\n *\n * @param client - Fetch client instance\n * @param id - id\n * @param params? - params?\n */\nexport async function listUserContactOrders(\n client: FetchClient,\n id: string | number,\n params?: operations[\"listUserContactOrders\"][\"parameters\"][\"query\"],\n): Promise<\n operations[\"listUserContactOrders\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.get(`/api/users/v2025-06/contacts/${id}/orders`, params);\n}\n\n/**\n * Mark contact's activities as read\n *\n *\n * @param client - Fetch client instance\n * @param id - id\n */\nexport async function markUserContactRead(\n client: FetchClient,\n id: string | number,\n): Promise<\n operations[\"markUserContactRead\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.post(`/api/users/v2025-06/contacts/${id}/read`);\n}\n\n/**\n * List subscription orders for a contact\n *\n *\n * @param client - Fetch client instance\n * @param id - id\n * @param params? - params?\n */\nexport async function listUserContactSubscriptionOrders(\n client: FetchClient,\n id: string | number,\n params?: operations[\"listUserContactSubscriptionOrders\"][\"parameters\"][\"query\"],\n): Promise<\n operations[\"listUserContactSubscriptionOrders\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.get(\n `/api/users/v2025-06/contacts/${id}/subscription_orders`,\n params,\n );\n}\n\n/**\n * Create a task for a contact\n *\n *\n * @param client - Fetch client instance\n * @param id - id\n * @param body - body\n */\nexport async function createUserContactTask(\n client: FetchClient,\n id: string | number,\n body: operations[\"createUserContactTask\"][\"requestBody\"][\"content\"][\"application/json\"],\n): Promise<\n operations[\"createUserContactTask\"][\"responses\"][201][\"content\"][\"application/json\"]\n> {\n return client.post(`/api/users/v2025-06/contacts/${id}/tasks`, body);\n}\n\n/**\n * List tasks for a contact\n *\n *\n * @param client - Fetch client instance\n * @param id - id\n */\nexport async function listUserContactTasks(\n client: FetchClient,\n id: string | number,\n): Promise<\n operations[\"listUserContactTasks\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.get(`/api/users/v2025-06/contacts/${id}/tasks`);\n}\n\n/**\n * Toggle pinned status of a note (deprecated)\n *\n *\n * @param client - Fetch client instance\n * @param id - id\n * @param note_id - note_id\n * @param body - body\n */\nexport async function toggleUserContactNotePin(\n client: FetchClient,\n id: string | number,\n note_id: string | number,\n body: operations[\"toggleUserContactNotePin\"][\"requestBody\"][\"content\"][\"application/json\"],\n): Promise<\n operations[\"toggleUserContactNotePin\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.post(\n `/api/users/v2025-06/contacts/${id}/notes/${note_id}/toggle_pinned`,\n body,\n );\n}\n","\"use client\";\n\nimport { useQuery } from \"@tanstack/react-query\";\nimport { usersContacts } from \"@fluid-app/user-contacts-api-client\";\nimport type { FetchClient } from \"@fluid-app/api-client-core\";\nimport type { components } from \"@fluid-app/user-contacts-api-client\";\n\nexport type ContactNote = components[\"schemas\"][\"Note\"];\n\nexport const CONTACT_NOTES_QUERY_KEY = (contactId: string) =>\n [\"portal-contacts\", \"notes\", contactId] as const;\n\nexport function useContactNotes(client: FetchClient, contactId: string) {\n return useQuery({\n queryKey: CONTACT_NOTES_QUERY_KEY(contactId),\n queryFn: () => usersContacts.listUserContactNotes(client, contactId),\n enabled: !!contactId,\n select: (data) => data.notes,\n });\n}\n","\"use client\";\n\nimport { useMutation, useQueryClient } from \"@tanstack/react-query\";\nimport { usersNotes } from \"@fluid-app/user-notes-api-client\";\nimport { fluidToast } from \"@fluid-app/ui-primitives\";\nimport { parseApiErrors, type FetchClient } from \"@fluid-app/api-client-core\";\nimport { CONTACT_NOTES_QUERY_KEY } from \"./use-contact-notes\";\n\nexport function useDeleteContactNote(\n client: FetchClient,\n contactId: string,\n options?: { onSuccess?: () => void },\n) {\n const queryClient = useQueryClient();\n\n return useMutation({\n mutationFn: (noteId: number) =>\n usersNotes.deleteUserNote(client, noteId, {\n contact_id: Number(contactId),\n }),\n onSuccess: () => {\n fluidToast({ title: \"Note deleted\", type: \"success\" });\n queryClient.invalidateQueries({\n queryKey: CONTACT_NOTES_QUERY_KEY(contactId),\n });\n options?.onSuccess?.();\n },\n onError: (error) => {\n fluidToast({\n title: \"Failed to delete note\",\n type: \"error\",\n description: parseApiErrors(error),\n });\n },\n });\n}\n","\"use client\";\n\nimport { useMutation, useQueryClient } from \"@tanstack/react-query\";\nimport { usersContacts } from \"@fluid-app/user-contacts-api-client\";\nimport { fluidToast } from \"@fluid-app/ui-primitives\";\nimport { parseApiErrors, type FetchClient } from \"@fluid-app/api-client-core\";\nimport { CONTACT_NOTES_QUERY_KEY } from \"./use-contact-notes\";\n\nexport type CreateNoteInput = {\n title: string;\n body: string;\n note_type?: string | null;\n pinned?: boolean | null;\n};\n\nexport function useCreateContactNote(\n client: FetchClient,\n contactId: string,\n options?: { onSuccess?: () => void },\n) {\n const queryClient = useQueryClient();\n\n return useMutation({\n mutationFn: (input: CreateNoteInput) =>\n usersContacts.createUserContactNote(client, contactId, {\n id: Number(contactId),\n note: input,\n }),\n onSuccess: () => {\n fluidToast({ title: \"Note created\", type: \"success\" });\n queryClient.invalidateQueries({\n queryKey: CONTACT_NOTES_QUERY_KEY(contactId),\n });\n options?.onSuccess?.();\n },\n onError: (error) => {\n fluidToast({\n title: \"Failed to create note\",\n type: \"error\",\n description: parseApiErrors(error),\n });\n },\n });\n}\n","\"use client\";\n\nimport { useMutation, useQueryClient } from \"@tanstack/react-query\";\nimport { usersNotes } from \"@fluid-app/user-notes-api-client\";\nimport { fluidToast } from \"@fluid-app/ui-primitives\";\nimport { parseApiErrors, type FetchClient } from \"@fluid-app/api-client-core\";\nimport { CONTACT_NOTES_QUERY_KEY } from \"./use-contact-notes\";\n\nexport type UpdateNoteInput = {\n title?: string;\n body?: string;\n note_type?: string | null;\n pinned?: boolean | null;\n};\n\nexport function useUpdateContactNote(\n client: FetchClient,\n contactId: string,\n options?: { onSuccess?: () => void },\n) {\n const queryClient = useQueryClient();\n\n return useMutation({\n mutationFn: ({\n noteId,\n input,\n }: {\n noteId: number;\n input: UpdateNoteInput;\n }) =>\n usersNotes.updateUserNote(client, noteId, {\n contact_id: Number(contactId),\n id: noteId,\n note: input,\n }),\n onSuccess: () => {\n fluidToast({ title: \"Note updated\", type: \"success\" });\n queryClient.invalidateQueries({\n queryKey: CONTACT_NOTES_QUERY_KEY(contactId),\n });\n options?.onSuccess?.();\n },\n onError: (error) => {\n fluidToast({\n title: \"Failed to update note\",\n type: \"error\",\n description: parseApiErrors(error),\n });\n },\n });\n}\n","export function formatDateForDisplay(dateStr: string): string {\n const date = new Date(dateStr);\n return date.toLocaleDateString(\"en-US\", {\n month: \"short\",\n day: \"numeric\",\n year: \"numeric\",\n });\n}\n","\"use client\";\n\nimport React, { useEffect, useRef, useState } from \"react\";\nimport { useEditor, EditorContent } from \"@tiptap/react\";\nimport StarterKit from \"@tiptap/starter-kit\";\nimport Heading from \"@tiptap/extension-heading\";\nimport Placeholder from \"@tiptap/extension-placeholder\";\nimport TextAlign from \"@tiptap/extension-text-align\";\nimport Underline from \"@tiptap/extension-underline\";\nimport {\n AlignLeft,\n AlignCenter,\n AlignRight,\n AlignJustify,\n List,\n ListOrdered,\n Calendar,\n X,\n} from \"lucide-react\";\nimport { cn } from \"@fluid-app/ui-primitives\";\nimport { formatDateForDisplay } from \"../../utils/format-date\";\n\nexport interface NoteTaskEditorProps {\n titlePlaceholder?: string;\n bodyPlaceholder?: string;\n onChange?: (content: {\n title: string;\n body: string;\n dueDate?: string;\n }) => void;\n className?: string;\n /** Pre-populate the title (for edit mode) */\n initialTitle?: string;\n /** Pre-populate the body (for edit mode) */\n initialBody?: string;\n /** Show due date picker */\n showDueDate?: boolean;\n /** Pre-populate the due date (ISO string, for edit mode) */\n initialDueDate?: string;\n /** When false, the editor is body-only (no H1 title). Default true. */\n showTitle?: boolean;\n /** Override for the editor content area min-height class */\n editorClassName?: string;\n}\n\nfunction extractTitleAndBody(editor: ReturnType<typeof useEditor>): {\n title: string;\n body: string;\n} {\n if (!editor) return { title: \"\", body: \"\" };\n\n const doc = editor.state.doc;\n let title = \"\";\n const bodyParts: string[] = [];\n\n doc.forEach((node) => {\n if (node.type.name === \"heading\" && !title) {\n title = node.textContent.trim();\n } else {\n const text = node.textContent.trim();\n if (text) bodyParts.push(text);\n }\n });\n\n return { title, body: bodyParts.join(\"\\n\") };\n}\n\nfunction extractBodyOnly(editor: ReturnType<typeof useEditor>): string {\n if (!editor) return \"\";\n const parts: string[] = [];\n editor.state.doc.forEach((node) => {\n const text = node.textContent.trim();\n if (text) parts.push(text);\n });\n return parts.join(\"\\n\");\n}\n\nexport function NoteTaskEditor({\n titlePlaceholder = \"New Note\",\n bodyPlaceholder = \"Start writing...\",\n onChange,\n className,\n initialTitle,\n initialBody,\n showDueDate = false,\n initialDueDate,\n showTitle = true,\n editorClassName,\n}: NoteTaskEditorProps): React.JSX.Element {\n const [dueDate, setDueDate] = useState<string | undefined>(initialDueDate);\n const dueDateRef = useRef(initialDueDate);\n const dateInputRef = useRef<HTMLInputElement>(null);\n\n // Keep ref in sync with state so onUpdate always reads the latest value\n useEffect(() => {\n dueDateRef.current = dueDate;\n }, [dueDate]);\n\n const initialContent = showTitle\n ? initialTitle || initialBody\n ? `<h1>${initialTitle ?? \"\"}</h1>${initialBody ?? \"\"}`\n : undefined\n : initialBody || undefined;\n\n const extensions = [\n StarterKit.configure({\n heading: showTitle ? false : { levels: [] as const },\n bulletList: {\n keepMarks: true,\n keepAttributes: false,\n },\n orderedList: {\n keepMarks: true,\n keepAttributes: false,\n },\n }),\n ...(showTitle ? [Heading.configure({ levels: [1] })] : []),\n Placeholder.configure({\n placeholder: ({ node }) => {\n if (node.type.name === \"heading\") {\n return titlePlaceholder;\n }\n return bodyPlaceholder;\n },\n }),\n TextAlign.configure({\n types: showTitle ? [\"heading\", \"paragraph\"] : [\"paragraph\"],\n alignments: [\"left\", \"center\", \"right\", \"justify\"],\n }),\n Underline,\n ];\n\n const defaultContent = showTitle\n ? {\n type: \"doc\" as const,\n content: [{ type: \"heading\" as const, attrs: { level: 1 } }],\n }\n : undefined;\n\n const editor = useEditor({\n extensions,\n content: initialContent ?? defaultContent,\n onUpdate: ({ editor }) => {\n if (showTitle) {\n const { title, body } = extractTitleAndBody(editor);\n onChange?.({ title, body, dueDate: dueDateRef.current });\n } else {\n const body = extractBodyOnly(editor);\n onChange?.({ title: \"\", body, dueDate: dueDateRef.current });\n }\n },\n });\n\n const fireOnChange = () => {\n if (!editor || !onChange) return;\n if (showTitle) {\n const { title, body } = extractTitleAndBody(editor);\n onChange({ title, body, dueDate });\n } else {\n const body = extractBodyOnly(editor);\n onChange({ title: \"\", body, dueDate });\n }\n };\n\n // Fire onChange once on mount so the parent's ref is populated with the\n // initial values before the user makes any edits.\n useEffect(() => {\n fireOnChange();\n // We only want this to run once after the editor is first created.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [editor]);\n\n // Notify parent when due date changes\n useEffect(() => {\n fireOnChange();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [dueDate]);\n\n const buttonBase =\n \"flex h-7 w-7 items-center justify-center rounded text-xs transition-colors\";\n const buttonActive = \"bg-gray-100 text-primary\";\n const buttonInactive = \"text-gray-400 hover:bg-gray-50\";\n\n const toolbarSeparator = <div className=\"mx-1 h-5 w-px bg-gray-200\" />;\n\n return (\n <div\n className={cn(\n \"border-border flex flex-col overflow-hidden rounded-lg border\",\n className,\n )}\n >\n {/* Toolbar */}\n <div className=\"border-border flex items-center gap-0.5 border-b bg-gray-50 px-2 py-1.5\">\n {/* Bold */}\n <button\n type=\"button\"\n onClick={() => editor?.chain().focus().toggleBold().run()}\n disabled={!editor?.can().chain().focus().toggleBold().run()}\n className={cn(\n buttonBase,\n \"font-bold\",\n editor?.isActive(\"bold\") ? buttonActive : buttonInactive,\n )}\n title=\"Bold\"\n >\n B\n </button>\n\n {/* Italic */}\n <button\n type=\"button\"\n onClick={() => editor?.chain().focus().toggleItalic().run()}\n disabled={!editor?.can().chain().focus().toggleItalic().run()}\n className={cn(\n buttonBase,\n \"italic\",\n editor?.isActive(\"italic\") ? buttonActive : buttonInactive,\n )}\n title=\"Italic\"\n >\n I\n </button>\n\n {/* Underline */}\n <button\n type=\"button\"\n onClick={() => editor?.chain().focus().toggleUnderline().run()}\n disabled={!editor?.can().chain().focus().toggleUnderline().run()}\n className={cn(\n buttonBase,\n \"underline\",\n editor?.isActive(\"underline\") ? buttonActive : buttonInactive,\n )}\n title=\"Underline\"\n >\n U\n </button>\n\n {toolbarSeparator}\n\n {/* Align left */}\n <button\n type=\"button\"\n onClick={() => editor?.chain().focus().setTextAlign(\"left\").run()}\n className={cn(\n buttonBase,\n editor?.isActive({ textAlign: \"left\" })\n ? buttonActive\n : buttonInactive,\n )}\n title=\"Align left\"\n >\n <AlignLeft className=\"h-3.5 w-3.5\" />\n </button>\n\n {/* Align center */}\n <button\n type=\"button\"\n onClick={() => editor?.chain().focus().setTextAlign(\"center\").run()}\n className={cn(\n buttonBase,\n editor?.isActive({ textAlign: \"center\" })\n ? buttonActive\n : buttonInactive,\n )}\n title=\"Align center\"\n >\n <AlignCenter className=\"h-3.5 w-3.5\" />\n </button>\n\n {/* Align right */}\n <button\n type=\"button\"\n onClick={() => editor?.chain().focus().setTextAlign(\"right\").run()}\n className={cn(\n buttonBase,\n editor?.isActive({ textAlign: \"right\" })\n ? buttonActive\n : buttonInactive,\n )}\n title=\"Align right\"\n >\n <AlignRight className=\"h-3.5 w-3.5\" />\n </button>\n\n {/* Align justify */}\n <button\n type=\"button\"\n onClick={() => editor?.chain().focus().setTextAlign(\"justify\").run()}\n className={cn(\n buttonBase,\n editor?.isActive({ textAlign: \"justify\" })\n ? buttonActive\n : buttonInactive,\n )}\n title=\"Justify\"\n >\n <AlignJustify className=\"h-3.5 w-3.5\" />\n </button>\n\n {toolbarSeparator}\n\n {/* Bullet list */}\n <button\n type=\"button\"\n onClick={() => editor?.chain().focus().toggleBulletList().run()}\n className={cn(\n buttonBase,\n editor?.isActive(\"bulletList\") ? buttonActive : buttonInactive,\n )}\n title=\"Bullet list\"\n >\n <List className=\"h-3.5 w-3.5\" />\n </button>\n\n {/* Ordered list */}\n <button\n type=\"button\"\n onClick={() => editor?.chain().focus().toggleOrderedList().run()}\n className={cn(\n buttonBase,\n editor?.isActive(\"orderedList\") ? buttonActive : buttonInactive,\n )}\n title=\"Ordered list\"\n >\n <ListOrdered className=\"h-3.5 w-3.5\" />\n </button>\n\n {showDueDate && (\n <>\n {toolbarSeparator}\n {/* Due date */}\n {dueDate ? (\n <div className=\"bg-primary/10 flex items-center gap-1 rounded px-2 py-1\">\n <Calendar className=\"text-primary h-3.5 w-3.5\" />\n <span className=\"text-primary text-xs font-medium\">\n {formatDateForDisplay(dueDate)}\n </span>\n <button\n type=\"button\"\n onClick={() => setDueDate(undefined)}\n className=\"text-primary/60 hover:text-primary ml-1\"\n title=\"Remove due date\"\n >\n <X className=\"h-3 w-3\" />\n </button>\n </div>\n ) : (\n <>\n <button\n type=\"button\"\n onClick={() => dateInputRef.current?.showPicker()}\n className=\"flex h-7 cursor-pointer items-center gap-1 rounded px-2 text-xs font-medium text-gray-400 transition-colors hover:bg-gray-50 hover:text-gray-600\"\n >\n <Calendar className=\"h-3.5 w-3.5\" />\n <span>Due date</span>\n </button>\n <input\n ref={dateInputRef}\n type=\"date\"\n className=\"invisible absolute h-0 w-0\"\n onChange={(e) => {\n if (e.target.value) {\n // Convert YYYY-MM-DD to ISO datetime at local midnight\n const localDate = new Date(e.target.value + \"T00:00:00\");\n setDueDate(localDate.toISOString());\n }\n }}\n />\n </>\n )}\n </>\n )}\n </div>\n\n {/* Editor area */}\n <EditorContent\n editor={editor}\n className={editorClassName ?? \"min-h-[60vh] flex-1 overflow-y-auto p-4\"}\n />\n\n <style>{`\n .ProseMirror {\n outline: none;\n }\n\n .ProseMirror h1 {\n font-size: 1.5rem;\n font-weight: 600;\n line-height: 1.3;\n margin-bottom: 0.5rem;\n }\n\n .ProseMirror h1.is-empty::before,\n .ProseMirror p.is-empty::before {\n color: #9ca3af;\n content: attr(data-placeholder);\n float: left;\n height: 0;\n pointer-events: none;\n }\n\n .ProseMirror ul {\n list-style-type: disc;\n padding-left: 1.5rem;\n margin: 0.5rem 0;\n }\n\n .ProseMirror ol {\n list-style-type: decimal;\n padding-left: 1.5rem;\n margin: 0.5rem 0;\n }\n\n .ProseMirror li {\n margin: 0.25rem 0;\n display: list-item;\n }\n\n .ProseMirror li > p {\n margin: 0;\n }\n `}</style>\n </div>\n );\n}\n","\"use client\";\n\nimport React, { useRef, useState } from \"react\";\nimport { Calendar, X } from \"lucide-react\";\nimport {\n Button,\n Input,\n Sheet,\n SheetContent,\n SheetFooter,\n SheetHeader,\n SheetTitle,\n} from \"@fluid-app/ui-primitives\";\nimport { NoteTaskEditor } from \"./note-task-editor\";\nimport { formatDateForDisplay } from \"../../utils/format-date\";\n\nexport interface NoteTaskModalProps {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n mode: \"create\" | \"edit\";\n type: \"note\" | \"task\";\n initialTitle?: string;\n initialBody?: string;\n initialDueDate?: string;\n showDueDate?: boolean;\n onSave: (data: { title: string; body: string; dueDate?: string }) => void;\n isPending?: boolean;\n isCompleted?: boolean;\n onToggleComplete?: () => void;\n isTogglePending?: boolean;\n}\n\nexport function NoteTaskModal({\n open,\n onOpenChange,\n mode,\n type,\n initialTitle = \"\",\n initialBody = \"\",\n initialDueDate,\n showDueDate = false,\n onSave,\n isPending = false,\n isCompleted,\n onToggleComplete,\n isTogglePending = false,\n}: NoteTaskModalProps): React.JSX.Element {\n const [title, setTitle] = useState(initialTitle);\n const [body, setBody] = useState(initialBody);\n const dateInputRef = useRef<HTMLInputElement>(null);\n const [dueDate, setDueDate] = useState<string | undefined>(initialDueDate);\n\n const typeLabel = type === \"note\" ? \"Note\" : \"Task\";\n const sheetTitle = mode === \"edit\" ? `Edit ${typeLabel}` : `New ${typeLabel}`;\n\n const requiresBody = type === \"note\";\n const canSave =\n !!title.trim() && (!requiresBody || !!body.trim()) && !isPending;\n\n const handleSave = () => {\n if (!canSave) return;\n onSave({\n title: title.trim(),\n body,\n dueDate,\n });\n };\n\n return (\n <Sheet open={open} onOpenChange={onOpenChange}>\n <SheetContent className=\"flex w-full flex-col sm:max-w-lg\">\n <SheetHeader>\n <SheetTitle>{sheetTitle}</SheetTitle>\n </SheetHeader>\n\n <div className=\"flex min-h-0 flex-1 flex-col gap-3\">\n <Input\n placeholder={`${typeLabel} title`}\n value={title}\n onChange={(e) => setTitle(e.target.value)}\n autoFocus\n />\n\n <NoteTaskEditor\n showTitle={false}\n bodyPlaceholder=\"Start writing...\"\n initialBody={initialBody}\n editorClassName=\"min-h-[200px] flex-1 overflow-y-auto p-4\"\n onChange={(content) => {\n setBody(content.body);\n }}\n />\n\n {showDueDate && (\n <div className=\"flex items-center gap-2\">\n {dueDate ? (\n <div className=\"bg-primary/10 inline-flex items-center gap-1.5 rounded-md px-2.5 py-1.5\">\n <Calendar className=\"text-primary h-3.5 w-3.5\" />\n <span className=\"text-primary text-sm font-medium\">\n Due {formatDateForDisplay(dueDate)}\n </span>\n <button\n type=\"button\"\n onClick={() => setDueDate(undefined)}\n className=\"text-primary/60 hover:text-primary ml-1\"\n title=\"Remove due date\"\n >\n <X className=\"h-3 w-3\" />\n </button>\n </div>\n ) : (\n <div className=\"relative\">\n <button\n type=\"button\"\n onClick={() => dateInputRef.current?.showPicker()}\n className=\"text-muted-foreground hover:text-foreground inline-flex cursor-pointer items-center gap-1.5 rounded-md px-2.5 py-1.5 text-sm font-medium transition-colors hover:bg-gray-50\"\n >\n <Calendar className=\"h-3.5 w-3.5\" />\n <span>Add due date</span>\n </button>\n <input\n ref={dateInputRef}\n type=\"date\"\n className=\"invisible absolute h-0 w-0\"\n onChange={(e) => {\n if (e.target.value) {\n const localDate = new Date(\n e.target.value + \"T00:00:00\",\n );\n setDueDate(localDate.toISOString());\n }\n }}\n />\n </div>\n )}\n </div>\n )}\n </div>\n\n <SheetFooter className=\"flex-row justify-end gap-2 border-t pt-4\">\n {mode === \"edit\" && onToggleComplete && (\n <Button\n variant=\"outline\"\n onClick={onToggleComplete}\n disabled={isTogglePending}\n className=\"mr-auto\"\n >\n {isCompleted ? \"Mark Incomplete\" : \"Mark Complete\"}\n </Button>\n )}\n <Button variant=\"outline\" onClick={() => onOpenChange(false)}>\n Cancel\n </Button>\n <Button onClick={handleSave} disabled={!canSave}>\n {isPending ? \"Saving...\" : \"Save\"}\n </Button>\n </SheetFooter>\n </SheetContent>\n </Sheet>\n );\n}\n","\"use client\";\n\nimport React, { useImperativeHandle, useState } from \"react\";\nimport {\n Calendar,\n Paperclip,\n Plus,\n StickyNote,\n Pen,\n EllipsisVertical,\n} from \"lucide-react\";\nimport {\n AlertDialog,\n AlertDialogAction,\n AlertDialogCancel,\n AlertDialogContent,\n AlertDialogDescription,\n AlertDialogFooter,\n AlertDialogHeader,\n AlertDialogTitle,\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuTrigger,\n} from \"@fluid-app/ui-primitives\";\nimport type { ContactNote } from \"../../hooks/notes/use-contact-notes\";\nimport { useDeleteContactNote } from \"../../hooks/notes/use-delete-contact-note\";\nimport { useCreateContactNote } from \"../../hooks/notes/use-create-contact-note\";\nimport { useUpdateContactNote } from \"../../hooks/notes/use-update-contact-note\";\nimport { NoteTaskModal } from \"../editor/note-task-modal\";\nimport type { FetchClient } from \"@fluid-app/api-client-core\";\n\n// ---------------------------------------------------------------------------\n// Date helpers\n// ---------------------------------------------------------------------------\n\nfunction formatDueDate(dateStr: string): string {\n const date = new Date(dateStr);\n return date.toLocaleDateString(\"en-US\", {\n month: \"short\",\n day: \"numeric\",\n year: \"numeric\",\n });\n}\n\n// ---------------------------------------------------------------------------\n// Empty state\n// ---------------------------------------------------------------------------\n\nfunction EmptyState({ onCreateNote }: { onCreateNote: () => void }) {\n return (\n <div className=\"flex flex-col items-center justify-center px-4 py-12 text-center\">\n <div className=\"relative mb-6\">\n <div className=\"flex h-20 w-20 items-center justify-center rounded-full bg-gradient-to-br from-amber-100 to-yellow-100\">\n <StickyNote className=\"h-9 w-9 text-amber-500\" />\n </div>\n <div className=\"absolute -right-2 -bottom-1 flex h-9 w-9 items-center justify-center rounded-full border-2 border-white bg-gradient-to-br from-orange-100 to-red-100 shadow-sm\">\n <Pen className=\"h-4 w-4 text-orange-500\" />\n </div>\n </div>\n <h4 className=\"text-foreground text-base font-semibold\">No notes yet</h4>\n <p className=\"text-muted-foreground mt-1.5 max-w-[260px] text-sm leading-relaxed\">\n Capture key details and insights about this contact to stay on top of\n every conversation\n </p>\n <button\n type=\"button\"\n onClick={onCreateNote}\n className=\"bg-primary text-primary-foreground hover:bg-primary/90 mt-4 inline-flex items-center gap-1.5 rounded-lg px-4 py-2 text-sm font-medium transition-colors\"\n >\n <Plus className=\"h-3.5 w-3.5\" />\n New Note\n </button>\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Note card\n// ---------------------------------------------------------------------------\n\nfunction NoteCard({\n note,\n onEdit,\n onDelete,\n}: {\n note: ContactNote;\n onEdit: (note: ContactNote) => void;\n onDelete: (note: ContactNote) => void;\n}) {\n const assetCount = note.assets?.length ?? 0;\n\n return (\n <div\n role=\"button\"\n tabIndex={0}\n onClick={() => onEdit(note)}\n onKeyDown={(e) => {\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n onEdit(note);\n }\n }}\n className=\"border-border bg-card hover:border-border/80 cursor-pointer rounded-xl border p-5 transition-colors\"\n >\n {/* Title row with ellipsis menu */}\n <div className=\"flex items-start justify-between gap-2\">\n <h4 className=\"text-foreground line-clamp-1 text-sm font-semibold\">\n {note.title}\n </h4>\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <button\n type=\"button\"\n onClick={(e) => e.stopPropagation()}\n className=\"text-muted-foreground inline-flex h-6 w-6 items-center justify-center rounded-md hover:opacity-70\"\n >\n <EllipsisVertical className=\"h-4 w-4\" />\n </button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\">\n <DropdownMenuItem\n className=\"text-destructive\"\n onClick={(e) => {\n e.stopPropagation();\n onDelete(note);\n }}\n >\n Delete\n </DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenu>\n </div>\n\n {/* Body */}\n <p className=\"text-muted-foreground mt-1.5 line-clamp-4 text-sm leading-relaxed\">\n {note.body}\n </p>\n\n {/* Meta row */}\n <div className=\"mt-3 flex flex-wrap items-center gap-4\">\n {note.due_at && (\n <div className=\"flex items-center gap-1.5\">\n <Calendar className=\"text-primary h-3.5 w-3.5\" />\n <span className=\"text-primary text-xs font-medium\">\n Due {formatDueDate(note.due_at)}\n </span>\n </div>\n )}\n {!note.due_at && note.due_date && (\n <div className=\"flex items-center gap-1.5\">\n <Calendar className=\"text-primary h-3.5 w-3.5\" />\n <span className=\"text-primary text-xs font-medium\">\n Due {formatDueDate(note.due_date)}\n </span>\n </div>\n )}\n {assetCount > 0 && (\n <div className=\"flex items-center gap-1.5\">\n <Paperclip className=\"text-muted-foreground h-3.5 w-3.5\" />\n <span className=\"text-muted-foreground text-xs\">\n {assetCount} {assetCount === 1 ? \"Attachment\" : \"Attachments\"}\n </span>\n </div>\n )}\n </div>\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Main component\n// ---------------------------------------------------------------------------\n\nexport interface NotesListProps {\n notes: ContactNote[];\n isLoading?: boolean;\n contactId: string;\n client: FetchClient;\n /** Notes API client for mutations */\n notesClient?: FetchClient;\n /** Ref that receives the openCreateModal callback for external triggering */\n ref?: React.Ref<(() => void) | null>;\n}\n\nexport function NotesList({\n notes,\n isLoading,\n contactId,\n client,\n notesClient,\n ref,\n}: NotesListProps): React.JSX.Element {\n const [noteToDelete, setNoteToDelete] = useState<ContactNote | null>(null);\n const [modalOpen, setModalOpen] = useState(false);\n const [editingNote, setEditingNote] = useState<ContactNote | null>(null);\n\n const effectiveClient = notesClient ?? client;\n\n const deleteNote = useDeleteContactNote(effectiveClient, contactId);\n const createNote = useCreateContactNote(effectiveClient, contactId, {\n onSuccess: () => setModalOpen(false),\n });\n const updateNote = useUpdateContactNote(effectiveClient, contactId, {\n onSuccess: () => setEditingNote(null),\n });\n\n const openCreateModal = () => {\n setEditingNote(null);\n setModalOpen(true);\n };\n\n // Expose openCreateModal to parent via ref\n useImperativeHandle(ref, () => openCreateModal);\n\n const handleSave = (data: {\n title: string;\n body: string;\n dueDate?: string;\n }) => {\n if (editingNote) {\n updateNote.mutate({\n noteId: editingNote.id,\n input: { title: data.title, body: data.body },\n });\n } else {\n createNote.mutate({ title: data.title, body: data.body });\n }\n };\n\n const isModalOpen = modalOpen || editingNote !== null;\n const handleModalOpenChange = (open: boolean) => {\n if (!open) {\n setModalOpen(false);\n setEditingNote(null);\n }\n };\n\n if (isLoading) {\n return (\n <div className=\"space-y-4\">\n <div className=\"flex items-center justify-between\">\n <div>\n <div className=\"bg-muted h-5 w-24 animate-pulse rounded\" />\n <div className=\"bg-muted mt-1 h-4 w-48 animate-pulse rounded\" />\n </div>\n <div className=\"bg-muted h-8 w-24 animate-pulse rounded-lg\" />\n </div>\n <div className=\"grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-3\">\n {[1, 2, 3].map((i) => (\n <div\n key={i}\n className=\"border-border bg-muted/50 h-40 animate-pulse rounded-xl border\"\n />\n ))}\n </div>\n </div>\n );\n }\n\n return (\n <div className=\"space-y-4\">\n {/* Header */}\n <div className=\"flex items-start justify-between\">\n <div>\n <h3 className=\"text-foreground text-base font-semibold\">\n Notes ({notes.length})\n </h3>\n <p className=\"text-muted-foreground mt-0.5 text-sm\">\n Capture key details and insights about this contact\n </p>\n </div>\n <button\n type=\"button\"\n onClick={openCreateModal}\n className=\"bg-primary text-primary-foreground hover:bg-primary/90 inline-flex items-center gap-1.5 rounded-lg px-3 py-1.5 text-sm font-medium transition-colors\"\n >\n <Plus className=\"h-3.5 w-3.5\" />\n Add Note\n </button>\n </div>\n\n {/* Content */}\n {notes.length === 0 ? (\n <EmptyState onCreateNote={openCreateModal} />\n ) : (\n <div className=\"grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-3\">\n {notes.map((note) => (\n <NoteCard\n key={note.id}\n note={note}\n onEdit={setEditingNote}\n onDelete={setNoteToDelete}\n />\n ))}\n </div>\n )}\n\n {/* Create/Edit modal */}\n <NoteTaskModal\n key={editingNote?.id ?? \"create\"}\n open={isModalOpen}\n onOpenChange={handleModalOpenChange}\n mode={editingNote ? \"edit\" : \"create\"}\n type=\"note\"\n initialTitle={editingNote?.title ?? \"\"}\n initialBody={editingNote?.body ?? \"\"}\n onSave={handleSave}\n isPending={createNote.isPending || updateNote.isPending}\n />\n\n {/* Delete confirmation modal */}\n <AlertDialog\n open={!!noteToDelete}\n onOpenChange={(open) => {\n if (!open) setNoteToDelete(null);\n }}\n >\n <AlertDialogContent>\n <AlertDialogHeader>\n <AlertDialogTitle>Delete Note</AlertDialogTitle>\n <AlertDialogDescription>\n Are you sure you want to delete "{noteToDelete?.title}"?\n This action cannot be undone.\n </AlertDialogDescription>\n </AlertDialogHeader>\n <AlertDialogFooter>\n <AlertDialogCancel>Cancel</AlertDialogCancel>\n <AlertDialogAction\n variant=\"destructive\"\n onClick={() => {\n if (noteToDelete) {\n deleteNote.mutate(noteToDelete.id);\n }\n }}\n >\n Delete\n </AlertDialogAction>\n </AlertDialogFooter>\n </AlertDialogContent>\n </AlertDialog>\n </div>\n );\n}\n","\"use client\";\n\nimport React, { useMemo, useState } from \"react\";\nimport type { LucideIcon } from \"lucide-react\";\nimport {\n Bell,\n Calendar,\n SquareCheckBig,\n Eye,\n MessageCircle,\n Play,\n ShoppingCart,\n Star,\n Trophy,\n UserPlus,\n User,\n Rocket,\n Share2,\n} from \"lucide-react\";\nimport { cn } from \"@fluid-app/ui-primitives\";\nimport type { ContactActivity } from \"../../hooks/contacts/use-contact-activities\";\n\n// ---------------------------------------------------------------------------\n// Slug → icon mapping\n// ---------------------------------------------------------------------------\n\nconst SLUG_ICON_MAP: Record<string, LucideIcon> = {\n order_placed: ShoppingCart,\n abandoned_cart: ShoppingCart,\n cart_items_added: ShoppingCart,\n new_cart_items_added: ShoppingCart,\n direct_message: MessageCircle,\n comment_reply: MessageCircle,\n message_received: MessageCircle,\n message_sent: MessageCircle,\n video: Play,\n video_complete: Play,\n video_contact: Play,\n video_complete_contact: Play,\n new_lead: UserPlus,\n page_views_contact: UserPlus,\n smart_link_clicked: UserPlus,\n page_views: Eye,\n upcoming_event: Calendar,\n review_left: Star,\n tasks: SquareCheckBig,\n announcements: Bell,\n fantasy_point: Trophy,\n};\n\nfunction getActivityIcon(slug: string | null | undefined): LucideIcon {\n return (slug && SLUG_ICON_MAP[slug]) || User;\n}\n\n// ---------------------------------------------------------------------------\n// Slug → type label mapping\n// ---------------------------------------------------------------------------\n\nfunction getTypeLabel(slug: string | null | undefined): string {\n if (!slug) return \"Notification\";\n if (\n slug.includes(\"message\") ||\n slug === \"direct_message\" ||\n slug === \"comment_reply\"\n )\n return \"Message\";\n if (slug.includes(\"page_view\")) return \"Alert from Fluid.app\";\n if (slug.includes(\"video\")) return \"Alert from Fluid.app\";\n if (\n slug.includes(\"order\") ||\n slug.includes(\"cart\") ||\n slug === \"abandoned_cart\"\n )\n return \"Alert from Fluid.app\";\n if (slug === \"tasks\") return \"Task\";\n if (slug === \"smart_link_clicked\" || slug === \"new_lead\")\n return \"Alert from Fluid.app\";\n if (slug === \"announcements\") return \"Announcement\";\n if (slug === \"upcoming_event\") return \"Event\";\n if (slug === \"review_left\") return \"Review\";\n if (slug === \"fantasy_point\") return \"Points\";\n return \"Notification\";\n}\n\n// ---------------------------------------------------------------------------\n// Slug → content card category\n// ---------------------------------------------------------------------------\n\nfunction getSlugCategory(slug: string | null | undefined): string {\n if (!slug) return \"other\";\n if (\n slug.includes(\"message\") ||\n slug === \"direct_message\" ||\n slug === \"comment_reply\"\n )\n return \"message\";\n if (slug === \"tasks\") return \"task\";\n if (slug.includes(\"page_view\") || slug === \"smart_link_clicked\")\n return \"page_view\";\n if (slug.includes(\"video\")) return \"video\";\n if (\n slug.includes(\"order\") ||\n slug.includes(\"cart\") ||\n slug === \"abandoned_cart\"\n )\n return \"order\";\n return \"other\";\n}\n\n// ---------------------------------------------------------------------------\n// Date helpers\n// ---------------------------------------------------------------------------\n\nfunction getDateKey(timestamp: string): string {\n return new Date(timestamp).toISOString().split(\"T\")[0] ?? timestamp;\n}\n\nfunction formatDateHeader(timestamp: string): string {\n const date = new Date(timestamp);\n const now = new Date();\n const todayKey = now.toISOString().split(\"T\")[0];\n const yesterdayKey = new Date(now.getTime() - 86400000)\n .toISOString()\n .split(\"T\")[0];\n const key = getDateKey(timestamp);\n\n if (key === todayKey) return \"Today\";\n if (key === yesterdayKey) return \"Yesterday\";\n return date.toLocaleDateString(\"en-US\", { month: \"long\", day: \"numeric\" });\n}\n\nfunction formatTimestamp(timestamp: string): string {\n return new Date(timestamp).toLocaleTimeString(\"en-US\", {\n hour: \"numeric\",\n minute: \"2-digit\",\n hour12: true,\n });\n}\n\n// ---------------------------------------------------------------------------\n// Filter\n// ---------------------------------------------------------------------------\n\nconst filterOptions = [\"All\", \"New\"] as const;\ntype FilterOption = (typeof filterOptions)[number];\n\nfunction filterActivities(\n activities: ContactActivity[],\n filter: FilterOption,\n): ContactActivity[] {\n if (filter === \"New\") return activities.filter((a) => !a.read_at);\n return activities;\n}\n\n// ---------------------------------------------------------------------------\n// Group by date\n// ---------------------------------------------------------------------------\n\ntype ActivityGroup = { label: string; items: ContactActivity[] };\n\nfunction groupByDate(activities: ContactActivity[]): ActivityGroup[] {\n const sorted = [...activities].sort(\n (a, b) =>\n new Date(b.created_at).getTime() - new Date(a.created_at).getTime(),\n );\n\n const map = new Map<string, ContactActivity[]>();\n for (const activity of sorted) {\n const key = getDateKey(activity.created_at);\n const existing = map.get(key);\n if (existing) {\n existing.push(activity);\n } else {\n map.set(key, [activity]);\n }\n }\n\n return Array.from(map.entries()).map(([, items]) => ({\n label: formatDateHeader(items[0]!.created_at),\n items,\n }));\n}\n\n// ---------------------------------------------------------------------------\n// Empty state\n// ---------------------------------------------------------------------------\n\nfunction EmptyState() {\n return (\n <div className=\"flex flex-col items-center justify-center px-4 py-12 text-center\">\n <div className=\"relative mb-6\">\n <div className=\"flex h-20 w-20 items-center justify-center rounded-full bg-gradient-to-br from-violet-100 to-indigo-100\">\n <Rocket className=\"h-9 w-9 text-violet-500\" />\n </div>\n <div className=\"absolute -right-2 -bottom-1 flex h-9 w-9 items-center justify-center rounded-full border-2 border-white bg-gradient-to-br from-pink-100 to-rose-100 shadow-sm\">\n <Share2 className=\"h-4 w-4 text-pink-500\" />\n </div>\n </div>\n <h4 className=\"text-foreground text-base font-semibold\">\n No activity yet\n </h4>\n <p className=\"text-muted-foreground mt-1.5 max-w-[240px] text-sm leading-relaxed\">\n Reach out and share a product or media to start building this\n contact's story\n </p>\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Content card - renders below header/subtitle based on slug category\n// ---------------------------------------------------------------------------\n\nfunction ContentCard({ activity }: { activity: ContactActivity }) {\n const category = getSlugCategory(activity.slug);\n const headerText = activity.formatted_description;\n\n // Extra data beyond what's shown in the header\n const extraDescription =\n activity.description && activity.description !== headerText\n ? activity.description\n : null;\n const extraTitle =\n activity.title && activity.title !== headerText ? activity.title : null;\n\n // Only render card when there's additional data\n if (!extraDescription && !extraTitle && category !== \"task\") return null;\n\n switch (category) {\n case \"message\":\n if (!extraDescription) return null;\n return (\n <div className=\"border-border bg-background mt-2 rounded-lg border p-3\">\n <p className=\"text-foreground text-sm leading-relaxed\">\n {extraDescription}\n </p>\n </div>\n );\n\n case \"task\":\n if (!extraDescription) return null;\n return (\n <div className=\"bg-muted/50 mt-2 rounded-lg p-3\">\n <p className=\"text-muted-foreground text-sm\">{extraDescription}</p>\n <div className=\"text-primary mt-2 flex items-center gap-1.5\">\n <Calendar className=\"h-3.5 w-3.5\" />\n <span className=\"text-xs font-medium\">\n Due {extraTitle || \"TBD\"}\n </span>\n </div>\n </div>\n );\n\n case \"page_view\":\n if (!extraTitle && !extraDescription) return null;\n return (\n <div className=\"bg-muted/50 mt-2 rounded-lg p-3\">\n <p className=\"text-foreground text-sm font-semibold\">\n {extraTitle || extraDescription}\n </p>\n <p className=\"text-muted-foreground text-xs\">\n {getTypeLabel(activity.slug)}\n </p>\n </div>\n );\n\n case \"video\":\n if (!extraTitle && !extraDescription) return null;\n return (\n <div className=\"bg-muted/50 mt-2 rounded-lg p-3\">\n {extraTitle && (\n <p className=\"text-foreground text-sm font-semibold\">\n {extraTitle}\n </p>\n )}\n {extraDescription && (\n <p className=\"text-muted-foreground mt-0.5 text-xs\">\n {extraDescription}\n </p>\n )}\n </div>\n );\n\n case \"order\":\n if (!extraTitle && !extraDescription) return null;\n return (\n <div className=\"bg-muted/50 mt-2 rounded-lg p-3\">\n <p className=\"text-foreground text-sm font-semibold\">\n {extraTitle || extraDescription}\n </p>\n </div>\n );\n\n default:\n return null;\n }\n}\n\n// ---------------------------------------------------------------------------\n// Activity item (redesigned)\n// ---------------------------------------------------------------------------\n\nfunction ActivityItem({\n activity,\n isFirst,\n isLast,\n}: {\n activity: ContactActivity;\n isFirst: boolean;\n isLast: boolean;\n}) {\n const Icon = getActivityIcon(activity.slug);\n const isUnread = !activity.read_at;\n const typeLabel = getTypeLabel(activity.slug);\n const headerText = activity.formatted_description;\n\n // Subtitle: show description if different from header, or title if different\n const subtitle =\n activity.description && activity.description !== headerText\n ? activity.description\n : activity.title && activity.title !== headerText\n ? activity.title\n : null;\n\n return (\n <div className=\"relative flex gap-3\">\n {/* Timeline column */}\n <div className=\"relative flex w-10 shrink-0 flex-col items-center\">\n {/* Vertical dashed line */}\n {!isFirst && !isLast && (\n <div className=\"absolute top-0 bottom-0 left-1/2 -translate-x-1/2 border-l-2 border-dashed border-blue-400\" />\n )}\n {!isFirst && isLast && (\n <div className=\"absolute top-0 left-1/2 h-5 -translate-x-1/2 border-l-2 border-dashed border-blue-400\" />\n )}\n {isFirst && !isLast && (\n <div className=\"absolute top-[44px] bottom-0 left-1/2 -translate-x-1/2 border-l-2 border-dashed border-blue-400\" />\n )}\n\n {/* Icon badge */}\n <div className=\"bg-background relative z-10 rounded-full\">\n <div className=\"bg-foreground text-background flex h-10 w-10 items-center justify-center rounded-full\">\n <Icon className=\"h-4 w-4\" />\n </div>\n {/* Unread dot */}\n {isUnread && (\n <div className=\"border-background absolute -top-0.5 -right-0.5 h-3 w-3 rounded-full border-2 bg-blue-600\" />\n )}\n </div>\n </div>\n\n {/* Content */}\n <div className=\"min-w-0 flex-1 pt-1 pb-8\">\n {/* Header row: formatted_description + type label + timestamp */}\n <div className=\"flex items-start gap-1.5\">\n <p className=\"text-foreground text-sm font-semibold\">{headerText}</p>\n <span className=\"text-muted-foreground mt-0.5 shrink-0 text-xs\">\n {typeLabel}\n </span>\n <span className=\"text-muted-foreground mt-0.5 flex-1 text-right text-xs\">\n {formatTimestamp(activity.created_at)}\n </span>\n </div>\n\n {/* Subtitle */}\n {subtitle && (\n <p className=\"text-muted-foreground mt-0.5 text-sm\">{subtitle}</p>\n )}\n\n {/* Content card */}\n <ContentCard activity={activity} />\n </div>\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Date separator\n// ---------------------------------------------------------------------------\n\nfunction DateSeparator({ label }: { label: string }) {\n return (\n <div className=\"py-3\">\n <p className=\"text-foreground text-base font-bold\">{label}</p>\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Main component\n// ---------------------------------------------------------------------------\n\nexport interface ActivityFeedProps {\n activities: ContactActivity[];\n isLoading?: boolean;\n /** Called when the user explicitly clicks \"Mark all read\" */\n onMarkRead?: () => void;\n}\n\nexport function ActivityFeed({\n activities,\n isLoading,\n onMarkRead,\n}: ActivityFeedProps): React.JSX.Element {\n const [activeFilter, setActiveFilter] = useState<FilterOption>(\"All\");\n\n const handleFilterChange = (option: FilterOption) => {\n setActiveFilter(option);\n };\n\n const hasUnread = activities.some((a) => !a.read_at);\n\n const filtered = useMemo(\n () => filterActivities(activities, activeFilter),\n [activities, activeFilter],\n );\n\n const grouped = useMemo(() => groupByDate(filtered), [filtered]);\n\n // Compute total item count for first/last logic\n const allItems = useMemo(() => grouped.flatMap((g) => g.items), [grouped]);\n\n if (isLoading) {\n return (\n <div className=\"space-y-4\">\n <div className=\"bg-muted h-5 w-24 animate-pulse rounded\" />\n <div className=\"flex gap-2\">\n {[1, 2, 3].map((i) => (\n <div\n key={i}\n className=\"bg-muted h-6 w-14 animate-pulse rounded-full\"\n />\n ))}\n </div>\n {[1, 2, 3].map((i) => (\n <div key={i} className=\"flex items-start gap-3\">\n <div className=\"bg-muted h-10 w-10 animate-pulse rounded-full\" />\n <div className=\"flex-1 space-y-1.5\">\n <div className=\"bg-muted h-4 w-3/4 animate-pulse rounded\" />\n <div className=\"bg-muted h-3 w-1/3 animate-pulse rounded\" />\n </div>\n </div>\n ))}\n </div>\n );\n }\n\n return (\n <div className=\"space-y-4\">\n {/* Header */}\n <h3 className=\"text-foreground text-lg font-semibold\">Recent Activity</h3>\n\n {/* Filter pills */}\n <div className=\"flex items-center gap-2\">\n {filterOptions.map((option) => (\n <button\n key={option}\n type=\"button\"\n onClick={() => handleFilterChange(option)}\n className={cn(\n \"rounded-full px-3 py-1 text-xs font-medium transition-colors\",\n activeFilter === option\n ? \"bg-primary text-primary-foreground\"\n : \"bg-muted text-muted-foreground hover:bg-muted/80\",\n )}\n >\n {option}\n </button>\n ))}\n {hasUnread && onMarkRead && (\n <button\n type=\"button\"\n onClick={onMarkRead}\n className=\"text-primary hover:text-primary/80 ml-auto text-xs font-medium transition-colors\"\n >\n Mark all read\n </button>\n )}\n </div>\n\n {/* Content */}\n {activities.length === 0 ? (\n <EmptyState />\n ) : filtered.length === 0 ? (\n <p className=\"text-muted-foreground py-8 text-center text-sm\">\n No {activeFilter.toLowerCase()} activities\n </p>\n ) : (\n <div>\n {grouped.map((group, groupIndex) => {\n // Calculate running index for first/last across all groups\n const itemsBefore = grouped\n .slice(0, groupIndex)\n .reduce((sum, g) => sum + g.items.length, 0);\n\n return (\n <div key={group.label}>\n {/* Date separator */}\n <DateSeparator label={group.label} />\n\n {/* Items */}\n {group.items.map((activity, itemIndex) => {\n const globalIndex = itemsBefore + itemIndex;\n return (\n <ActivityItem\n key={activity.id}\n activity={activity}\n isFirst={globalIndex === 0}\n isLast={globalIndex === allItems.length - 1}\n />\n );\n })}\n </div>\n );\n })}\n </div>\n )}\n </div>\n );\n}\n","/**\n * Generated API client functions for users_tasks\n *\n * DO NOT EDIT THIS FILE DIRECTLY\n * This file is auto-generated. To update:\n * 1. Update the OpenAPI spec file\n * 2. Run: pnpm generate\n */\n\nimport type { FetchClient } from \"../lib/fetch-client\";\nimport type { operations } from \"../generated/users_tasks\";\n\n// ============================================================================\n// Users Tasks\n// ============================================================================\n\n/**\n * Toggle task completion\n *\n *\n * @param client - Fetch client instance\n * @param id - id\n */\nexport async function completeUserTask(\n client: FetchClient,\n id: string | number,\n): Promise<\n operations[\"completeUserTask\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.post(`/api/users/v2025-06/tasks/${id}/complete`);\n}\n\n/**\n * Create a task\n *\n *\n * @param client - Fetch client instance\n * @param body - body\n */\nexport async function createUserTask(\n client: FetchClient,\n body: operations[\"createUserTask\"][\"requestBody\"][\"content\"][\"application/json\"],\n): Promise<\n operations[\"createUserTask\"][\"responses\"][201][\"content\"][\"application/json\"]\n> {\n return client.post(`/api/users/v2025-06/tasks`, body);\n}\n\n/**\n * List tasks for the current user\n *\n *\n * @param client - Fetch client instance\n * @param params? - params?\n */\nexport async function listUserTasks(\n client: FetchClient,\n params?: operations[\"listUserTasks\"][\"parameters\"][\"query\"],\n): Promise<\n operations[\"listUserTasks\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.get(`/api/users/v2025-06/tasks`, params);\n}\n\n/**\n * Delete a task\n *\n *\n * @param client - Fetch client instance\n * @param id - id\n */\nexport async function deleteUserTask(\n client: FetchClient,\n id: string | number,\n): Promise<\n operations[\"deleteUserTask\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.delete(`/api/users/v2025-06/tasks/${id}`);\n}\n\n/**\n * Get a task\n *\n *\n * @param client - Fetch client instance\n * @param id - id\n */\nexport async function getUserTask(\n client: FetchClient,\n id: string | number,\n): Promise<\n operations[\"getUserTask\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.get(`/api/users/v2025-06/tasks/${id}`);\n}\n\n/**\n * Update a task\n *\n *\n * @param client - Fetch client instance\n * @param id - id\n * @param body - body\n */\nexport async function updateUserTask(\n client: FetchClient,\n id: string | number,\n body: operations[\"updateUserTask\"][\"requestBody\"][\"content\"][\"application/json\"],\n): Promise<\n operations[\"updateUserTask\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.patch(`/api/users/v2025-06/tasks/${id}`, body);\n}\n","\"use client\";\n\nimport { useQuery } from \"@tanstack/react-query\";\nimport { usersContacts } from \"@fluid-app/user-contacts-api-client\";\nimport type { FetchClient } from \"@fluid-app/api-client-core\";\nimport type { components } from \"@fluid-app/user-contacts-api-client\";\n\nexport type ContactTask = components[\"schemas\"][\"Task\"];\n\nexport const CONTACT_TASKS_QUERY_KEY = (contactId: string) =>\n [\"portal-contacts\", \"tasks\", contactId] as const;\n\nexport function useContactTasks(client: FetchClient, contactId: string) {\n return useQuery({\n queryKey: CONTACT_TASKS_QUERY_KEY(contactId),\n queryFn: () => usersContacts.listUserContactTasks(client, contactId),\n enabled: !!contactId,\n select: (data) => data.tasks,\n });\n}\n","\"use client\";\n\nimport { useMutation, useQueryClient } from \"@tanstack/react-query\";\nimport { usersTasks } from \"@fluid-app/user-tasks-api-client\";\nimport { fluidToast } from \"@fluid-app/ui-primitives\";\nimport { parseApiErrors, type FetchClient } from \"@fluid-app/api-client-core\";\nimport { CONTACT_TASKS_QUERY_KEY } from \"./use-contact-tasks\";\n\nexport function useToggleTaskCompletion(\n client: FetchClient,\n contactId: string,\n) {\n const queryClient = useQueryClient();\n\n return useMutation({\n mutationFn: ({\n taskId,\n isCompleted,\n }: {\n taskId: number;\n isCompleted: boolean;\n }) =>\n usersTasks.updateUserTask(client, taskId, {\n id: taskId,\n task: {\n completed_at: isCompleted ? null : new Date().toISOString(),\n },\n }),\n onSuccess: () => {\n queryClient.invalidateQueries({\n queryKey: CONTACT_TASKS_QUERY_KEY(contactId),\n });\n },\n onError: (error) => {\n fluidToast({\n title: \"Failed to update task\",\n type: \"error\",\n description: parseApiErrors(error),\n });\n },\n });\n}\n","\"use client\";\n\nimport { useMutation, useQueryClient } from \"@tanstack/react-query\";\nimport { usersTasks } from \"@fluid-app/user-tasks-api-client\";\nimport { fluidToast } from \"@fluid-app/ui-primitives\";\nimport { parseApiErrors, type FetchClient } from \"@fluid-app/api-client-core\";\nimport { CONTACT_TASKS_QUERY_KEY } from \"./use-contact-tasks\";\n\nexport function useDeleteContactTask(\n client: FetchClient,\n contactId: string,\n options?: { onSuccess?: () => void },\n) {\n const queryClient = useQueryClient();\n\n return useMutation({\n mutationFn: (taskId: number) => usersTasks.deleteUserTask(client, taskId),\n onSuccess: () => {\n fluidToast({ title: \"Task deleted\", type: \"success\" });\n queryClient.invalidateQueries({\n queryKey: CONTACT_TASKS_QUERY_KEY(contactId),\n });\n options?.onSuccess?.();\n },\n onError: (error) => {\n fluidToast({\n title: \"Failed to delete task\",\n type: \"error\",\n description: parseApiErrors(error),\n });\n },\n });\n}\n","\"use client\";\n\nimport { useMutation, useQueryClient } from \"@tanstack/react-query\";\nimport { usersContacts } from \"@fluid-app/user-contacts-api-client\";\nimport { fluidToast } from \"@fluid-app/ui-primitives\";\nimport { parseApiErrors, type FetchClient } from \"@fluid-app/api-client-core\";\nimport { CONTACT_TASKS_QUERY_KEY } from \"./use-contact-tasks\";\n\nexport type CreateTaskInput = {\n body: string;\n due_at?: string | null;\n completed_at?: string | null;\n user_id?: number | null;\n};\n\nexport function useCreateContactTask(\n client: FetchClient,\n contactId: string,\n options?: { onSuccess?: () => void },\n) {\n const queryClient = useQueryClient();\n\n return useMutation({\n mutationFn: (input: CreateTaskInput) =>\n usersContacts.createUserContactTask(client, contactId, {\n id: Number(contactId),\n task: input,\n }),\n onSuccess: () => {\n fluidToast({ title: \"Task created\", type: \"success\" });\n queryClient.invalidateQueries({\n queryKey: CONTACT_TASKS_QUERY_KEY(contactId),\n });\n options?.onSuccess?.();\n },\n onError: (error) => {\n fluidToast({\n title: \"Failed to create task\",\n type: \"error\",\n description: parseApiErrors(error),\n });\n },\n });\n}\n","\"use client\";\n\nimport { useMutation, useQueryClient } from \"@tanstack/react-query\";\nimport { usersTasks } from \"@fluid-app/user-tasks-api-client\";\nimport { fluidToast } from \"@fluid-app/ui-primitives\";\nimport { parseApiErrors, type FetchClient } from \"@fluid-app/api-client-core\";\nimport { CONTACT_TASKS_QUERY_KEY } from \"./use-contact-tasks\";\n\nexport type UpdateTaskInput = {\n body?: string | null;\n due_at?: string | null;\n completed_at?: string | null;\n contact_id?: number | null;\n};\n\nexport function useUpdateContactTask(\n client: FetchClient,\n contactId: string,\n options?: { onSuccess?: () => void },\n) {\n const queryClient = useQueryClient();\n\n return useMutation({\n mutationFn: ({\n taskId,\n input,\n }: {\n taskId: number;\n input: UpdateTaskInput;\n }) =>\n usersTasks.updateUserTask(client, taskId, {\n id: taskId,\n task: input,\n }),\n onSuccess: () => {\n fluidToast({ title: \"Task updated\", type: \"success\" });\n queryClient.invalidateQueries({\n queryKey: CONTACT_TASKS_QUERY_KEY(contactId),\n });\n options?.onSuccess?.();\n },\n onError: (error) => {\n fluidToast({\n title: \"Failed to update task\",\n type: \"error\",\n description: parseApiErrors(error),\n });\n },\n });\n}\n","\"use client\";\n\nimport React, { useImperativeHandle, useState } from \"react\";\nimport {\n Calendar,\n Plus,\n ClipboardList,\n SquareCheckBig,\n CircleCheck,\n EllipsisVertical,\n} from \"lucide-react\";\nimport {\n cn,\n AlertDialog,\n AlertDialogAction,\n AlertDialogCancel,\n AlertDialogContent,\n AlertDialogDescription,\n AlertDialogFooter,\n AlertDialogHeader,\n AlertDialogTitle,\n Button,\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuTrigger,\n} from \"@fluid-app/ui-primitives\";\nimport type { FetchClient } from \"@fluid-app/api-client-core\";\nimport type { ContactTask } from \"../../hooks/contacts/use-contact-tasks\";\nimport { useToggleTaskCompletion } from \"../../hooks/contacts/use-toggle-task-completion\";\nimport { useDeleteContactTask } from \"../../hooks/contacts/use-delete-contact-task\";\nimport { useCreateContactTask } from \"../../hooks/contacts/use-create-contact-task\";\nimport { useUpdateContactTask } from \"../../hooks/contacts/use-update-contact-task\";\nimport { NoteTaskModal } from \"../editor/note-task-modal\";\n\n// ---------------------------------------------------------------------------\n// Date helpers\n// ---------------------------------------------------------------------------\n\nfunction formatDueDate(dateStr: string): string {\n const date = new Date(dateStr);\n return date.toLocaleDateString(\"en-US\", {\n month: \"short\",\n day: \"numeric\",\n year: \"numeric\",\n });\n}\n\nfunction formatRelativeTime(dateStr: string): string {\n const date = new Date(dateStr);\n const now = new Date();\n const diffMs = now.getTime() - date.getTime();\n const diffDays = Math.floor(diffMs / (1000 * 60 * 60 * 24));\n\n if (diffDays === 0) {\n return date.toLocaleTimeString(\"en-US\", {\n hour: \"numeric\",\n minute: \"2-digit\",\n });\n } else if (diffDays === 1) {\n return \"Yesterday\";\n } else {\n return `${diffDays} days ago`;\n }\n}\n\n/** Parse task body into title + body. First line is title, rest is body. */\nfunction parseTaskBody(body: string): { title: string; body: string } {\n const firstNewline = body.indexOf(\"\\n\\n\");\n if (firstNewline >= 0) {\n return {\n title: body.slice(0, firstNewline),\n body: body.slice(firstNewline + 2),\n };\n }\n return { title: body, body: \"\" };\n}\n\n// ---------------------------------------------------------------------------\n// Empty state\n// ---------------------------------------------------------------------------\n\nfunction EmptyState({ onCreateTask }: { onCreateTask: () => void }) {\n return (\n <div className=\"flex flex-col items-center justify-center px-4 py-12 text-center\">\n <div className=\"relative mb-6\">\n <div className=\"flex h-20 w-20 items-center justify-center rounded-full bg-gradient-to-br from-teal-100 to-emerald-100\">\n <ClipboardList className=\"h-9 w-9 text-teal-500\" />\n </div>\n <div className=\"absolute -right-2 -bottom-1 flex h-9 w-9 items-center justify-center rounded-full border-2 border-white bg-gradient-to-br from-blue-100 to-indigo-100 shadow-sm\">\n <SquareCheckBig className=\"h-4 w-4 text-blue-500\" />\n </div>\n </div>\n <h4 className=\"text-foreground text-base font-semibold\">No tasks yet</h4>\n <p className=\"text-muted-foreground mt-1.5 max-w-[260px] text-sm leading-relaxed\">\n Stay organized by creating tasks to track follow-ups for this contact\n </p>\n <button\n type=\"button\"\n onClick={onCreateTask}\n className=\"bg-primary text-primary-foreground hover:bg-primary/90 mt-4 inline-flex items-center gap-1.5 rounded-lg px-4 py-2 text-sm font-medium transition-colors\"\n >\n <Plus className=\"h-3.5 w-3.5\" />\n New Task\n </button>\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Task card\n// ---------------------------------------------------------------------------\n\ninterface TaskCardProps {\n task: ContactTask;\n toggleCompletion: ReturnType<typeof useToggleTaskCompletion>;\n onEdit: (task: ContactTask) => void;\n onDeleteClick: (task: ContactTask) => void;\n}\n\nfunction TaskCard({\n task,\n toggleCompletion,\n onEdit,\n onDeleteClick,\n}: TaskCardProps) {\n const isCompleted = !!task.completed_at;\n\n // Split the body into title (first line) and remaining body text\n const bodyLines = (task.body ?? \"\").split(\"\\n\");\n const title = bodyLines[0] ?? \"\";\n const bodyText = bodyLines.slice(1).join(\"\\n\").trim();\n\n const timestamp = task.created_at ? formatRelativeTime(task.created_at) : \"\";\n\n return (\n <div\n role=\"button\"\n tabIndex={0}\n onClick={() => onEdit(task)}\n onKeyDown={(e) => {\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n onEdit(task);\n }\n }}\n className=\"border-border bg-card min-w-[250px] cursor-pointer rounded-xl border p-4 transition-colors\"\n >\n <div className=\"flex items-start gap-3\">\n {/* Checkbox */}\n <button\n type=\"button\"\n onClick={(e) => {\n e.stopPropagation();\n toggleCompletion.mutate({\n taskId: task.id,\n isCompleted: isCompleted,\n });\n }}\n disabled={toggleCompletion.isPending}\n className=\"mt-0.5 shrink-0 transition-opacity hover:opacity-70 disabled:cursor-not-allowed disabled:opacity-50\"\n aria-label={isCompleted ? \"Mark as open\" : \"Mark as completed\"}\n >\n {isCompleted ? (\n <CircleCheck className=\"text-primary h-5 w-5\" />\n ) : (\n <div className=\"border-muted-foreground h-5 w-5 rounded-full border-2\" />\n )}\n </button>\n\n {/* Content */}\n <div className=\"min-w-0 flex-1\">\n {/* Title & menu row */}\n <div className=\"flex items-start justify-between gap-2\">\n <h4\n className={cn(\n \"text-foreground line-clamp-2 font-semibold\",\n isCompleted && \"text-muted-foreground line-through\",\n )}\n >\n {title}\n </h4>\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button\n variant=\"ghost\"\n size=\"icon-xs\"\n onClick={(e) => e.stopPropagation()}\n >\n <EllipsisVertical className=\"h-4 w-4\" />\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\">\n <DropdownMenuItem\n className=\"text-destructive\"\n onClick={(e) => {\n e.stopPropagation();\n onDeleteClick(task);\n }}\n >\n Delete\n </DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenu>\n </div>\n\n {/* Body text */}\n {bodyText && (\n <p\n className=\"text-muted-foreground mt-1 line-clamp-3 text-sm\"\n style={\n isCompleted ? { textDecoration: \"line-through\" } : undefined\n }\n >\n {bodyText}\n </p>\n )}\n\n {/* Due date & Timestamp */}\n <div className=\"mt-2 flex flex-row items-center gap-2\">\n <span className=\"text-muted-foreground text-xs\">{timestamp}</span>\n {task.due_at && (\n <div className=\"flex items-center gap-1\">\n <Calendar\n className={cn(\n \"h-3.5 w-3.5\",\n isCompleted ? \"text-muted-foreground\" : \"text-primary\",\n )}\n />\n <span\n className={cn(\n \"text-xs font-medium\",\n isCompleted ? \"text-muted-foreground\" : \"text-primary\",\n )}\n >\n Due {formatDueDate(task.due_at)}\n </span>\n </div>\n )}\n </div>\n </div>\n </div>\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Main component\n// ---------------------------------------------------------------------------\n\nexport interface TaskListProps {\n tasks: ContactTask[];\n isLoading?: boolean;\n contactId: string;\n client: FetchClient;\n /** Tasks API client for delete/toggle operations */\n tasksClient?: FetchClient;\n /** Ref that receives the openCreateModal callback for external triggering */\n ref?: React.Ref<(() => void) | null>;\n}\n\nexport function TaskList({\n tasks,\n isLoading,\n contactId,\n client,\n tasksClient,\n ref,\n}: TaskListProps): React.JSX.Element {\n const [taskToDelete, setTaskToDelete] = useState<ContactTask | null>(null);\n const [modalOpen, setModalOpen] = useState(false);\n const [editingTask, setEditingTask] = useState<ContactTask | null>(null);\n\n const effectiveClient = tasksClient ?? client;\n\n const toggleCompletion = useToggleTaskCompletion(effectiveClient, contactId);\n const deleteTask = useDeleteContactTask(effectiveClient, contactId, {\n onSuccess: () => setTaskToDelete(null),\n });\n const createTask = useCreateContactTask(effectiveClient, contactId, {\n onSuccess: () => setModalOpen(false),\n });\n const updateTask = useUpdateContactTask(effectiveClient, contactId, {\n onSuccess: () => setEditingTask(null),\n });\n\n const openCreateModal = () => {\n setEditingTask(null);\n setModalOpen(true);\n };\n\n // Expose openCreateModal to parent via ref\n useImperativeHandle(ref, () => openCreateModal);\n\n const handleSave = (data: {\n title: string;\n body: string;\n dueDate?: string;\n }) => {\n const taskBody = data.body ? `${data.title}\\n\\n${data.body}` : data.title;\n\n if (editingTask) {\n updateTask.mutate({\n taskId: editingTask.id,\n input: { body: taskBody, due_at: data.dueDate ?? null },\n });\n } else {\n createTask.mutate({ body: taskBody, due_at: data.dueDate ?? null });\n }\n };\n\n const editingParsed = editingTask\n ? parseTaskBody(editingTask.body ?? \"\")\n : null;\n\n const isModalOpen = modalOpen || editingTask !== null;\n const handleModalOpenChange = (open: boolean) => {\n if (!open) {\n setModalOpen(false);\n setEditingTask(null);\n }\n };\n\n if (isLoading) {\n return (\n <div className=\"space-y-4\">\n <div className=\"flex items-center justify-between\">\n <div>\n <div className=\"bg-muted h-5 w-24 animate-pulse rounded\" />\n <div className=\"bg-muted mt-1 h-4 w-48 animate-pulse rounded\" />\n </div>\n <div className=\"bg-muted h-8 w-24 animate-pulse rounded-lg\" />\n </div>\n <div className=\"grid grid-cols-1 gap-5 sm:grid-cols-2\">\n {[1, 2, 3].map((i) => (\n <div\n key={i}\n className=\"border-border bg-muted/50 h-32 animate-pulse rounded-xl border\"\n />\n ))}\n </div>\n </div>\n );\n }\n\n return (\n <div className=\"space-y-4\">\n {/* Header */}\n <div className=\"flex items-start justify-between\">\n <div>\n <h3 className=\"text-foreground text-base font-semibold\">\n Tasks ({tasks.length})\n </h3>\n <p className=\"text-muted-foreground mt-0.5 text-sm\">\n Manage tasks and follow-ups for this contact\n </p>\n </div>\n <button\n type=\"button\"\n onClick={openCreateModal}\n className=\"bg-primary text-primary-foreground hover:bg-primary/90 inline-flex items-center gap-1.5 rounded-lg px-3 py-1.5 text-sm font-medium transition-colors\"\n >\n <Plus className=\"h-3.5 w-3.5\" />\n Add Task\n </button>\n </div>\n\n {/* Content */}\n {tasks.length === 0 ? (\n <EmptyState onCreateTask={openCreateModal} />\n ) : (\n <div className=\"grid grid-cols-1 gap-5 sm:grid-cols-2\">\n {tasks.map((task) => (\n <TaskCard\n key={task.id}\n task={task}\n toggleCompletion={toggleCompletion}\n onEdit={setEditingTask}\n onDeleteClick={setTaskToDelete}\n />\n ))}\n </div>\n )}\n\n {/* Create/Edit modal */}\n <NoteTaskModal\n key={editingTask?.id ?? \"create\"}\n open={isModalOpen}\n onOpenChange={handleModalOpenChange}\n mode={editingTask ? \"edit\" : \"create\"}\n type=\"task\"\n initialTitle={editingParsed?.title ?? \"\"}\n initialBody={editingParsed?.body ?? \"\"}\n initialDueDate={editingTask?.due_at ?? undefined}\n showDueDate\n onSave={handleSave}\n isPending={createTask.isPending || updateTask.isPending}\n isCompleted={editingTask ? !!editingTask.completed_at : undefined}\n onToggleComplete={\n editingTask\n ? () =>\n toggleCompletion.mutate(\n {\n taskId: editingTask.id,\n isCompleted: !!editingTask.completed_at,\n },\n { onSuccess: () => setEditingTask(null) },\n )\n : undefined\n }\n isTogglePending={toggleCompletion.isPending}\n />\n\n {/* Delete confirmation modal */}\n <AlertDialog\n open={taskToDelete !== null}\n onOpenChange={(open) => {\n if (!open) setTaskToDelete(null);\n }}\n >\n <AlertDialogContent>\n <AlertDialogHeader>\n <AlertDialogTitle>Delete Task</AlertDialogTitle>\n <AlertDialogDescription>\n Are you sure you want to delete this task? This action cannot be\n undone.\n </AlertDialogDescription>\n </AlertDialogHeader>\n <AlertDialogFooter>\n <AlertDialogCancel>Cancel</AlertDialogCancel>\n <AlertDialogAction\n variant=\"destructive\"\n onClick={() => {\n if (taskToDelete) {\n deleteTask.mutate(taskToDelete.id);\n }\n }}\n >\n Delete\n </AlertDialogAction>\n </AlertDialogFooter>\n </AlertDialogContent>\n </AlertDialog>\n </div>\n );\n}\n","\"use client\";\n\nimport { useQuery } from \"@tanstack/react-query\";\nimport { usersContacts } from \"@fluid-app/user-contacts-api-client\";\nimport type { FetchClient } from \"@fluid-app/api-client-core\";\nimport type { components } from \"@fluid-app/user-contacts-api-client\";\n\nexport type ContactActivity = components[\"schemas\"][\"Activity\"];\n\nexport function useContactActivities(\n client: FetchClient,\n contactId: string,\n options?: { enabled?: boolean },\n) {\n return useQuery({\n queryKey: [\"portal-contacts\", \"activities\", contactId] as const,\n queryFn: () => usersContacts.listUserContactActivities(client, contactId),\n enabled: options?.enabled !== false && !!contactId,\n select: (data) => data.activities,\n });\n}\n","\"use client\";\n\nimport { useMutation, useQueryClient } from \"@tanstack/react-query\";\nimport { usersContacts } from \"@fluid-app/user-contacts-api-client\";\nimport type { FetchClient } from \"@fluid-app/api-client-core\";\nimport type { ContactActivity } from \"./use-contact-activities\";\n\nexport function useMarkContactRead(client: FetchClient, contactId: string) {\n const queryClient = useQueryClient();\n const queryKey = [\"portal-contacts\", \"activities\", contactId] as const;\n\n return useMutation({\n mutationFn: () => usersContacts.markUserContactRead(client, contactId),\n onMutate: () => {\n // Optimistically mark all activities as read in the cache.\n // The query stores the raw API response; `select` maps to activities[].\n const previous = queryClient.getQueryData<{\n activities: ContactActivity[];\n }>(queryKey);\n\n if (previous) {\n const now = new Date().toISOString();\n queryClient.setQueryData(queryKey, {\n ...previous,\n activities: previous.activities.map((a) =>\n a.read_at ? a : { ...a, read_at: now },\n ),\n });\n }\n\n return { previous };\n },\n onError: (_err, _vars, context) => {\n // Roll back on failure\n if (context?.previous) {\n queryClient.setQueryData(queryKey, context.previous);\n }\n },\n onSettled: () => {\n // Refetch to sync with server state\n queryClient.invalidateQueries({ queryKey });\n },\n });\n}\n","\"use client\";\n\nimport React, {\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport {\n Tabs,\n TabsContent,\n TabsList,\n TabsTrigger,\n} from \"@fluid-app/ui-primitives\";\nimport type { FetchClient } from \"@fluid-app/api-client-core\";\nimport { ContactInfoCard } from \"../../../shared/components/contacts/contactCard/contactInfoCard\";\nimport { ContactDetailsForm } from \"../../../shared/components/contacts/contactDetailsForm\";\nimport { NotesSidebar } from \"../notes/notes-sidebar\";\nimport { NotesList } from \"../notes/notes-list\";\nimport { ActivityFeed } from \"../activities/activity-feed\";\nimport { TaskList } from \"../tasks/task-list\";\nimport { useContactActivities } from \"../../hooks/contacts/use-contact-activities\";\nimport { useContactTasks } from \"../../hooks/contacts/use-contact-tasks\";\nimport { useContactNotes } from \"../../hooks/notes/use-contact-notes\";\nimport { useMarkContactRead } from \"../../hooks/contacts/use-mark-contact-read\";\nimport type { Contact } from \"../../../shared/types\";\nimport { ShoppingCart, Repeat2 } from \"lucide-react\";\n\nexport interface RepContactDetailViewProps {\n contact?: Contact;\n contactId: string;\n client: FetchClient;\n /** Notes API client for note mutations (delete) */\n notesClient?: FetchClient;\n /** Tasks API client for task mutations (delete, toggle) */\n tasksClient?: FetchClient;\n countryOptions?: { name: string; value: string }[];\n /** Slot for rendering orders content (provided by consumer) */\n ordersSlot?: React.ReactNode;\n /** Slot for rendering subscriptions content (provided by consumer) */\n subscriptionsSlot?: React.ReactNode;\n}\n\nconst DEFAULT_COUNTRY_OPTIONS: { name: string; value: string }[] = [];\n\nexport function RepContactDetailView({\n contact,\n contactId,\n client,\n notesClient,\n tasksClient,\n countryOptions = DEFAULT_COUNTRY_OPTIONS,\n ordersSlot,\n subscriptionsSlot,\n}: RepContactDetailViewProps): React.JSX.Element {\n const [activeTab, setActiveTab] = useState(\"activity\");\n\n const { data: activities = [], isLoading: isLoadingActivities } =\n useContactActivities(client, contactId);\n\n const { data: tasks = [], isLoading: isLoadingTasks } = useContactTasks(\n client,\n contactId,\n );\n\n const { data: notes = [], isLoading: isLoadingNotes } = useContactNotes(\n client,\n contactId,\n );\n\n const markRead = useMarkContactRead(client, contactId);\n const hasFiredRef = useRef(false);\n const prevHasUnreadRef = useRef(false);\n\n // Refs to imperatively open create modals from the sidebar\n const openNoteModalRef = useRef<(() => void) | null>(null);\n const openTaskModalRef = useRef<(() => void) | null>(null);\n const [pendingOpenModal, setPendingOpenModal] = useState<\n \"tasks\" | \"notes\" | null\n >(null);\n\n useEffect(() => {\n if (pendingOpenModal === \"tasks\" && openTaskModalRef.current) {\n openTaskModalRef.current();\n setPendingOpenModal(null);\n } else if (pendingOpenModal === \"notes\" && openNoteModalRef.current) {\n openNoteModalRef.current();\n setPendingOpenModal(null);\n }\n }, [pendingOpenModal]);\n\n // Reset the guard when new unread activities arrive\n const hasUnread = useMemo(\n () => activities.some((a) => !a.read_at),\n [activities],\n );\n\n // Reset the guard when new unread activities appear (inline sync)\n if (hasUnread && !prevHasUnreadRef.current) {\n hasFiredRef.current = false;\n }\n prevHasUnreadRef.current = hasUnread;\n\n const handleMarkRead = useCallback(() => {\n if (hasFiredRef.current || markRead.isPending) return;\n hasFiredRef.current = true;\n markRead.mutate();\n }, [markRead]);\n\n const contactInfo = useMemo(\n () => ({\n firstName: contact?.first_name ?? undefined,\n lastName: contact?.last_name ?? undefined,\n email: contact?.email ?? undefined,\n phone: contact?.phone ?? undefined,\n address: contact?.address ?? undefined,\n city: contact?.city ?? undefined,\n state: contact?.state ?? undefined,\n postalCode: contact?.postal_code ?? undefined,\n status: contact?.status ?? undefined,\n avatarUrl: contact?.avatar_url ?? undefined,\n countryName: contact?.country?.name ?? undefined,\n }),\n [contact],\n );\n\n return (\n <div className=\"mx-auto max-w-7xl px-4 py-4 sm:px-6 sm:py-6 lg:px-10 lg:py-8\">\n <div className=\"grid grid-cols-1 items-start gap-6 lg:grid-cols-3\">\n {/* Left column: Contact card + Notes */}\n <div className=\"space-y-6\">\n <ContactInfoCard\n contact={contactInfo}\n onEdit={() => setActiveTab(\"edit\")}\n showActions\n onCreateTask={() => {\n setActiveTab(\"tasks\");\n setPendingOpenModal(\"tasks\");\n }}\n onCreateNote={() => {\n setActiveTab(\"notes\");\n setPendingOpenModal(\"notes\");\n }}\n />\n <NotesSidebar\n notes={notes}\n isLoading={isLoadingNotes}\n onNavigateToNotes={() => setActiveTab(\"notes\")}\n />\n </div>\n\n {/* Right column: Tabs (Edit / Activity) */}\n <div className=\"lg:col-span-2\">\n <Tabs value={activeTab} onValueChange={setActiveTab}>\n <TabsList className=\"border-border w-full justify-start rounded-none border-b bg-transparent p-0\">\n <TabsTrigger\n value=\"edit\"\n className=\"text-muted-foreground data-[state=active]:border-b-primary data-[state=active]:text-foreground rounded-none border-0 border-b-2 border-b-transparent px-4 py-2.5 text-sm font-medium shadow-none focus-visible:ring-0 focus-visible:outline-none data-[state=active]:bg-transparent data-[state=active]:shadow-none\"\n >\n Edit\n </TabsTrigger>\n <TabsTrigger\n value=\"activity\"\n className=\"text-muted-foreground data-[state=active]:border-b-primary data-[state=active]:text-foreground rounded-none border-0 border-b-2 border-b-transparent px-4 py-2.5 text-sm font-medium shadow-none focus-visible:ring-0 focus-visible:outline-none data-[state=active]:bg-transparent data-[state=active]:shadow-none\"\n >\n Activity\n </TabsTrigger>\n <TabsTrigger\n value=\"tasks\"\n className=\"text-muted-foreground data-[state=active]:border-b-primary data-[state=active]:text-foreground rounded-none border-0 border-b-2 border-b-transparent px-4 py-2.5 text-sm font-medium shadow-none focus-visible:ring-0 focus-visible:outline-none data-[state=active]:bg-transparent data-[state=active]:shadow-none\"\n >\n Tasks\n </TabsTrigger>\n <TabsTrigger\n value=\"notes\"\n className=\"text-muted-foreground data-[state=active]:border-b-primary data-[state=active]:text-foreground rounded-none border-0 border-b-2 border-b-transparent px-4 py-2.5 text-sm font-medium shadow-none focus-visible:ring-0 focus-visible:outline-none data-[state=active]:bg-transparent data-[state=active]:shadow-none\"\n >\n Notes\n </TabsTrigger>\n <TabsTrigger\n value=\"orders\"\n className=\"text-muted-foreground data-[state=active]:border-b-primary data-[state=active]:text-foreground rounded-none border-0 border-b-2 border-b-transparent px-4 py-2.5 text-sm font-medium shadow-none focus-visible:ring-0 focus-visible:outline-none data-[state=active]:bg-transparent data-[state=active]:shadow-none\"\n >\n Orders\n </TabsTrigger>\n <TabsTrigger\n value=\"subscriptions\"\n className=\"text-muted-foreground data-[state=active]:border-b-primary data-[state=active]:text-foreground rounded-none border-0 border-b-2 border-b-transparent px-4 py-2.5 text-sm font-medium shadow-none focus-visible:ring-0 focus-visible:outline-none data-[state=active]:bg-transparent data-[state=active]:shadow-none\"\n >\n Subscriptions\n </TabsTrigger>\n </TabsList>\n\n <TabsContent value=\"edit\" className=\"mt-6\">\n <ContactDetailsForm countries={countryOptions} />\n </TabsContent>\n\n <TabsContent value=\"activity\" className=\"mt-6\">\n <ActivityFeed\n activities={activities}\n isLoading={isLoadingActivities}\n onMarkRead={handleMarkRead}\n />\n </TabsContent>\n\n <TabsContent value=\"tasks\" className=\"mt-6\">\n <TaskList\n tasks={tasks}\n isLoading={isLoadingTasks}\n contactId={contactId}\n client={client}\n tasksClient={tasksClient}\n ref={openTaskModalRef}\n />\n </TabsContent>\n\n <TabsContent value=\"notes\" className=\"mt-6\">\n <NotesList\n notes={notes}\n isLoading={isLoadingNotes}\n contactId={contactId}\n client={client}\n notesClient={notesClient}\n ref={openNoteModalRef}\n />\n </TabsContent>\n\n <TabsContent value=\"orders\" className=\"mt-6\">\n {ordersSlot ?? (\n <div className=\"flex flex-col items-center justify-center py-16 text-center\">\n <div className=\"bg-muted mb-4 flex h-14 w-14 items-center justify-center rounded-full\">\n <ShoppingCart className=\"text-muted-foreground h-6 w-6\" />\n </div>\n <h3 className=\"text-foreground text-sm font-medium\">\n No orders yet\n </h3>\n <p className=\"text-muted-foreground mt-1 text-sm\">\n Orders placed by this contact will appear here.\n </p>\n </div>\n )}\n </TabsContent>\n\n <TabsContent value=\"subscriptions\" className=\"mt-6\">\n {subscriptionsSlot ?? (\n <div className=\"flex flex-col items-center justify-center py-16 text-center\">\n <div className=\"bg-muted mb-4 flex h-14 w-14 items-center justify-center rounded-full\">\n <Repeat2 className=\"text-muted-foreground h-6 w-6\" />\n </div>\n <h3 className=\"text-foreground text-sm font-medium\">\n No subscriptions yet\n </h3>\n <p className=\"text-muted-foreground mt-1 text-sm\">\n Subscriptions for this contact will appear here.\n </p>\n </div>\n )}\n </TabsContent>\n </Tabs>\n </div>\n </div>\n </div>\n );\n}\n","\"use client\";\n\nimport React from \"react\";\nimport { ChevronLeft, ChevronRight } from \"lucide-react\";\n\nexport function Pagination({\n currentPage,\n totalPages,\n totalCount,\n onPageChange,\n}: {\n currentPage: number;\n totalPages: number;\n totalCount: number;\n onPageChange: (page: number) => void;\n}): React.JSX.Element | null {\n if (totalPages <= 1) return null;\n\n return (\n <div className=\"flex items-center justify-between pt-2\">\n <p className=\"text-muted-foreground text-xs\">\n Page {currentPage} of {totalPages} ({totalCount} total)\n </p>\n <div className=\"flex items-center gap-1\">\n <button\n type=\"button\"\n aria-label=\"Previous page\"\n disabled={currentPage <= 1}\n onClick={() => onPageChange(currentPage - 1)}\n className=\"text-muted-foreground hover:bg-muted inline-flex h-7 w-7 items-center justify-center rounded-md transition-colors disabled:opacity-40\"\n >\n <ChevronLeft className=\"h-3 w-3\" />\n </button>\n <button\n type=\"button\"\n aria-label=\"Next page\"\n disabled={currentPage >= totalPages}\n onClick={() => onPageChange(currentPage + 1)}\n className=\"text-muted-foreground hover:bg-muted inline-flex h-7 w-7 items-center justify-center rounded-md transition-colors disabled:opacity-40\"\n >\n <ChevronRight className=\"h-3 w-3\" />\n </button>\n </div>\n </div>\n );\n}\n","\"use client\";\n\nimport { useQuery, keepPreviousData } from \"@tanstack/react-query\";\nimport { usersContacts } from \"@fluid-app/user-contacts-api-client\";\nimport type { FetchClient } from \"@fluid-app/api-client-core\";\nimport type { components } from \"@fluid-app/user-contacts-api-client\";\n\nexport type ContactOrder = components[\"schemas\"][\"Order\"];\n\ntype OrderStatus = components[\"schemas\"][\"Order\"][\"status\"];\n\nexport const CONTACT_ORDERS_QUERY_KEY = (contactId: string) =>\n [\"rep-contacts\", \"orders\", contactId] as const;\n\nexport function useContactOrders(\n client: FetchClient,\n contactId: string,\n params?: { page?: number; per_page?: number; status?: OrderStatus },\n) {\n return useQuery({\n queryKey: [\n ...CONTACT_ORDERS_QUERY_KEY(contactId),\n params?.page,\n params?.per_page,\n params?.status,\n ] as const,\n queryFn: () =>\n usersContacts.listUserContactOrders(client, contactId, params),\n enabled: !!contactId,\n placeholderData: keepPreviousData,\n });\n}\n","\"use client\";\n\nimport React, { useState } from \"react\";\nimport { ShoppingCart } from \"lucide-react\";\nimport { Pagination } from \"../shared/Pagination\";\nimport { Skeleton } from \"@fluid-app/ui-primitives\";\nimport type { FetchClient } from \"@fluid-app/api-client-core\";\nimport {\n useContactOrders,\n type ContactOrder,\n} from \"../../hooks/contacts/use-contact-orders\";\nimport {\n StatusBadge,\n type StatusBadgeVariant,\n} from \"../../../shared/components/contacts/statusBadge\";\n\n// ---------------------------------------------------------------------------\n// Status → badge variant maps\n// ---------------------------------------------------------------------------\n\nconst financialStatusVariant: Record<string, StatusBadgeVariant> = {\n paid: \"success\",\n authorized: \"info\",\n partially_paid: \"warning\",\n partially_refunded: \"notice\",\n refunded: \"danger\",\n voided: \"neutral\",\n marked_free: \"success\",\n marked_paid: \"success\",\n pending: \"warning\",\n};\n\nconst fulfillmentStatusVariant: Record<string, StatusBadgeVariant> = {\n fulfilled: \"neutral\",\n in_progress: \"warning\",\n partially_fulfilled: \"warning\",\n scheduled: \"info\",\n on_hold: \"notice\",\n unfulfilled: \"warning\",\n};\n\n// order.status — the order-processing status used by filter pills\nconst statusVariant: Record<string, StatusBadgeVariant> = {\n awaiting_payment: \"warning\",\n awaiting_shipment: \"info\",\n shipped: \"success\",\n delivered: \"success\",\n archived: \"neutral\",\n cancelled: \"danger\",\n failed_payment: \"danger\",\n draft: \"neutral\",\n};\n\nconst sourceVariant: Record<string, StatusBadgeVariant> = {\n enrollment: \"accent\",\n subscription: \"info\",\n web: \"neutral\",\n mobile: \"neutral\",\n admin: \"neutral\",\n backoffice: \"neutral\",\n};\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction formatLabel(value: string): string {\n return value\n .split(\"_\")\n .map((word) => word.charAt(0).toUpperCase() + word.slice(1))\n .join(\" \");\n}\n\nfunction formatDate(dateStr: string): string {\n return new Date(dateStr).toLocaleDateString(\"en-US\", {\n month: \"short\",\n day: \"numeric\",\n year: \"numeric\",\n });\n}\n\nfunction formatAmount(order: ContactOrder): string {\n const amount = Number(order.amount ?? 0);\n const code = order.currency_code ?? \"USD\";\n try {\n return new Intl.NumberFormat(\"en-US\", {\n style: \"currency\",\n currency: code,\n }).format(amount);\n } catch {\n return `$${amount.toFixed(2)}`;\n }\n}\n\n// ---------------------------------------------------------------------------\n// Filter pills\n// ---------------------------------------------------------------------------\n\nconst STATUS_FILTERS = [\n { label: \"All\", value: null },\n { label: \"Awaiting Payment\", value: \"awaiting_payment\" as const },\n { label: \"Awaiting Shipment\", value: \"awaiting_shipment\" as const },\n { label: \"Shipped\", value: \"shipped\" as const },\n { label: \"Delivered\", value: \"delivered\" as const },\n { label: \"Cancelled\", value: \"cancelled\" as const },\n] as const;\n\n// ---------------------------------------------------------------------------\n// Empty state\n// ---------------------------------------------------------------------------\n\nfunction EmptyState() {\n return (\n <div className=\"flex flex-col items-center justify-center px-4 py-12 text-center\">\n <div className=\"relative mb-6\">\n <div className=\"from-primary/10 to-primary/5 flex h-20 w-20 items-center justify-center rounded-full bg-gradient-to-br\">\n <ShoppingCart className=\"text-primary/60 h-9 w-9\" />\n </div>\n </div>\n <h4 className=\"text-foreground text-base font-semibold\">No orders yet</h4>\n <p className=\"text-muted-foreground mt-1.5 max-w-[260px] text-sm leading-relaxed\">\n Orders placed by this contact will appear here\n </p>\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Loading skeleton\n// ---------------------------------------------------------------------------\n\nfunction OrderCardSkeleton() {\n return (\n <div className=\"border-border bg-card rounded-xl border p-5\">\n <div className=\"flex items-start justify-between\">\n <div className=\"space-y-3\">\n <Skeleton className=\"h-5 w-32\" />\n <div className=\"flex gap-2\">\n <Skeleton className=\"h-5 w-20 rounded-xl\" />\n <Skeleton className=\"h-5 w-16 rounded-xl\" />\n <Skeleton className=\"h-5 w-24 rounded-xl\" />\n </div>\n <Skeleton className=\"h-4 w-28\" />\n </div>\n <Skeleton className=\"h-6 w-16\" />\n </div>\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Order card\n// ---------------------------------------------------------------------------\n\nfunction OrderCard({ order }: { order: ContactOrder }) {\n return (\n <div className=\"border-border bg-card hover:border-border/80 hover:bg-accent/30 rounded-xl border p-5 transition-colors\">\n <div className=\"flex items-start justify-between gap-4\">\n {/* Left side: order info */}\n <div className=\"min-w-0 flex-1 space-y-3\">\n {/* Order number */}\n <p className=\"text-foreground text-sm font-semibold\">\n #{order.order_number ?? order.id}\n </p>\n\n {/* Status badges */}\n <div className=\"flex flex-wrap gap-1.5\">\n <StatusBadge\n status={statusVariant[order.status] ?? \"neutral\"}\n label={formatLabel(order.status)}\n />\n <StatusBadge\n status={\n financialStatusVariant[order.financial_status] ?? \"neutral\"\n }\n label={formatLabel(order.financial_status)}\n />\n <StatusBadge\n status={\n fulfillmentStatusVariant[order.fulfillment_status] ?? \"neutral\"\n }\n label={formatLabel(order.fulfillment_status)}\n />\n <StatusBadge\n status={sourceVariant[order.source] ?? \"neutral\"}\n label={formatLabel(order.source)}\n />\n </div>\n\n {/* Date */}\n <p className=\"text-muted-foreground text-xs\">\n {formatDate(order.created_at)}\n </p>\n </div>\n\n {/* Right side: amount */}\n <p className=\"text-foreground text-base font-semibold tabular-nums\">\n {formatAmount(order)}\n </p>\n </div>\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Main component\n// ---------------------------------------------------------------------------\n\nexport interface ContactOrdersListProps {\n client: FetchClient;\n contactId: string;\n pageSize?: number;\n}\n\nexport function ContactOrdersList({\n client,\n contactId,\n pageSize = 10,\n}: ContactOrdersListProps): React.JSX.Element {\n const [page, setPage] = useState(1);\n const [statusFilter, setStatusFilter] = useState<\n ContactOrder[\"status\"] | null\n >(null);\n\n const { data, isLoading, isError, isFetching } = useContactOrders(\n client,\n contactId,\n {\n page,\n per_page: pageSize,\n ...(statusFilter ? { status: statusFilter } : {}),\n },\n );\n\n const orders = data?.orders ?? [];\n const meta = data?.meta;\n const totalCount = meta?.total_count ?? 0;\n const totalPages = meta?.total_pages ?? 1;\n const currentPage = meta?.current_page ?? page;\n\n // Reset page when filter changes\n const handleStatusChange = (value: ContactOrder[\"status\"] | null) => {\n setStatusFilter(value);\n setPage(1);\n };\n\n if (isLoading) {\n return (\n <div className=\"space-y-4\">\n <div className=\"flex items-center justify-between\">\n <Skeleton className=\"h-6 w-24\" />\n </div>\n <div className=\"space-y-3\">\n {[1, 2, 3].map((i) => (\n <OrderCardSkeleton key={i} />\n ))}\n </div>\n </div>\n );\n }\n\n if (isError) {\n return (\n <div className=\"flex flex-col items-center justify-center px-4 py-12 text-center\">\n <p className=\"text-destructive text-sm font-medium\">\n Failed to load orders\n </p>\n <p className=\"text-muted-foreground mt-1 text-xs\">\n Please try again later\n </p>\n </div>\n );\n }\n\n if (totalCount === 0 && !statusFilter) {\n return <EmptyState />;\n }\n\n return (\n <div className=\"space-y-4\">\n {/* Header */}\n <div className=\"flex items-center justify-between\">\n <h3 className=\"text-foreground text-base font-semibold\">\n Orders\n <span className=\"text-muted-foreground ml-1.5 text-sm font-normal\">\n ({totalCount})\n </span>\n </h3>\n {isFetching && (\n <div className=\"bg-muted h-1.5 w-1.5 animate-pulse rounded-full\" />\n )}\n </div>\n\n {/* Filter pills */}\n <div className=\"flex flex-wrap gap-1.5\">\n {STATUS_FILTERS.map((filter) => (\n <button\n type=\"button\"\n key={filter.label}\n onClick={() => handleStatusChange(filter.value)}\n className={`rounded-full px-3 py-1 text-xs font-medium transition-colors ${\n statusFilter === filter.value\n ? \"bg-foreground text-background\"\n : \"bg-muted text-muted-foreground hover:bg-muted/80\"\n }`}\n >\n {filter.label}\n </button>\n ))}\n </div>\n\n {/* Orders list */}\n {orders.length === 0 ? (\n <div className=\"flex flex-col items-center justify-center py-8 text-center\">\n <p className=\"text-muted-foreground text-sm\">\n No orders match this filter\n </p>\n </div>\n ) : (\n <div className=\"space-y-3\">\n {orders.map((order) => (\n <OrderCard key={order.id} order={order} />\n ))}\n </div>\n )}\n\n {/* Pagination */}\n <Pagination\n currentPage={currentPage}\n totalPages={totalPages}\n totalCount={totalCount}\n onPageChange={setPage}\n />\n </div>\n );\n}\n","\"use client\";\n\nimport { useQuery, keepPreviousData } from \"@tanstack/react-query\";\nimport { usersContacts } from \"@fluid-app/user-contacts-api-client\";\nimport type { FetchClient } from \"@fluid-app/api-client-core\";\nimport type {\n components,\n operations,\n} from \"@fluid-app/user-contacts-api-client\";\n\nexport type ContactSubscriptionOrder =\n components[\"schemas\"][\"ListUserContactSubscriptionOrdersResponse200ApplicationJsonSchema\"][\"subscription_orders\"][number];\n\ntype SubscriptionOrderStatus = NonNullable<\n operations[\"listUserContactSubscriptionOrders\"][\"parameters\"][\"query\"]\n>[\"status\"];\n\nexport const CONTACT_SUBSCRIPTION_ORDERS_QUERY_KEY = (contactId: string) =>\n [\"rep-contacts\", \"subscription-orders\", contactId] as const;\n\nexport function useContactSubscriptionOrders(\n client: FetchClient,\n contactId: string,\n params?: {\n page?: number;\n per_page?: number;\n status?: SubscriptionOrderStatus;\n },\n) {\n return useQuery({\n queryKey: [\n ...CONTACT_SUBSCRIPTION_ORDERS_QUERY_KEY(contactId),\n params?.page,\n params?.per_page,\n params?.status,\n ] as const,\n queryFn: () =>\n usersContacts.listUserContactSubscriptionOrders(\n client,\n contactId,\n params,\n ),\n enabled: !!contactId,\n placeholderData: keepPreviousData,\n });\n}\n","\"use client\";\n\nimport React, { useState } from \"react\";\nimport { Repeat2 } from \"lucide-react\";\nimport { Pagination } from \"../shared/Pagination\";\nimport { Skeleton } from \"@fluid-app/ui-primitives\";\nimport type { FetchClient } from \"@fluid-app/api-client-core\";\nimport {\n useContactSubscriptionOrders,\n type ContactSubscriptionOrder,\n} from \"../../hooks/contacts/use-contact-subscription-orders\";\nimport {\n StatusBadge,\n type StatusBadgeVariant,\n} from \"../../../shared/components/contacts/statusBadge\";\n\n// ---------------------------------------------------------------------------\n// Subscription lifecycle status → badge variant map\n//\n// This maps the subscription's *lifecycle* status (sub.status) — NOT the\n// order-processing status used by the filter pills / API query parameter.\n// See the STATUS_FILTERS comment below for the full explanation.\n// ---------------------------------------------------------------------------\n\nconst lifecycleStatusVariant: Record<string, StatusBadgeVariant> = {\n active: \"success\",\n paused: \"warning\",\n cancelled: \"danger\",\n expired: \"neutral\",\n pending: \"warning\",\n trial: \"info\",\n past_due: \"notice\",\n failed: \"danger\",\n};\n\n// ---------------------------------------------------------------------------\n// Filter pills\n//\n// NOTE: The filter pills use *order-processing* statuses (awaiting_payment,\n// shipped, etc.) which map to the API's `status` query parameter. The badge\n// in each card displays the *subscription lifecycle* status (active, paused,\n// etc.) from `sub.status`. These are intentionally two different dimensions:\n// the filter narrows which subscription orders appear, while the badge shows\n// each subscription's lifecycle state.\n// ---------------------------------------------------------------------------\n\ntype SubscriptionOrderStatusFilter =\n | \"awaiting_payment\"\n | \"awaiting_shipment\"\n | \"shipped\"\n | \"delivered\"\n | \"archived\"\n | \"cancelled\"\n | \"failed_payment\"\n | \"draft\";\n\nconst STATUS_FILTERS: {\n label: string;\n value: SubscriptionOrderStatusFilter | null;\n}[] = [\n { label: \"All\", value: null },\n { label: \"Awaiting Payment\", value: \"awaiting_payment\" },\n { label: \"Awaiting Shipment\", value: \"awaiting_shipment\" },\n { label: \"Shipped\", value: \"shipped\" },\n { label: \"Delivered\", value: \"delivered\" },\n { label: \"Cancelled\", value: \"cancelled\" },\n];\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction formatLabel(value: string): string {\n return value\n .split(\"_\")\n .map((word) => word.charAt(0).toUpperCase() + word.slice(1))\n .join(\" \");\n}\n\nfunction formatDate(dateStr: string | null | undefined): string {\n if (!dateStr) return \"\\u2014\";\n return new Date(dateStr).toLocaleDateString(\"en-US\", {\n month: \"short\",\n day: \"numeric\",\n year: \"numeric\",\n });\n}\n\n// ---------------------------------------------------------------------------\n// Empty state\n// ---------------------------------------------------------------------------\n\nfunction EmptyState() {\n return (\n <div className=\"flex flex-col items-center justify-center px-4 py-12 text-center\">\n <div className=\"relative mb-6\">\n <div className=\"from-primary/10 to-primary/5 flex h-20 w-20 items-center justify-center rounded-full bg-gradient-to-br\">\n <Repeat2 className=\"text-primary/60 h-9 w-9\" />\n </div>\n </div>\n <h4 className=\"text-foreground text-base font-semibold\">\n No subscriptions yet\n </h4>\n <p className=\"text-muted-foreground mt-1.5 max-w-[260px] text-sm leading-relaxed\">\n Subscriptions for this contact will appear here\n </p>\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Loading skeleton\n// ---------------------------------------------------------------------------\n\nfunction SubscriptionCardSkeleton() {\n return (\n <div className=\"border-border bg-card rounded-xl border p-5\">\n <div className=\"flex items-start gap-4\">\n <Skeleton className=\"h-12 w-12 rounded-lg\" />\n <div className=\"flex-1 space-y-3\">\n <Skeleton className=\"h-5 w-32\" />\n <div className=\"flex gap-2\">\n <Skeleton className=\"h-5 w-16 rounded-xl\" />\n <Skeleton className=\"h-5 w-24 rounded-xl\" />\n </div>\n <Skeleton className=\"h-4 w-40\" />\n </div>\n <Skeleton className=\"h-6 w-16\" />\n </div>\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Subscription card\n// ---------------------------------------------------------------------------\n\nfunction SubscriptionCard({ sub }: { sub: ContactSubscriptionOrder }) {\n const displayAmount = sub.display_total ?? sub.display_amount ?? null;\n\n return (\n <div className=\"border-border bg-card hover:border-border/80 hover:bg-accent/30 rounded-xl border p-5 transition-colors\">\n <div className=\"flex items-start gap-4\">\n {/* Thumbnail */}\n {sub.order_thumbnail ? (\n <img\n src={sub.order_thumbnail}\n alt={`Subscription #${sub.order_number ?? sub.id}`}\n loading=\"lazy\"\n className=\"h-12 w-12 flex-shrink-0 rounded-lg object-cover\"\n />\n ) : (\n <div className=\"bg-muted flex h-12 w-12 flex-shrink-0 items-center justify-center rounded-lg\">\n <Repeat2 className=\"text-muted-foreground h-5 w-5\" />\n </div>\n )}\n\n {/* Info */}\n <div className=\"min-w-0 flex-1 space-y-2.5\">\n {/* Order number */}\n <p className=\"text-foreground text-sm font-semibold\">\n #{sub.order_number ?? sub.id}\n </p>\n\n {/* Status + interval */}\n <div className=\"flex flex-wrap items-center gap-1.5\">\n <StatusBadge\n status={lifecycleStatusVariant[sub.status] ?? \"neutral\"}\n label={formatLabel(sub.status)}\n />\n {sub.subscription_interval != null && (\n <StatusBadge\n status=\"accent\"\n label={`Every ${sub.subscription_interval} days`}\n />\n )}\n </div>\n\n {/* Dates */}\n <div className=\"text-muted-foreground flex flex-wrap gap-x-4 gap-y-1 text-xs\">\n {sub.next_bill_date && (\n <span>\n Next bill:{\" \"}\n <span className=\"text-foreground font-medium\">\n {formatDate(sub.next_bill_date)}\n </span>\n </span>\n )}\n {sub.created_at && (\n <span>Created {formatDate(sub.created_at)}</span>\n )}\n </div>\n </div>\n\n {/* Amount */}\n {displayAmount && (\n <p className=\"text-foreground flex-shrink-0 text-base font-semibold tabular-nums\">\n {displayAmount}\n </p>\n )}\n </div>\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Main component\n// ---------------------------------------------------------------------------\n\nexport interface ContactSubscriptionOrdersListProps {\n client: FetchClient;\n contactId: string;\n pageSize?: number;\n}\n\nexport function ContactSubscriptionOrdersList({\n client,\n contactId,\n pageSize = 10,\n}: ContactSubscriptionOrdersListProps): React.JSX.Element {\n const [page, setPage] = useState(1);\n const [statusFilter, setStatusFilter] =\n useState<SubscriptionOrderStatusFilter | null>(null);\n\n const { data, isLoading, isError, isFetching } = useContactSubscriptionOrders(\n client,\n contactId,\n {\n page,\n per_page: pageSize,\n ...(statusFilter ? { status: statusFilter } : {}),\n },\n );\n\n const subscriptions = data?.subscription_orders ?? [];\n const meta = data?.meta;\n const totalCount = meta?.total_count ?? 0;\n const totalPages = meta?.total_pages ?? 1;\n const currentPage = meta?.current_page ?? page;\n\n const handleStatusChange = (value: SubscriptionOrderStatusFilter | null) => {\n setStatusFilter(value);\n setPage(1);\n };\n\n if (isLoading) {\n return (\n <div className=\"space-y-4\">\n <div className=\"flex items-center justify-between\">\n <Skeleton className=\"h-6 w-32\" />\n </div>\n <div className=\"space-y-3\">\n {[1, 2, 3].map((i) => (\n <SubscriptionCardSkeleton key={i} />\n ))}\n </div>\n </div>\n );\n }\n\n if (isError) {\n return (\n <div className=\"flex flex-col items-center justify-center px-4 py-12 text-center\">\n <p className=\"text-destructive text-sm font-medium\">\n Failed to load subscriptions\n </p>\n <p className=\"text-muted-foreground mt-1 text-xs\">\n Please try again later\n </p>\n </div>\n );\n }\n\n if (totalCount === 0 && !statusFilter) {\n return <EmptyState />;\n }\n\n return (\n <div className=\"space-y-4\">\n {/* Header */}\n <div className=\"flex items-center justify-between\">\n <h3 className=\"text-foreground text-base font-semibold\">\n Subscriptions\n <span className=\"text-muted-foreground ml-1.5 text-sm font-normal\">\n ({totalCount})\n </span>\n </h3>\n {isFetching && (\n <div className=\"bg-muted h-1.5 w-1.5 animate-pulse rounded-full\" />\n )}\n </div>\n\n {/* Filter pills */}\n <div className=\"flex flex-wrap gap-1.5\">\n {STATUS_FILTERS.map((filter) => (\n <button\n type=\"button\"\n key={filter.label}\n onClick={() => handleStatusChange(filter.value)}\n className={`rounded-full px-3 py-1 text-xs font-medium transition-colors ${\n statusFilter === filter.value\n ? \"bg-foreground text-background\"\n : \"bg-muted text-muted-foreground hover:bg-muted/80\"\n }`}\n >\n {filter.label}\n </button>\n ))}\n </div>\n\n {/* Subscriptions list */}\n {subscriptions.length === 0 ? (\n <div className=\"flex flex-col items-center justify-center py-8 text-center\">\n <p className=\"text-muted-foreground text-sm\">\n No subscriptions match this filter\n </p>\n </div>\n ) : (\n <div className=\"space-y-3\">\n {subscriptions.map((sub) => (\n <SubscriptionCard key={sub.id} sub={sub} />\n ))}\n </div>\n )}\n\n {/* Pagination */}\n <Pagination\n currentPage={currentPage}\n totalPages={totalPages}\n totalCount={totalCount}\n onPageChange={setPage}\n />\n </div>\n );\n}\n","/**\n * Generated API client functions for company_contacts\n *\n * DO NOT EDIT THIS FILE DIRECTLY\n * This file is auto-generated. To update:\n * 1. Update the OpenAPI spec file\n * 2. Run: pnpm generate\n */\n\nimport type { FetchClient } from \"../lib/fetch-client\";\nimport type { operations } from \"../generated/company_contacts\";\n\n// ============================================================================\n// Company Contacts\n// ============================================================================\n\n/**\n * Create a company contact\n *\n *\n * @param client - Fetch client instance\n * @param body - body\n */\nexport async function createCompanyContact(\n client: FetchClient,\n body: operations[\"createCompanyContact\"][\"requestBody\"][\"content\"][\"application/json\"],\n): Promise<\n operations[\"createCompanyContact\"][\"responses\"][201][\"content\"][\"application/json\"]\n> {\n return client.post(`/api/company/contacts`, body);\n}\n\n/**\n * List company contacts\n *\n *\n * @param client - Fetch client instance\n * @param params? - params?\n */\nexport async function listCompanyContacts(\n client: FetchClient,\n params?: operations[\"listCompanyContacts\"][\"parameters\"][\"query\"],\n): Promise<\n operations[\"listCompanyContacts\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.get(`/api/company/contacts`, params);\n}\n\n/**\n * Delete a company contact\n *\n *\n * @param client - Fetch client instance\n * @param id - id\n */\nexport async function deleteCompanyContact(\n client: FetchClient,\n id: string | number,\n): Promise<\n operations[\"deleteCompanyContact\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.delete(`/api/company/contacts/${id}`);\n}\n\n/**\n * Get a company contact\n *\n *\n * @param client - Fetch client instance\n * @param id - id\n */\nexport async function getCompanyContact(\n client: FetchClient,\n id: string | number,\n): Promise<\n operations[\"getCompanyContact\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.get(`/api/company/contacts/${id}`);\n}\n\n/**\n * Update a company contact\n *\n *\n * @param client - Fetch client instance\n * @param id - id\n * @param body - body\n */\nexport async function updateCompanyContact(\n client: FetchClient,\n id: string | number,\n body: operations[\"updateCompanyContact\"][\"requestBody\"][\"content\"][\"application/json\"],\n): Promise<\n operations[\"updateCompanyContact\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.patch(`/api/company/contacts/${id}`, body);\n}\n","import { companyContacts } from \"@fluid-app/company-contacts-api-client\";\nimport { usersContacts } from \"@fluid-app/user-contacts-api-client\";\nimport type { Contact, ContactsApiConfig } from \"../types\";\n\nexport type ContactApi = ReturnType<typeof createContactApi>;\n\nexport function createContactApi(config: ContactsApiConfig) {\n const { mode, client } = config;\n\n if (mode === \"admin\") {\n return {\n getContact: (id: string) =>\n companyContacts.getCompanyContact(client, id) as Promise<{\n contact: Contact;\n }>,\n createContact: (data: Record<string, unknown>) =>\n companyContacts.createCompanyContact(client, {\n contact: data,\n } as Parameters<typeof companyContacts.createCompanyContact>[1]),\n updateContact: (id: string, data: Record<string, unknown>) =>\n companyContacts.updateCompanyContact(client, id, {\n id: Number(id),\n contact: data,\n } as Parameters<typeof companyContacts.updateCompanyContact>[2]),\n deleteContact: (id: string) =>\n companyContacts.deleteCompanyContact(client, id),\n };\n }\n\n return {\n getContact: (id: string) =>\n usersContacts.getUserContact(client, id) as Promise<{\n contact: Contact;\n }>,\n createContact: (data: Record<string, unknown>) =>\n usersContacts.createUserContact(client, {\n contact: data,\n } as Parameters<typeof usersContacts.createUserContact>[1]),\n updateContact: (id: string, data: Record<string, unknown>) =>\n usersContacts.updateUserContact(client, id, {\n contact: data,\n } as Parameters<typeof usersContacts.updateUserContact>[2]),\n deleteContact: (id: string) => usersContacts.deleteUserContact(client, id),\n };\n}\n","\"use client\";\n\nimport { useQuery } from \"@tanstack/react-query\";\nimport type { ContactsApiConfig } from \"../types\";\nimport { createContactApi } from \"../utils/createContactApi\";\nimport { CONTACTS_QUERY_KEYS } from \"../query-keys\";\n\nexport function useContactDetail(\n config: ContactsApiConfig,\n contactId: string,\n queryKeyPrefix = \"contacts\",\n) {\n const { getContact } = createContactApi(config);\n\n return useQuery({\n queryKey: CONTACTS_QUERY_KEYS.detail(queryKeyPrefix, contactId),\n queryFn: () => getContact(contactId),\n enabled: !!contactId,\n });\n}\n","\"use client\";\n\nimport { useMutation, useQueryClient } from \"@tanstack/react-query\";\nimport { fluidToast } from \"@fluid-app/ui-primitives\";\nimport { parseApiErrors } from \"@fluid-app/api-client-core\";\nimport type { ContactsApiConfig } from \"../types\";\nimport { createContactApi } from \"../utils/createContactApi\";\nimport { CONTACTS_QUERY_KEYS } from \"../query-keys\";\n\ntype UpdateInput = {\n id: string;\n data: Record<string, unknown>;\n};\n\nexport function useUpdateContactMutation(\n config: ContactsApiConfig,\n contactId: string,\n queryKeyPrefix = \"contacts\",\n options?: {\n onSuccess?: () => void;\n onError?: (error: unknown) => void;\n },\n) {\n const queryClient = useQueryClient();\n const { updateContact } = createContactApi(config);\n\n return useMutation({\n mutationFn: ({ id, data }: UpdateInput) => updateContact(id, data),\n onSuccess: () => {\n fluidToast({ title: \"Contact updated successfully\", type: \"success\" });\n queryClient.invalidateQueries({\n queryKey: CONTACTS_QUERY_KEYS.all(queryKeyPrefix),\n });\n options?.onSuccess?.();\n },\n onError: (error) => {\n fluidToast({\n title: \"Failed to save contact\",\n type: \"error\",\n description: parseApiErrors(error),\n });\n options?.onError?.(error);\n },\n });\n}\n","\"use client\";\n\nimport { useMutation, useQueryClient } from \"@tanstack/react-query\";\nimport { fluidToast } from \"@fluid-app/ui-primitives\";\nimport { parseApiErrors } from \"@fluid-app/api-client-core\";\nimport type { ContactsApiConfig } from \"../types\";\nimport { createContactApi } from \"../utils/createContactApi\";\nimport { CONTACTS_QUERY_KEYS } from \"../query-keys\";\n\nexport function useDeleteContactMutation(\n config: ContactsApiConfig,\n queryKeyPrefix = \"contacts\",\n options?: {\n onSuccess?: () => void;\n onError?: (error: unknown) => void;\n },\n) {\n const queryClient = useQueryClient();\n const { deleteContact } = createContactApi(config);\n\n return useMutation({\n mutationFn: (contactId: string) => deleteContact(contactId),\n onSuccess: () => {\n fluidToast({ title: \"Contact deleted successfully\", type: \"success\" });\n queryClient.invalidateQueries({\n queryKey: CONTACTS_QUERY_KEYS.all(queryKeyPrefix),\n });\n options?.onSuccess?.();\n },\n onError: (error) => {\n fluidToast({\n title: \"Failed to delete contact\",\n type: \"error\",\n description: parseApiErrors(error),\n });\n options?.onError?.(error);\n },\n });\n}\n","import { z } from \"zod\";\n\n/**\n * Form schema for creating a contact.\n * Matches CompanyContactCreate from the OpenAPI spec, except:\n * - Uses country_id/language_id (mapped to country_code/language_code on submit)\n *\n * @see CompanyContactCreate in company_contacts.d.ts\n */\nexport const createContactFormSchema = z.object({\n first_name: z.string().min(1, { message: \"First name is required\" }),\n last_name: z.string().min(1, { message: \"Last name is required\" }),\n status: z.string().nullable().optional(),\n email: z.string().email().or(z.literal(\"\")).nullable().optional(),\n phone: z.string().nullable().optional(),\n address: z.string().nullable().optional(),\n city: z.string().nullable().optional(),\n state: z.string().nullable().optional(),\n postal_code: z.string().nullable().optional(),\n country_id: z.coerce.string().nullable().optional(),\n language_id: z.coerce.string().nullable().optional(),\n affiliate: z.record(z.string(), z.unknown()).nullable().optional(),\n metadata: z.record(z.string(), z.unknown()).optional(),\n});\n\nexport type CreateContactFormData = z.infer<typeof createContactFormSchema>;\n\n/**\n * Form schema for editing a contact.\n * Same fields as create plus id. Uses .passthrough() so extra fields\n * from the Contact read model (full_name, avatar_url, etc.) don't\n * cause validation failures.\n *\n * @see CompanyContactUpdate in company_contacts.d.ts\n */\nexport const editContactFormSchema = createContactFormSchema.passthrough();\n\nexport type EditContactFormData = z.infer<typeof editContactFormSchema>;\n","\"use client\";\n\nimport { useMemo, useCallback } from \"react\";\nimport { useZodForm, fluidToast } from \"@fluid-app/ui-primitives\";\nimport type { UseFormReturn } from \"react-hook-form\";\nimport { useQuery } from \"@tanstack/react-query\";\nimport { useContactDetail } from \"./useContactDetail\";\nimport { useUpdateContactMutation } from \"./useUpdateContactMutation\";\nimport { useDeleteContactMutation } from \"./useDeleteContactMutation\";\nimport {\n createContactFormSchema,\n editContactFormSchema,\n type EditContactFormData,\n} from \"../schemas/contactFormSchema\";\nimport type { Contact, ContactsApiConfig } from \"../types\";\n\nconst mutableKeys = Object.keys(\n createContactFormSchema.shape,\n) as (keyof EditContactFormData)[];\n\nexport function useContactDetailPage(\n config: ContactsApiConfig,\n contactId: string,\n options?: {\n queryKeyPrefix?: string;\n getCountries?: () => Promise<{ id: number; name: string; iso?: string }[]>;\n onDeleteSuccess?: () => void;\n },\n): {\n contact: Contact | undefined;\n isLoading: boolean;\n methods: UseFormReturn<EditContactFormData>;\n countryOptions: { name: string; value: string }[];\n isDirty: boolean;\n isSubmitting: boolean;\n isDeleting: boolean;\n onSave: () => void;\n onDelete: () => void;\n} {\n const queryKeyPrefix = options?.queryKeyPrefix ?? \"contacts\";\n\n const { data, isLoading } = useContactDetail(\n config,\n contactId,\n queryKeyPrefix,\n );\n\n const { data: countries } = useQuery({\n queryKey: [\"countries\"],\n queryFn: options?.getCountries ?? (() => Promise.resolve([])),\n enabled: !!options?.getCountries,\n });\n\n const countryOptions = useMemo(\n () =>\n [\n ...(countries?.map((c) => ({\n name: c.name,\n value: c.iso ?? c.id.toString(),\n })) ?? []),\n ].sort((a, b) => a.name.localeCompare(b.name)),\n [countries],\n );\n\n const contact = data?.contact;\n\n // Map nested country object to the ISO code the form select expects\n const formValues = useMemo(() => {\n if (!contact) return undefined;\n return {\n ...contact,\n country_id:\n contact.country?.iso ?? contact.country_id?.toString() ?? null,\n } as unknown as EditContactFormData;\n }, [contact]);\n\n const methods = useZodForm<EditContactFormData>(editContactFormSchema, {\n values: formValues,\n mode: \"onBlur\",\n });\n\n const updateMutation = useUpdateContactMutation(\n config,\n contactId,\n queryKeyPrefix,\n {\n onSuccess: () => {\n methods.reset(methods.getValues());\n },\n },\n );\n\n const deleteMutation = useDeleteContactMutation(config, queryKeyPrefix, {\n onSuccess: () => {\n options?.onDeleteSuccess?.();\n },\n });\n\n const onSave = useCallback(() => {\n methods.handleSubmit(\n (formData) => {\n const payload: Record<string, unknown> = {};\n for (const key of mutableKeys) {\n if (key in formData) {\n payload[key] = formData[key];\n }\n }\n\n // API expects country_code/language_code (ISO strings) instead of country_id/language_id\n // Form value is already the ISO code (countryOptions maps c.iso ?? c.id.toString())\n if (payload.country_id) {\n payload.country_code = String(payload.country_id);\n delete payload.country_id;\n }\n if (payload.language_id) {\n payload.language_code = String(payload.language_id);\n delete payload.language_id;\n }\n\n updateMutation.mutate({\n id: contactId,\n data: payload,\n });\n },\n (errors) => {\n const errorMessages = Object.entries(errors)\n .map(([field, err]) => {\n const msg =\n typeof err?.message === \"string\" ? err.message : \"invalid\";\n return `${field.replace(/_/g, \" \")}: ${msg}`;\n })\n .join(\", \");\n fluidToast({\n title: \"Please fix the form errors before saving\",\n description: errorMessages || undefined,\n type: \"error\",\n });\n },\n )();\n }, [methods, updateMutation, contactId]);\n\n const onDelete = useCallback(() => {\n deleteMutation.mutate(contactId);\n }, [deleteMutation, contactId]);\n\n return {\n contact,\n isLoading,\n methods,\n countryOptions,\n isDirty: methods.formState.isDirty,\n isSubmitting: updateMutation.isPending,\n isDeleting: deleteMutation.isPending,\n onSave,\n onDelete,\n };\n}\n","\"use client\";\n\nimport { useMutation, useQueryClient } from \"@tanstack/react-query\";\nimport { fluidToast } from \"@fluid-app/ui-primitives\";\nimport { parseApiErrors } from \"@fluid-app/api-client-core\";\nimport type { ContactsApiConfig } from \"../types\";\nimport { createContactApi } from \"../utils/createContactApi\";\nimport { CONTACTS_QUERY_KEYS } from \"../query-keys\";\nimport type { CreateContactFormData } from \"../schemas/contactFormSchema\";\n\nexport function useCreateContactMutation(\n config: ContactsApiConfig,\n queryKeyPrefix = \"contacts\",\n options?: {\n onSuccess?: (data: { contact: { id: number } }) => void;\n onError?: (error: unknown) => void;\n },\n) {\n const queryClient = useQueryClient();\n const { createContact } = createContactApi(config);\n\n return useMutation({\n mutationFn: (data: CreateContactFormData) =>\n createContact(data as unknown as Record<string, unknown>),\n onSuccess: (data) => {\n fluidToast({ title: \"Contact created successfully\", type: \"success\" });\n queryClient.invalidateQueries({\n queryKey: CONTACTS_QUERY_KEYS.all(queryKeyPrefix),\n });\n options?.onSuccess?.(data as unknown as { contact: { id: number } });\n },\n onError: (error) => {\n if (options?.onError) {\n options.onError(error);\n } else {\n fluidToast({\n title: \"Failed to create contact\",\n type: \"error\",\n description: parseApiErrors(error),\n });\n }\n },\n });\n}\n","/**\n * Hook that derives a FetchClient from the portal SDK's FluidProvider context.\n *\n * Maps FluidSDKConfig fields to a FetchClient suitable for contacts, notes, and tasks APIs.\n * Follows the same pattern as useMessagingConfig.\n */\n\nimport { useMemo } from \"react\";\nimport { createFetchClient } from \"@fluid-app/api-client-core\";\nimport type { FetchClient } from \"@fluid-app/api-client-core\";\nimport { useFluidContext } from \"../providers/FluidProvider\";\n\nexport function useContactsConfig(): { client: FetchClient } {\n const { config } = useFluidContext();\n\n const client = useMemo(() => {\n // Don't append /api — the generated API client paths already include /api\n const baseUrl = config.baseUrl.replace(/\\/+$/, \"\").replace(/\\/api$/, \"\");\n\n return createFetchClient({\n baseUrl,\n getAuthToken: config.getAuthToken,\n onAuthError: config.onAuthError,\n defaultHeaders: config.defaultHeaders,\n });\n }, [\n config.baseUrl,\n config.getAuthToken,\n config.onAuthError,\n config.defaultHeaders,\n ]);\n\n return { client };\n}\n","import { useState, useCallback, useRef, useMemo } from \"react\";\nimport { useQuery } from \"@tanstack/react-query\";\nimport { FormProvider } from \"react-hook-form\";\nimport { useZodForm } from \"@fluid-app/ui-primitives\";\nimport { ArrowLeft } from \"lucide-react\";\nimport type { ComponentProps } from \"react\";\nimport type {\n BackgroundValue,\n BorderRadiusOptions,\n ColorOptions,\n PaddingOptions,\n} from \"../types\";\nimport type { WidgetPropertySchema } from \"../registries/property-schema-types\";\nimport { Button } from \"@fluid-app/portal-widgets/ui\";\nimport { ContactsListScreen } from \"@fluid-app/contacts-ui/screens/ContactsListScreen\";\nimport type { Contact } from \"@fluid-app/contacts-ui/shared/components/contacts/allContacts/contactsPage\";\nimport { ContactDetailScreen } from \"@fluid-app/contacts-ui/screens/ContactDetailScreen\";\nimport { ContactCreateScreen } from \"@fluid-app/contacts-ui/screens/ContactCreateScreen\";\nimport { RepContactDetailView } from \"@fluid-app/contacts-ui/portal/components/contacts/rep-contact-detail-view\";\nimport { ContactDetailsForm } from \"@fluid-app/contacts-ui/shared/components/contacts/contactDetailsForm\";\nimport { ContactOrdersList } from \"@fluid-app/contacts-ui/portal/components/orders/ContactOrdersList\";\nimport { ContactSubscriptionOrdersList } from \"@fluid-app/contacts-ui/portal/components/subscriptions/ContactSubscriptionOrdersList\";\nimport { useContactDetailPage } from \"@fluid-app/contacts-ui/shared/hooks/useContactDetailPage\";\nimport { useCreateContactMutation } from \"@fluid-app/contacts-ui/shared/hooks/useCreateContactMutation\";\nimport {\n createContactFormSchema,\n type CreateContactFormData,\n} from \"@fluid-app/contacts-ui/shared/schemas/contactFormSchema\";\nimport type { ContactsApiConfig } from \"@fluid-app/contacts-ui/shared/types\";\nimport { usersContacts } from \"@fluid-app/user-contacts-api-client\";\nimport { useContactsConfig } from \"../contacts/use-contacts-config\";\n\ntype NavState =\n | { view: \"list\" }\n | { view: \"detail\"; contactId: string }\n | { view: \"new\" };\n\ntype ContactsScreenProps = ComponentProps<\"div\"> & {\n // Styling\n background?: BackgroundValue;\n textColor?: ColorOptions;\n accentColor?: ColorOptions;\n padding?: PaddingOptions;\n borderRadius?: BorderRadiusOptions;\n\n // Display\n defaultViewMode?: \"list\" | \"grid\";\n\n // Callbacks\n onContactSelect?: (contactId: string) => void;\n onCreateContact?: () => void;\n};\n\nconst QUERY_KEY_PREFIX = \"sdk-contacts\";\n\nfunction fetchCountries(\n client: ContactsApiConfig[\"client\"],\n): Promise<{ id: number; name: string; iso?: string }[]> {\n return client.get(\"/api/countries\");\n}\n\nfunction ContactListView({\n client,\n onNavigate,\n onContactSelect,\n}: {\n client: ContactsApiConfig[\"client\"];\n onNavigate: (state: NavState) => void;\n onContactSelect?: (contactId: string) => void;\n}) {\n const handleSelectContact = useCallback(\n (contact: Contact) => {\n onContactSelect?.(String(contact.id));\n onNavigate({ view: \"detail\", contactId: String(contact.id) });\n },\n [onNavigate, onContactSelect],\n );\n\n const listContacts = useCallback(\n (params: Record<string, unknown>) =>\n usersContacts.listUserContacts(\n client,\n params as Parameters<typeof usersContacts.listUserContacts>[1],\n ),\n [client],\n );\n\n const deleteContacts = useCallback(\n (ids: number[]) =>\n usersContacts.bulkDeleteUserContacts(client, { contact_ids: ids }),\n [client],\n );\n\n const handleAddContact = useCallback(() => {\n onNavigate({ view: \"new\" });\n }, [onNavigate]);\n\n return (\n <ContactsListScreen\n listContacts={listContacts}\n deleteContacts={deleteContacts}\n queryKeyPrefix={QUERY_KEY_PREFIX}\n tableLayout=\"members\"\n onEditContact={handleSelectContact}\n onRowClick={handleSelectContact}\n onAddContact={handleAddContact}\n />\n );\n}\n\nfunction ContactDetailView({\n contactId,\n client,\n onNavigate,\n}: {\n contactId: string;\n client: ContactsApiConfig[\"client\"];\n onNavigate: (state: NavState) => void;\n}) {\n const config: ContactsApiConfig = useMemo(\n () => ({ mode: \"rep\" as const, client }),\n [client],\n );\n\n const getCountries = useCallback(() => fetchCountries(client), [client]);\n\n const {\n contact,\n isLoading,\n methods,\n countryOptions,\n isDirty,\n isSubmitting,\n isDeleting,\n onSave,\n onDelete,\n } = useContactDetailPage(config, contactId, {\n queryKeyPrefix: QUERY_KEY_PREFIX,\n getCountries,\n onDeleteSuccess: () => onNavigate({ view: \"list\" }),\n });\n\n const handleNavigateToList = useCallback(() => {\n onNavigate({ view: \"list\" });\n }, [onNavigate]);\n\n if (isLoading) {\n return (\n <div className=\"mx-auto max-w-7xl space-y-6 px-4 py-4 sm:px-6 sm:py-6 lg:px-10 lg:py-8\">\n <div className=\"bg-muted h-10 w-48 animate-pulse rounded-md\" />\n <div className=\"bg-muted h-8 w-64 animate-pulse rounded-md\" />\n <div className=\"grid grid-cols-1 gap-6 lg:grid-cols-3\">\n <div className=\"bg-muted h-80 animate-pulse rounded-2xl\" />\n <div className=\"bg-muted h-64 animate-pulse rounded-md lg:col-span-2\" />\n </div>\n </div>\n );\n }\n\n if (!contact) {\n return (\n <div className=\"mx-auto max-w-7xl px-4 py-4 sm:px-6 sm:py-6 lg:px-10 lg:py-8\">\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className=\"mb-6\"\n onClick={handleNavigateToList}\n >\n <ArrowLeft className=\"h-4 w-4\" />\n Back to Contacts\n </Button>\n <div className=\"border-border max-w-sm rounded-lg border border-dashed p-8 text-center\">\n <h2 className=\"text-foreground text-xl font-semibold\">\n Unable to load contact\n </h2>\n <p className=\"text-muted-foreground mt-2\">\n This contact may have been deleted, you may not have permission to\n view it, or there was a network error. Please try again.\n </p>\n </div>\n </div>\n );\n }\n\n return (\n <ContactDetailScreen\n contactId={contactId}\n contact={contact}\n onNavigateToList={handleNavigateToList}\n onSave={onSave}\n onDelete={onDelete}\n isDirty={isDirty}\n isSubmitting={isSubmitting}\n isDeleting={isDeleting}\n >\n <FormProvider {...methods}>\n <RepContactDetailView\n contact={contact}\n contactId={contactId}\n client={client}\n notesClient={client}\n tasksClient={client}\n countryOptions={countryOptions}\n ordersSlot={\n <ContactOrdersList client={client} contactId={contactId} />\n }\n subscriptionsSlot={\n <ContactSubscriptionOrdersList\n client={client}\n contactId={contactId}\n />\n }\n />\n </FormProvider>\n </ContactDetailScreen>\n );\n}\n\nconst CREATE_DEFAULT_VALUES: CreateContactFormData = {\n first_name: \"\",\n last_name: \"\",\n email: \"\",\n phone: \"\",\n status: \"new\",\n address: \"\",\n city: \"\",\n state: \"\",\n postal_code: \"\",\n country_id: null,\n language_id: null,\n metadata: {},\n affiliate: {},\n};\n\nfunction ContactCreateView({\n client,\n onNavigate,\n onCreateContact,\n}: {\n client: ContactsApiConfig[\"client\"];\n onNavigate: (state: NavState) => void;\n onCreateContact?: () => void;\n}) {\n const formRef = useRef<HTMLFormElement>(null);\n\n const config: ContactsApiConfig = useMemo(\n () => ({ mode: \"rep\" as const, client }),\n [client],\n );\n\n const { data: countries } = useQuery({\n queryKey: [\"countries\"],\n queryFn: () => fetchCountries(client),\n });\n\n const countryOptions = useMemo(\n () =>\n (countries ?? [])\n .map((c) => ({ name: c.name, value: c.iso ?? String(c.id) }))\n .sort((a, b) => a.name.localeCompare(b.name)),\n [countries],\n );\n\n const methods = useZodForm<CreateContactFormData>(createContactFormSchema, {\n defaultValues: CREATE_DEFAULT_VALUES,\n });\n\n const mutation = useCreateContactMutation(config, QUERY_KEY_PREFIX, {\n onSuccess: (data) => {\n onCreateContact?.();\n const newContactId = data?.contact?.id;\n if (newContactId) {\n onNavigate({ view: \"detail\", contactId: String(newContactId) });\n } else {\n onNavigate({ view: \"list\" });\n }\n },\n });\n\n const { mutate } = mutation;\n\n const onSubmit = useMemo(\n () =>\n methods.handleSubmit(\n (data) => {\n const { affiliate, country_id, language_id, ...contactFields } = data;\n const payload: Record<string, unknown> = {};\n\n for (const [key, value] of Object.entries(contactFields)) {\n if (value !== \"\" && value !== null && value !== undefined) {\n payload[key] = value;\n }\n }\n\n if (country_id) {\n payload.country_code = String(country_id);\n }\n if (language_id) {\n payload.language_code = String(language_id);\n }\n\n if (affiliate && Object.keys(affiliate).length > 0) {\n payload.affiliate = affiliate;\n }\n\n // The mutation accepts CreateContactFormData but internally casts to\n // Record<string, unknown>. Our payload substitutes country_code/language_code\n // for country_id/language_id (matching the rep API), so we cast through unknown.\n mutate(payload as unknown as CreateContactFormData);\n },\n () => {\n // Validation errors are shown inline by react-hook-form field controllers.\n // handleSubmit already populates field errors before calling this callback.\n },\n ),\n [methods, mutate],\n );\n\n const handleNavigateToList = useCallback(() => {\n onNavigate({ view: \"list\" });\n }, [onNavigate]);\n\n return (\n <ContactCreateScreen\n onNavigateToList={handleNavigateToList}\n onSubmit={() => formRef.current?.requestSubmit()}\n isPending={mutation.isPending}\n >\n <FormProvider {...methods}>\n <div className=\"mx-auto max-w-7xl space-y-12 md:px-10 md:py-8\">\n <form\n ref={formRef}\n onSubmit={onSubmit}\n className=\"mx-auto space-y-6 lg:max-w-2xl\"\n >\n <ContactDetailsForm\n countries={countryOptions}\n cardClassName=\"bg-transparent shadow-none\"\n />\n </form>\n </div>\n </FormProvider>\n </ContactCreateScreen>\n );\n}\n\nexport function ContactsScreen({\n onContactSelect,\n onCreateContact,\n /* eslint-disable @typescript-eslint/no-unused-vars -- destructured to exclude from divProps spread */\n background,\n textColor,\n accentColor,\n padding,\n borderRadius,\n defaultViewMode,\n /* eslint-enable @typescript-eslint/no-unused-vars */\n ...divProps\n}: ContactsScreenProps): React.JSX.Element {\n const { client } = useContactsConfig();\n const [nav, setNav] = useState<NavState>({ view: \"list\" });\n\n return (\n <div {...divProps} className={`h-full ${divProps.className ?? \"\"}`}>\n {nav.view === \"list\" && (\n <ContactListView\n client={client}\n onNavigate={setNav}\n onContactSelect={onContactSelect}\n />\n )}\n {nav.view === \"detail\" && (\n <ContactDetailView\n contactId={nav.contactId}\n client={client}\n onNavigate={setNav}\n />\n )}\n {nav.view === \"new\" && (\n <ContactCreateView\n client={client}\n onNavigate={setNav}\n onCreateContact={onCreateContact}\n />\n )}\n </div>\n );\n}\n\nexport const contactsScreenPropertySchema: WidgetPropertySchema = {\n widgetType: \"ContactsScreen\",\n displayName: \"Contacts Screen\",\n tabsConfig: [{ id: \"styling\", label: \"Styling\" }],\n fields: [],\n} as const satisfies WidgetPropertySchema;\n"],"mappings":"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"}
|