@fluid-app/portal-sdk 0.1.373 → 0.1.374

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.
Files changed (74) hide show
  1. package/dist/{ContactsScreen-BVAzJjVs.cjs → ContactsScreen-C28RoYHu.cjs} +2 -2
  2. package/dist/{ContactsScreen-BVAzJjVs.cjs.map → ContactsScreen-C28RoYHu.cjs.map} +1 -1
  3. package/dist/{ContactsScreen-BKKowprR.cjs → ContactsScreen-CCXFgzcN.cjs} +2 -2
  4. package/dist/{ContactsScreen-BHy20ML1.mjs → ContactsScreen-DvPP4F22.mjs} +2 -2
  5. package/dist/{ContactsScreen-BHy20ML1.mjs.map → ContactsScreen-DvPP4F22.mjs.map} +1 -1
  6. package/dist/{ContactsTranslationBridge-BGeau5_N.mjs → ContactsTranslationBridge-Ckjj_Iu9.mjs} +3 -1
  7. package/dist/{ContactsTranslationBridge-BGeau5_N.mjs.map → ContactsTranslationBridge-Ckjj_Iu9.mjs.map} +1 -1
  8. package/dist/{ContactsTranslationBridge-D9gEIAp3.cjs → ContactsTranslationBridge-Dx_1jAxz.cjs} +3 -1
  9. package/dist/{ContactsTranslationBridge-D9gEIAp3.cjs.map → ContactsTranslationBridge-Dx_1jAxz.cjs.map} +1 -1
  10. package/dist/{FluidProvider-CURmntkw.cjs → FluidProvider-BvVjhwrv.cjs} +7 -6
  11. package/dist/{FluidProvider-CURmntkw.cjs.map → FluidProvider-BvVjhwrv.cjs.map} +1 -1
  12. package/dist/{FluidProvider-Bu9N22BI.mjs → FluidProvider-Cx0wNNF7.mjs} +7 -6
  13. package/dist/{FluidProvider-Bu9N22BI.mjs.map → FluidProvider-Cx0wNNF7.mjs.map} +1 -1
  14. package/dist/{MessagingScreen-NE1Na8rN.cjs → MessagingScreen-6fuZJ_0Q.cjs} +5 -5
  15. package/dist/{MessagingScreen-D8_oGy_k.mjs → MessagingScreen-BEVwNvC3.mjs} +2 -2
  16. package/dist/{MessagingScreen-D8_oGy_k.mjs.map → MessagingScreen-BEVwNvC3.mjs.map} +1 -1
  17. package/dist/{MessagingScreen-YvwfkYbW.cjs → MessagingScreen-BTcBx8v4.cjs} +2 -2
  18. package/dist/{MessagingScreen-YvwfkYbW.cjs.map → MessagingScreen-BTcBx8v4.cjs.map} +1 -1
  19. package/dist/{MessagingScreen-DwmciO1o.mjs → MessagingScreen-Bw3pawb5.mjs} +5 -5
  20. package/dist/{OrdersScreen-B81SHSOU.cjs → OrdersScreen-BZUSgBTy.cjs} +2 -2
  21. package/dist/{OrdersScreen-B81SHSOU.cjs.map → OrdersScreen-BZUSgBTy.cjs.map} +1 -1
  22. package/dist/{OrdersScreen-BtgUuBky.cjs → OrdersScreen-CViKIru5.cjs} +5 -5
  23. package/dist/{OrdersScreen-DYjOpQa2.mjs → OrdersScreen-DcA6QoGF.mjs} +5 -5
  24. package/dist/{OrdersScreen-BycEvuSw.mjs → OrdersScreen-Kkk88xDy.mjs} +2 -2
  25. package/dist/{OrdersScreen-BycEvuSw.mjs.map → OrdersScreen-Kkk88xDy.mjs.map} +1 -1
  26. package/dist/{ProfileScreen-DisEMe-1.cjs → ProfileScreen-C2-nARkW.cjs} +6 -6
  27. package/dist/{ProfileScreen-BVRnPuRm.mjs → ProfileScreen-CZJA8dZS.mjs} +4 -4
  28. package/dist/{ProfileScreen-BVRnPuRm.mjs.map → ProfileScreen-CZJA8dZS.mjs.map} +1 -1
  29. package/dist/{ProfileScreen-Ckf1a-zh.mjs → ProfileScreen-DjCRBTlH.mjs} +6 -6
  30. package/dist/{ProfileScreen-B0yVzqyg.cjs → ProfileScreen-j-5VwfqY.cjs} +4 -4
  31. package/dist/{ProfileScreen-B0yVzqyg.cjs.map → ProfileScreen-j-5VwfqY.cjs.map} +1 -1
  32. package/dist/{ShopScreen-DN5Y1HQ7.mjs → ShopScreen-BT5QKVbL.mjs} +5 -5
  33. package/dist/{ShopScreen-CPpJB-Kt.mjs → ShopScreen-CyRX0aOs.mjs} +48 -42
  34. package/dist/ShopScreen-CyRX0aOs.mjs.map +1 -0
  35. package/dist/{ShopScreen-CEB0iwmF.cjs → ShopScreen-D3Pzmg6Q.cjs} +5 -5
  36. package/dist/{ShopScreen-B9uHdQP7.cjs → ShopScreen-DVlQAOHj.cjs} +48 -42
  37. package/dist/ShopScreen-DVlQAOHj.cjs.map +1 -0
  38. package/dist/{ShopWidget-BbCPV2_Y.cjs → ShopWidget-C_R5RGoe.cjs} +13 -23
  39. package/dist/ShopWidget-C_R5RGoe.cjs.map +1 -0
  40. package/dist/{ShopWidget-BF0zWjS6.cjs → ShopWidget-CaPQVMlr.cjs} +1 -1
  41. package/dist/{ShopWidget-YMXis5SJ.mjs → ShopWidget-N0OqYNM-.mjs} +13 -23
  42. package/dist/ShopWidget-N0OqYNM-.mjs.map +1 -0
  43. package/dist/{SubscriptionsScreen-DdazqD1V.mjs → SubscriptionsScreen-C-UXQeNC.mjs} +4 -4
  44. package/dist/{SubscriptionsScreen-DdazqD1V.mjs.map → SubscriptionsScreen-C-UXQeNC.mjs.map} +1 -1
  45. package/dist/{SubscriptionsScreen-BTQuJNaY.cjs → SubscriptionsScreen-OITPOl3Y.cjs} +4 -4
  46. package/dist/{SubscriptionsScreen-BTQuJNaY.cjs.map → SubscriptionsScreen-OITPOl3Y.cjs.map} +1 -1
  47. package/dist/{SubscriptionsScreen-C_7vhN3q.cjs → SubscriptionsScreen-amFuxymL.cjs} +6 -6
  48. package/dist/{SubscriptionsScreen-ZkjeOBHH.mjs → SubscriptionsScreen-lvMO6Bkp.mjs} +6 -6
  49. package/dist/{ToDoWidget-3bkkxozQ.cjs → ToDoWidget-Cr0VP7k6.cjs} +1 -1
  50. package/dist/{ToDoWidget-BZyJIX1X.mjs → ToDoWidget-DiGklfKG.mjs} +32 -39
  51. package/dist/ToDoWidget-DiGklfKG.mjs.map +1 -0
  52. package/dist/{ToDoWidget-CgFDCQNX.cjs → ToDoWidget-aSYTB02O.cjs} +31 -38
  53. package/dist/ToDoWidget-aSYTB02O.cjs.map +1 -0
  54. package/dist/index.cjs +24 -24
  55. package/dist/index.d.cts.map +1 -1
  56. package/dist/index.d.mts.map +1 -1
  57. package/dist/index.mjs +24 -24
  58. package/dist/preview/preview-entry.cjs +5 -5
  59. package/dist/preview/preview-entry.mjs +5 -5
  60. package/dist/{use-portal-card-add-3ds-flow-CphCh5cu.mjs → use-portal-card-add-3ds-flow-BLjXfmje.mjs} +2 -2
  61. package/dist/{use-portal-card-add-3ds-flow-CphCh5cu.mjs.map → use-portal-card-add-3ds-flow-BLjXfmje.mjs.map} +1 -1
  62. package/dist/{use-portal-card-add-3ds-flow-BxFF4Wew.cjs → use-portal-card-add-3ds-flow-C2uzzhr8.cjs} +2 -2
  63. package/dist/{use-portal-card-add-3ds-flow-BxFF4Wew.cjs.map → use-portal-card-add-3ds-flow-C2uzzhr8.cjs.map} +1 -1
  64. package/dist/{widget-package-utils-BS8mCzgZ.mjs → widget-package-utils-DG2ibxqS.mjs} +2 -2
  65. package/dist/{widget-package-utils-BS8mCzgZ.mjs.map → widget-package-utils-DG2ibxqS.mjs.map} +1 -1
  66. package/dist/{widget-package-utils-C0WYunNq.cjs → widget-package-utils-pdLitM72.cjs} +2 -2
  67. package/dist/{widget-package-utils-C0WYunNq.cjs.map → widget-package-utils-pdLitM72.cjs.map} +1 -1
  68. package/package.json +14 -14
  69. package/dist/ShopScreen-B9uHdQP7.cjs.map +0 -1
  70. package/dist/ShopScreen-CPpJB-Kt.mjs.map +0 -1
  71. package/dist/ShopWidget-BbCPV2_Y.cjs.map +0 -1
  72. package/dist/ShopWidget-YMXis5SJ.mjs.map +0 -1
  73. package/dist/ToDoWidget-BZyJIX1X.mjs.map +0 -1
  74. package/dist/ToDoWidget-CgFDCQNX.cjs.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"ContactsTranslationBridge-D9gEIAp3.cjs","names":["portalTenantContacts.contacts_show","portalTenantContacts.contacts_list","portalTenantContacts.contacts_create","portalTenantContacts.contacts_update","portalTenantContacts.contacts_destroy","portalTenantContacts.contacts_bulk_destroy","portalTenantContacts.contacts_notes_list","portalTenantContacts.contacts_notes_create","portalTenantContacts.contacts_notes_update","portalTenantContacts.contacts_notes_destroy","portalTenantContacts.contacts_tasks_list","portalTenantContacts.contacts_tasks_create","portalTenantContacts.contacts_tasks_update","portalTenantContacts.contacts_tasks_destroy","portalTenantContacts.contacts_groups_list","portalTenantContacts.contacts_groups_create","portalTenantContacts.contacts_groups_update","portalTenantContacts.contacts_groups_destroy","usePortalTenantClient","ContactsApiProvider","createDomainTranslations","createStaticDictAdapter","useActiveLocale","useDomainDict","ContactsTranslationProvider"],"sources":["../../../store/core/src/countries-api-context.ts","../../../api-clients/portal-tenant-contacts/src/namespaces/portal_tenant_contacts.ts","../src/adapters/contacts-api-adapter.ts","../src/contacts/PortalContactsApiProvider.tsx","../../../contacts/core/src/translation-dictionary.ts","../../../contacts/core/src/translation-adapter.ts","../src/providers/ContactsTranslationBridge.tsx"],"sourcesContent":["import { createContext, type Provider, use } from \"react\";\nimport type { CountriesApi } from \"./countries-api\";\n\nconst CountriesApiContext = createContext<CountriesApi | null>(null);\n\nexport const CountriesApiProvider: Provider<CountriesApi | null> =\n CountriesApiContext.Provider;\n\nexport function useCountriesApi(): CountriesApi {\n const api = use(CountriesApiContext);\n if (!api) {\n throw new Error(\n \"useCountriesApi must be used within a CountriesApiProvider\",\n );\n }\n return api;\n}\n","/**\n * Generated API client functions for portal_tenant_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/portal-tenant-contacts\";\n\n// ============================================================================\n// contacts\n// ============================================================================\n\n/**\n * List contacts with cursor pagination\n * Returns a paginated list of contacts belonging to the authenticated member.\n *\n * @param client - Fetch client instance\n * @param [params] - params\n */\nexport async function contacts_list(\n client: FetchClient,\n params?: operations[\"contacts_list\"][\"parameters\"][\"query\"],\n): Promise<\n operations[\"contacts_list\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.get(`/api/contacts`, params);\n}\n\n/**\n * Create a new contact\n * Creates a new contact for the authenticated member.\n *\n * @param client - Fetch client instance\n * @param body - body\n */\nexport async function contacts_create(\n client: FetchClient,\n body: operations[\"contacts_create\"][\"requestBody\"][\"content\"][\"application/json\"],\n): Promise<\n operations[\"contacts_create\"][\"responses\"][201][\"content\"][\"application/json\"]\n> {\n return client.post(`/api/contacts`, body);\n}\n\n/**\n * Get a specific contact\n * Returns a single contact by ID.\n *\n * @param client - Fetch client instance\n * @param id - id\n */\nexport async function contacts_show(\n client: FetchClient,\n id: string | number,\n): Promise<\n operations[\"contacts_show\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.get(`/api/contacts/${id}`);\n}\n\n/**\n * Update a contact\n * Updates an existing contact's attributes.\n *\n * @param client - Fetch client instance\n * @param id - id\n * @param body - body\n */\nexport async function contacts_update(\n client: FetchClient,\n id: string | number,\n body: operations[\"contacts_update\"][\"requestBody\"][\"content\"][\"application/json\"],\n): Promise<\n operations[\"contacts_update\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.patch(`/api/contacts/${id}`, body);\n}\n\n/**\n * Delete a contact\n * Soft-deletes a contact by ID.\n *\n * @param client - Fetch client instance\n * @param id - id\n */\nexport async function contacts_destroy(\n client: FetchClient,\n id: string | number,\n): Promise<\n operations[\"contacts_destroy\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.delete(`/api/contacts/${id}`);\n}\n\n/**\n * Delete multiple contacts\n * Soft-deletes multiple contacts by their IDs.\n *\n * @param client - Fetch client instance\n * @param body - body\n */\nexport async function contacts_bulk_destroy(\n client: FetchClient,\n body: operations[\"contacts_bulk_destroy\"][\"requestBody\"][\"content\"][\"application/json\"],\n): Promise<\n operations[\"contacts_bulk_destroy\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.delete(`/api/contacts/bulk`, { body });\n}\n\n/**\n * List contact groups\n * Returns a paginated list of contact groups belonging to the authenticated member.\n *\n * @param client - Fetch client instance\n * @param [params] - params\n */\nexport async function contacts_groups_list(\n client: FetchClient,\n params?: operations[\"contacts_groups_list\"][\"parameters\"][\"query\"],\n): Promise<\n operations[\"contacts_groups_list\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.get(`/api/contacts/groups`, params);\n}\n\n/**\n * Create a new group\n * Creates a new contact group for the authenticated member.\n *\n * @param client - Fetch client instance\n * @param body - body\n */\nexport async function contacts_groups_create(\n client: FetchClient,\n body: operations[\"contacts_groups_create\"][\"requestBody\"][\"content\"][\"application/json\"],\n): Promise<\n operations[\"contacts_groups_create\"][\"responses\"][201][\"content\"][\"application/json\"]\n> {\n return client.post(`/api/contacts/groups`, body);\n}\n\n/**\n * Update a group\n * Updates an existing contact group.\n *\n * @param client - Fetch client instance\n * @param id - id\n * @param body - body\n */\nexport async function contacts_groups_update(\n client: FetchClient,\n id: string | number,\n body: operations[\"contacts_groups_update\"][\"requestBody\"][\"content\"][\"application/json\"],\n): Promise<\n operations[\"contacts_groups_update\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.patch(`/api/contacts/groups/${id}`, body);\n}\n\n/**\n * Delete a group\n * Removes a contact group.\n *\n * @param client - Fetch client instance\n * @param id - id\n */\nexport async function contacts_groups_destroy(\n client: FetchClient,\n id: string | number,\n): Promise<\n operations[\"contacts_groups_destroy\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.delete(`/api/contacts/groups/${id}`);\n}\n\n/**\n * List notes for a contact\n * Returns notes attached to a contact.\n *\n * @param client - Fetch client instance\n * @param contact_id - contact_id\n * @param [params] - params\n */\nexport async function contacts_notes_list(\n client: FetchClient,\n contact_id: string | number,\n params?: operations[\"contacts_notes_list\"][\"parameters\"][\"query\"],\n): Promise<\n operations[\"contacts_notes_list\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.get(`/api/contacts/${contact_id}/notes`, params);\n}\n\n/**\n * Create a note for a contact\n * Adds a new note to a contact.\n *\n * @param client - Fetch client instance\n * @param contact_id - contact_id\n * @param body - body\n */\nexport async function contacts_notes_create(\n client: FetchClient,\n contact_id: string | number,\n body: operations[\"contacts_notes_create\"][\"requestBody\"][\"content\"][\"application/json\"],\n): Promise<\n operations[\"contacts_notes_create\"][\"responses\"][201][\"content\"][\"application/json\"]\n> {\n return client.post(`/api/contacts/${contact_id}/notes`, body);\n}\n\n/**\n * List tasks for a contact\n * Returns tasks assigned to a contact.\n *\n * @param client - Fetch client instance\n * @param contact_id - contact_id\n * @param [params] - params\n */\nexport async function contacts_tasks_list(\n client: FetchClient,\n contact_id: string | number,\n params?: operations[\"contacts_tasks_list\"][\"parameters\"][\"query\"],\n): Promise<\n operations[\"contacts_tasks_list\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.get(`/api/contacts/${contact_id}/tasks`, params);\n}\n\n/**\n * Create a task for a contact\n * Adds a new task to a contact.\n *\n * @param client - Fetch client instance\n * @param contact_id - contact_id\n * @param body - body\n */\nexport async function contacts_tasks_create(\n client: FetchClient,\n contact_id: string | number,\n body: operations[\"contacts_tasks_create\"][\"requestBody\"][\"content\"][\"application/json\"],\n): Promise<\n operations[\"contacts_tasks_create\"][\"responses\"][201][\"content\"][\"application/json\"]\n> {\n return client.post(`/api/contacts/${contact_id}/tasks`, body);\n}\n\n/**\n * Update a note\n * Updates an existing note on a contact.\n *\n * @param client - Fetch client instance\n * @param contact_id - contact_id\n * @param id - id\n * @param body - body\n */\nexport async function contacts_notes_update(\n client: FetchClient,\n contact_id: string | number,\n id: string | number,\n body: operations[\"contacts_notes_update\"][\"requestBody\"][\"content\"][\"application/json\"],\n): Promise<\n operations[\"contacts_notes_update\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.patch(`/api/contacts/${contact_id}/notes/${id}`, body);\n}\n\n/**\n * Delete a note\n * Removes a note from a contact.\n *\n * @param client - Fetch client instance\n * @param contact_id - contact_id\n * @param id - id\n */\nexport async function contacts_notes_destroy(\n client: FetchClient,\n contact_id: string | number,\n id: string | number,\n): Promise<\n operations[\"contacts_notes_destroy\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.delete(`/api/contacts/${contact_id}/notes/${id}`);\n}\n\n/**\n * Update a task\n * Updates an existing task on a contact.\n *\n * @param client - Fetch client instance\n * @param contact_id - contact_id\n * @param id - id\n * @param body - body\n */\nexport async function contacts_tasks_update(\n client: FetchClient,\n contact_id: string | number,\n id: string | number,\n body: operations[\"contacts_tasks_update\"][\"requestBody\"][\"content\"][\"application/json\"],\n): Promise<\n operations[\"contacts_tasks_update\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.patch(`/api/contacts/${contact_id}/tasks/${id}`, body);\n}\n\n/**\n * Delete a task\n * Removes a task from a contact.\n *\n * @param client - Fetch client instance\n * @param contact_id - contact_id\n * @param id - id\n */\nexport async function contacts_tasks_destroy(\n client: FetchClient,\n contact_id: string | number,\n id: string | number,\n): Promise<\n operations[\"contacts_tasks_destroy\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.delete(`/api/contacts/${contact_id}/tasks/${id}`);\n}\n","/**\n * Portal Contacts Adapter — Implements ContactsDomainApi using the\n * portal-tenant Contacts BFF endpoints.\n *\n * The existing contacts-ui hooks and components expect the ContactsApi,\n * NotesApi, and TasksApi interfaces from @fluid-app/contacts-core. This\n * adapter translates between the BFF response shapes and the core types\n * so the UI layer works unchanged.\n *\n * Features not available in the BFF (activities, markRead, orders,\n * subscriptionOrders) are omitted — the optional interface lets the\n * UI layer gracefully disable those capabilities.\n */\n\nimport type { FetchClient } from \"@fluid-app/api-client-core\";\nimport type { ContactsApi } from \"@fluid-app/contacts-core/contacts-api\";\nimport type { NotesApi } from \"@fluid-app/contacts-core/notes-api\";\nimport type { TasksApi } from \"@fluid-app/contacts-core/tasks-api\";\nimport type { GroupsApi } from \"@fluid-app/contacts-core/groups-api\";\nimport type { ContactsDomainApi } from \"@fluid-app/contacts-core/contacts-api-context\";\nimport type {\n Contact,\n ContactGroup,\n ContactNote,\n ContactTask,\n PaginationMeta,\n} from \"@fluid-app/contacts-core/types\";\nimport { portalTenantContacts } from \"@fluid-app/portal-tenant-contacts-api-client\";\n\n// ---------------------------------------------------------------------------\n// Response mappers — BFF shapes → core shapes\n// ---------------------------------------------------------------------------\n\nconst EMPTY_META: PaginationMeta = {\n total_count: 0,\n total_pages: 0,\n current_page: 1,\n next_cursor: null,\n};\n\nfunction paginationFromBff(\n meta: Record<string, unknown> | undefined,\n itemCount: number,\n currentPage: number,\n pageSize: number,\n): PaginationMeta {\n if (!meta) return EMPTY_META;\n const pagination = meta.pagination as Record<string, unknown> | undefined;\n const nextCursor = (pagination?.next_cursor as string | null) ?? null;\n const hasNext = !!nextCursor;\n\n const realTotal = meta.total_count as number | undefined;\n const totalCount =\n realTotal ??\n (hasNext\n ? (currentPage + 1) * pageSize\n : (currentPage - 1) * pageSize + itemCount);\n\n return {\n total_count: totalCount,\n total_pages: Math.max(1, Math.ceil(totalCount / pageSize)),\n current_page: currentPage,\n next_cursor: nextCursor,\n request_id: (meta.request_id as string) ?? undefined,\n timestamp: (meta.timestamp as string) ?? undefined,\n };\n}\n\n/** BFF Contact → core Contact. Fills missing fields with safe defaults. */\nfunction mapContact(raw: Record<string, unknown>): Contact {\n return {\n id: raw.id as number,\n full_name: `${raw.first_name ?? \"\"} ${raw.last_name ?? \"\"}`.trim(),\n first_name: (raw.first_name as string) ?? null,\n last_name: (raw.last_name as string) ?? null,\n email: (raw.email as string) ?? null,\n phone: (raw.phone as string) ?? null,\n status: (raw.status as string) ?? null,\n address: (raw.address as string) ?? null,\n city: (raw.city as string) ?? null,\n state: (raw.state as string) ?? null,\n postal_code: (raw.postal_code as string) ?? null,\n avatar_url: (raw.avatar_url as string) ?? null,\n country: (raw.country as Contact[\"country\"]) ?? null,\n tags: (raw.tags as string[]) ?? [],\n metadata: {},\n created_at: raw.created_at as string,\n updated_at: raw.updated_at as string,\n } as Contact;\n}\n\n/** BFF Note → core ContactNote. */\nfunction mapNote(raw: Record<string, unknown>): ContactNote {\n return {\n id: raw.id as number,\n title: (raw.title as string) ?? \"\",\n body: (raw.body as string) ?? \"\",\n note_type: null,\n due_date: null,\n due_time: null,\n pinned: null,\n created_at: raw.created_at as string,\n updated_at: raw.updated_at as string,\n contact_id: (raw.contact_id as number) ?? 0,\n assets: [],\n };\n}\n\n/** BFF Task → core ContactTask. */\nfunction mapTask(raw: Record<string, unknown>): ContactTask {\n return {\n id: raw.id as number,\n body: (raw.title as string) ?? \"\",\n due_at: (raw.due_date as string) ?? null,\n completed_at:\n (raw.completed_at as string) ??\n (raw.completed ? new Date().toISOString() : null),\n created_at: raw.created_at as string,\n contact_id: (raw.contact_id as number) ?? null,\n };\n}\n\n// ---------------------------------------------------------------------------\n// Param mappers — old offset-based params → BFF cursor-based params\n// ---------------------------------------------------------------------------\n\n/**\n * The contacts-ui sends offset pagination params (page, per_page, sort_by,\n * sort_direction, search, status). The BFF expects cursor pagination\n * (page[cursor], page[limit], search, tags). Translate between the two.\n *\n * `cursorCache` maps page numbers → cursor tokens so page-2+ requests can\n * resolve to the correct cursor. The cache is populated from BFF responses.\n */\nfunction mapListParams(\n params: Record<string, unknown> | undefined,\n cursorCache: Map<number, string>,\n): Parameters<typeof portalTenantContacts.contacts_list>[1] {\n if (!params) return undefined;\n\n const mapped: Record<string, unknown> = {};\n\n if (params.per_page || params.limit) {\n mapped[\"page[limit]\"] = params.per_page ?? params.limit;\n }\n\n // Translate offset page number → cursor token\n const page = (params.page as number) ?? 1;\n if (page > 1) {\n const cursor = cursorCache.get(page);\n if (cursor) {\n mapped[\"page[cursor]\"] = cursor;\n }\n }\n\n if (params.search_query || params.search || params.query) {\n mapped.search = params.search_query ?? params.search ?? params.query;\n }\n if (params.tags) {\n mapped.tags = params.tags;\n }\n\n return mapped as Parameters<typeof portalTenantContacts.contacts_list>[1];\n}\n\n// ---------------------------------------------------------------------------\n// Adapter factories\n// ---------------------------------------------------------------------------\n\nfunction createContactsAdapter(client: FetchClient): ContactsApi {\n // Cursor cache: maps page numbers → cursor tokens from BFF responses.\n // Page 1 has no cursor; the BFF response for page N includes\n // next_cursor which becomes the cursor for page N+1.\n const cursorCache = new Map<number, string>();\n\n return {\n getContact: async (id) => {\n const response = await portalTenantContacts.contacts_show(client, id);\n return {\n contact: mapContact(\n (response as Record<string, unknown>).contact as Record<\n string,\n unknown\n >,\n ),\n };\n },\n\n listContacts: async (params) => {\n const raw = params as Record<string, unknown> | undefined;\n const page = (raw?.page as number) ?? 1;\n const pageSize = (raw?.per_page as number) ?? 25;\n\n const response = await portalTenantContacts.contacts_list(\n client,\n mapListParams(raw, cursorCache),\n );\n const body = response as Record<string, unknown>;\n const meta = body.meta as Record<string, unknown> | undefined;\n const pagination = meta?.pagination as\n | Record<string, unknown>\n | undefined;\n\n // Store the next_cursor so the UI can request page + 1\n const nextCursor = pagination?.next_cursor as string | null | undefined;\n if (nextCursor) {\n cursorCache.set(page + 1, nextCursor);\n }\n\n const contacts = ((body.contacts as Record<string, unknown>[]) ?? []).map(\n mapContact,\n );\n return {\n contacts,\n meta: paginationFromBff(meta, contacts.length, page, pageSize),\n };\n },\n\n createContact: async (data) => {\n return portalTenantContacts.contacts_create(client, {\n contact: data,\n } as Parameters<typeof portalTenantContacts.contacts_create>[1]);\n },\n\n updateContact: async (id, data) => {\n return portalTenantContacts.contacts_update(client, id, {\n contact: data,\n } as Parameters<typeof portalTenantContacts.contacts_update>[2]);\n },\n\n deleteContact: async (id) => {\n return portalTenantContacts.contacts_destroy(client, id);\n },\n\n bulkDeleteContacts: async (ids) => {\n return portalTenantContacts.contacts_bulk_destroy(client, { ids });\n },\n\n // listActivities, markRead, listOrders, listSubscriptionOrders are not\n // available through the BFF — omitted so the UI disables these features.\n };\n}\n\nfunction createNotesAdapter(client: FetchClient): NotesApi {\n return {\n listNotes: async (contactId) => {\n const response = await portalTenantContacts.contacts_notes_list(\n client,\n contactId,\n );\n const body = response as Record<string, unknown>;\n return {\n notes: ((body.notes as Record<string, unknown>[]) ?? []).map(mapNote),\n };\n },\n\n createNote: async (contactId, input) => {\n return portalTenantContacts.contacts_notes_create(client, contactId, {\n note: input,\n } as Parameters<typeof portalTenantContacts.contacts_notes_create>[2]);\n },\n\n updateNote: async (noteId, contactId, input) => {\n return portalTenantContacts.contacts_notes_update(\n client,\n contactId,\n noteId,\n {\n note: input,\n } as Parameters<typeof portalTenantContacts.contacts_notes_update>[3],\n );\n },\n\n deleteNote: async (noteId, contactId) => {\n return portalTenantContacts.contacts_notes_destroy(\n client,\n contactId,\n noteId,\n );\n },\n };\n}\n\nfunction createTasksAdapter(client: FetchClient): TasksApi {\n return {\n listTasks: async (contactId) => {\n const response = await portalTenantContacts.contacts_tasks_list(\n client,\n contactId,\n );\n const body = response as Record<string, unknown>;\n return {\n tasks: ((body.tasks as Record<string, unknown>[]) ?? []).map(mapTask),\n };\n },\n\n createTask: async (contactId, input) => {\n return portalTenantContacts.contacts_tasks_create(client, contactId, {\n task: { title: input.body, due_date: input.due_at },\n } as Parameters<typeof portalTenantContacts.contacts_tasks_create>[2]);\n },\n\n updateTask: async (taskId, contactId, input) => {\n return portalTenantContacts.contacts_tasks_update(\n client,\n contactId,\n taskId,\n {\n task: {\n title: input.body ?? undefined,\n completed:\n input.completed_at !== undefined\n ? input.completed_at !== null\n : undefined,\n due_date: input.due_at,\n },\n } as Parameters<typeof portalTenantContacts.contacts_tasks_update>[3],\n );\n },\n\n deleteTask: async (taskId, contactId) => {\n return portalTenantContacts.contacts_tasks_destroy(\n client,\n contactId,\n taskId,\n );\n },\n };\n}\n\n/** BFF Group → core ContactGroup. */\nfunction mapGroup(raw: Record<string, unknown>): ContactGroup {\n return {\n id: raw.id as number,\n name: (raw.name as string) ?? \"\",\n avatar: (raw.avatar as string) ?? null,\n avatar_background: (raw.avatar_background as string) ?? null,\n contacts_count: (raw.contacts_count as number) ?? 0,\n created_at: raw.created_at as string,\n updated_at: raw.updated_at as string,\n };\n}\n\nfunction createGroupsAdapter(client: FetchClient): GroupsApi {\n return {\n listGroups: async () => {\n const response = await portalTenantContacts.contacts_groups_list(client);\n const body = response as Record<string, unknown>;\n return {\n groups: ((body.groups as Record<string, unknown>[]) ?? []).map(\n mapGroup,\n ),\n };\n },\n\n createGroup: async (input) => {\n const response = await portalTenantContacts.contacts_groups_create(\n client,\n {\n group: input,\n } as Parameters<typeof portalTenantContacts.contacts_groups_create>[1],\n );\n const body = response as Record<string, unknown>;\n return {\n group: mapGroup(body.group as Record<string, unknown>),\n };\n },\n\n updateGroup: async (groupId, input) => {\n const response = await portalTenantContacts.contacts_groups_update(\n client,\n groupId,\n {\n group: input,\n } as Parameters<typeof portalTenantContacts.contacts_groups_update>[2],\n );\n const body = response as Record<string, unknown>;\n return {\n group: mapGroup(body.group as Record<string, unknown>),\n };\n },\n\n deleteGroup: async (groupId) => {\n return portalTenantContacts.contacts_groups_destroy(client, groupId);\n },\n };\n}\n\n/**\n * Creates a composite ContactsDomainApi backed by the portal-tenant\n * Contacts BFF endpoints.\n */\nexport function createPortalContactsDomainApiAdapter(\n client: FetchClient,\n): ContactsDomainApi {\n return {\n contacts: createContactsAdapter(client),\n notes: createNotesAdapter(client),\n tasks: createTasksAdapter(client),\n groups: createGroupsAdapter(client),\n };\n}\n","import { useMemo, type ReactElement, type ReactNode } from \"react\";\nimport { ContactsApiProvider } from \"@fluid-app/contacts-core/contacts-api-context\";\nimport { usePortalTenantClient } from \"../providers/PortalTenantClientProvider\";\nimport { createPortalContactsDomainApiAdapter } from \"../adapters/contacts-api-adapter\";\n\nexport function PortalContactsApiProvider({\n children,\n}: {\n children: ReactNode;\n}): ReactElement {\n const client = usePortalTenantClient();\n\n const api = useMemo(\n () => createPortalContactsDomainApiAdapter(client),\n [client],\n );\n\n return <ContactsApiProvider value={api}>{children}</ContactsApiProvider>;\n}\n","export const contactsEn = {\n breadcrumb: \"Contacts\",\n breadcrumb_new: \"New Contact\",\n contact_label: \"Contact\",\n contacts_deleted_successfully: \"Contacts deleted successfully\",\n add: \"Add\",\n add_contact: \"Add Contact\",\n add_todo: \"Add to-do\",\n add_todo_dialog_title: \"Add a to-do\",\n adding: \"Adding...\",\n update_contact: \"Update Contact\",\n saving: \"Saving\",\n cancel: \"Cancel\",\n save: \"Save\",\n delete: \"Delete\",\n delete_name: \"Delete {{name}}?\",\n delete_confirm_permanent:\n \"This permanently removes the contact and all of their notes, tasks, and activity. This can't be undone.\",\n delete_contact: \"Delete contact\",\n delete_contact_confirm_one:\n \"Are you sure you want to delete this contact? This action cannot be undone.\",\n delete_contact_confirm_other:\n \"Are you sure you want to delete {{count}} contacts? This action cannot be undone.\",\n delete_contact_title: \"Delete contact?\",\n deleting: \"Deleting...\",\n search_placeholder: \"Search contacts\",\n error_loading: \"Couldn't load contact\",\n error_loading_description:\n \"This contact may have been deleted, you may not have permission to view it, or there was a network error. Try selecting them again.\",\n error_loading_list: \"Couldn't load contacts. Pull down to retry.\",\n error_generic: \"Something went wrong. Please try again later.\",\n loading: \"Loading...\",\n loading_more: \"Loading more...\",\n searching: \"Searching...\",\n people_count: \"{{count}} people across your network\",\n person_count: \"{{count}} person across your network\",\n no_contacts_search: 'No contacts match \"{{term}}\".',\n no_contacts_yet: \"No contacts yet.\",\n no_contacts_filter: \"No contacts match this filter.\",\n empty_select_contact: \"Select a contact\",\n empty_select_description:\n \"Pick someone from your list on the left to see their details, notes, and tasks.\",\n tab_tasks: \"Tasks\",\n tab_notes: \"Notes\",\n edit_profile: \"Edit profile\",\n editing_name: \"Editing {{name}}\",\n profile_edit_description:\n \"Update details below. Your contact card above is paused while you edit.\",\n new_task: \"New task\",\n last_updated: \"Last updated {{date}}\",\n label_email: \"Email\",\n label_phone: \"Phone\",\n label_address: \"Address\",\n label_call: \"Call\",\n label_first_name: \"First Name\",\n label_last_name: \"Last Name\",\n label_city: \"City\",\n label_country: \"Country\",\n label_full_address: \"Full Address\",\n label_postal_code: \"Postal Code\",\n label_state: \"State/Province\",\n label_status: \"Status\",\n not_set: \"Not set\",\n more_actions: \"More actions\",\n back_to_contacts: \"Back to contacts\",\n back_to_tasks: \"Back to Tasks\",\n filter_all: \"All\",\n filter_leads: \"Leads\",\n filter_customers: \"Customers\",\n note_placeholder: \"Leave a note about this contact…\",\n note_body_aria: \"Note body\",\n add_note: \"Add note\",\n tip_save_shortcut_mac: \"Tip: ⌘ + Enter to save\",\n tip_save_shortcut_other: \"Tip: Ctrl + Enter to save\",\n task_describe_placeholder: \"Describe the task…\",\n task_description_aria: \"Task description\",\n task_discard_aria: \"Discard task\",\n add_task: \"Add task\",\n quick_today: \"Today\",\n quick_tomorrow: \"Tomorrow\",\n task_select_date: \"Select Date\",\n task_due_in_days: \"In {{count}} days\",\n task_next_week: \"Next Week\",\n task_no_date: \"No Date\",\n task_custom_calendar: \"Custom Calendar\",\n task_time_label: \"Time\",\n task_time_aria: \"Select due time\",\n calendar_next_month: \"Go to next month\",\n calendar_previous_month: \"Go to previous month\",\n calendar_month_dropdown: \"Month: \",\n calendar_year_dropdown: \"Year: \",\n calendar_week_number: \"Week {{number}}\",\n task_custom_date_selected_aria: \"Change due date: {{date}}\",\n task_custom_date_aria: \"Select due date\",\n edit_contact_name: \"Edit {{name}}\",\n save_changes: \"Save changes\",\n add_field: \"Add {{field}}\",\n copy_field: \"Copy {{field}}\",\n copied_field: \"Copied {{field}}\",\n attachment_one: \"1 attachment\",\n attachment_other: \"{{count}} attachments\",\n note_actions: \"Note actions\",\n delete_note_title: \"Delete note?\",\n delete_note_irreversible: \"This action cannot be undone.\",\n task_yesterday: \"Yesterday\",\n task_days_ago_one: \"1 day ago\",\n task_days_ago_other: \"{{count}} days ago\",\n task_overdue_due: \"Overdue · {{date}}\",\n task_due: \"Due {{date}}\",\n mark_as_open: \"Mark as open\",\n mark_as_completed: \"Mark as completed\",\n task_actions: \"Task actions\",\n delete_task_title: \"Delete task?\",\n delete_task_confirm:\n \"Are you sure you want to delete this task? This action cannot be undone.\",\n groups_manage_groups: \"Manage Groups\",\n groups_manage_title: \"Manage Groups\",\n groups_back_to_contacts: \"Back to contacts\",\n groups_new_group: \"New Group\",\n groups_empty: \"No groups yet. Create a group to get started.\",\n groups_delete_title: \"Delete group?\",\n groups_delete_confirm:\n \"Are you sure you want to delete “{{name}}”? Contacts in this group will not be deleted, but they will be removed from the group.\",\n groups_create_title: \"Create Group\",\n groups_edit_title: \"Edit Group\",\n groups_remove_emoji: \"Remove emoji\",\n groups_avatar: \"Avatar\",\n groups_name_label: \"Group Name\",\n groups_name_placeholder: \"Group name\",\n groups_tab_change_emoji: \"Change Emoji\",\n groups_tab_change_color: \"Change color\",\n groups_no_emoji_found: \"No emoji found.\",\n groups_close: \"Close\",\n groups_creating: \"Creating...\",\n groups_create: \"Create\",\n groups_created_toast: 'Group \"{{name}}\" created',\n groups_create_failed: \"Failed to create group\",\n groups_create_new_group: \"Create New Group\",\n groups_updated_toast: \"Group updated\",\n groups_update_failed: \"Failed to update group\",\n groups_deleted_toast: 'Group \"{{name}}\" deleted',\n groups_delete_failed: \"Failed to delete group\",\n groups_contact_one: \"{{count}} contact\",\n groups_contact_other: \"{{count}} contacts\",\n groups_member_one: \"{{count}} member\",\n groups_member_other: \"{{count}} members\",\n groups_search_contacts_to_add: \"Search contacts to add...\",\n groups_no_contacts_found: \"No contacts found\",\n groups_loading_members: \"Loading members...\",\n groups_empty_members:\n \"No contacts in this group yet. Use the search above to add contacts.\",\n groups_edit_aria: \"Edit {{name}}\",\n groups_delete_aria: \"Delete {{name}}\",\n groups_remove_member_aria: \"Remove {{name}}\",\n groups_member_added_toast: \"{{contact}} added to {{group}}\",\n groups_member_removed_toast: \"{{contact}} removed from {{group}}\",\n groups_member_add_failed: \"Failed to add {{contact}} to {{group}}\",\n groups_member_remove_failed: \"Failed to remove {{contact}} from {{group}}\",\n groups_inline_search_placeholder: \"Search\",\n groups_inline_create: 'Create \"{{name}}\"',\n groups_inline_create_failed: 'Failed to create group \"{{name}}\"',\n groups_inline_no_groups_found: \"No groups found\",\n groups_inline_selected_one: \"{{count}} group selected\",\n groups_inline_selected_other: \"{{count}} groups selected\",\n groups_color_red: \"Red\",\n groups_color_orange: \"Orange\",\n groups_color_yellow: \"Yellow\",\n groups_color_green: \"Green\",\n groups_color_teal: \"Teal\",\n groups_color_cyan: \"Cyan\",\n groups_color_blue: \"Blue\",\n groups_color_indigo: \"Indigo\",\n groups_color_purple: \"Purple\",\n groups_color_pink: \"Pink\",\n groups_add_group: \"Add Group\",\n groups_add_to_group: \"Add to Group\",\n groups_no_groups_yet: \"No groups yet\",\n groups_tags_save_failed: \"Failed to save group changes\",\n groups_title: \"Groups\",\n groups_options_aria: \"Group options\",\n groups_selected_count_one: \"{{count}} contact selected\",\n groups_selected_count_other: \"{{count}} contacts selected\",\n contacts_deleted_one: \"{{count}} contact deleted\",\n contacts_deleted_other: \"{{count}} contacts deleted\",\n contact_deleted_toast: \"{{name}} deleted\",\n contact_delete_failed: \"Failed to delete contact\",\n contacts_delete_failed_one: \"Failed to delete contact\",\n contacts_delete_failed_other: \"Failed to delete contacts\",\n contacts_added_to_group_one: \"Added {{count}} contact to {{group}}\",\n contacts_added_to_group_other: \"Added {{count}} contacts to {{group}}\",\n contacts_add_to_group_failed_one: \"Failed to add contact to {{group}}\",\n contacts_add_to_group_failed_other: \"Failed to add contacts to {{group}}\",\n delete_contact_aria: \"Delete {{name}}\",\n placeholder_first_name: \"Enter first name\",\n placeholder_last_name: \"Enter last name\",\n placeholder_email: \"Enter email address\",\n placeholder_phone: \"Enter phone number\",\n placeholder_full_address: \"Enter street address\",\n placeholder_city: \"Enter city\",\n placeholder_country: \"Select country\",\n placeholder_state: \"Enter state or province\",\n placeholder_postal_code: \"Enter postal code\",\n placeholder_status: \"Select status\",\n status_new: \"New\",\n status_active: \"Active\",\n status_inactive: \"Inactive\",\n status_cold: \"Cold\",\n status_lead: \"Lead\",\n status_customer: \"Customer\",\n // ManageGroupsModal / CreateGroupModal\n groups_manage_for_contact: \"Manage Groups for {{name}}\",\n groups_available: \"Available Groups\",\n groups_name_required_title: \"Group name required\",\n groups_name_required_description: \"Please enter a name for the new group\",\n groups_already_exists_title: \"Group already exists\",\n groups_already_exists_description: 'A group named \"{{name}}\" already exists',\n groups_choose_emoji: \"Choose Emoji\",\n groups_choose_color: \"Choose Color\",\n // Task toasts\n task_updated: \"Task updated\",\n task_created: \"Task created\",\n task_deleted: \"Task deleted\",\n task_update_failed: \"Failed to update task\",\n task_create_failed: \"Failed to create task\",\n task_delete_failed: \"Failed to delete task\",\n // Note toasts\n note_created: \"Note created\",\n note_updated: \"Note updated\",\n note_deleted: \"Note deleted\",\n note_create_failed: \"Failed to create note\",\n note_update_failed: \"Failed to update note\",\n note_delete_failed: \"Failed to delete note\",\n // Contact mutation toasts (shared hooks)\n contact_created: \"Contact created successfully\",\n contact_updated: \"Contact updated successfully\",\n contact_deleted: \"Contact deleted successfully\",\n contact_create_failed: \"Failed to create contact\",\n contact_save_failed: \"Failed to save contact\",\n form_errors_title: \"Please fix the form errors before saving\",\n // Validation\n validation_first_name_required: \"First name is required\",\n validation_last_name_required: \"Last name is required\",\n // Orders\n orders_title: \"Orders\",\n orders_empty: \"No orders yet\",\n orders_empty_description: \"Orders placed by this contact will appear here\",\n orders_failed: \"Failed to load orders\",\n orders_retry: \"Please try again later\",\n orders_no_match: \"No orders match this filter\",\n // Notes sidebar\n notes_title: \"Notes\",\n notes_empty: \"No notes yet\",\n notes_view_all: \"View all\",\n pagination_page_of: \"Page {{current}} of {{total}} ({{count}} total)\",\n pagination_previous: \"Previous page\",\n pagination_next: \"Next page\",\n // Activity feed\n activity_title: \"Recent Activity\",\n activity_empty: \"No activity yet\",\n activity_empty_description:\n \"Reach out and share a product or media to start building this contact’s story\",\n activity_filter_new: \"New\",\n activity_mark_all_read: \"Mark all read\",\n activity_no_match: \"No {{filter}} activities\",\n activity_type_message: \"Message\",\n activity_type_task: \"Task\",\n activity_type_alert: \"Alert from Fluid.app\",\n activity_type_announcement: \"Announcement\",\n activity_type_event: \"Event\",\n activity_type_review: \"Review\",\n activity_type_points: \"Points\",\n activity_type_notification: \"Notification\",\n activity_date_today: \"Today\",\n activity_date_yesterday: \"Yesterday\",\n activity_due: \"Due\",\n activity_tbd: \"TBD\",\n notes_more: \"more\",\n // Subscriptions\n subscriptions_title: \"Subscriptions\",\n subscriptions_empty: \"No subscriptions yet\",\n subscriptions_empty_description:\n \"Subscriptions for this contact will appear here\",\n subscriptions_failed: \"Failed to load subscriptions\",\n subscriptions_no_match: \"No subscriptions match this filter\",\n subscriptions_next_bill: \"Next bill:\",\n subscriptions_created: \"Created {{date}}\",\n subscriptions_every_days: \"Every {{count}} days\",\n // Status filters (shared by orders & subscriptions)\n status_filter_awaiting_payment: \"Awaiting Payment\",\n status_filter_awaiting_shipment: \"Awaiting Shipment\",\n status_filter_shipped: \"Shipped\",\n status_filter_delivered: \"Delivered\",\n status_filter_cancelled: \"Cancelled\",\n // Editor / due date\n editor_add_due_date: \"Add due date\",\n editor_due_date: \"Due date\",\n editor_remove_due_date: \"Remove due date\",\n editor_start_writing: \"Start writing...\",\n // Note/task modal\n modal_note_label: \"Note\",\n modal_task_label: \"Task\",\n modal_edit_type: \"Edit {{type}}\",\n modal_new_type: \"New {{type}}\",\n modal_type_title_placeholder: \"{{type}} title\",\n modal_mark_incomplete: \"Mark Incomplete\",\n modal_mark_complete: \"Mark Complete\",\n // Toolbar\n toolbar_bold: \"Bold\",\n toolbar_italic: \"Italic\",\n toolbar_underline: \"Underline\",\n toolbar_align_left: \"Align left\",\n toolbar_align_center: \"Align center\",\n toolbar_align_right: \"Align right\",\n toolbar_justify: \"Justify\",\n toolbar_bullet_list: \"Bullet list\",\n toolbar_ordered_list: \"Ordered list\",\n // Contact info card\n tooltip_message: \"Message\",\n tooltip_new_note: \"New Note\",\n tooltip_events_coming_soon: \"Events (coming soon)\",\n contact_info_title: \"Contact Information\",\n contact_info_no_email: \"No email entered\",\n contact_info_no_phone: \"No phone number entered\",\n contact_info_no_address: \"No address entered\",\n contact_info_edit: \"Edit\",\n contact_unknown_name: \"Unknown\",\n // Relative time labels\n relative_today: \"today\",\n relative_yesterday: \"yesterday\",\n relative_days_ago: \"{{count}} days ago\",\n relative_weeks_ago_one: \"1 week ago\",\n relative_weeks_ago_other: \"{{count}} weeks ago\",\n relative_months_ago_one: \"1 month ago\",\n relative_months_ago_other: \"{{count}} months ago\",\n relative_years_ago_one: \"1 year ago\",\n relative_years_ago_other: \"{{count}} years ago\",\n // Action unavailable aria label\n action_unavailable: \"{{label}} (unavailable)\",\n // Note/task editor defaults\n editor_default_title: \"New Note\",\n editor_default_body_placeholder: \"Start writing...\",\n // Contacts table\n table_groups: \"Groups\",\n table_filter_by_group: \"Filter by group\",\n table_column_name: \"Name\",\n table_column_email: \"Email\",\n table_column_phone: \"Phone\",\n table_column_id: \"ID\",\n table_column_status: \"Status\",\n table_search_placeholder: \"Search contacts...\",\n table_no_contacts: \"No contacts found\",\n table_no_contacts_group_filter:\n \"No contacts found for the selected group filter.\",\n table_select_all: \"Select all\",\n table_deselect_all: \"Deselect all\",\n table_selected_count: \"{{count}} selected\",\n table_actions: \"Actions\",\n table_edit: \"Edit\",\n table_clear_filters: \"Clear filters\",\n table_contact_actions: \"Contact actions\",\n table_sort_asc: \"{{name}} (A-Z)\",\n table_sort_desc: \"{{name}} (Z-A)\",\n table_delete_rows_one: \"Delete {{count}} row\",\n table_delete_rows_other: \"Delete {{count}} rows\",\n table_delete_contacts_one: \"Delete {{count}} contact\",\n table_delete_contacts_other: \"Delete {{count}} contacts\",\n table_select_contact: \"Select {{name}}\",\n contact_optional_label: \"Contact (optional)\",\n contact_picker_trigger_aria: \"Contact (optional): {{selection}}\",\n select_contact: \"Select Contact\",\n no_contact: \"No contact\",\n clear_contact_aria: \"Clear contact\",\n todo_empty: \"You've got nothing else To-Do!\",\n todo_more_tasks_one: \"{{count}} more task\",\n todo_more_tasks_other: \"{{count}} more tasks\",\n edit_todo: \"Edit\",\n delete_todo: \"Delete\",\n view_done: \"View done ({{count}})\",\n hide_done: \"Hide done\",\n // Sponsor card\n sponsor_title: \"Sponsor\",\n label_name: \"Name\",\n // Affiliate / rep assignment\n assign_rep_title: \"Assign Rep\",\n assign_rep_tooltip: \"The rep affiliated with this contact\",\n assign_rep_clear: \"Clear\",\n assign_rep_edit: \"Edit\",\n assign_rep_back: \"Back\",\n assign_rep_search_placeholder: \"Search by name or email...\",\n assign_rep_loading: \"Loading…\",\n assign_rep_no_results: 'No reps found matching \"{{term}}\"',\n} as const satisfies Record<string, string>;\n\nexport type ContactsDict = typeof contactsEn;\n","import {\n createDomainTranslations,\n type DomainTranslations,\n} from \"@fluid-app/i18n/translations\";\nimport { createStaticDictAdapter } from \"@fluid-app/i18n/static-dict-adapter\";\nimport type { TranslationApi } from \"@fluid-app/i18n/translation-api\";\nimport { contactsEn, type ContactsDict } from \"./translation-dictionary\";\n\nexport const contactsDomain: DomainTranslations<ContactsDict> =\n createDomainTranslations<ContactsDict>({\n fallback: contactsEn,\n loaders: {\n de: () =>\n import(\"./locale/de.json\").then(\n (m): ContactsDict => m.default as ContactsDict,\n ),\n el: () =>\n import(\"./locale/el.json\").then(\n (m): ContactsDict => m.default as ContactsDict,\n ),\n es: () =>\n import(\"./locale/es.json\").then(\n (m): ContactsDict => m.default as ContactsDict,\n ),\n fr: () =>\n import(\"./locale/fr.json\").then(\n (m): ContactsDict => m.default as ContactsDict,\n ),\n he: () =>\n import(\"./locale/he.json\").then(\n (m): ContactsDict => m.default as ContactsDict,\n ),\n hu: () =>\n import(\"./locale/hu.json\").then(\n (m): ContactsDict => m.default as ContactsDict,\n ),\n id: () =>\n import(\"./locale/id.json\").then(\n (m): ContactsDict => m.default as ContactsDict,\n ),\n it: () =>\n import(\"./locale/it.json\").then(\n (m): ContactsDict => m.default as ContactsDict,\n ),\n ja: () =>\n import(\"./locale/ja.json\").then(\n (m): ContactsDict => m.default as ContactsDict,\n ),\n ko: () =>\n import(\"./locale/ko.json\").then(\n (m): ContactsDict => m.default as ContactsDict,\n ),\n nl: () =>\n import(\"./locale/nl.json\").then(\n (m): ContactsDict => m.default as ContactsDict,\n ),\n pl: () =>\n import(\"./locale/pl.json\").then(\n (m): ContactsDict => m.default as ContactsDict,\n ),\n pt: () =>\n import(\"./locale/pt.json\").then(\n (m): ContactsDict => m.default as ContactsDict,\n ),\n ro: () =>\n import(\"./locale/ro.json\").then(\n (m): ContactsDict => m.default as ContactsDict,\n ),\n ru: () =>\n import(\"./locale/ru.json\").then(\n (m): ContactsDict => m.default as ContactsDict,\n ),\n th: () =>\n import(\"./locale/th.json\").then(\n (m): ContactsDict => m.default as ContactsDict,\n ),\n tl: () =>\n import(\"./locale/tl.json\").then(\n (m): ContactsDict => m.default as ContactsDict,\n ),\n tr: () =>\n import(\"./locale/tr.json\").then(\n (m): ContactsDict => m.default as ContactsDict,\n ),\n zh_CN: () =>\n import(\"./locale/zh_CN.json\").then(\n (m): ContactsDict => m.default as ContactsDict,\n ),\n zh_TW: () =>\n import(\"./locale/zh_TW.json\").then(\n (m): ContactsDict => m.default as ContactsDict,\n ),\n },\n });\n\nexport function createContactsTranslationAdapter(\n locale: string,\n dict: ContactsDict,\n): TranslationApi<ContactsDict> {\n return createStaticDictAdapter(locale, dict);\n}\n","import { useMemo, type ReactNode } from \"react\";\nimport { useActiveLocale } from \"@fluid-app/i18n/locale-context\";\nimport { useDomainDict } from \"@fluid-app/i18n/use-domain-dict\";\nimport {\n contactsDomain,\n createContactsTranslationAdapter,\n} from \"@fluid-app/contacts-core/translation-adapter\";\nimport { ContactsTranslationProvider } from \"@fluid-app/contacts-core/translation-api-context\";\n\nexport function ContactsTranslationBridge({\n children,\n}: {\n children: ReactNode;\n}): React.JSX.Element {\n const { locale } = useActiveLocale();\n const dict = useDomainDict(contactsDomain, locale);\n const api = useMemo(\n () => createContactsTranslationAdapter(locale, dict),\n [locale, dict],\n );\n return (\n <ContactsTranslationProvider value={api}>\n {children}\n </ContactsTranslationProvider>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"ContactsTranslationBridge-Dx_1jAxz.cjs","names":["portalTenantContacts.contacts_show","portalTenantContacts.contacts_list","portalTenantContacts.contacts_create","portalTenantContacts.contacts_update","portalTenantContacts.contacts_destroy","portalTenantContacts.contacts_bulk_destroy","portalTenantContacts.contacts_notes_list","portalTenantContacts.contacts_notes_create","portalTenantContacts.contacts_notes_update","portalTenantContacts.contacts_notes_destroy","portalTenantContacts.contacts_tasks_list","portalTenantContacts.contacts_tasks_create","portalTenantContacts.contacts_tasks_update","portalTenantContacts.contacts_tasks_destroy","portalTenantContacts.contacts_groups_list","portalTenantContacts.contacts_groups_create","portalTenantContacts.contacts_groups_update","portalTenantContacts.contacts_groups_destroy","usePortalTenantClient","ContactsApiProvider","createDomainTranslations","createStaticDictAdapter","useActiveLocale","useDomainDict","ContactsTranslationProvider"],"sources":["../../../store/core/src/countries-api-context.ts","../../../api-clients/portal-tenant-contacts/src/namespaces/portal_tenant_contacts.ts","../src/adapters/contacts-api-adapter.ts","../src/contacts/PortalContactsApiProvider.tsx","../../../contacts/core/src/translation-dictionary.ts","../../../contacts/core/src/translation-adapter.ts","../src/providers/ContactsTranslationBridge.tsx"],"sourcesContent":["import { createContext, type Provider, use } from \"react\";\nimport type { CountriesApi } from \"./countries-api\";\n\nconst CountriesApiContext = createContext<CountriesApi | null>(null);\n\nexport const CountriesApiProvider: Provider<CountriesApi | null> =\n CountriesApiContext.Provider;\n\nexport function useCountriesApi(): CountriesApi {\n const api = use(CountriesApiContext);\n if (!api) {\n throw new Error(\n \"useCountriesApi must be used within a CountriesApiProvider\",\n );\n }\n return api;\n}\n","/**\n * Generated API client functions for portal_tenant_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/portal-tenant-contacts\";\n\n// ============================================================================\n// contacts\n// ============================================================================\n\n/**\n * List contacts with cursor pagination\n * Returns a paginated list of contacts belonging to the authenticated member.\n *\n * @param client - Fetch client instance\n * @param [params] - params\n */\nexport async function contacts_list(\n client: FetchClient,\n params?: operations[\"contacts_list\"][\"parameters\"][\"query\"],\n): Promise<\n operations[\"contacts_list\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.get(`/api/contacts`, params);\n}\n\n/**\n * Create a new contact\n * Creates a new contact for the authenticated member.\n *\n * @param client - Fetch client instance\n * @param body - body\n */\nexport async function contacts_create(\n client: FetchClient,\n body: operations[\"contacts_create\"][\"requestBody\"][\"content\"][\"application/json\"],\n): Promise<\n operations[\"contacts_create\"][\"responses\"][201][\"content\"][\"application/json\"]\n> {\n return client.post(`/api/contacts`, body);\n}\n\n/**\n * Get a specific contact\n * Returns a single contact by ID.\n *\n * @param client - Fetch client instance\n * @param id - id\n */\nexport async function contacts_show(\n client: FetchClient,\n id: string | number,\n): Promise<\n operations[\"contacts_show\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.get(`/api/contacts/${id}`);\n}\n\n/**\n * Update a contact\n * Updates an existing contact's attributes.\n *\n * @param client - Fetch client instance\n * @param id - id\n * @param body - body\n */\nexport async function contacts_update(\n client: FetchClient,\n id: string | number,\n body: operations[\"contacts_update\"][\"requestBody\"][\"content\"][\"application/json\"],\n): Promise<\n operations[\"contacts_update\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.patch(`/api/contacts/${id}`, body);\n}\n\n/**\n * Delete a contact\n * Soft-deletes a contact by ID.\n *\n * @param client - Fetch client instance\n * @param id - id\n */\nexport async function contacts_destroy(\n client: FetchClient,\n id: string | number,\n): Promise<\n operations[\"contacts_destroy\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.delete(`/api/contacts/${id}`);\n}\n\n/**\n * Delete multiple contacts\n * Soft-deletes multiple contacts by their IDs.\n *\n * @param client - Fetch client instance\n * @param body - body\n */\nexport async function contacts_bulk_destroy(\n client: FetchClient,\n body: operations[\"contacts_bulk_destroy\"][\"requestBody\"][\"content\"][\"application/json\"],\n): Promise<\n operations[\"contacts_bulk_destroy\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.delete(`/api/contacts/bulk`, { body });\n}\n\n/**\n * List contact groups\n * Returns a paginated list of contact groups belonging to the authenticated member.\n *\n * @param client - Fetch client instance\n * @param [params] - params\n */\nexport async function contacts_groups_list(\n client: FetchClient,\n params?: operations[\"contacts_groups_list\"][\"parameters\"][\"query\"],\n): Promise<\n operations[\"contacts_groups_list\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.get(`/api/contacts/groups`, params);\n}\n\n/**\n * Create a new group\n * Creates a new contact group for the authenticated member.\n *\n * @param client - Fetch client instance\n * @param body - body\n */\nexport async function contacts_groups_create(\n client: FetchClient,\n body: operations[\"contacts_groups_create\"][\"requestBody\"][\"content\"][\"application/json\"],\n): Promise<\n operations[\"contacts_groups_create\"][\"responses\"][201][\"content\"][\"application/json\"]\n> {\n return client.post(`/api/contacts/groups`, body);\n}\n\n/**\n * Update a group\n * Updates an existing contact group.\n *\n * @param client - Fetch client instance\n * @param id - id\n * @param body - body\n */\nexport async function contacts_groups_update(\n client: FetchClient,\n id: string | number,\n body: operations[\"contacts_groups_update\"][\"requestBody\"][\"content\"][\"application/json\"],\n): Promise<\n operations[\"contacts_groups_update\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.patch(`/api/contacts/groups/${id}`, body);\n}\n\n/**\n * Delete a group\n * Removes a contact group.\n *\n * @param client - Fetch client instance\n * @param id - id\n */\nexport async function contacts_groups_destroy(\n client: FetchClient,\n id: string | number,\n): Promise<\n operations[\"contacts_groups_destroy\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.delete(`/api/contacts/groups/${id}`);\n}\n\n/**\n * List notes for a contact\n * Returns notes attached to a contact.\n *\n * @param client - Fetch client instance\n * @param contact_id - contact_id\n * @param [params] - params\n */\nexport async function contacts_notes_list(\n client: FetchClient,\n contact_id: string | number,\n params?: operations[\"contacts_notes_list\"][\"parameters\"][\"query\"],\n): Promise<\n operations[\"contacts_notes_list\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.get(`/api/contacts/${contact_id}/notes`, params);\n}\n\n/**\n * Create a note for a contact\n * Adds a new note to a contact.\n *\n * @param client - Fetch client instance\n * @param contact_id - contact_id\n * @param body - body\n */\nexport async function contacts_notes_create(\n client: FetchClient,\n contact_id: string | number,\n body: operations[\"contacts_notes_create\"][\"requestBody\"][\"content\"][\"application/json\"],\n): Promise<\n operations[\"contacts_notes_create\"][\"responses\"][201][\"content\"][\"application/json\"]\n> {\n return client.post(`/api/contacts/${contact_id}/notes`, body);\n}\n\n/**\n * List tasks for a contact\n * Returns tasks assigned to a contact.\n *\n * @param client - Fetch client instance\n * @param contact_id - contact_id\n * @param [params] - params\n */\nexport async function contacts_tasks_list(\n client: FetchClient,\n contact_id: string | number,\n params?: operations[\"contacts_tasks_list\"][\"parameters\"][\"query\"],\n): Promise<\n operations[\"contacts_tasks_list\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.get(`/api/contacts/${contact_id}/tasks`, params);\n}\n\n/**\n * Create a task for a contact\n * Adds a new task to a contact.\n *\n * @param client - Fetch client instance\n * @param contact_id - contact_id\n * @param body - body\n */\nexport async function contacts_tasks_create(\n client: FetchClient,\n contact_id: string | number,\n body: operations[\"contacts_tasks_create\"][\"requestBody\"][\"content\"][\"application/json\"],\n): Promise<\n operations[\"contacts_tasks_create\"][\"responses\"][201][\"content\"][\"application/json\"]\n> {\n return client.post(`/api/contacts/${contact_id}/tasks`, body);\n}\n\n/**\n * Update a note\n * Updates an existing note on a contact.\n *\n * @param client - Fetch client instance\n * @param contact_id - contact_id\n * @param id - id\n * @param body - body\n */\nexport async function contacts_notes_update(\n client: FetchClient,\n contact_id: string | number,\n id: string | number,\n body: operations[\"contacts_notes_update\"][\"requestBody\"][\"content\"][\"application/json\"],\n): Promise<\n operations[\"contacts_notes_update\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.patch(`/api/contacts/${contact_id}/notes/${id}`, body);\n}\n\n/**\n * Delete a note\n * Removes a note from a contact.\n *\n * @param client - Fetch client instance\n * @param contact_id - contact_id\n * @param id - id\n */\nexport async function contacts_notes_destroy(\n client: FetchClient,\n contact_id: string | number,\n id: string | number,\n): Promise<\n operations[\"contacts_notes_destroy\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.delete(`/api/contacts/${contact_id}/notes/${id}`);\n}\n\n/**\n * Update a task\n * Updates an existing task on a contact.\n *\n * @param client - Fetch client instance\n * @param contact_id - contact_id\n * @param id - id\n * @param body - body\n */\nexport async function contacts_tasks_update(\n client: FetchClient,\n contact_id: string | number,\n id: string | number,\n body: operations[\"contacts_tasks_update\"][\"requestBody\"][\"content\"][\"application/json\"],\n): Promise<\n operations[\"contacts_tasks_update\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.patch(`/api/contacts/${contact_id}/tasks/${id}`, body);\n}\n\n/**\n * Delete a task\n * Removes a task from a contact.\n *\n * @param client - Fetch client instance\n * @param contact_id - contact_id\n * @param id - id\n */\nexport async function contacts_tasks_destroy(\n client: FetchClient,\n contact_id: string | number,\n id: string | number,\n): Promise<\n operations[\"contacts_tasks_destroy\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.delete(`/api/contacts/${contact_id}/tasks/${id}`);\n}\n","/**\n * Portal Contacts Adapter — Implements ContactsDomainApi using the\n * portal-tenant Contacts BFF endpoints.\n *\n * The existing contacts-ui hooks and components expect the ContactsApi,\n * NotesApi, and TasksApi interfaces from @fluid-app/contacts-core. This\n * adapter translates between the BFF response shapes and the core types\n * so the UI layer works unchanged.\n *\n * Features not available in the BFF (activities, markRead, orders,\n * subscriptionOrders) are omitted — the optional interface lets the\n * UI layer gracefully disable those capabilities.\n */\n\nimport type { FetchClient } from \"@fluid-app/api-client-core\";\nimport type { ContactsApi } from \"@fluid-app/contacts-core/contacts-api\";\nimport type { NotesApi } from \"@fluid-app/contacts-core/notes-api\";\nimport type { TasksApi } from \"@fluid-app/contacts-core/tasks-api\";\nimport type { GroupsApi } from \"@fluid-app/contacts-core/groups-api\";\nimport type { ContactsDomainApi } from \"@fluid-app/contacts-core/contacts-api-context\";\nimport type {\n Contact,\n ContactGroup,\n ContactNote,\n ContactTask,\n PaginationMeta,\n} from \"@fluid-app/contacts-core/types\";\nimport { portalTenantContacts } from \"@fluid-app/portal-tenant-contacts-api-client\";\n\n// ---------------------------------------------------------------------------\n// Response mappers — BFF shapes → core shapes\n// ---------------------------------------------------------------------------\n\nconst EMPTY_META: PaginationMeta = {\n total_count: 0,\n total_pages: 0,\n current_page: 1,\n next_cursor: null,\n};\n\nfunction paginationFromBff(\n meta: Record<string, unknown> | undefined,\n itemCount: number,\n currentPage: number,\n pageSize: number,\n): PaginationMeta {\n if (!meta) return EMPTY_META;\n const pagination = meta.pagination as Record<string, unknown> | undefined;\n const nextCursor = (pagination?.next_cursor as string | null) ?? null;\n const hasNext = !!nextCursor;\n\n const realTotal = meta.total_count as number | undefined;\n const totalCount =\n realTotal ??\n (hasNext\n ? (currentPage + 1) * pageSize\n : (currentPage - 1) * pageSize + itemCount);\n\n return {\n total_count: totalCount,\n total_pages: Math.max(1, Math.ceil(totalCount / pageSize)),\n current_page: currentPage,\n next_cursor: nextCursor,\n request_id: (meta.request_id as string) ?? undefined,\n timestamp: (meta.timestamp as string) ?? undefined,\n };\n}\n\n/** BFF Contact → core Contact. Fills missing fields with safe defaults. */\nfunction mapContact(raw: Record<string, unknown>): Contact {\n return {\n id: raw.id as number,\n full_name: `${raw.first_name ?? \"\"} ${raw.last_name ?? \"\"}`.trim(),\n first_name: (raw.first_name as string) ?? null,\n last_name: (raw.last_name as string) ?? null,\n email: (raw.email as string) ?? null,\n phone: (raw.phone as string) ?? null,\n status: (raw.status as string) ?? null,\n address: (raw.address as string) ?? null,\n city: (raw.city as string) ?? null,\n state: (raw.state as string) ?? null,\n postal_code: (raw.postal_code as string) ?? null,\n avatar_url: (raw.avatar_url as string) ?? null,\n country: (raw.country as Contact[\"country\"]) ?? null,\n tags: (raw.tags as string[]) ?? [],\n metadata: {},\n created_at: raw.created_at as string,\n updated_at: raw.updated_at as string,\n } as Contact;\n}\n\n/** BFF Note → core ContactNote. */\nfunction mapNote(raw: Record<string, unknown>): ContactNote {\n return {\n id: raw.id as number,\n title: (raw.title as string) ?? \"\",\n body: (raw.body as string) ?? \"\",\n note_type: null,\n due_date: null,\n due_time: null,\n pinned: null,\n created_at: raw.created_at as string,\n updated_at: raw.updated_at as string,\n contact_id: (raw.contact_id as number) ?? 0,\n assets: [],\n };\n}\n\n/** BFF Task → core ContactTask. */\nfunction mapTask(raw: Record<string, unknown>): ContactTask {\n return {\n id: raw.id as number,\n body: (raw.title as string) ?? \"\",\n due_at: (raw.due_date as string) ?? null,\n completed_at:\n (raw.completed_at as string) ??\n (raw.completed ? new Date().toISOString() : null),\n created_at: raw.created_at as string,\n contact_id: (raw.contact_id as number) ?? null,\n };\n}\n\n// ---------------------------------------------------------------------------\n// Param mappers — old offset-based params → BFF cursor-based params\n// ---------------------------------------------------------------------------\n\n/**\n * The contacts-ui sends offset pagination params (page, per_page, sort_by,\n * sort_direction, search, status). The BFF expects cursor pagination\n * (page[cursor], page[limit], search, tags). Translate between the two.\n *\n * `cursorCache` maps page numbers → cursor tokens so page-2+ requests can\n * resolve to the correct cursor. The cache is populated from BFF responses.\n */\nfunction mapListParams(\n params: Record<string, unknown> | undefined,\n cursorCache: Map<number, string>,\n): Parameters<typeof portalTenantContacts.contacts_list>[1] {\n if (!params) return undefined;\n\n const mapped: Record<string, unknown> = {};\n\n if (params.per_page || params.limit) {\n mapped[\"page[limit]\"] = params.per_page ?? params.limit;\n }\n\n // Translate offset page number → cursor token\n const page = (params.page as number) ?? 1;\n if (page > 1) {\n const cursor = cursorCache.get(page);\n if (cursor) {\n mapped[\"page[cursor]\"] = cursor;\n }\n }\n\n if (params.search_query || params.search || params.query) {\n mapped.search = params.search_query ?? params.search ?? params.query;\n }\n if (params.tags) {\n mapped.tags = params.tags;\n }\n\n return mapped as Parameters<typeof portalTenantContacts.contacts_list>[1];\n}\n\n// ---------------------------------------------------------------------------\n// Adapter factories\n// ---------------------------------------------------------------------------\n\nfunction createContactsAdapter(client: FetchClient): ContactsApi {\n // Cursor cache: maps page numbers → cursor tokens from BFF responses.\n // Page 1 has no cursor; the BFF response for page N includes\n // next_cursor which becomes the cursor for page N+1.\n const cursorCache = new Map<number, string>();\n\n return {\n getContact: async (id) => {\n const response = await portalTenantContacts.contacts_show(client, id);\n return {\n contact: mapContact(\n (response as Record<string, unknown>).contact as Record<\n string,\n unknown\n >,\n ),\n };\n },\n\n listContacts: async (params) => {\n const raw = params as Record<string, unknown> | undefined;\n const page = (raw?.page as number) ?? 1;\n const pageSize = (raw?.per_page as number) ?? 25;\n\n const response = await portalTenantContacts.contacts_list(\n client,\n mapListParams(raw, cursorCache),\n );\n const body = response as Record<string, unknown>;\n const meta = body.meta as Record<string, unknown> | undefined;\n const pagination = meta?.pagination as\n | Record<string, unknown>\n | undefined;\n\n // Store the next_cursor so the UI can request page + 1\n const nextCursor = pagination?.next_cursor as string | null | undefined;\n if (nextCursor) {\n cursorCache.set(page + 1, nextCursor);\n }\n\n const contacts = ((body.contacts as Record<string, unknown>[]) ?? []).map(\n mapContact,\n );\n return {\n contacts,\n meta: paginationFromBff(meta, contacts.length, page, pageSize),\n };\n },\n\n createContact: async (data) => {\n return portalTenantContacts.contacts_create(client, {\n contact: data,\n } as Parameters<typeof portalTenantContacts.contacts_create>[1]);\n },\n\n updateContact: async (id, data) => {\n return portalTenantContacts.contacts_update(client, id, {\n contact: data,\n } as Parameters<typeof portalTenantContacts.contacts_update>[2]);\n },\n\n deleteContact: async (id) => {\n return portalTenantContacts.contacts_destroy(client, id);\n },\n\n bulkDeleteContacts: async (ids) => {\n return portalTenantContacts.contacts_bulk_destroy(client, { ids });\n },\n\n // listActivities, markRead, listOrders, listSubscriptionOrders are not\n // available through the BFF — omitted so the UI disables these features.\n };\n}\n\nfunction createNotesAdapter(client: FetchClient): NotesApi {\n return {\n listNotes: async (contactId) => {\n const response = await portalTenantContacts.contacts_notes_list(\n client,\n contactId,\n );\n const body = response as Record<string, unknown>;\n return {\n notes: ((body.notes as Record<string, unknown>[]) ?? []).map(mapNote),\n };\n },\n\n createNote: async (contactId, input) => {\n return portalTenantContacts.contacts_notes_create(client, contactId, {\n note: input,\n } as Parameters<typeof portalTenantContacts.contacts_notes_create>[2]);\n },\n\n updateNote: async (noteId, contactId, input) => {\n return portalTenantContacts.contacts_notes_update(\n client,\n contactId,\n noteId,\n {\n note: input,\n } as Parameters<typeof portalTenantContacts.contacts_notes_update>[3],\n );\n },\n\n deleteNote: async (noteId, contactId) => {\n return portalTenantContacts.contacts_notes_destroy(\n client,\n contactId,\n noteId,\n );\n },\n };\n}\n\nfunction createTasksAdapter(client: FetchClient): TasksApi {\n return {\n listTasks: async (contactId) => {\n const response = await portalTenantContacts.contacts_tasks_list(\n client,\n contactId,\n );\n const body = response as Record<string, unknown>;\n return {\n tasks: ((body.tasks as Record<string, unknown>[]) ?? []).map(mapTask),\n };\n },\n\n createTask: async (contactId, input) => {\n return portalTenantContacts.contacts_tasks_create(client, contactId, {\n task: { title: input.body, due_date: input.due_at },\n } as Parameters<typeof portalTenantContacts.contacts_tasks_create>[2]);\n },\n\n updateTask: async (taskId, contactId, input) => {\n return portalTenantContacts.contacts_tasks_update(\n client,\n contactId,\n taskId,\n {\n task: {\n title: input.body ?? undefined,\n completed:\n input.completed_at !== undefined\n ? input.completed_at !== null\n : undefined,\n due_date: input.due_at,\n },\n } as Parameters<typeof portalTenantContacts.contacts_tasks_update>[3],\n );\n },\n\n deleteTask: async (taskId, contactId) => {\n return portalTenantContacts.contacts_tasks_destroy(\n client,\n contactId,\n taskId,\n );\n },\n };\n}\n\n/** BFF Group → core ContactGroup. */\nfunction mapGroup(raw: Record<string, unknown>): ContactGroup {\n return {\n id: raw.id as number,\n name: (raw.name as string) ?? \"\",\n avatar: (raw.avatar as string) ?? null,\n avatar_background: (raw.avatar_background as string) ?? null,\n contacts_count: (raw.contacts_count as number) ?? 0,\n created_at: raw.created_at as string,\n updated_at: raw.updated_at as string,\n };\n}\n\nfunction createGroupsAdapter(client: FetchClient): GroupsApi {\n return {\n listGroups: async () => {\n const response = await portalTenantContacts.contacts_groups_list(client);\n const body = response as Record<string, unknown>;\n return {\n groups: ((body.groups as Record<string, unknown>[]) ?? []).map(\n mapGroup,\n ),\n };\n },\n\n createGroup: async (input) => {\n const response = await portalTenantContacts.contacts_groups_create(\n client,\n {\n group: input,\n } as Parameters<typeof portalTenantContacts.contacts_groups_create>[1],\n );\n const body = response as Record<string, unknown>;\n return {\n group: mapGroup(body.group as Record<string, unknown>),\n };\n },\n\n updateGroup: async (groupId, input) => {\n const response = await portalTenantContacts.contacts_groups_update(\n client,\n groupId,\n {\n group: input,\n } as Parameters<typeof portalTenantContacts.contacts_groups_update>[2],\n );\n const body = response as Record<string, unknown>;\n return {\n group: mapGroup(body.group as Record<string, unknown>),\n };\n },\n\n deleteGroup: async (groupId) => {\n return portalTenantContacts.contacts_groups_destroy(client, groupId);\n },\n };\n}\n\n/**\n * Creates a composite ContactsDomainApi backed by the portal-tenant\n * Contacts BFF endpoints.\n */\nexport function createPortalContactsDomainApiAdapter(\n client: FetchClient,\n): ContactsDomainApi {\n return {\n contacts: createContactsAdapter(client),\n notes: createNotesAdapter(client),\n tasks: createTasksAdapter(client),\n groups: createGroupsAdapter(client),\n };\n}\n","import { useMemo, type ReactElement, type ReactNode } from \"react\";\nimport { ContactsApiProvider } from \"@fluid-app/contacts-core/contacts-api-context\";\nimport { usePortalTenantClient } from \"../providers/PortalTenantClientProvider\";\nimport { createPortalContactsDomainApiAdapter } from \"../adapters/contacts-api-adapter\";\n\nexport function PortalContactsApiProvider({\n children,\n}: {\n children: ReactNode;\n}): ReactElement {\n const client = usePortalTenantClient();\n\n const api = useMemo(\n () => createPortalContactsDomainApiAdapter(client),\n [client],\n );\n\n return <ContactsApiProvider value={api}>{children}</ContactsApiProvider>;\n}\n","export const contactsEn = {\n breadcrumb: \"Contacts\",\n breadcrumb_new: \"New Contact\",\n contact_label: \"Contact\",\n contacts_deleted_successfully: \"Contacts deleted successfully\",\n add: \"Add\",\n add_contact: \"Add Contact\",\n add_todo: \"Add to-do\",\n add_todo_dialog_title: \"Add a to-do\",\n adding: \"Adding...\",\n update_contact: \"Update Contact\",\n saving: \"Saving\",\n cancel: \"Cancel\",\n save: \"Save\",\n delete: \"Delete\",\n delete_name: \"Delete {{name}}?\",\n delete_confirm_permanent:\n \"This permanently removes the contact and all of their notes, tasks, and activity. This can't be undone.\",\n delete_contact: \"Delete contact\",\n delete_contact_confirm_one:\n \"Are you sure you want to delete this contact? This action cannot be undone.\",\n delete_contact_confirm_other:\n \"Are you sure you want to delete {{count}} contacts? This action cannot be undone.\",\n delete_contact_title: \"Delete contact?\",\n deleting: \"Deleting...\",\n search_placeholder: \"Search contacts\",\n error_loading: \"Couldn't load contact\",\n error_loading_description:\n \"This contact may have been deleted, you may not have permission to view it, or there was a network error. Try selecting them again.\",\n error_loading_list: \"Couldn't load contacts. Pull down to retry.\",\n error_generic: \"Something went wrong. Please try again later.\",\n loading: \"Loading...\",\n loading_more: \"Loading more...\",\n searching: \"Searching...\",\n people_count: \"{{count}} people across your network\",\n person_count: \"{{count}} person across your network\",\n no_contacts_search: 'No contacts match \"{{term}}\".',\n no_contacts_yet: \"No contacts yet.\",\n no_contacts_filter: \"No contacts match this filter.\",\n empty_select_contact: \"Select a contact\",\n empty_select_description:\n \"Pick someone from your list on the left to see their details, notes, and tasks.\",\n tab_tasks: \"Tasks\",\n tab_notes: \"Notes\",\n edit_profile: \"Edit profile\",\n editing_name: \"Editing {{name}}\",\n profile_edit_description:\n \"Update details below. Your contact card above is paused while you edit.\",\n new_task: \"New task\",\n last_updated: \"Last updated {{date}}\",\n label_email: \"Email\",\n label_phone: \"Phone\",\n label_address: \"Address\",\n label_call: \"Call\",\n label_first_name: \"First Name\",\n label_last_name: \"Last Name\",\n label_city: \"City\",\n label_country: \"Country\",\n label_full_address: \"Full Address\",\n label_postal_code: \"Postal Code\",\n label_state: \"State/Province\",\n label_status: \"Status\",\n not_set: \"Not set\",\n more_actions: \"More actions\",\n back_to_contacts: \"Back to contacts\",\n back_to_tasks: \"Back to Tasks\",\n filter_all: \"All\",\n filter_leads: \"Leads\",\n filter_customers: \"Customers\",\n note_placeholder: \"Leave a note about this contact…\",\n note_body_aria: \"Note body\",\n add_note: \"Add note\",\n tip_save_shortcut_mac: \"Tip: ⌘ + Enter to save\",\n tip_save_shortcut_other: \"Tip: Ctrl + Enter to save\",\n task_describe_placeholder: \"Describe the task…\",\n task_description_aria: \"Task description\",\n task_discard_aria: \"Discard task\",\n add_task: \"Add task\",\n quick_today: \"Today\",\n quick_tomorrow: \"Tomorrow\",\n task_select_date: \"Select Date\",\n task_due_in_days: \"In {{count}} days\",\n task_next_week: \"Next Week\",\n task_no_date: \"No Date\",\n task_custom_calendar: \"Custom Calendar\",\n task_time_label: \"Time\",\n task_time_aria: \"Select due time\",\n calendar_next_month: \"Go to next month\",\n calendar_previous_month: \"Go to previous month\",\n calendar_month_dropdown: \"Month: \",\n calendar_year_dropdown: \"Year: \",\n calendar_week_number: \"Week {{number}}\",\n task_custom_date_selected_aria: \"Change due date: {{date}}\",\n task_custom_date_aria: \"Select due date\",\n edit_contact_name: \"Edit {{name}}\",\n save_changes: \"Save changes\",\n add_field: \"Add {{field}}\",\n copy_field: \"Copy {{field}}\",\n copied_field: \"Copied {{field}}\",\n attachment_one: \"1 attachment\",\n attachment_other: \"{{count}} attachments\",\n note_actions: \"Note actions\",\n delete_note_title: \"Delete note?\",\n delete_note_irreversible: \"This action cannot be undone.\",\n task_yesterday: \"Yesterday\",\n task_days_ago_one: \"1 day ago\",\n task_days_ago_other: \"{{count}} days ago\",\n task_overdue_due: \"Overdue · {{date}}\",\n task_due: \"Due {{date}}\",\n mark_as_open: \"Mark as open\",\n mark_as_completed: \"Mark as completed\",\n task_actions: \"Task actions\",\n delete_task_title: \"Delete task?\",\n delete_task_confirm:\n \"Are you sure you want to delete this task? This action cannot be undone.\",\n groups_manage_groups: \"Manage Groups\",\n groups_manage_title: \"Manage Groups\",\n groups_back_to_contacts: \"Back to contacts\",\n groups_new_group: \"New Group\",\n groups_empty: \"No groups yet. Create a group to get started.\",\n groups_delete_title: \"Delete group?\",\n groups_delete_confirm:\n \"Are you sure you want to delete “{{name}}”? Contacts in this group will not be deleted, but they will be removed from the group.\",\n groups_create_title: \"Create Group\",\n groups_edit_title: \"Edit Group\",\n groups_remove_emoji: \"Remove emoji\",\n groups_avatar: \"Avatar\",\n groups_name_label: \"Group Name\",\n groups_name_placeholder: \"Group name\",\n groups_tab_change_emoji: \"Change Emoji\",\n groups_tab_change_color: \"Change color\",\n groups_no_emoji_found: \"No emoji found.\",\n groups_close: \"Close\",\n groups_creating: \"Creating...\",\n groups_create: \"Create\",\n groups_created_toast: 'Group \"{{name}}\" created',\n groups_create_failed: \"Failed to create group\",\n groups_create_new_group: \"Create New Group\",\n groups_updated_toast: \"Group updated\",\n groups_update_failed: \"Failed to update group\",\n groups_deleted_toast: 'Group \"{{name}}\" deleted',\n groups_delete_failed: \"Failed to delete group\",\n groups_contact_one: \"{{count}} contact\",\n groups_contact_other: \"{{count}} contacts\",\n groups_member_one: \"{{count}} member\",\n groups_member_other: \"{{count}} members\",\n groups_search_contacts_to_add: \"Search contacts to add...\",\n groups_no_contacts_found: \"No contacts found\",\n groups_loading_members: \"Loading members...\",\n groups_empty_members:\n \"No contacts in this group yet. Use the search above to add contacts.\",\n groups_edit_aria: \"Edit {{name}}\",\n groups_delete_aria: \"Delete {{name}}\",\n groups_remove_member_aria: \"Remove {{name}}\",\n groups_member_added_toast: \"{{contact}} added to {{group}}\",\n groups_member_removed_toast: \"{{contact}} removed from {{group}}\",\n groups_member_add_failed: \"Failed to add {{contact}} to {{group}}\",\n groups_member_remove_failed: \"Failed to remove {{contact}} from {{group}}\",\n groups_inline_search_placeholder: \"Search\",\n groups_inline_create: 'Create \"{{name}}\"',\n groups_inline_create_failed: 'Failed to create group \"{{name}}\"',\n groups_inline_no_groups_found: \"No groups found\",\n groups_inline_selected_one: \"{{count}} group selected\",\n groups_inline_selected_other: \"{{count}} groups selected\",\n groups_color_red: \"Red\",\n groups_color_orange: \"Orange\",\n groups_color_yellow: \"Yellow\",\n groups_color_green: \"Green\",\n groups_color_teal: \"Teal\",\n groups_color_cyan: \"Cyan\",\n groups_color_blue: \"Blue\",\n groups_color_indigo: \"Indigo\",\n groups_color_purple: \"Purple\",\n groups_color_pink: \"Pink\",\n groups_add_group: \"Add Group\",\n groups_add_to_group: \"Add to Group\",\n groups_no_groups_yet: \"No groups yet\",\n groups_tags_save_failed: \"Failed to save group changes\",\n groups_title: \"Groups\",\n groups_options_aria: \"Group options\",\n groups_selected_count_one: \"{{count}} contact selected\",\n groups_selected_count_other: \"{{count}} contacts selected\",\n contacts_deleted_one: \"{{count}} contact deleted\",\n contacts_deleted_other: \"{{count}} contacts deleted\",\n contact_deleted_toast: \"{{name}} deleted\",\n contact_delete_failed: \"Failed to delete contact\",\n contacts_delete_failed_one: \"Failed to delete contact\",\n contacts_delete_failed_other: \"Failed to delete contacts\",\n contacts_added_to_group_one: \"Added {{count}} contact to {{group}}\",\n contacts_added_to_group_other: \"Added {{count}} contacts to {{group}}\",\n contacts_add_to_group_failed_one: \"Failed to add contact to {{group}}\",\n contacts_add_to_group_failed_other: \"Failed to add contacts to {{group}}\",\n delete_contact_aria: \"Delete {{name}}\",\n placeholder_first_name: \"Enter first name\",\n placeholder_last_name: \"Enter last name\",\n placeholder_email: \"Enter email address\",\n placeholder_phone: \"Enter phone number\",\n placeholder_full_address: \"Enter street address\",\n placeholder_city: \"Enter city\",\n placeholder_country: \"Select country\",\n placeholder_state: \"Enter state or province\",\n placeholder_postal_code: \"Enter postal code\",\n placeholder_status: \"Select status\",\n status_new: \"New\",\n status_active: \"Active\",\n status_inactive: \"Inactive\",\n status_cold: \"Cold\",\n status_lead: \"Lead\",\n status_customer: \"Customer\",\n // ManageGroupsModal / CreateGroupModal\n groups_manage_for_contact: \"Manage Groups for {{name}}\",\n groups_available: \"Available Groups\",\n groups_name_required_title: \"Group name required\",\n groups_name_required_description: \"Please enter a name for the new group\",\n groups_already_exists_title: \"Group already exists\",\n groups_already_exists_description: 'A group named \"{{name}}\" already exists',\n groups_choose_emoji: \"Choose Emoji\",\n groups_choose_color: \"Choose Color\",\n // Task toasts\n task_updated: \"Task updated\",\n task_created: \"Task created\",\n task_deleted: \"Task deleted\",\n task_update_failed: \"Failed to update task\",\n task_create_failed: \"Failed to create task\",\n task_delete_failed: \"Failed to delete task\",\n // Note toasts\n note_created: \"Note created\",\n note_updated: \"Note updated\",\n note_deleted: \"Note deleted\",\n note_create_failed: \"Failed to create note\",\n note_update_failed: \"Failed to update note\",\n note_delete_failed: \"Failed to delete note\",\n // Contact mutation toasts (shared hooks)\n contact_created: \"Contact created successfully\",\n contact_updated: \"Contact updated successfully\",\n contact_deleted: \"Contact deleted successfully\",\n contact_create_failed: \"Failed to create contact\",\n contact_save_failed: \"Failed to save contact\",\n form_errors_title: \"Please fix the form errors before saving\",\n // Validation\n validation_first_name_required: \"First name is required\",\n validation_last_name_required: \"Last name is required\",\n // Orders\n orders_title: \"Orders\",\n orders_empty: \"No orders yet\",\n orders_empty_description: \"Orders placed by this contact will appear here\",\n orders_failed: \"Failed to load orders\",\n orders_retry: \"Please try again later\",\n orders_no_match: \"No orders match this filter\",\n // Notes sidebar\n notes_title: \"Notes\",\n notes_empty: \"No notes yet\",\n notes_view_all: \"View all\",\n pagination_page_of: \"Page {{current}} of {{total}} ({{count}} total)\",\n pagination_previous: \"Previous page\",\n pagination_next: \"Next page\",\n // Activity feed\n activity_title: \"Recent Activity\",\n activity_empty: \"No activity yet\",\n activity_empty_description:\n \"Reach out and share a product or media to start building this contact’s story\",\n activity_filter_new: \"New\",\n activity_mark_all_read: \"Mark all read\",\n activity_no_match: \"No {{filter}} activities\",\n activity_type_message: \"Message\",\n activity_type_task: \"Task\",\n activity_type_alert: \"Alert from Fluid.app\",\n activity_type_announcement: \"Announcement\",\n activity_type_event: \"Event\",\n activity_type_review: \"Review\",\n activity_type_points: \"Points\",\n activity_type_notification: \"Notification\",\n activity_date_today: \"Today\",\n activity_date_yesterday: \"Yesterday\",\n activity_due: \"Due\",\n activity_tbd: \"TBD\",\n notes_more: \"more\",\n // Subscriptions\n subscriptions_title: \"Subscriptions\",\n subscriptions_empty: \"No subscriptions yet\",\n subscriptions_empty_description:\n \"Subscriptions for this contact will appear here\",\n subscriptions_failed: \"Failed to load subscriptions\",\n subscriptions_no_match: \"No subscriptions match this filter\",\n subscriptions_next_bill: \"Next bill:\",\n subscriptions_created: \"Created {{date}}\",\n subscriptions_every_days: \"Every {{count}} days\",\n // Status filters (shared by orders & subscriptions)\n status_filter_awaiting_payment: \"Awaiting Payment\",\n status_filter_awaiting_shipment: \"Awaiting Shipment\",\n status_filter_shipped: \"Shipped\",\n status_filter_delivered: \"Delivered\",\n status_filter_cancelled: \"Cancelled\",\n // Editor / due date\n editor_add_due_date: \"Add due date\",\n editor_due_date: \"Due date\",\n editor_remove_due_date: \"Remove due date\",\n editor_start_writing: \"Start writing...\",\n // Note/task modal\n modal_note_label: \"Note\",\n modal_task_label: \"Task\",\n modal_edit_type: \"Edit {{type}}\",\n modal_new_type: \"New {{type}}\",\n modal_type_title_placeholder: \"{{type}} title\",\n modal_mark_incomplete: \"Mark Incomplete\",\n modal_mark_complete: \"Mark Complete\",\n // Toolbar\n toolbar_bold: \"Bold\",\n toolbar_italic: \"Italic\",\n toolbar_underline: \"Underline\",\n toolbar_align_left: \"Align left\",\n toolbar_align_center: \"Align center\",\n toolbar_align_right: \"Align right\",\n toolbar_justify: \"Justify\",\n toolbar_bullet_list: \"Bullet list\",\n toolbar_ordered_list: \"Ordered list\",\n // Contact info card\n tooltip_message: \"Message\",\n tooltip_new_note: \"New Note\",\n tooltip_events_coming_soon: \"Events (coming soon)\",\n contact_info_title: \"Contact Information\",\n contact_info_no_email: \"No email entered\",\n contact_info_no_phone: \"No phone number entered\",\n contact_info_no_address: \"No address entered\",\n contact_info_edit: \"Edit\",\n contact_unknown_name: \"Unknown\",\n // Relative time labels\n relative_today: \"today\",\n relative_yesterday: \"yesterday\",\n relative_days_ago: \"{{count}} days ago\",\n relative_weeks_ago_one: \"1 week ago\",\n relative_weeks_ago_other: \"{{count}} weeks ago\",\n relative_months_ago_one: \"1 month ago\",\n relative_months_ago_other: \"{{count}} months ago\",\n relative_years_ago_one: \"1 year ago\",\n relative_years_ago_other: \"{{count}} years ago\",\n // Action unavailable aria label\n action_unavailable: \"{{label}} (unavailable)\",\n // Note/task editor defaults\n editor_default_title: \"New Note\",\n editor_default_body_placeholder: \"Start writing...\",\n // Contacts table\n table_groups: \"Groups\",\n table_filter_by_group: \"Filter by group\",\n table_column_name: \"Name\",\n table_column_email: \"Email\",\n table_column_phone: \"Phone\",\n table_column_id: \"ID\",\n table_column_status: \"Status\",\n table_search_placeholder: \"Search contacts...\",\n table_no_contacts: \"No contacts found\",\n table_no_contacts_group_filter:\n \"No contacts found for the selected group filter.\",\n table_select_all: \"Select all\",\n table_deselect_all: \"Deselect all\",\n table_selected_count: \"{{count}} selected\",\n table_actions: \"Actions\",\n table_edit: \"Edit\",\n table_clear_filters: \"Clear filters\",\n table_contact_actions: \"Contact actions\",\n table_sort_asc: \"{{name}} (A-Z)\",\n table_sort_desc: \"{{name}} (Z-A)\",\n table_delete_rows_one: \"Delete {{count}} row\",\n table_delete_rows_other: \"Delete {{count}} rows\",\n table_delete_contacts_one: \"Delete {{count}} contact\",\n table_delete_contacts_other: \"Delete {{count}} contacts\",\n table_select_contact: \"Select {{name}}\",\n contact_optional_label: \"Contact (optional)\",\n contact_picker_trigger_aria: \"Contact (optional): {{selection}}\",\n select_contact: \"Select Contact\",\n no_contact: \"No contact\",\n clear_contact_aria: \"Clear contact\",\n todo_empty: \"You've got nothing else To-Do!\",\n todo_open_tasks_one: \"{{count}} open task\",\n todo_open_tasks_other: \"{{count}} open tasks\",\n todo_more_tasks_one: \"{{count}} more task\",\n todo_more_tasks_other: \"{{count}} more tasks\",\n edit_todo: \"Edit\",\n delete_todo: \"Delete\",\n view_done: \"View done ({{count}})\",\n hide_done: \"Hide done\",\n // Sponsor card\n sponsor_title: \"Sponsor\",\n label_name: \"Name\",\n // Affiliate / rep assignment\n assign_rep_title: \"Assign Rep\",\n assign_rep_tooltip: \"The rep affiliated with this contact\",\n assign_rep_clear: \"Clear\",\n assign_rep_edit: \"Edit\",\n assign_rep_back: \"Back\",\n assign_rep_search_placeholder: \"Search by name or email...\",\n assign_rep_loading: \"Loading…\",\n assign_rep_no_results: 'No reps found matching \"{{term}}\"',\n} as const satisfies Record<string, string>;\n\nexport type ContactsDict = typeof contactsEn;\n","import {\n createDomainTranslations,\n type DomainTranslations,\n} from \"@fluid-app/i18n/translations\";\nimport { createStaticDictAdapter } from \"@fluid-app/i18n/static-dict-adapter\";\nimport type { TranslationApi } from \"@fluid-app/i18n/translation-api\";\nimport { contactsEn, type ContactsDict } from \"./translation-dictionary\";\n\nexport const contactsDomain: DomainTranslations<ContactsDict> =\n createDomainTranslations<ContactsDict>({\n fallback: contactsEn,\n loaders: {\n de: () =>\n import(\"./locale/de.json\").then(\n (m): ContactsDict => m.default as ContactsDict,\n ),\n el: () =>\n import(\"./locale/el.json\").then(\n (m): ContactsDict => m.default as ContactsDict,\n ),\n es: () =>\n import(\"./locale/es.json\").then(\n (m): ContactsDict => m.default as ContactsDict,\n ),\n fr: () =>\n import(\"./locale/fr.json\").then(\n (m): ContactsDict => m.default as ContactsDict,\n ),\n he: () =>\n import(\"./locale/he.json\").then(\n (m): ContactsDict => m.default as ContactsDict,\n ),\n hu: () =>\n import(\"./locale/hu.json\").then(\n (m): ContactsDict => m.default as ContactsDict,\n ),\n id: () =>\n import(\"./locale/id.json\").then(\n (m): ContactsDict => m.default as ContactsDict,\n ),\n it: () =>\n import(\"./locale/it.json\").then(\n (m): ContactsDict => m.default as ContactsDict,\n ),\n ja: () =>\n import(\"./locale/ja.json\").then(\n (m): ContactsDict => m.default as ContactsDict,\n ),\n ko: () =>\n import(\"./locale/ko.json\").then(\n (m): ContactsDict => m.default as ContactsDict,\n ),\n nl: () =>\n import(\"./locale/nl.json\").then(\n (m): ContactsDict => m.default as ContactsDict,\n ),\n pl: () =>\n import(\"./locale/pl.json\").then(\n (m): ContactsDict => m.default as ContactsDict,\n ),\n pt: () =>\n import(\"./locale/pt.json\").then(\n (m): ContactsDict => m.default as ContactsDict,\n ),\n ro: () =>\n import(\"./locale/ro.json\").then(\n (m): ContactsDict => m.default as ContactsDict,\n ),\n ru: () =>\n import(\"./locale/ru.json\").then(\n (m): ContactsDict => m.default as ContactsDict,\n ),\n th: () =>\n import(\"./locale/th.json\").then(\n (m): ContactsDict => m.default as ContactsDict,\n ),\n tl: () =>\n import(\"./locale/tl.json\").then(\n (m): ContactsDict => m.default as ContactsDict,\n ),\n tr: () =>\n import(\"./locale/tr.json\").then(\n (m): ContactsDict => m.default as ContactsDict,\n ),\n zh_CN: () =>\n import(\"./locale/zh_CN.json\").then(\n (m): ContactsDict => m.default as ContactsDict,\n ),\n zh_TW: () =>\n import(\"./locale/zh_TW.json\").then(\n (m): ContactsDict => m.default as ContactsDict,\n ),\n },\n });\n\nexport function createContactsTranslationAdapter(\n locale: string,\n dict: ContactsDict,\n): TranslationApi<ContactsDict> {\n return createStaticDictAdapter(locale, dict);\n}\n","import { useMemo, type ReactNode } from \"react\";\nimport { useActiveLocale } from \"@fluid-app/i18n/locale-context\";\nimport { useDomainDict } from \"@fluid-app/i18n/use-domain-dict\";\nimport {\n contactsDomain,\n createContactsTranslationAdapter,\n} from \"@fluid-app/contacts-core/translation-adapter\";\nimport { ContactsTranslationProvider } from \"@fluid-app/contacts-core/translation-api-context\";\n\nexport function ContactsTranslationBridge({\n children,\n}: {\n children: ReactNode;\n}): React.JSX.Element {\n const { locale } = useActiveLocale();\n const dict = useDomainDict(contactsDomain, locale);\n const api = useMemo(\n () => createContactsTranslationAdapter(locale, dict),\n [locale, dict],\n );\n return (\n <ContactsTranslationProvider value={api}>\n {children}\n </ContactsTranslationProvider>\n );\n}\n"],"mappings":"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"}
@@ -3,7 +3,7 @@ const require_ScreenRenderer = require("./ScreenRenderer-Ce8MJPnR.cjs");
3
3
  const require_use_account = require("./use-account-BBSExzPb.cjs");
4
4
  const require_use_optional_store = require("./use-optional-store-CIM4spDu.cjs");
5
5
  const require_mysite_api_context = require("./mysite-api-context-DtEXblIV.cjs");
6
- const require_ContactsTranslationBridge = require("./ContactsTranslationBridge-D9gEIAp3.cjs");
6
+ const require_ContactsTranslationBridge = require("./ContactsTranslationBridge-Dx_1jAxz.cjs");
7
7
  const require_query_keys = require("./query-keys-DcXw31XS.cjs");
8
8
  const require_registry_context = require("./registry-context-Ds0_y48D.cjs");
9
9
  const require_QuickLinksWidget = require("./QuickLinksWidget-DUdlJGwE.cjs");
@@ -12,7 +12,7 @@ const require_SearchSort = require("./SearchSort-BVc7PJ_Q.cjs");
12
12
  const require_shell_translation_api_context = require("./shell-translation-api-context-uGur0Kah.cjs");
13
13
  const require_error_state = require("./error-state-bqYzR5FT.cjs");
14
14
  const require_PointsWidget = require("./PointsWidget-CcENjU_h.cjs");
15
- const require_ShopWidget = require("./ShopWidget-BbCPV2_Y.cjs");
15
+ const require_ShopWidget = require("./ShopWidget-C_R5RGoe.cjs");
16
16
  const require_LayoutWidget = require("./LayoutWidget-CzM4gn1-.cjs");
17
17
  const require_TextWidget = require("./TextWidget-Bu3yJ6TJ.cjs");
18
18
  const require_AlertWidget = require("./AlertWidget-B4g4x-Qx.cjs");
@@ -32,7 +32,7 @@ const require_QuickShareWidget = require("./QuickShareWidget-CESDDIcr.cjs");
32
32
  const require_SeparatorWidget = require("./SeparatorWidget-DVnbbshP.cjs");
33
33
  const require_SpacerWidget = require("./SpacerWidget-5oBsx8_A.cjs");
34
34
  const require_TableWidget = require("./TableWidget-BrDvinFN.cjs");
35
- const require_ToDoWidget = require("./ToDoWidget-CgFDCQNX.cjs");
35
+ const require_ToDoWidget = require("./ToDoWidget-aSYTB02O.cjs");
36
36
  const require_VideoWidget = require("./VideoWidget-B4SzSxTv.cjs");
37
37
  const require_translation_adapter = require("./translation-adapter-CkgtjiOT.cjs");
38
38
  const require_translation_adapter$1 = require("./translation-adapter-BMvv-Nqx.cjs");
@@ -18059,6 +18059,7 @@ const shopDomain = require_static_dict_adapter.createDomainTranslations({
18059
18059
  breadcrumb: "Shop",
18060
18060
  product_fallback_name: "Product",
18061
18061
  search_placeholder: "Search products...",
18062
+ shop_all: "Shop All",
18062
18063
  sort_by: "Sort By",
18063
18064
  sort_title_asc: "Title (A-Z)",
18064
18065
  sort_title_desc: "Title (Z-A)",
@@ -18191,11 +18192,11 @@ const widgetPropertySchemas = {
18191
18192
  QuickShareWidget: () => Promise.resolve().then(() => require("./QuickShareWidget-BpsLyzRi.cjs")).then((m) => m.quickShareWidgetPropertySchema),
18192
18193
  RecentActivityWidget: () => Promise.resolve().then(() => require("./RecentActivityWidget-7tACMQqV.cjs")).then((n) => n.RecentActivityWidget_exports).then((m) => m.recentActivityWidgetPropertySchema),
18193
18194
  SeparatorWidget: () => Promise.resolve().then(() => require("./SeparatorWidget-DVnbbshP.cjs")).then((n) => n.SeparatorWidget_exports).then((m) => m.separatorWidgetPropertySchema),
18194
- ShopWidget: () => Promise.resolve().then(() => require("./ShopWidget-BF0zWjS6.cjs")).then((m) => m.shopWidgetPropertySchema),
18195
+ ShopWidget: () => Promise.resolve().then(() => require("./ShopWidget-CaPQVMlr.cjs")).then((m) => m.shopWidgetPropertySchema),
18195
18196
  SpacerWidget: () => Promise.resolve().then(() => require("./SpacerWidget-5oBsx8_A.cjs")).then((n) => n.SpacerWidget_exports).then((m) => m.spacerWidgetPropertySchema),
18196
18197
  TableWidget: () => Promise.resolve().then(() => require("./TableWidget-Dp3jYy6Z.cjs")).then((m) => m.tableWidgetPropertySchema),
18197
18198
  TextWidget: () => Promise.resolve().then(() => require("./TextWidget-Bu3yJ6TJ.cjs")).then((n) => n.TextWidget_exports).then((m) => m.textWidgetPropertySchema),
18198
- ToDoWidget: () => Promise.resolve().then(() => require("./ToDoWidget-3bkkxozQ.cjs")).then((m) => m.toDoWidgetPropertySchema),
18199
+ ToDoWidget: () => Promise.resolve().then(() => require("./ToDoWidget-Cr0VP7k6.cjs")).then((m) => m.toDoWidgetPropertySchema),
18199
18200
  VideoWidget: () => Promise.resolve().then(() => require("./VideoWidget-B4SzSxTv.cjs")).then((n) => n.VideoWidget_exports).then((m) => m.videoWidgetPropertySchema)
18200
18201
  };
18201
18202
  //#endregion
@@ -19876,4 +19877,4 @@ Object.defineProperty(exports, "widgetPropertySchemas", {
19876
19877
  }
19877
19878
  });
19878
19879
 
19879
- //# sourceMappingURL=FluidProvider-CURmntkw.cjs.map
19880
+ //# sourceMappingURL=FluidProvider-BvVjhwrv.cjs.map