@fluid-app/portal-sdk 0.1.524 → 0.1.526

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 (53) hide show
  1. package/dist/{ContactsScreen-DeXNeKhZ.cjs → ContactsScreen-C3ccWqAe.cjs} +41 -38
  2. package/dist/{ContactsScreen-DeXNeKhZ.cjs.map → ContactsScreen-C3ccWqAe.cjs.map} +1 -1
  3. package/dist/{ContactsScreen-C29wHxlb.mjs → ContactsScreen-C_UMnqhN.mjs} +2 -2
  4. package/dist/{ContactsScreen-xXR5SM7U.cjs → ContactsScreen-DEQAF0fC.cjs} +2 -2
  5. package/dist/{ContactsScreen-C5WtXbuk.mjs → ContactsScreen-DkChLGnB.mjs} +41 -38
  6. package/dist/{ContactsScreen-C5WtXbuk.mjs.map → ContactsScreen-DkChLGnB.mjs.map} +1 -1
  7. package/dist/{ContactsTranslationBridge-7hUvizHe.mjs → ContactsTranslationBridge-B4SlrRSR.mjs} +4 -3
  8. package/dist/{ContactsTranslationBridge-7hUvizHe.mjs.map → ContactsTranslationBridge-B4SlrRSR.mjs.map} +1 -1
  9. package/dist/{ContactsTranslationBridge-MTW9WS-j.cjs → ContactsTranslationBridge-C7Q9rpKH.cjs} +4 -3
  10. package/dist/{ContactsTranslationBridge-MTW9WS-j.cjs.map → ContactsTranslationBridge-C7Q9rpKH.cjs.map} +1 -1
  11. package/dist/{FluidProvider-BsFKQnUK.cjs → FluidProvider-B4msuwpR.cjs} +2 -2
  12. package/dist/{FluidProvider-BsFKQnUK.cjs.map → FluidProvider-B4msuwpR.cjs.map} +1 -1
  13. package/dist/{FluidProvider-BnzzWdqN.mjs → FluidProvider-CqFIXA9E.mjs} +2 -2
  14. package/dist/{FluidProvider-BnzzWdqN.mjs.map → FluidProvider-CqFIXA9E.mjs.map} +1 -1
  15. package/dist/{MessagingScreen-CPbJ2scr.mjs → MessagingScreen-8OZSwMYW.mjs} +3 -3
  16. package/dist/{MessagingScreen-Dn4YnN6I.cjs → MessagingScreen-CY8VbrOx.cjs} +3 -3
  17. package/dist/{MessagingScreen-CkTXrFJI.cjs → MessagingScreen-D_Y3Coa6.cjs} +38 -17
  18. package/dist/MessagingScreen-D_Y3Coa6.cjs.map +1 -0
  19. package/dist/{MessagingScreen-D0elghP1.mjs → MessagingScreen-DwU7sqzj.mjs} +38 -17
  20. package/dist/MessagingScreen-DwU7sqzj.mjs.map +1 -0
  21. package/dist/{OrdersScreen-BwrCczgL.mjs → OrdersScreen-CNYPIZBb.mjs} +3 -3
  22. package/dist/{OrdersScreen-Bkw8Gakq.mjs → OrdersScreen-CNzRy_gk.mjs} +3 -3
  23. package/dist/{OrdersScreen-Bkw8Gakq.mjs.map → OrdersScreen-CNzRy_gk.mjs.map} +1 -1
  24. package/dist/{OrdersScreen-DTyk0hBC.cjs → OrdersScreen-CSYdmQVZ.cjs} +3 -3
  25. package/dist/{OrdersScreen-CE6w3HTb.cjs → OrdersScreen-DZfsHpZK.cjs} +3 -3
  26. package/dist/{OrdersScreen-CE6w3HTb.cjs.map → OrdersScreen-DZfsHpZK.cjs.map} +1 -1
  27. package/dist/{ProfileScreen-Bjs-nBKq.cjs → ProfileScreen-B8Df2C1b.cjs} +3 -3
  28. package/dist/{ProfileScreen-Bjs-nBKq.cjs.map → ProfileScreen-B8Df2C1b.cjs.map} +1 -1
  29. package/dist/{ProfileScreen-CpPCRKK7.cjs → ProfileScreen-DYNeWfwK.cjs} +4 -4
  30. package/dist/{ProfileScreen-D7n2kWsy.mjs → ProfileScreen-DsFhKUi2.mjs} +4 -4
  31. package/dist/{ProfileScreen-W3mNfSGX.mjs → ProfileScreen-OH5UYO9J.mjs} +3 -3
  32. package/dist/{ProfileScreen-W3mNfSGX.mjs.map → ProfileScreen-OH5UYO9J.mjs.map} +1 -1
  33. package/dist/{SubscriptionsScreen-DdJKVEEk.cjs → SubscriptionsScreen-C0s1Dy_5.cjs} +4 -4
  34. package/dist/{SubscriptionsScreen-zlS5PXyR.mjs → SubscriptionsScreen-CJheY605.mjs} +4 -4
  35. package/dist/{SubscriptionsScreen-zlS5PXyR.mjs.map → SubscriptionsScreen-CJheY605.mjs.map} +1 -1
  36. package/dist/{SubscriptionsScreen-o3DKCuSN.mjs → SubscriptionsScreen-D0wBR3ji.mjs} +4 -4
  37. package/dist/{SubscriptionsScreen-C-v8uneR.cjs → SubscriptionsScreen-DplufOOc.cjs} +4 -4
  38. package/dist/{SubscriptionsScreen-C-v8uneR.cjs.map → SubscriptionsScreen-DplufOOc.cjs.map} +1 -1
  39. package/dist/index.cjs +18 -18
  40. package/dist/index.d.cts +309 -1
  41. package/dist/index.d.cts.map +1 -1
  42. package/dist/index.d.mts +309 -1
  43. package/dist/index.d.mts.map +1 -1
  44. package/dist/index.mjs +18 -18
  45. package/dist/task-composer-form-DDzxr6_A.cjs.map +1 -1
  46. package/dist/task-composer-form-DTHeuJ9-.mjs.map +1 -1
  47. package/dist/{use-portal-card-add-3ds-flow-gj_LSjop.mjs → use-portal-card-add-3ds-flow-ps5Lr2c3.mjs} +2 -2
  48. package/dist/{use-portal-card-add-3ds-flow-gj_LSjop.mjs.map → use-portal-card-add-3ds-flow-ps5Lr2c3.mjs.map} +1 -1
  49. package/dist/{use-portal-card-add-3ds-flow-BEZtTxel.cjs → use-portal-card-add-3ds-flow-r2akoTNE.cjs} +2 -2
  50. package/dist/{use-portal-card-add-3ds-flow-BEZtTxel.cjs.map → use-portal-card-add-3ds-flow-r2akoTNE.cjs.map} +1 -1
  51. package/package.json +19 -19
  52. package/dist/MessagingScreen-CkTXrFJI.cjs.map +0 -1
  53. package/dist/MessagingScreen-D0elghP1.mjs.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"ContactsTranslationBridge-MTW9WS-j.cjs","names":["toApiErrorBody","ApiError","toApiErrorData","useAccount","ContactsApiProvider","createDomainTranslations","createStaticDictAdapter","useActiveLocale","useDomainDict","ContactsTranslationProvider"],"sources":["../../../platform/api-client-core/src/hey-api-error-policy.ts","../../../api-clients/hey-api-fetch-runtime/src/generated/core/bodySerializer.gen.ts","../../../api-clients/hey-api-fetch-runtime/src/generated/core/params.gen.ts","../../../api-clients/hey-api-fetch-runtime/src/generated/core/serverSentEvents.gen.ts","../../../api-clients/hey-api-fetch-runtime/src/generated/core/pathSerializer.gen.ts","../../../api-clients/hey-api-fetch-runtime/src/generated/core/utils.gen.ts","../../../api-clients/hey-api-fetch-runtime/src/generated/core/auth.gen.ts","../../../api-clients/hey-api-fetch-runtime/src/generated/client/utils.gen.ts","../../../api-clients/hey-api-fetch-runtime/src/generated/client/client.gen.ts","../../../api-clients/portal-tenant-contacts/src/hey-api-client.ts","../../../api-clients/portal-tenant-contacts/src/hey-api/sdk.gen.ts","../src/adapters/contacts-api-adapter.ts","../src/providers/FluidConfigProvider.tsx","../src/contacts/PortalContactsApiProvider.tsx","../../../contacts/core/src/translation-dictionary.ts","../../../contacts/core/src/translation-adapter.ts","../src/providers/ContactsTranslationBridge.tsx"],"sourcesContent":["import type { ApiErrorBody, ApiErrorData } from \"./api-error-shape\";\nimport { toApiErrorBody, toApiErrorData } from \"./api-error-shape\";\nimport { ApiError } from \"./fetch-client\";\n\nexport interface HeyApiErrorRequestOptions {\n method?: string;\n}\n\nexport interface HeyApiErrorInterceptorOptions {\n onResponseError?: (response: Response) => void;\n shouldPassThroughTransportError?: (error: unknown) => boolean;\n}\n\nexport type HeyApiErrorInterceptor = (\n error: unknown,\n response: Response | undefined,\n request: Request | undefined,\n options: HeyApiErrorRequestOptions,\n) => unknown;\n\nfunction getNonEmptyString(value: unknown): string | undefined {\n if (typeof value !== \"string\") {\n return undefined;\n }\n\n const trimmed = value.trim();\n return trimmed.length > 0 ? trimmed : undefined;\n}\n\nfunction getRequestId(\n response: Response,\n error: ApiErrorBody,\n): string | undefined {\n const meta = toApiErrorBody(error?.meta);\n\n return (\n getNonEmptyString(response.headers.get(\"x-request-id\")) ??\n getNonEmptyString(response.headers.get(\"request-id\")) ??\n getNonEmptyString(error?.request_id) ??\n getNonEmptyString(error?.requestId) ??\n getNonEmptyString(meta?.request_id) ??\n getNonEmptyString(meta?.requestId)\n );\n}\n\nfunction getErrorMessage(\n error: Record<string, unknown>,\n fallback: string,\n): string {\n const nestedError = toApiErrorBody(error.error);\n\n return (\n getNonEmptyString(error.message) ??\n getNonEmptyString(error.error_message) ??\n getNonEmptyString(nestedError?.message) ??\n fallback\n );\n}\n\n/**\n * Creates an error interceptor compatible with generated Hey API fetch clients.\n * Consumer-specific auth and cancellation policy is supplied through callbacks,\n * keeping this package independent from generated client types.\n */\nexport function createHeyApiErrorInterceptor(\n options: HeyApiErrorInterceptorOptions = {},\n): HeyApiErrorInterceptor {\n return (error, response, request, requestOptions) => {\n if (!response) {\n if (error instanceof ApiError) {\n return error;\n }\n\n if (options.shouldPassThroughTransportError?.(error)) {\n return error;\n }\n\n // Request construction and auth callbacks run before dispatch. Preserve\n // those errors instead of reporting them as network failures.\n if (!request) {\n return error;\n }\n\n return new ApiError(\n `Network error: ${error instanceof Error ? error.message : \"Unknown network error\"}`,\n 0,\n null,\n );\n }\n\n // Generated clients surface malformed JSON bodies as SyntaxError. Map an\n // otherwise successful response to the shared strict parse contract.\n if (response.ok && error instanceof SyntaxError) {\n return new ApiError(\n \"Failed to parse response as JSON\",\n response.status,\n null,\n getRequestId(response, null),\n );\n }\n\n options.onResponseError?.(response);\n\n const method = request?.method ?? requestOptions.method ?? \"GET\";\n const errorRecord = toApiErrorBody(error);\n const requestId = getRequestId(response, errorRecord);\n\n if (errorRecord) {\n // `data` is the unwrapped field-error bag, `body` the whole envelope.\n // Both derive from one shared rule — see docs/api-error-data-contract.md.\n return new ApiError(\n getErrorMessage(errorRecord, `${method} request failed`),\n response.status,\n toApiErrorData(errorRecord),\n requestId,\n errorRecord,\n );\n }\n\n const isJson = response.headers\n .get(\"content-type\")\n ?.includes(\"application/json\");\n const text = getNonEmptyString(error);\n\n return new ApiError(\n isJson && text\n ? text.slice(0, 200)\n : `${method} request failed with status ${response.status}`,\n response.status,\n // A parsed JSON string is a legal `ApiErrorData` member, so it is kept\n // rather than dropped — the shared fetch client already preserves it, and\n // discarding it here made the two producers disagree.\n isJson ? (error as ApiErrorData) : null,\n requestId,\n // Unreachable as an envelope: this branch runs only when the payload is\n // not a plain object, which is exactly what `toApiErrorBody` rejects.\n null,\n );\n };\n}\n","// This file is auto-generated by @hey-api/openapi-ts\n\nimport type {\n ArrayStyle,\n ObjectStyle,\n SerializerOptions,\n} from \"./pathSerializer.gen\";\n\nexport type QuerySerializer = (query: Record<string, unknown>) => string;\n\nexport type BodySerializer = (body: unknown) => unknown;\n\ntype QuerySerializerOptionsObject = {\n allowReserved?: boolean;\n array?: Partial<SerializerOptions<ArrayStyle>>;\n object?: Partial<SerializerOptions<ObjectStyle>>;\n};\n\nexport type QuerySerializerOptions = QuerySerializerOptionsObject & {\n /**\n * Per-parameter serialization overrides. When provided, these settings\n * override the global array/object settings for specific parameter names.\n */\n parameters?: Record<string, QuerySerializerOptionsObject>;\n};\n\nconst serializeFormDataPair = (\n data: FormData,\n key: string,\n value: unknown,\n): void => {\n if (typeof value === \"string\" || value instanceof Blob) {\n data.append(key, value);\n } else if (value instanceof Date) {\n data.append(key, value.toISOString());\n } else {\n data.append(key, JSON.stringify(value));\n }\n};\n\nconst serializeUrlSearchParamsPair = (\n data: URLSearchParams,\n key: string,\n value: unknown,\n): void => {\n if (typeof value === \"string\") {\n data.append(key, value);\n } else {\n data.append(key, JSON.stringify(value));\n }\n};\n\nexport const formDataBodySerializer = {\n bodySerializer: (body: unknown): FormData => {\n const data = new FormData();\n\n Object.entries(body as Record<string, unknown>).forEach(([key, value]) => {\n if (value === undefined || value === null) {\n return;\n }\n if (Array.isArray(value)) {\n value.forEach((v) => serializeFormDataPair(data, key, v));\n } else {\n serializeFormDataPair(data, key, value);\n }\n });\n\n return data;\n },\n};\n\nexport const jsonBodySerializer = {\n bodySerializer: (body: unknown): string =>\n JSON.stringify(body, (_key, value) =>\n typeof value === \"bigint\" ? value.toString() : value,\n ),\n};\n\nexport const urlSearchParamsBodySerializer = {\n bodySerializer: (body: unknown): string => {\n const data = new URLSearchParams();\n\n Object.entries(body as Record<string, unknown>).forEach(([key, value]) => {\n if (value === undefined || value === null) {\n return;\n }\n if (Array.isArray(value)) {\n value.forEach((v) => serializeUrlSearchParamsPair(data, key, v));\n } else {\n serializeUrlSearchParamsPair(data, key, value);\n }\n });\n\n return data.toString();\n },\n};\n","// This file is auto-generated by @hey-api/openapi-ts\n\ntype Slot = \"body\" | \"headers\" | \"path\" | \"query\";\n\nexport type Field =\n | {\n in: Exclude<Slot, \"body\">;\n /**\n * Field name. This is the name we want the user to see and use.\n */\n key: string;\n /**\n * Field mapped name. This is the name we want to use in the request.\n * If omitted, we use the same value as `key`.\n */\n map?: string;\n }\n | {\n in: Extract<Slot, \"body\">;\n /**\n * Key isn't required for bodies.\n */\n key?: string;\n map?: string;\n }\n | {\n /**\n * Field name. This is the name we want the user to see and use.\n */\n key: string;\n /**\n * Field mapped name. This is the name we want to use in the request.\n * If `in` is omitted, `map` aliases `key` to the transport layer.\n */\n map: Slot;\n };\n\nexport interface Fields {\n allowExtra?: Partial<Record<Slot, boolean>>;\n args?: ReadonlyArray<Field>;\n}\n\nexport type FieldsConfig = ReadonlyArray<Field | Fields>;\n\nconst extraPrefixesMap: Record<string, Slot> = {\n $body_: \"body\",\n $headers_: \"headers\",\n $path_: \"path\",\n $query_: \"query\",\n};\nconst extraPrefixes = Object.entries(extraPrefixesMap);\n\ntype KeyMap = Map<\n string,\n | {\n in: Slot;\n map?: string;\n }\n | {\n in?: never;\n map: Slot;\n }\n>;\n\nfunction buildKeyMap(fields: FieldsConfig, map?: KeyMap): KeyMap {\n if (!map) {\n map = new Map();\n }\n\n for (const config of fields) {\n if (\"in\" in config) {\n if (config.key) {\n map.set(config.key, {\n in: config.in,\n map: config.map,\n });\n }\n } else if (\"key\" in config) {\n map.set(config.key, {\n map: config.map,\n });\n } else if (config.args) {\n buildKeyMap(config.args, map);\n }\n }\n\n return map;\n}\n\ninterface Params {\n body?: unknown;\n headers: Record<string, unknown>;\n path: Record<string, unknown>;\n query: Record<string, unknown>;\n}\n\nfunction stripEmptySlots(params: Params): void {\n for (const [slot, value] of Object.entries(params)) {\n if (slot === \"body\") continue;\n if (\n value &&\n typeof value === \"object\" &&\n !Array.isArray(value) &&\n !Object.keys(value).length\n ) {\n delete params[slot as Slot];\n }\n }\n}\n\nexport function buildClientParams(\n args: ReadonlyArray<unknown>,\n fields: FieldsConfig,\n): Params {\n const params: Params = {\n headers: Object.create(null),\n path: Object.create(null),\n query: Object.create(null),\n };\n\n const map = buildKeyMap(fields);\n\n function writeSlot(slot: Slot, key: string, value: unknown): void {\n let record = params[slot] as Record<string, unknown> | undefined;\n if (record === undefined) {\n record = Object.create(null) as Record<string, unknown>;\n params[slot] = record;\n }\n record[key] = value;\n }\n\n let config: FieldsConfig[number] | undefined;\n\n for (const [index, arg] of args.entries()) {\n if (fields[index]) {\n config = fields[index];\n }\n\n if (!config) {\n continue;\n }\n\n if (\"in\" in config) {\n if (config.key) {\n const field = map.get(config.key)!;\n const name = field.map || config.key;\n if (field.in) {\n writeSlot(field.in, name, arg);\n }\n } else {\n params.body = arg;\n }\n } else {\n for (const [key, value] of Object.entries(arg ?? {})) {\n const field = map.get(key);\n\n if (field) {\n if (field.in) {\n const name = field.map || key;\n writeSlot(field.in, name, value);\n } else {\n params[field.map] = value;\n }\n } else {\n const extra = extraPrefixes.find(([prefix]) =>\n key.startsWith(prefix),\n );\n\n if (extra) {\n const [prefix, slot] = extra;\n writeSlot(slot, key.slice(prefix.length), value);\n } else if (\"allowExtra\" in config && config.allowExtra) {\n for (const [slot, allowed] of Object.entries(config.allowExtra)) {\n if (allowed) {\n writeSlot(slot as Slot, key, value);\n break;\n }\n }\n }\n }\n }\n }\n }\n\n stripEmptySlots(params);\n\n return params;\n}\n","// This file is auto-generated by @hey-api/openapi-ts\n\nimport type { Config } from \"./types.gen\";\n\nexport type ServerSentEventsOptions<TData = unknown> = Omit<\n RequestInit,\n \"method\"\n> &\n Pick<Config, \"method\" | \"responseTransformer\" | \"responseValidator\"> & {\n /**\n * Fetch API implementation. You can use this option to provide a custom\n * fetch instance.\n *\n * @default globalThis.fetch\n */\n fetch?: typeof fetch;\n /**\n * Implementing clients can call request interceptors inside this hook.\n */\n onRequest?: (url: string, init: RequestInit) => Promise<Request>;\n /**\n * Callback invoked when a network or parsing error occurs during streaming.\n *\n * This option applies only if the endpoint returns a stream of events.\n *\n * @param error The error that occurred.\n */\n onSseError?: (error: unknown) => void;\n /**\n * Callback invoked when an event is streamed from the server.\n *\n * This option applies only if the endpoint returns a stream of events.\n *\n * @param event Event streamed from the server.\n * @returns Nothing (void).\n */\n onSseEvent?: (event: StreamEvent<TData>) => void;\n serializedBody?: RequestInit[\"body\"];\n /**\n * Default retry delay in milliseconds.\n *\n * This option applies only if the endpoint returns a stream of events.\n *\n * @default 3000\n */\n sseDefaultRetryDelay?: number;\n /**\n * Maximum number of retry attempts before giving up.\n */\n sseMaxRetryAttempts?: number;\n /**\n * Maximum retry delay in milliseconds.\n *\n * Applies only when exponential backoff is used.\n *\n * This option applies only if the endpoint returns a stream of events.\n *\n * @default 30000\n */\n sseMaxRetryDelay?: number;\n /**\n * Optional sleep function for retry backoff.\n *\n * Defaults to using `setTimeout`.\n */\n sseSleepFn?: (ms: number) => Promise<void>;\n url: string;\n };\n\nexport interface StreamEvent<TData = unknown> {\n data: TData;\n event?: string;\n id?: string;\n retry?: number;\n}\n\nexport type ServerSentEventsResult<\n TData = unknown,\n TReturn = void,\n TNext = unknown,\n> = {\n stream: AsyncGenerator<\n TData extends Record<string, unknown> ? TData[keyof TData] : TData,\n TReturn,\n TNext\n >;\n};\n\nexport function createSseClient<TData = unknown>({\n onRequest,\n onSseError,\n onSseEvent,\n responseTransformer,\n responseValidator,\n sseDefaultRetryDelay,\n sseMaxRetryAttempts,\n sseMaxRetryDelay,\n sseSleepFn,\n url,\n ...options\n}: ServerSentEventsOptions): ServerSentEventsResult<TData> {\n let lastEventId: string | undefined;\n\n const sleep =\n sseSleepFn ??\n ((ms: number) => new Promise((resolve) => setTimeout(resolve, ms)));\n\n const createStream = async function* () {\n let retryDelay: number = sseDefaultRetryDelay ?? 3000;\n let attempt = 0;\n const signal = options.signal ?? new AbortController().signal;\n\n while (true) {\n if (signal.aborted) break;\n\n attempt++;\n\n const headers =\n options.headers instanceof Headers\n ? options.headers\n : new Headers(options.headers as Record<string, string> | undefined);\n\n if (lastEventId !== undefined) {\n headers.set(\"Last-Event-ID\", lastEventId);\n }\n\n try {\n const requestInit: RequestInit = {\n redirect: \"follow\",\n ...options,\n body: options.serializedBody,\n headers,\n signal,\n };\n let request = new Request(url, requestInit);\n if (onRequest) {\n request = await onRequest(url, requestInit);\n }\n // fetch must be assigned here, otherwise it would throw the error:\n // TypeError: Failed to execute 'fetch' on 'Window': Illegal invocation\n const _fetch = options.fetch ?? globalThis.fetch;\n const response = await _fetch(request);\n\n if (!response.ok)\n throw new Error(\n `SSE failed: ${response.status} ${response.statusText}`,\n );\n\n if (!response.body) throw new Error(\"No body in SSE response\");\n\n const reader = response.body\n .pipeThrough(new TextDecoderStream())\n .getReader();\n\n let buffer = \"\";\n\n const abortHandler = () => {\n try {\n reader.cancel();\n } catch {\n // noop\n }\n };\n\n signal.addEventListener(\"abort\", abortHandler);\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n buffer += value;\n buffer = buffer.replace(/\\r\\n?/g, \"\\n\"); // normalize line endings\n\n const chunks = buffer.split(\"\\n\\n\");\n buffer = chunks.pop() ?? \"\";\n\n for (const chunk of chunks) {\n const lines = chunk.split(\"\\n\");\n const dataLines: Array<string> = [];\n let eventName: string | undefined;\n\n for (const line of lines) {\n if (line.startsWith(\"data:\")) {\n dataLines.push(line.replace(/^data:\\s*/, \"\"));\n } else if (line.startsWith(\"event:\")) {\n eventName = line.replace(/^event:\\s*/, \"\");\n } else if (line.startsWith(\"id:\")) {\n lastEventId = line.replace(/^id:\\s*/, \"\");\n } else if (line.startsWith(\"retry:\")) {\n const parsed = Number.parseInt(\n line.replace(/^retry:\\s*/, \"\"),\n 10,\n );\n if (!Number.isNaN(parsed)) {\n retryDelay = parsed;\n }\n }\n }\n\n let data: unknown;\n let parsedJson = false;\n\n if (dataLines.length) {\n const rawData = dataLines.join(\"\\n\");\n try {\n data = JSON.parse(rawData);\n parsedJson = true;\n } catch {\n data = rawData;\n }\n }\n\n if (parsedJson) {\n if (responseValidator) {\n await responseValidator(data);\n }\n\n if (responseTransformer) {\n data = await responseTransformer(data);\n }\n }\n\n onSseEvent?.({\n data,\n event: eventName,\n id: lastEventId,\n retry: retryDelay,\n });\n\n if (dataLines.length) {\n yield data as any;\n }\n }\n }\n } finally {\n signal.removeEventListener(\"abort\", abortHandler);\n reader.releaseLock();\n }\n\n break; // exit loop on normal completion\n } catch (error) {\n // connection failed or aborted; retry after delay\n onSseError?.(error);\n\n if (\n sseMaxRetryAttempts !== undefined &&\n attempt >= sseMaxRetryAttempts\n ) {\n break; // stop after firing error\n }\n\n // exponential backoff: double retry each attempt, cap at 30s\n const backoff = Math.min(\n retryDelay * 2 ** (attempt - 1),\n sseMaxRetryDelay ?? 30000,\n );\n await sleep(backoff);\n }\n }\n };\n\n const stream = createStream();\n\n return { stream };\n}\n","// This file is auto-generated by @hey-api/openapi-ts\n\ninterface SerializeOptions<T>\n extends SerializePrimitiveOptions, SerializerOptions<T> {}\n\ninterface SerializePrimitiveOptions {\n allowReserved?: boolean;\n name: string;\n}\n\nexport interface SerializerOptions<T> {\n /**\n * @default true\n */\n explode: boolean;\n style: T;\n}\n\nexport type ArrayStyle = \"form\" | \"spaceDelimited\" | \"pipeDelimited\";\nexport type ArraySeparatorStyle = ArrayStyle | MatrixStyle;\ntype MatrixStyle = \"label\" | \"matrix\" | \"simple\";\nexport type ObjectStyle = \"form\" | \"deepObject\";\ntype ObjectSeparatorStyle = ObjectStyle | MatrixStyle;\n\ninterface SerializePrimitiveParam extends SerializePrimitiveOptions {\n value: string;\n}\n\nexport const separatorArrayExplode = (\n style: ArraySeparatorStyle,\n): \".\" | \";\" | \",\" | \"&\" => {\n switch (style) {\n case \"label\":\n return \".\";\n case \"matrix\":\n return \";\";\n case \"simple\":\n return \",\";\n default:\n return \"&\";\n }\n};\n\nexport const separatorArrayNoExplode = (\n style: ArraySeparatorStyle,\n): \",\" | \"|\" | \"%20\" => {\n switch (style) {\n case \"form\":\n return \",\";\n case \"pipeDelimited\":\n return \"|\";\n case \"spaceDelimited\":\n return \"%20\";\n default:\n return \",\";\n }\n};\n\nexport const separatorObjectExplode = (\n style: ObjectSeparatorStyle,\n): \".\" | \";\" | \",\" | \"&\" => {\n switch (style) {\n case \"label\":\n return \".\";\n case \"matrix\":\n return \";\";\n case \"simple\":\n return \",\";\n default:\n return \"&\";\n }\n};\n\nexport const serializeArrayParam = ({\n allowReserved,\n explode,\n name,\n style,\n value,\n}: SerializeOptions<ArraySeparatorStyle> & {\n value: unknown[];\n}): string => {\n if (!explode) {\n const joinedValues = (\n allowReserved ? value : value.map((v) => encodeURIComponent(v as string))\n ).join(separatorArrayNoExplode(style));\n switch (style) {\n case \"label\":\n return `.${joinedValues}`;\n case \"matrix\":\n return `;${name}=${joinedValues}`;\n case \"simple\":\n return joinedValues;\n default:\n return `${name}=${joinedValues}`;\n }\n }\n\n const separator = separatorArrayExplode(style);\n const joinedValues = value\n .map((v) => {\n if (style === \"label\" || style === \"simple\") {\n return allowReserved ? v : encodeURIComponent(v as string);\n }\n\n return serializePrimitiveParam({\n allowReserved,\n name,\n value: v as string,\n });\n })\n .join(separator);\n return style === \"label\" || style === \"matrix\"\n ? separator + joinedValues\n : joinedValues;\n};\n\nexport const serializePrimitiveParam = ({\n allowReserved,\n name,\n value,\n}: SerializePrimitiveParam): string => {\n if (value === undefined || value === null) {\n return \"\";\n }\n\n if (typeof value === \"object\") {\n throw new Error(\n \"Deeply-nested arrays/objects aren’t supported. Provide your own `querySerializer()` to handle these.\",\n );\n }\n\n return `${name}=${allowReserved ? value : encodeURIComponent(value)}`;\n};\n\nexport const serializeObjectParam = ({\n allowReserved,\n explode,\n name,\n style,\n value,\n valueOnly,\n}: SerializeOptions<ObjectSeparatorStyle> & {\n value: Record<string, unknown> | Date;\n valueOnly?: boolean;\n}): string => {\n if (value instanceof Date) {\n return valueOnly ? value.toISOString() : `${name}=${value.toISOString()}`;\n }\n\n if (style !== \"deepObject\" && !explode) {\n let values: string[] = [];\n Object.entries(value).forEach(([key, v]) => {\n values = [\n ...values,\n key,\n allowReserved ? (v as string) : encodeURIComponent(v as string),\n ];\n });\n const joinedValues = values.join(\",\");\n switch (style) {\n case \"form\":\n return `${name}=${joinedValues}`;\n case \"label\":\n return `.${joinedValues}`;\n case \"matrix\":\n return `;${name}=${joinedValues}`;\n default:\n return joinedValues;\n }\n }\n\n const separator = separatorObjectExplode(style);\n const joinedValues = Object.entries(value)\n .map(([key, v]) =>\n serializePrimitiveParam({\n allowReserved,\n name: style === \"deepObject\" ? `${name}[${key}]` : key,\n value: v as string,\n }),\n )\n .join(separator);\n return style === \"label\" || style === \"matrix\"\n ? separator + joinedValues\n : joinedValues;\n};\n","// This file is auto-generated by @hey-api/openapi-ts\n\nimport type { BodySerializer, QuerySerializer } from \"./bodySerializer.gen\";\nimport {\n type ArraySeparatorStyle,\n serializeArrayParam,\n serializeObjectParam,\n serializePrimitiveParam,\n} from \"./pathSerializer.gen\";\n\nexport interface PathSerializer {\n path: Record<string, unknown>;\n url: string;\n}\n\nexport const PATH_PARAM_RE: RegExp = /\\{[^{}]+\\}/g;\n\nexport const defaultPathSerializer = ({\n path,\n url: _url,\n}: PathSerializer): string => {\n let url = _url;\n const matches = _url.match(PATH_PARAM_RE);\n if (matches) {\n for (const match of matches) {\n let explode = false;\n let name = match.substring(1, match.length - 1);\n let style: ArraySeparatorStyle = \"simple\";\n\n if (name.endsWith(\"*\")) {\n explode = true;\n name = name.substring(0, name.length - 1);\n }\n\n if (name.startsWith(\".\")) {\n name = name.substring(1);\n style = \"label\";\n } else if (name.startsWith(\";\")) {\n name = name.substring(1);\n style = \"matrix\";\n }\n\n const value = path[name];\n\n if (value === undefined || value === null) {\n continue;\n }\n\n if (Array.isArray(value)) {\n url = url.replace(\n match,\n serializeArrayParam({ explode, name, style, value }),\n );\n continue;\n }\n\n if (typeof value === \"object\") {\n url = url.replace(\n match,\n serializeObjectParam({\n explode,\n name,\n style,\n value: value as Record<string, unknown>,\n valueOnly: true,\n }),\n );\n continue;\n }\n\n if (style === \"matrix\") {\n url = url.replace(\n match,\n `;${serializePrimitiveParam({\n name,\n value: value as string,\n })}`,\n );\n continue;\n }\n\n const replaceValue = encodeURIComponent(\n style === \"label\" ? `.${value as string}` : (value as string),\n );\n url = url.replace(match, replaceValue);\n }\n }\n return url;\n};\n\nexport const getUrl = ({\n baseUrl,\n path,\n query,\n querySerializer,\n url: _url,\n}: {\n baseUrl?: string;\n path?: Record<string, unknown>;\n query?: Record<string, unknown>;\n querySerializer: QuerySerializer;\n url: string;\n}): string => {\n const pathUrl = _url.startsWith(\"/\") ? _url : `/${_url}`;\n let url = (baseUrl ?? \"\") + pathUrl;\n if (path) {\n url = defaultPathSerializer({ path, url });\n }\n let search = query ? querySerializer(query) : \"\";\n if (search.startsWith(\"?\")) {\n search = search.substring(1);\n }\n if (search) {\n url += `?${search}`;\n }\n return url;\n};\n\nexport function getValidRequestBody(options: {\n body?: unknown;\n bodySerializer?: BodySerializer | null;\n serializedBody?: unknown;\n}): unknown {\n const hasBody = options.body !== undefined;\n const isSerializedBody = hasBody && options.bodySerializer;\n\n if (isSerializedBody) {\n if (\"serializedBody\" in options) {\n const hasSerializedBody =\n options.serializedBody !== undefined && options.serializedBody !== \"\";\n\n return hasSerializedBody ? options.serializedBody : null;\n }\n\n // not all clients implement a serializedBody property (i.e., client-axios)\n return options.body !== \"\" ? options.body : null;\n }\n\n // plain/text body\n if (hasBody) {\n return options.body;\n }\n\n // no body was provided\n return undefined;\n}\n","// This file is auto-generated by @hey-api/openapi-ts\n\nexport type AuthToken = string | undefined;\n\nexport interface Auth {\n /**\n * Which part of the request do we use to send the auth?\n *\n * @default 'header'\n */\n in?: \"header\" | \"query\" | \"cookie\";\n /**\n * A unique identifier for the security scheme.\n *\n * Defined only when there are multiple security schemes whose `Auth`\n * shape would otherwise be identical.\n */\n key?: string;\n /**\n * Header or query parameter name.\n *\n * @default 'Authorization'\n */\n name?: string;\n scheme?: \"basic\" | \"bearer\";\n type: \"apiKey\" | \"http\";\n}\n\nexport const getAuthToken = async (\n auth: Auth,\n callback: ((auth: Auth) => Promise<AuthToken> | AuthToken) | AuthToken,\n): Promise<string | undefined> => {\n const token =\n typeof callback === \"function\" ? await callback(auth) : callback;\n\n if (!token) {\n return;\n }\n\n if (auth.scheme === \"bearer\") {\n return `Bearer ${token}`;\n }\n\n if (auth.scheme === \"basic\") {\n return `Basic ${btoa(token)}`;\n }\n\n return token;\n};\n","// This file is auto-generated by @hey-api/openapi-ts\n\nimport { getAuthToken } from \"../core/auth.gen\";\nimport type { QuerySerializerOptions } from \"../core/bodySerializer.gen\";\nimport { jsonBodySerializer } from \"../core/bodySerializer.gen\";\nimport {\n serializeArrayParam,\n serializeObjectParam,\n serializePrimitiveParam,\n} from \"../core/pathSerializer.gen\";\nimport { getUrl } from \"../core/utils.gen\";\nimport type {\n Client,\n ClientOptions,\n Config,\n RequestOptions,\n} from \"./types.gen\";\n\nexport const createQuerySerializer = <T = unknown>({\n parameters = {},\n ...args\n}: QuerySerializerOptions = {}): ((queryParams: T) => string) => {\n const querySerializer = (queryParams: T): string => {\n const search: string[] = [];\n if (queryParams && typeof queryParams === \"object\") {\n for (const name in queryParams) {\n const value = queryParams[name];\n\n if (value === undefined || value === null) {\n continue;\n }\n\n const options = parameters[name] || args;\n\n if (Array.isArray(value)) {\n const serializedArray = serializeArrayParam({\n allowReserved: options.allowReserved,\n explode: true,\n name,\n style: \"form\",\n value,\n ...options.array,\n });\n if (serializedArray) search.push(serializedArray);\n } else if (typeof value === \"object\") {\n const serializedObject = serializeObjectParam({\n allowReserved: options.allowReserved,\n explode: true,\n name,\n style: \"deepObject\",\n value: value as Record<string, unknown>,\n ...options.object,\n });\n if (serializedObject) search.push(serializedObject);\n } else {\n const serializedPrimitive = serializePrimitiveParam({\n allowReserved: options.allowReserved,\n name,\n value: value as string,\n });\n if (serializedPrimitive) search.push(serializedPrimitive);\n }\n }\n }\n return search.join(\"&\");\n };\n return querySerializer;\n};\n\n/**\n * Infers parseAs value from provided Content-Type header.\n */\nexport const getParseAs = (\n contentType: string | null,\n): Exclude<Config[\"parseAs\"], \"auto\"> => {\n if (!contentType) {\n // If no Content-Type header is provided, the best we can do is return the raw response body,\n // which is effectively the same as the 'stream' option.\n return \"stream\";\n }\n\n const cleanContent = contentType.split(\";\")[0]?.trim();\n\n if (!cleanContent) {\n return;\n }\n\n if (\n cleanContent.startsWith(\"application/json\") ||\n cleanContent.endsWith(\"+json\")\n ) {\n return \"json\";\n }\n\n if (cleanContent === \"multipart/form-data\") {\n return \"formData\";\n }\n\n if (\n [\"application/\", \"audio/\", \"image/\", \"video/\"].some((type) =>\n cleanContent.startsWith(type),\n )\n ) {\n return \"blob\";\n }\n\n if (cleanContent.startsWith(\"text/\")) {\n return \"text\";\n }\n\n return;\n};\n\nconst checkForExistence = (\n options: Pick<RequestOptions, \"auth\" | \"query\"> & {\n headers: Headers;\n },\n name?: string,\n): boolean => {\n if (!name) {\n return false;\n }\n if (\n options.headers.has(name) ||\n options.query?.[name] ||\n options.headers.get(\"Cookie\")?.includes(`${name}=`)\n ) {\n return true;\n }\n return false;\n};\n\nexport async function setAuthParams(\n options: Pick<RequestOptions, \"auth\" | \"query\" | \"security\"> & {\n headers: Headers;\n },\n): Promise<void> {\n for (const auth of options.security ?? []) {\n if (checkForExistence(options, auth.name)) {\n continue;\n }\n\n const token = await getAuthToken(auth, options.auth);\n\n if (!token) {\n continue;\n }\n\n const name = auth.name ?? \"Authorization\";\n\n switch (auth.in) {\n case \"query\":\n if (!options.query) {\n options.query = {};\n }\n options.query[name] = token;\n break;\n case \"cookie\":\n options.headers.append(\"Cookie\", `${name}=${token}`);\n break;\n case \"header\":\n default:\n options.headers.set(name, token);\n break;\n }\n }\n}\n\nexport const buildUrl: Client[\"buildUrl\"] = (options) =>\n getUrl({\n baseUrl: options.baseUrl as string,\n path: options.path,\n query: options.query,\n querySerializer:\n typeof options.querySerializer === \"function\"\n ? options.querySerializer\n : createQuerySerializer(options.querySerializer),\n url: options.url,\n });\n\nexport const mergeConfigs = (a: Config, b: Config): Config => {\n const config = { ...a, ...b };\n if (config.baseUrl?.endsWith(\"/\")) {\n config.baseUrl = config.baseUrl.substring(0, config.baseUrl.length - 1);\n }\n config.headers = mergeHeaders(a.headers, b.headers);\n return config;\n};\n\nconst headersEntries = (headers: Headers): Array<[string, string]> => {\n const entries: Array<[string, string]> = [];\n headers.forEach((value, key) => {\n entries.push([key, value]);\n });\n return entries;\n};\n\nexport const mergeHeaders = (\n ...headers: Array<Required<Config>[\"headers\"] | undefined>\n): Headers => {\n const mergedHeaders = new Headers();\n for (const header of headers) {\n if (!header) {\n continue;\n }\n\n const iterator =\n header instanceof Headers\n ? headersEntries(header)\n : Object.entries(header);\n\n for (const [key, value] of iterator) {\n if (value === null) {\n mergedHeaders.delete(key);\n } else if (Array.isArray(value)) {\n for (const v of value) {\n mergedHeaders.append(key, v as string);\n }\n } else if (value !== undefined) {\n // assume object headers are meant to be JSON stringified, i.e., their\n // content value in OpenAPI specification is 'application/json'\n mergedHeaders.set(\n key,\n typeof value === \"object\" ? JSON.stringify(value) : (value as string),\n );\n }\n }\n }\n return mergedHeaders;\n};\n\ntype ErrInterceptor<Err, Res, Req, Options> = (\n error: Err,\n /** response may be undefined due to a network error where no response object is produced */\n response: Res | undefined,\n /** request may be undefined, because error may be from building the request object itself */\n request: Req | undefined,\n options: Options,\n) => Err | Promise<Err>;\n\ntype ReqInterceptor<Req, Options> = (\n request: Req,\n options: Options,\n) => Req | Promise<Req>;\n\ntype ResInterceptor<Res, Req, Options> = (\n response: Res,\n request: Req,\n options: Options,\n) => Res | Promise<Res>;\n\nclass Interceptors<Interceptor> {\n fns: Array<Interceptor | null> = [];\n\n clear(): void {\n this.fns = [];\n }\n\n eject(id: number | Interceptor): void {\n const index = this.getInterceptorIndex(id);\n if (this.fns[index]) {\n this.fns[index] = null;\n }\n }\n\n exists(id: number | Interceptor): boolean {\n const index = this.getInterceptorIndex(id);\n return Boolean(this.fns[index]);\n }\n\n getInterceptorIndex(id: number | Interceptor): number {\n if (typeof id === \"number\") {\n return this.fns[id] ? id : -1;\n }\n return this.fns.indexOf(id);\n }\n\n update(\n id: number | Interceptor,\n fn: Interceptor,\n ): number | Interceptor | false {\n const index = this.getInterceptorIndex(id);\n if (this.fns[index]) {\n this.fns[index] = fn;\n return id;\n }\n return false;\n }\n\n use(fn: Interceptor): number {\n this.fns.push(fn);\n return this.fns.length - 1;\n }\n}\n\nexport interface Middleware<Req, Res, Err, Options> {\n error: Interceptors<ErrInterceptor<Err, Res, Req, Options>>;\n request: Interceptors<ReqInterceptor<Req, Options>>;\n response: Interceptors<ResInterceptor<Res, Req, Options>>;\n}\n\nexport const createInterceptors = <Req, Res, Err, Options>(): Middleware<\n Req,\n Res,\n Err,\n Options\n> => ({\n error: new Interceptors<ErrInterceptor<Err, Res, Req, Options>>(),\n request: new Interceptors<ReqInterceptor<Req, Options>>(),\n response: new Interceptors<ResInterceptor<Res, Req, Options>>(),\n});\n\nconst defaultQuerySerializer = createQuerySerializer({\n allowReserved: false,\n array: {\n explode: true,\n style: \"form\",\n },\n object: {\n explode: true,\n style: \"deepObject\",\n },\n});\n\nconst defaultHeaders = {\n \"Content-Type\": \"application/json\",\n};\n\nexport const createConfig = <T extends ClientOptions = ClientOptions>(\n override: Config<Omit<ClientOptions, keyof T> & T> = {},\n): Config<Omit<ClientOptions, keyof T> & T> => ({\n ...jsonBodySerializer,\n headers: defaultHeaders,\n parseAs: \"auto\",\n querySerializer: defaultQuerySerializer,\n ...override,\n});\n","// This file is auto-generated by @hey-api/openapi-ts\n\nimport { createSseClient } from \"../core/serverSentEvents.gen\";\nimport type { HttpMethod } from \"../core/types.gen\";\nimport { getValidRequestBody } from \"../core/utils.gen\";\nimport type {\n Client,\n Config,\n RequestOptions,\n ResolvedRequestOptions,\n} from \"./types.gen\";\nimport {\n buildUrl,\n createConfig,\n createInterceptors,\n getParseAs,\n mergeConfigs,\n mergeHeaders,\n setAuthParams,\n} from \"./utils.gen\";\n\ntype ReqInit = Omit<RequestInit, \"body\" | \"headers\"> & {\n body?: any;\n headers: ReturnType<typeof mergeHeaders>;\n};\n\nexport const createClient = (config: Config = {}): Client => {\n let _config = mergeConfigs(createConfig(), config);\n\n const getConfig = (): Config => ({ ..._config });\n\n const setConfig = (config: Config): Config => {\n _config = mergeConfigs(_config, config);\n return getConfig();\n };\n\n const interceptors = createInterceptors<\n Request,\n Response,\n unknown,\n ResolvedRequestOptions\n >();\n\n const beforeRequest = async <\n TData = unknown,\n TResponseStyle extends \"data\" | \"fields\" = \"fields\",\n ThrowOnError extends boolean = boolean,\n Url extends string = string,\n >(\n options: RequestOptions<TData, TResponseStyle, ThrowOnError, Url>,\n ) => {\n const opts = {\n ..._config,\n ...options,\n fetch: options.fetch ?? _config.fetch ?? globalThis.fetch,\n headers: mergeHeaders(_config.headers, options.headers),\n serializedBody: undefined as string | undefined,\n };\n\n if (opts.security) {\n await setAuthParams(opts);\n }\n\n if (opts.requestValidator) {\n await opts.requestValidator(opts);\n }\n\n if (opts.body !== undefined && opts.bodySerializer) {\n opts.serializedBody = opts.bodySerializer(opts.body) as\n | string\n | undefined;\n }\n\n // remove Content-Type header if body is empty to avoid sending invalid requests\n if (opts.body === undefined || opts.serializedBody === \"\") {\n opts.headers.delete(\"Content-Type\");\n }\n\n const resolvedOpts = opts as typeof opts &\n ResolvedRequestOptions<TResponseStyle, ThrowOnError, Url>;\n const url = buildUrl(resolvedOpts);\n\n return { opts: resolvedOpts, url };\n };\n\n const request: Client[\"request\"] = async (options) => {\n const throwOnError = options.throwOnError ?? _config.throwOnError;\n const responseStyle = options.responseStyle ?? _config.responseStyle;\n\n let request: Request | undefined;\n let response: Response | undefined;\n\n try {\n const { opts, url } = await beforeRequest(options);\n const requestInit: ReqInit = {\n redirect: \"follow\",\n ...opts,\n body: getValidRequestBody(opts),\n };\n\n request = new Request(url, requestInit);\n\n for (const fn of interceptors.request.fns) {\n if (fn) {\n request = await fn(request, opts);\n }\n }\n\n // fetch must be assigned here, otherwise it would throw the error:\n // TypeError: Failed to execute 'fetch' on 'Window': Illegal invocation\n const _fetch = opts.fetch!;\n\n response = await _fetch(request);\n\n for (const fn of interceptors.response.fns) {\n if (fn) {\n response = await fn(response, request, opts);\n }\n }\n\n const result = {\n request,\n response,\n };\n\n if (response.ok) {\n const parseAs =\n (opts.parseAs === \"auto\"\n ? getParseAs(response.headers.get(\"Content-Type\"))\n : opts.parseAs) ?? \"json\";\n\n if (\n response.status === 204 ||\n response.headers.get(\"Content-Length\") === \"0\"\n ) {\n let emptyData: any;\n switch (parseAs) {\n case \"arrayBuffer\":\n case \"blob\":\n case \"text\":\n emptyData = await response[parseAs]();\n break;\n case \"formData\":\n emptyData = new FormData();\n break;\n case \"stream\":\n emptyData = response.body;\n break;\n case \"json\":\n default:\n emptyData = {};\n break;\n }\n return opts.responseStyle === \"data\"\n ? emptyData\n : {\n data: emptyData,\n ...result,\n };\n }\n\n let data: any;\n switch (parseAs) {\n case \"arrayBuffer\":\n case \"blob\":\n case \"formData\":\n case \"text\":\n data = await response[parseAs]();\n break;\n case \"json\": {\n // Some servers return 200 with no Content-Length and empty body.\n // response.json() would throw; read as text and parse if non-empty.\n const text = await response.text();\n data = text ? JSON.parse(text) : {};\n break;\n }\n case \"stream\":\n return opts.responseStyle === \"data\"\n ? response.body\n : {\n data: response.body,\n ...result,\n };\n }\n\n if (parseAs === \"json\") {\n if (opts.responseValidator) {\n await opts.responseValidator(data);\n }\n\n if (opts.responseTransformer) {\n data = await opts.responseTransformer(data);\n }\n }\n\n return opts.responseStyle === \"data\"\n ? data\n : {\n data,\n ...result,\n };\n }\n\n const textError = await response.text();\n let jsonError: unknown;\n\n try {\n jsonError = JSON.parse(textError);\n } catch {\n // noop\n }\n\n throw jsonError ?? textError;\n } catch (error) {\n let finalError = error;\n\n for (const fn of interceptors.error.fns) {\n if (fn) {\n finalError = await fn(\n finalError,\n response,\n request,\n options as ResolvedRequestOptions,\n );\n }\n }\n\n finalError = finalError || {};\n\n if (throwOnError) {\n throw finalError;\n }\n\n // TODO: we probably want to return error and improve types\n return responseStyle === \"data\"\n ? undefined\n : {\n error: finalError,\n request,\n response,\n };\n }\n };\n\n const makeMethodFn =\n (method: Uppercase<HttpMethod>) => (options: RequestOptions) =>\n request({ ...options, method });\n\n const makeSseFn =\n (method: Uppercase<HttpMethod>) => async (options: RequestOptions) => {\n const { opts, url } = await beforeRequest(options);\n return createSseClient({\n ...opts,\n body: opts.body as BodyInit | null | undefined,\n method,\n onRequest: async (url, init) => {\n let request = new Request(url, init);\n for (const fn of interceptors.request.fns) {\n if (fn) {\n request = await fn(request, opts);\n }\n }\n return request;\n },\n serializedBody: getValidRequestBody(opts) as\n | BodyInit\n | null\n | undefined,\n url,\n });\n };\n\n const _buildUrl: Client[\"buildUrl\"] = (options) =>\n buildUrl({ ..._config, ...options });\n\n return {\n buildUrl: _buildUrl,\n connect: makeMethodFn(\"CONNECT\"),\n delete: makeMethodFn(\"DELETE\"),\n get: makeMethodFn(\"GET\"),\n getConfig,\n head: makeMethodFn(\"HEAD\"),\n interceptors,\n options: makeMethodFn(\"OPTIONS\"),\n patch: makeMethodFn(\"PATCH\"),\n post: makeMethodFn(\"POST\"),\n put: makeMethodFn(\"PUT\"),\n request,\n setConfig,\n sse: {\n connect: makeSseFn(\"CONNECT\"),\n delete: makeSseFn(\"DELETE\"),\n get: makeSseFn(\"GET\"),\n head: makeSseFn(\"HEAD\"),\n options: makeSseFn(\"OPTIONS\"),\n patch: makeSseFn(\"PATCH\"),\n post: makeSseFn(\"POST\"),\n put: makeSseFn(\"PUT\"),\n trace: makeSseFn(\"TRACE\"),\n },\n trace: makeMethodFn(\"TRACE\"),\n } as Client;\n};\n","import { createHeyApiErrorInterceptor } from \"@fluid-app/api-client-core\";\nimport { type Client, createClient } from \"@fluid-app/hey-api-fetch-runtime\";\n\nexport type PortalTenantContactsHeyApiClient = Client;\n\nexport interface PortalTenantContactsHeyApiClientConfig {\n baseUrl: string;\n fetch?: typeof fetch;\n credentials?: RequestCredentials;\n defaultHeaders?: Readonly<Record<string, string>>;\n onAuthError?: () => void;\n}\n\nfunction isAbortError(error: unknown): boolean {\n return (\n (error instanceof DOMException && error.name === \"AbortError\") ||\n (error instanceof Error && error.name === \"AbortError\")\n );\n}\n\nexport function createPortalTenantContactsHeyApiClient(\n config: PortalTenantContactsHeyApiClientConfig,\n): PortalTenantContactsHeyApiClient {\n const client = createClient({\n baseUrl: config.baseUrl,\n credentials: config.credentials,\n fetch: config.fetch,\n headers: {\n Accept: \"application/json\",\n ...config.defaultHeaders,\n },\n throwOnError: true,\n });\n\n client.interceptors.error.use(\n createHeyApiErrorInterceptor({\n onResponseError: (response) => {\n if (response.status === 401) {\n config.onAuthError?.();\n }\n },\n shouldPassThroughTransportError: isAbortError,\n }),\n );\n\n return client;\n}\n","// This file is auto-generated by @hey-api/openapi-ts\n\nimport type {\n Client,\n ClientMeta,\n Options as Options2,\n RequestResult,\n TDataShape,\n} from \"@fluid-app/hey-api-fetch-runtime\";\n\nimport type {\n ContactsBulkDestroyData,\n ContactsBulkDestroyErrors,\n ContactsBulkDestroyResponses,\n ContactsCreateData,\n ContactsCreateErrors,\n ContactsCreateResponses,\n ContactsDestroyData,\n ContactsDestroyErrors,\n ContactsDestroyResponses,\n ContactsGroupsCreateData,\n ContactsGroupsCreateErrors,\n ContactsGroupsCreateResponses,\n ContactsGroupsDestroyData,\n ContactsGroupsDestroyErrors,\n ContactsGroupsDestroyResponses,\n ContactsGroupsListData,\n ContactsGroupsListErrors,\n ContactsGroupsListResponses,\n ContactsGroupsUpdateData,\n ContactsGroupsUpdateErrors,\n ContactsGroupsUpdateResponses,\n ContactsListData,\n ContactsListErrors,\n ContactsListResponses,\n ContactsNotesCreateData,\n ContactsNotesCreateErrors,\n ContactsNotesCreateResponses,\n ContactsNotesDestroyData,\n ContactsNotesDestroyErrors,\n ContactsNotesDestroyResponses,\n ContactsNotesListData,\n ContactsNotesListErrors,\n ContactsNotesListResponses,\n ContactsNotesUpdateData,\n ContactsNotesUpdateErrors,\n ContactsNotesUpdateResponses,\n ContactsShowData,\n ContactsShowErrors,\n ContactsShowResponses,\n ContactsTasksCreateData,\n ContactsTasksCreateErrors,\n ContactsTasksCreateResponses,\n ContactsTasksDestroyData,\n ContactsTasksDestroyErrors,\n ContactsTasksDestroyResponses,\n ContactsTasksListData,\n ContactsTasksListErrors,\n ContactsTasksListResponses,\n ContactsTasksUpdateData,\n ContactsTasksUpdateErrors,\n ContactsTasksUpdateResponses,\n ContactsUpdateData,\n ContactsUpdateErrors,\n ContactsUpdateResponses,\n} from \"./types.gen\";\n\nexport type Options<\n TData extends TDataShape = TDataShape,\n ThrowOnError extends boolean = boolean,\n TResponse = unknown,\n> = Options2<TData, ThrowOnError, TResponse> & {\n /**\n * You can provide a client instance returned by `createClient()` instead of\n * individual options. This might be also useful if you want to implement a\n * custom client.\n */\n client: Client;\n /**\n * You can pass arbitrary values through the `meta` object. This can be\n * used to access values that aren't defined as part of the SDK function.\n */\n meta?: keyof ClientMeta extends never ? Record<string, unknown> : ClientMeta;\n};\n\n/**\n * List contacts with cursor pagination\n *\n * Returns a paginated list of contacts belonging to the authenticated member.\n */\nexport const contactsList = <ThrowOnError extends boolean = true>(\n options: Options<ContactsListData, ThrowOnError>,\n): RequestResult<\n ContactsListResponses,\n ContactsListErrors,\n ThrowOnError,\n \"data\"\n> =>\n options.client.get<\n ContactsListResponses,\n ContactsListErrors,\n ThrowOnError,\n \"data\"\n >({\n responseStyle: \"data\",\n security: [\n {\n in: \"cookie\",\n name: \"portal_tenant_user_id\",\n type: \"apiKey\",\n },\n ],\n url: \"/api/contacts\",\n ...options,\n });\n\n/**\n * Create a new contact\n *\n * Creates a new contact for the authenticated member.\n */\nexport const contactsCreate = <ThrowOnError extends boolean = true>(\n options: Options<ContactsCreateData, ThrowOnError>,\n): RequestResult<\n ContactsCreateResponses,\n ContactsCreateErrors,\n ThrowOnError,\n \"data\"\n> =>\n options.client.post<\n ContactsCreateResponses,\n ContactsCreateErrors,\n ThrowOnError,\n \"data\"\n >({\n responseStyle: \"data\",\n security: [\n {\n in: \"cookie\",\n name: \"portal_tenant_user_id\",\n type: \"apiKey\",\n },\n ],\n url: \"/api/contacts\",\n ...options,\n headers: {\n \"Content-Type\": \"application/json\",\n ...options.headers,\n },\n });\n\n/**\n * Delete a contact\n *\n * Soft-deletes a contact by ID.\n */\nexport const contactsDestroy = <ThrowOnError extends boolean = true>(\n options: Options<ContactsDestroyData, ThrowOnError>,\n): RequestResult<\n ContactsDestroyResponses,\n ContactsDestroyErrors,\n ThrowOnError,\n \"data\"\n> =>\n options.client.delete<\n ContactsDestroyResponses,\n ContactsDestroyErrors,\n ThrowOnError,\n \"data\"\n >({\n responseStyle: \"data\",\n security: [\n {\n in: \"cookie\",\n name: \"portal_tenant_user_id\",\n type: \"apiKey\",\n },\n ],\n url: \"/api/contacts/{id}\",\n ...options,\n });\n\n/**\n * Get a specific contact\n *\n * Returns a single contact by ID.\n */\nexport const contactsShow = <ThrowOnError extends boolean = true>(\n options: Options<ContactsShowData, ThrowOnError>,\n): RequestResult<\n ContactsShowResponses,\n ContactsShowErrors,\n ThrowOnError,\n \"data\"\n> =>\n options.client.get<\n ContactsShowResponses,\n ContactsShowErrors,\n ThrowOnError,\n \"data\"\n >({\n responseStyle: \"data\",\n security: [\n {\n in: \"cookie\",\n name: \"portal_tenant_user_id\",\n type: \"apiKey\",\n },\n ],\n url: \"/api/contacts/{id}\",\n ...options,\n });\n\n/**\n * Update a contact\n *\n * Updates an existing contact's attributes.\n */\nexport const contactsUpdate = <ThrowOnError extends boolean = true>(\n options: Options<ContactsUpdateData, ThrowOnError>,\n): RequestResult<\n ContactsUpdateResponses,\n ContactsUpdateErrors,\n ThrowOnError,\n \"data\"\n> =>\n options.client.patch<\n ContactsUpdateResponses,\n ContactsUpdateErrors,\n ThrowOnError,\n \"data\"\n >({\n responseStyle: \"data\",\n security: [\n {\n in: \"cookie\",\n name: \"portal_tenant_user_id\",\n type: \"apiKey\",\n },\n ],\n url: \"/api/contacts/{id}\",\n ...options,\n headers: {\n \"Content-Type\": \"application/json\",\n ...options.headers,\n },\n });\n\n/**\n * Delete multiple contacts\n *\n * Soft-deletes multiple contacts by their IDs.\n */\nexport const contactsBulkDestroy = <ThrowOnError extends boolean = true>(\n options: Options<ContactsBulkDestroyData, ThrowOnError>,\n): RequestResult<\n ContactsBulkDestroyResponses,\n ContactsBulkDestroyErrors,\n ThrowOnError,\n \"data\"\n> =>\n options.client.delete<\n ContactsBulkDestroyResponses,\n ContactsBulkDestroyErrors,\n ThrowOnError,\n \"data\"\n >({\n responseStyle: \"data\",\n security: [\n {\n in: \"cookie\",\n name: \"portal_tenant_user_id\",\n type: \"apiKey\",\n },\n ],\n url: \"/api/contacts/bulk\",\n ...options,\n headers: {\n \"Content-Type\": \"application/json\",\n ...options.headers,\n },\n });\n\n/**\n * List contact groups\n *\n * Returns a paginated list of contact groups belonging to the authenticated member.\n */\nexport const contactsGroupsList = <ThrowOnError extends boolean = true>(\n options: Options<ContactsGroupsListData, ThrowOnError>,\n): RequestResult<\n ContactsGroupsListResponses,\n ContactsGroupsListErrors,\n ThrowOnError,\n \"data\"\n> =>\n options.client.get<\n ContactsGroupsListResponses,\n ContactsGroupsListErrors,\n ThrowOnError,\n \"data\"\n >({\n responseStyle: \"data\",\n security: [\n {\n in: \"cookie\",\n name: \"portal_tenant_user_id\",\n type: \"apiKey\",\n },\n ],\n url: \"/api/contacts/groups\",\n ...options,\n });\n\n/**\n * Create a new group\n *\n * Creates a new contact group for the authenticated member.\n */\nexport const contactsGroupsCreate = <ThrowOnError extends boolean = true>(\n options: Options<ContactsGroupsCreateData, ThrowOnError>,\n): RequestResult<\n ContactsGroupsCreateResponses,\n ContactsGroupsCreateErrors,\n ThrowOnError,\n \"data\"\n> =>\n options.client.post<\n ContactsGroupsCreateResponses,\n ContactsGroupsCreateErrors,\n ThrowOnError,\n \"data\"\n >({\n responseStyle: \"data\",\n security: [\n {\n in: \"cookie\",\n name: \"portal_tenant_user_id\",\n type: \"apiKey\",\n },\n ],\n url: \"/api/contacts/groups\",\n ...options,\n headers: {\n \"Content-Type\": \"application/json\",\n ...options.headers,\n },\n });\n\n/**\n * Delete a group\n *\n * Removes a contact group.\n */\nexport const contactsGroupsDestroy = <ThrowOnError extends boolean = true>(\n options: Options<ContactsGroupsDestroyData, ThrowOnError>,\n): RequestResult<\n ContactsGroupsDestroyResponses,\n ContactsGroupsDestroyErrors,\n ThrowOnError,\n \"data\"\n> =>\n options.client.delete<\n ContactsGroupsDestroyResponses,\n ContactsGroupsDestroyErrors,\n ThrowOnError,\n \"data\"\n >({\n responseStyle: \"data\",\n security: [\n {\n in: \"cookie\",\n name: \"portal_tenant_user_id\",\n type: \"apiKey\",\n },\n ],\n url: \"/api/contacts/groups/{id}\",\n ...options,\n });\n\n/**\n * Update a group\n *\n * Updates an existing contact group.\n */\nexport const contactsGroupsUpdate = <ThrowOnError extends boolean = true>(\n options: Options<ContactsGroupsUpdateData, ThrowOnError>,\n): RequestResult<\n ContactsGroupsUpdateResponses,\n ContactsGroupsUpdateErrors,\n ThrowOnError,\n \"data\"\n> =>\n options.client.patch<\n ContactsGroupsUpdateResponses,\n ContactsGroupsUpdateErrors,\n ThrowOnError,\n \"data\"\n >({\n responseStyle: \"data\",\n security: [\n {\n in: \"cookie\",\n name: \"portal_tenant_user_id\",\n type: \"apiKey\",\n },\n ],\n url: \"/api/contacts/groups/{id}\",\n ...options,\n headers: {\n \"Content-Type\": \"application/json\",\n ...options.headers,\n },\n });\n\n/**\n * List notes for a contact\n *\n * Returns notes attached to a contact.\n */\nexport const contactsNotesList = <ThrowOnError extends boolean = true>(\n options: Options<ContactsNotesListData, ThrowOnError>,\n): RequestResult<\n ContactsNotesListResponses,\n ContactsNotesListErrors,\n ThrowOnError,\n \"data\"\n> =>\n options.client.get<\n ContactsNotesListResponses,\n ContactsNotesListErrors,\n ThrowOnError,\n \"data\"\n >({\n responseStyle: \"data\",\n security: [\n {\n in: \"cookie\",\n name: \"portal_tenant_user_id\",\n type: \"apiKey\",\n },\n ],\n url: \"/api/contacts/{contact_id}/notes\",\n ...options,\n });\n\n/**\n * Create a note for a contact\n *\n * Adds a new note to a contact.\n */\nexport const contactsNotesCreate = <ThrowOnError extends boolean = true>(\n options: Options<ContactsNotesCreateData, ThrowOnError>,\n): RequestResult<\n ContactsNotesCreateResponses,\n ContactsNotesCreateErrors,\n ThrowOnError,\n \"data\"\n> =>\n options.client.post<\n ContactsNotesCreateResponses,\n ContactsNotesCreateErrors,\n ThrowOnError,\n \"data\"\n >({\n responseStyle: \"data\",\n security: [\n {\n in: \"cookie\",\n name: \"portal_tenant_user_id\",\n type: \"apiKey\",\n },\n ],\n url: \"/api/contacts/{contact_id}/notes\",\n ...options,\n headers: {\n \"Content-Type\": \"application/json\",\n ...options.headers,\n },\n });\n\n/**\n * List tasks for a contact\n *\n * Returns tasks assigned to a contact.\n */\nexport const contactsTasksList = <ThrowOnError extends boolean = true>(\n options: Options<ContactsTasksListData, ThrowOnError>,\n): RequestResult<\n ContactsTasksListResponses,\n ContactsTasksListErrors,\n ThrowOnError,\n \"data\"\n> =>\n options.client.get<\n ContactsTasksListResponses,\n ContactsTasksListErrors,\n ThrowOnError,\n \"data\"\n >({\n responseStyle: \"data\",\n security: [\n {\n in: \"cookie\",\n name: \"portal_tenant_user_id\",\n type: \"apiKey\",\n },\n ],\n url: \"/api/contacts/{contact_id}/tasks\",\n ...options,\n });\n\n/**\n * Create a task for a contact\n *\n * Adds a new task to a contact.\n */\nexport const contactsTasksCreate = <ThrowOnError extends boolean = true>(\n options: Options<ContactsTasksCreateData, ThrowOnError>,\n): RequestResult<\n ContactsTasksCreateResponses,\n ContactsTasksCreateErrors,\n ThrowOnError,\n \"data\"\n> =>\n options.client.post<\n ContactsTasksCreateResponses,\n ContactsTasksCreateErrors,\n ThrowOnError,\n \"data\"\n >({\n responseStyle: \"data\",\n security: [\n {\n in: \"cookie\",\n name: \"portal_tenant_user_id\",\n type: \"apiKey\",\n },\n ],\n url: \"/api/contacts/{contact_id}/tasks\",\n ...options,\n headers: {\n \"Content-Type\": \"application/json\",\n ...options.headers,\n },\n });\n\n/**\n * Delete a note\n *\n * Removes a note from a contact.\n */\nexport const contactsNotesDestroy = <ThrowOnError extends boolean = true>(\n options: Options<ContactsNotesDestroyData, ThrowOnError>,\n): RequestResult<\n ContactsNotesDestroyResponses,\n ContactsNotesDestroyErrors,\n ThrowOnError,\n \"data\"\n> =>\n options.client.delete<\n ContactsNotesDestroyResponses,\n ContactsNotesDestroyErrors,\n ThrowOnError,\n \"data\"\n >({\n responseStyle: \"data\",\n security: [\n {\n in: \"cookie\",\n name: \"portal_tenant_user_id\",\n type: \"apiKey\",\n },\n ],\n url: \"/api/contacts/{contact_id}/notes/{id}\",\n ...options,\n });\n\n/**\n * Update a note\n *\n * Updates an existing note on a contact.\n */\nexport const contactsNotesUpdate = <ThrowOnError extends boolean = true>(\n options: Options<ContactsNotesUpdateData, ThrowOnError>,\n): RequestResult<\n ContactsNotesUpdateResponses,\n ContactsNotesUpdateErrors,\n ThrowOnError,\n \"data\"\n> =>\n options.client.patch<\n ContactsNotesUpdateResponses,\n ContactsNotesUpdateErrors,\n ThrowOnError,\n \"data\"\n >({\n responseStyle: \"data\",\n security: [\n {\n in: \"cookie\",\n name: \"portal_tenant_user_id\",\n type: \"apiKey\",\n },\n ],\n url: \"/api/contacts/{contact_id}/notes/{id}\",\n ...options,\n headers: {\n \"Content-Type\": \"application/json\",\n ...options.headers,\n },\n });\n\n/**\n * Delete a task\n *\n * Removes a task from a contact.\n */\nexport const contactsTasksDestroy = <ThrowOnError extends boolean = true>(\n options: Options<ContactsTasksDestroyData, ThrowOnError>,\n): RequestResult<\n ContactsTasksDestroyResponses,\n ContactsTasksDestroyErrors,\n ThrowOnError,\n \"data\"\n> =>\n options.client.delete<\n ContactsTasksDestroyResponses,\n ContactsTasksDestroyErrors,\n ThrowOnError,\n \"data\"\n >({\n responseStyle: \"data\",\n security: [\n {\n in: \"cookie\",\n name: \"portal_tenant_user_id\",\n type: \"apiKey\",\n },\n ],\n url: \"/api/contacts/{contact_id}/tasks/{id}\",\n ...options,\n });\n\n/**\n * Update a task\n *\n * Updates an existing task on a contact.\n */\nexport const contactsTasksUpdate = <ThrowOnError extends boolean = true>(\n options: Options<ContactsTasksUpdateData, ThrowOnError>,\n): RequestResult<\n ContactsTasksUpdateResponses,\n ContactsTasksUpdateErrors,\n ThrowOnError,\n \"data\"\n> =>\n options.client.patch<\n ContactsTasksUpdateResponses,\n ContactsTasksUpdateErrors,\n ThrowOnError,\n \"data\"\n >({\n responseStyle: \"data\",\n security: [\n {\n in: \"cookie\",\n name: \"portal_tenant_user_id\",\n type: \"apiKey\",\n },\n ],\n url: \"/api/contacts/{contact_id}/tasks/{id}\",\n ...options,\n headers: {\n \"Content-Type\": \"application/json\",\n ...options.headers,\n },\n });\n","import type { ContactsApi } from \"@fluid-app/contacts-core/contacts-api\";\nimport type { ContactsDomainApi } from \"@fluid-app/contacts-core/contacts-api-context\";\nimport type { GroupsApi } from \"@fluid-app/contacts-core/groups-api\";\nimport type { NotesApi } from \"@fluid-app/contacts-core/notes-api\";\nimport type { TasksApi } from \"@fluid-app/contacts-core/tasks-api\";\nimport type {\n Contact,\n ContactGroup,\n ContactNote,\n ContactTask,\n PaginationMeta,\n} from \"@fluid-app/contacts-core/types\";\nimport type { PortalTenantContactsHeyApiClient } from \"@fluid-app/portal-tenant-contacts-api-client/client\";\nimport {\n contactsBulkDestroy,\n contactsCreate,\n contactsDestroy,\n contactsGroupsCreate,\n contactsGroupsDestroy,\n contactsGroupsList,\n contactsGroupsUpdate,\n contactsList,\n contactsNotesCreate,\n contactsNotesDestroy,\n contactsNotesList,\n contactsNotesUpdate,\n contactsShow,\n contactsTasksCreate,\n contactsTasksDestroy,\n contactsTasksList,\n contactsTasksUpdate,\n contactsUpdate,\n} from \"@fluid-app/portal-tenant-contacts-api-client/sdk\";\nimport type {\n Contact as BffContact,\n ContactCreate,\n ContactUpdate,\n ContactsListData,\n Group,\n Note,\n Task,\n} from \"@fluid-app/portal-tenant-contacts-api-client/types\";\n\nconst EMPTY_META: PaginationMeta = {\n total_count: 0,\n total_pages: 0,\n current_page: 1,\n next_cursor: null,\n};\n\nfunction toNumericId(id: string): number {\n return Number(id);\n}\n\nfunction paginationFromBff(\n meta:\n | {\n request_id?: string | null;\n timestamp?: string;\n total_count?: number;\n pagination?: { next_cursor?: string | null };\n }\n | undefined,\n itemCount: number,\n currentPage: number,\n pageSize: number,\n): PaginationMeta {\n if (!meta) return EMPTY_META;\n\n const nextCursor = meta.pagination?.next_cursor ?? null;\n const totalCount =\n meta.total_count ??\n (nextCursor\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 ?? undefined,\n timestamp: meta.timestamp,\n };\n}\n\nfunction mapContact(raw: BffContact): Contact {\n const extended = raw as BffContact & { country?: Contact[\"country\"] };\n\n return {\n id: raw.id ?? 0,\n full_name: `${raw.first_name ?? \"\"} ${raw.last_name ?? \"\"}`.trim(),\n first_name: raw.first_name ?? null,\n last_name: raw.last_name ?? null,\n email: raw.email ?? null,\n phone: raw.phone ?? null,\n status: raw.status ?? null,\n address: raw.address ?? null,\n city: raw.city ?? null,\n state: raw.state ?? null,\n postal_code: raw.postal_code ?? null,\n avatar_url: raw.avatar_url ?? null,\n country: extended.country ?? null,\n tags: raw.tags ?? [],\n metadata: {},\n created_at: raw.created_at ?? \"\",\n updated_at: raw.updated_at ?? \"\",\n } satisfies Contact;\n}\n\nfunction mapNote(raw: Note): ContactNote {\n return {\n id: raw.id ?? 0,\n title: raw.title ?? \"\",\n body: raw.body ?? \"\",\n note_type: null,\n due_date: null,\n due_time: null,\n pinned: null,\n created_at: raw.created_at ?? \"\",\n updated_at: raw.updated_at ?? \"\",\n contact_id: raw.contact_id ?? 0,\n assets: [],\n } satisfies ContactNote;\n}\n\nfunction mapTask(raw: Task): ContactTask {\n const extended = raw as Task & { completed_at?: string | null };\n\n return {\n id: raw.id ?? 0,\n body: raw.title ?? \"\",\n due_at: raw.due_date ?? null,\n completed_at:\n extended.completed_at ??\n (raw.completed ? new Date().toISOString() : null),\n created_at: raw.created_at ?? \"\",\n contact_id: raw.contact_id ?? null,\n } satisfies ContactTask;\n}\n\nfunction mapGroup(raw: Group): ContactGroup {\n return {\n id: raw.id ?? 0,\n name: raw.name ?? \"\",\n avatar: raw.avatar ?? null,\n avatar_background: raw.avatar_background ?? null,\n contacts_count: raw.contacts_count ?? 0,\n created_at: raw.created_at ?? \"\",\n updated_at: raw.updated_at ?? \"\",\n } satisfies ContactGroup;\n}\n\nconst cursorCachesByClient = new WeakMap<\n PortalTenantContactsHeyApiClient,\n Map<string, Map<number, string>>\n>();\n\nfunction cursorCacheKey(params: Record<string, unknown> | undefined): string {\n return JSON.stringify({\n limit: params?.per_page ?? params?.limit ?? null,\n search: params?.search_query ?? params?.search ?? params?.query ?? null,\n tags: params?.tags ?? null,\n });\n}\n\nfunction cursorCacheFor(\n client: PortalTenantContactsHeyApiClient,\n params: Record<string, unknown> | undefined,\n): Map<number, string> {\n let byQuery = cursorCachesByClient.get(client);\n if (!byQuery) {\n byQuery = new Map();\n cursorCachesByClient.set(client, byQuery);\n }\n\n const key = cursorCacheKey(params);\n const existing = byQuery.get(key);\n if (existing) return existing;\n\n const cache = new Map<number, string>();\n byQuery.set(key, cache);\n return cache;\n}\n\nfunction mapListParams(\n params: Record<string, unknown> | undefined,\n cursorCache: ReadonlyMap<number, string>,\n): ContactsListData[\"query\"] | null {\n if (!params) return undefined;\n\n const page = typeof params.page === \"number\" ? params.page : 1;\n const limitValue = params.per_page ?? params.limit;\n const searchValue = params.search_query ?? params.search ?? params.query;\n const tags = Array.isArray(params.tags)\n ? params.tags.filter((tag): tag is string => typeof tag === \"string\")\n : undefined;\n\n const cursor = page > 1 ? cursorCache.get(page) : undefined;\n if (page > 1 && cursor === undefined) return null;\n\n return {\n ...(typeof limitValue === \"number\" ? { \"page[limit]\": limitValue } : {}),\n ...(cursor !== undefined ? { \"page[cursor]\": cursor } : {}),\n ...(typeof searchValue === \"string\" ? { search: searchValue } : {}),\n ...(tags ? { tags } : {}),\n };\n}\n\nfunction createContactsAdapter(\n client: PortalTenantContactsHeyApiClient,\n): ContactsApi {\n return {\n getContact: async (id) => {\n const response = await contactsShow({\n client,\n path: { id: toNumericId(id) },\n });\n return { contact: mapContact(response.contact ?? {}) };\n },\n listContacts: async (params) => {\n const page = typeof params?.page === \"number\" ? params.page : 1;\n const pageSize =\n typeof params?.per_page === \"number\" ? params.per_page : 25;\n const cursorCache = cursorCacheFor(client, params);\n const query = mapListParams(params, cursorCache);\n if (query === null) {\n return {\n contacts: [],\n meta: paginationFromBff(undefined, 0, page, pageSize),\n };\n }\n const response = await contactsList({\n client,\n ...(query ? { query } : {}),\n });\n const nextCursor = response.meta?.pagination?.next_cursor;\n if (nextCursor) cursorCache.set(page + 1, nextCursor);\n\n const contacts = (response.contacts ?? []).map(mapContact);\n return {\n contacts,\n meta: paginationFromBff(response.meta, contacts.length, page, pageSize),\n };\n },\n createContact: (data) =>\n contactsCreate({\n client,\n body: { contact: data as ContactCreate },\n }),\n updateContact: (id, data) =>\n contactsUpdate({\n client,\n path: { id: toNumericId(id) },\n body: { contact: data as ContactUpdate },\n }),\n deleteContact: (id) =>\n contactsDestroy({ client, path: { id: toNumericId(id) } }),\n bulkDeleteContacts: (ids) => contactsBulkDestroy({ client, body: { ids } }),\n };\n}\n\nfunction createNotesAdapter(\n client: PortalTenantContactsHeyApiClient,\n): NotesApi {\n return {\n listNotes: async (contactId) => {\n const response = await contactsNotesList({\n client,\n path: { contact_id: toNumericId(contactId) },\n });\n return { notes: (response.notes ?? []).map(mapNote) };\n },\n createNote: (contactId, input) =>\n contactsNotesCreate({\n client,\n path: { contact_id: toNumericId(contactId) },\n body: { note: { title: input.title, body: input.body } },\n }),\n updateNote: (noteId, contactId, input) =>\n contactsNotesUpdate({\n client,\n path: { contact_id: toNumericId(contactId), id: noteId },\n body: { note: { title: input.title, body: input.body } },\n }),\n deleteNote: (noteId, contactId) =>\n contactsNotesDestroy({\n client,\n path: { contact_id: toNumericId(contactId), id: noteId },\n }),\n };\n}\n\nfunction createTasksAdapter(\n client: PortalTenantContactsHeyApiClient,\n): TasksApi {\n return {\n listTasks: async (contactId) => {\n const response = await contactsTasksList({\n client,\n path: { contact_id: toNumericId(contactId) },\n });\n return { tasks: (response.tasks ?? []).map(mapTask) };\n },\n createTask: (contactId, input) =>\n contactsTasksCreate({\n client,\n path: { contact_id: toNumericId(contactId) },\n body: { task: { title: input.body, due_date: input.due_at } },\n }),\n updateTask: (taskId, contactId, input) =>\n contactsTasksUpdate({\n client,\n path: { contact_id: toNumericId(contactId), id: taskId },\n body: {\n task: {\n title: input.body ?? undefined,\n completed:\n input.completed_at === undefined\n ? undefined\n : input.completed_at !== null,\n due_date: input.due_at,\n },\n },\n }),\n deleteTask: (taskId, contactId) =>\n contactsTasksDestroy({\n client,\n path: { contact_id: toNumericId(contactId), id: taskId },\n }),\n };\n}\n\nfunction createGroupsAdapter(\n client: PortalTenantContactsHeyApiClient,\n): GroupsApi {\n return {\n listGroups: async () => {\n const response = await contactsGroupsList({ client });\n return { groups: (response.groups ?? []).map(mapGroup) };\n },\n createGroup: async (input) => {\n const response = await contactsGroupsCreate({\n client,\n body: { group: input },\n });\n return { group: mapGroup(response.group ?? {}) };\n },\n updateGroup: async (groupId, input) => {\n const response = await contactsGroupsUpdate({\n client,\n path: { id: groupId },\n body: { group: input },\n });\n return { group: mapGroup(response.group ?? {}) };\n },\n deleteGroup: (groupId) =>\n contactsGroupsDestroy({ client, path: { id: groupId } }),\n };\n}\n\nexport function createPortalContactsDomainApiAdapter(\n client: PortalTenantContactsHeyApiClient,\n): ContactsDomainApi {\n return {\n contacts: createContactsAdapter(client),\n notes: createNotesAdapter(client),\n tasks: createTasksAdapter(client),\n groups: createGroupsAdapter(client),\n };\n}\n","import { createContext, type ReactNode, use, useMemo } from \"react\";\nimport { useAccount } from \"../hooks/use-account\";\nimport type { FluidSDKConfig } from \"../types/config\";\n\nexport interface FluidContextValue {\n readonly config: FluidSDKConfig;\n}\n\nconst FluidContext = createContext<FluidContextValue | null>(null);\n\n/**\n * Provides SDK configuration and hydrates its country from the authenticated\n * account. Shared widget hosts use this provider as part of the exhaustive\n * portal runtime contract.\n */\nexport function FluidConfigProvider({\n children,\n config,\n}: {\n children: ReactNode;\n config: FluidSDKConfig;\n}): React.JSX.Element {\n const { data: account } = useAccount();\n const value = useMemo<FluidContextValue>(() => {\n const countryIso =\n account?.market_country_iso ?? account?.default_country_iso;\n\n return {\n config: countryIso ? { ...config, countryIso } : config,\n };\n }, [config, account?.market_country_iso, account?.default_country_iso]);\n\n return (\n <FluidContext.Provider value={value}>{children}</FluidContext.Provider>\n );\n}\n\nexport function useFluidContext(): FluidContextValue {\n const context = use(FluidContext);\n if (!context) {\n throw new Error(\"useFluidContext must be used within a FluidProvider\");\n }\n return context;\n}\n","import { useMemo, useRef, type ReactElement, type ReactNode } from \"react\";\nimport { ContactsApiProvider } from \"@fluid-app/contacts-core/contacts-api-context\";\nimport { createPortalTenantContactsHeyApiClient } from \"@fluid-app/portal-tenant-contacts-api-client/client\";\nimport { createPortalContactsDomainApiAdapter } from \"../adapters/contacts-api-adapter\";\nimport { useFluidContext } from \"../providers/FluidConfigProvider\";\n\nexport function PortalContactsApiProvider({\n children,\n}: {\n children: ReactNode;\n}): ReactElement {\n const { config } = useFluidContext();\n const configRef = useRef(config);\n configRef.current = config;\n const { baseUrl } = config;\n const csrfToken =\n typeof document === \"undefined\"\n ? null\n : document\n .querySelector('meta[name=\"csrf-token\"]')\n ?.getAttribute(\"content\");\n\n const client = useMemo(\n () =>\n createPortalTenantContactsHeyApiClient({\n baseUrl,\n credentials: \"include\",\n defaultHeaders: {\n ...configRef.current.defaultHeaders,\n ...(csrfToken ? { \"X-CSRF-Token\": csrfToken } : {}),\n },\n onAuthError: () => configRef.current.onAuthError?.(),\n }),\n [baseUrl, csrfToken],\n );\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 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 ar: () =>\n import(\"./locale/ar.json\").then(\n (m): ContactsDict => m.default as ContactsDict,\n ),\n bg: () =>\n import(\"./locale/bg.json\").then(\n (m): ContactsDict => m.default as ContactsDict,\n ),\n bn: () =>\n import(\"./locale/bn.json\").then(\n (m): ContactsDict => m.default as ContactsDict,\n ),\n cs: () =>\n import(\"./locale/cs.json\").then(\n (m): ContactsDict => m.default as ContactsDict,\n ),\n da: () =>\n import(\"./locale/da.json\").then(\n (m): ContactsDict => m.default as ContactsDict,\n ),\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 fi: () =>\n import(\"./locale/fi.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 hi: () =>\n import(\"./locale/hi.json\").then(\n (m): ContactsDict => m.default as ContactsDict,\n ),\n hr: () =>\n import(\"./locale/hr.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 ms: () =>\n import(\"./locale/ms.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 no: () =>\n import(\"./locale/no.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 sk: () =>\n import(\"./locale/sk.json\").then(\n (m): ContactsDict => m.default as ContactsDict,\n ),\n sv: () =>\n import(\"./locale/sv.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 uk: () =>\n import(\"./locale/uk.json\").then(\n (m): ContactsDict => m.default as ContactsDict,\n ),\n vi: () =>\n import(\"./locale/vi.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-C7Q9rpKH.cjs","names":["toApiErrorBody","ApiError","toApiErrorData","useAccount","ContactsApiProvider","createDomainTranslations","createStaticDictAdapter","useActiveLocale","useDomainDict","ContactsTranslationProvider"],"sources":["../../../platform/api-client-core/src/hey-api-error-policy.ts","../../../api-clients/hey-api-fetch-runtime/src/generated/core/bodySerializer.gen.ts","../../../api-clients/hey-api-fetch-runtime/src/generated/core/params.gen.ts","../../../api-clients/hey-api-fetch-runtime/src/generated/core/serverSentEvents.gen.ts","../../../api-clients/hey-api-fetch-runtime/src/generated/core/pathSerializer.gen.ts","../../../api-clients/hey-api-fetch-runtime/src/generated/core/utils.gen.ts","../../../api-clients/hey-api-fetch-runtime/src/generated/core/auth.gen.ts","../../../api-clients/hey-api-fetch-runtime/src/generated/client/utils.gen.ts","../../../api-clients/hey-api-fetch-runtime/src/generated/client/client.gen.ts","../../../api-clients/portal-tenant-contacts/src/hey-api-client.ts","../../../api-clients/portal-tenant-contacts/src/hey-api/sdk.gen.ts","../src/adapters/contacts-api-adapter.ts","../src/providers/FluidConfigProvider.tsx","../src/contacts/PortalContactsApiProvider.tsx","../../../contacts/core/src/translation-dictionary.ts","../../../contacts/core/src/translation-adapter.ts","../src/providers/ContactsTranslationBridge.tsx"],"sourcesContent":["import type { ApiErrorBody, ApiErrorData } from \"./api-error-shape\";\nimport { toApiErrorBody, toApiErrorData } from \"./api-error-shape\";\nimport { ApiError } from \"./fetch-client\";\n\nexport interface HeyApiErrorRequestOptions {\n method?: string;\n}\n\nexport interface HeyApiErrorInterceptorOptions {\n onResponseError?: (response: Response) => void;\n shouldPassThroughTransportError?: (error: unknown) => boolean;\n}\n\nexport type HeyApiErrorInterceptor = (\n error: unknown,\n response: Response | undefined,\n request: Request | undefined,\n options: HeyApiErrorRequestOptions,\n) => unknown;\n\nfunction getNonEmptyString(value: unknown): string | undefined {\n if (typeof value !== \"string\") {\n return undefined;\n }\n\n const trimmed = value.trim();\n return trimmed.length > 0 ? trimmed : undefined;\n}\n\nfunction getRequestId(\n response: Response,\n error: ApiErrorBody,\n): string | undefined {\n const meta = toApiErrorBody(error?.meta);\n\n return (\n getNonEmptyString(response.headers.get(\"x-request-id\")) ??\n getNonEmptyString(response.headers.get(\"request-id\")) ??\n getNonEmptyString(error?.request_id) ??\n getNonEmptyString(error?.requestId) ??\n getNonEmptyString(meta?.request_id) ??\n getNonEmptyString(meta?.requestId)\n );\n}\n\nfunction getErrorMessage(\n error: Record<string, unknown>,\n fallback: string,\n): string {\n const nestedError = toApiErrorBody(error.error);\n\n return (\n getNonEmptyString(error.message) ??\n getNonEmptyString(error.error_message) ??\n getNonEmptyString(nestedError?.message) ??\n fallback\n );\n}\n\n/**\n * Creates an error interceptor compatible with generated Hey API fetch clients.\n * Consumer-specific auth and cancellation policy is supplied through callbacks,\n * keeping this package independent from generated client types.\n */\nexport function createHeyApiErrorInterceptor(\n options: HeyApiErrorInterceptorOptions = {},\n): HeyApiErrorInterceptor {\n return (error, response, request, requestOptions) => {\n if (!response) {\n if (error instanceof ApiError) {\n return error;\n }\n\n if (options.shouldPassThroughTransportError?.(error)) {\n return error;\n }\n\n // Request construction and auth callbacks run before dispatch. Preserve\n // those errors instead of reporting them as network failures.\n if (!request) {\n return error;\n }\n\n return new ApiError(\n `Network error: ${error instanceof Error ? error.message : \"Unknown network error\"}`,\n 0,\n null,\n );\n }\n\n // Generated clients surface malformed JSON bodies as SyntaxError. Map an\n // otherwise successful response to the shared strict parse contract.\n if (response.ok && error instanceof SyntaxError) {\n return new ApiError(\n \"Failed to parse response as JSON\",\n response.status,\n null,\n getRequestId(response, null),\n );\n }\n\n options.onResponseError?.(response);\n\n const method = request?.method ?? requestOptions.method ?? \"GET\";\n const errorRecord = toApiErrorBody(error);\n const requestId = getRequestId(response, errorRecord);\n\n if (errorRecord) {\n // `data` is the unwrapped field-error bag, `body` the whole envelope.\n // Both derive from one shared rule — see docs/api-error-data-contract.md.\n return new ApiError(\n getErrorMessage(errorRecord, `${method} request failed`),\n response.status,\n toApiErrorData(errorRecord),\n requestId,\n errorRecord,\n );\n }\n\n const isJson = response.headers\n .get(\"content-type\")\n ?.includes(\"application/json\");\n const text = getNonEmptyString(error);\n\n return new ApiError(\n isJson && text\n ? text.slice(0, 200)\n : `${method} request failed with status ${response.status}`,\n response.status,\n // A parsed JSON string is a legal `ApiErrorData` member, so it is kept\n // rather than dropped — the shared fetch client already preserves it, and\n // discarding it here made the two producers disagree.\n isJson ? (error as ApiErrorData) : null,\n requestId,\n // Unreachable as an envelope: this branch runs only when the payload is\n // not a plain object, which is exactly what `toApiErrorBody` rejects.\n null,\n );\n };\n}\n","// This file is auto-generated by @hey-api/openapi-ts\n\nimport type {\n ArrayStyle,\n ObjectStyle,\n SerializerOptions,\n} from \"./pathSerializer.gen\";\n\nexport type QuerySerializer = (query: Record<string, unknown>) => string;\n\nexport type BodySerializer = (body: unknown) => unknown;\n\ntype QuerySerializerOptionsObject = {\n allowReserved?: boolean;\n array?: Partial<SerializerOptions<ArrayStyle>>;\n object?: Partial<SerializerOptions<ObjectStyle>>;\n};\n\nexport type QuerySerializerOptions = QuerySerializerOptionsObject & {\n /**\n * Per-parameter serialization overrides. When provided, these settings\n * override the global array/object settings for specific parameter names.\n */\n parameters?: Record<string, QuerySerializerOptionsObject>;\n};\n\nconst serializeFormDataPair = (\n data: FormData,\n key: string,\n value: unknown,\n): void => {\n if (typeof value === \"string\" || value instanceof Blob) {\n data.append(key, value);\n } else if (value instanceof Date) {\n data.append(key, value.toISOString());\n } else {\n data.append(key, JSON.stringify(value));\n }\n};\n\nconst serializeUrlSearchParamsPair = (\n data: URLSearchParams,\n key: string,\n value: unknown,\n): void => {\n if (typeof value === \"string\") {\n data.append(key, value);\n } else {\n data.append(key, JSON.stringify(value));\n }\n};\n\nexport const formDataBodySerializer = {\n bodySerializer: (body: unknown): FormData => {\n const data = new FormData();\n\n Object.entries(body as Record<string, unknown>).forEach(([key, value]) => {\n if (value === undefined || value === null) {\n return;\n }\n if (Array.isArray(value)) {\n value.forEach((v) => serializeFormDataPair(data, key, v));\n } else {\n serializeFormDataPair(data, key, value);\n }\n });\n\n return data;\n },\n};\n\nexport const jsonBodySerializer = {\n bodySerializer: (body: unknown): string =>\n JSON.stringify(body, (_key, value) =>\n typeof value === \"bigint\" ? value.toString() : value,\n ),\n};\n\nexport const urlSearchParamsBodySerializer = {\n bodySerializer: (body: unknown): string => {\n const data = new URLSearchParams();\n\n Object.entries(body as Record<string, unknown>).forEach(([key, value]) => {\n if (value === undefined || value === null) {\n return;\n }\n if (Array.isArray(value)) {\n value.forEach((v) => serializeUrlSearchParamsPair(data, key, v));\n } else {\n serializeUrlSearchParamsPair(data, key, value);\n }\n });\n\n return data.toString();\n },\n};\n","// This file is auto-generated by @hey-api/openapi-ts\n\ntype Slot = \"body\" | \"headers\" | \"path\" | \"query\";\n\nexport type Field =\n | {\n in: Exclude<Slot, \"body\">;\n /**\n * Field name. This is the name we want the user to see and use.\n */\n key: string;\n /**\n * Field mapped name. This is the name we want to use in the request.\n * If omitted, we use the same value as `key`.\n */\n map?: string;\n }\n | {\n in: Extract<Slot, \"body\">;\n /**\n * Key isn't required for bodies.\n */\n key?: string;\n map?: string;\n }\n | {\n /**\n * Field name. This is the name we want the user to see and use.\n */\n key: string;\n /**\n * Field mapped name. This is the name we want to use in the request.\n * If `in` is omitted, `map` aliases `key` to the transport layer.\n */\n map: Slot;\n };\n\nexport interface Fields {\n allowExtra?: Partial<Record<Slot, boolean>>;\n args?: ReadonlyArray<Field>;\n}\n\nexport type FieldsConfig = ReadonlyArray<Field | Fields>;\n\nconst extraPrefixesMap: Record<string, Slot> = {\n $body_: \"body\",\n $headers_: \"headers\",\n $path_: \"path\",\n $query_: \"query\",\n};\nconst extraPrefixes = Object.entries(extraPrefixesMap);\n\ntype KeyMap = Map<\n string,\n | {\n in: Slot;\n map?: string;\n }\n | {\n in?: never;\n map: Slot;\n }\n>;\n\nfunction buildKeyMap(fields: FieldsConfig, map?: KeyMap): KeyMap {\n if (!map) {\n map = new Map();\n }\n\n for (const config of fields) {\n if (\"in\" in config) {\n if (config.key) {\n map.set(config.key, {\n in: config.in,\n map: config.map,\n });\n }\n } else if (\"key\" in config) {\n map.set(config.key, {\n map: config.map,\n });\n } else if (config.args) {\n buildKeyMap(config.args, map);\n }\n }\n\n return map;\n}\n\ninterface Params {\n body?: unknown;\n headers: Record<string, unknown>;\n path: Record<string, unknown>;\n query: Record<string, unknown>;\n}\n\nfunction stripEmptySlots(params: Params): void {\n for (const [slot, value] of Object.entries(params)) {\n if (slot === \"body\") continue;\n if (\n value &&\n typeof value === \"object\" &&\n !Array.isArray(value) &&\n !Object.keys(value).length\n ) {\n delete params[slot as Slot];\n }\n }\n}\n\nexport function buildClientParams(\n args: ReadonlyArray<unknown>,\n fields: FieldsConfig,\n): Params {\n const params: Params = {\n headers: Object.create(null),\n path: Object.create(null),\n query: Object.create(null),\n };\n\n const map = buildKeyMap(fields);\n\n function writeSlot(slot: Slot, key: string, value: unknown): void {\n let record = params[slot] as Record<string, unknown> | undefined;\n if (record === undefined) {\n record = Object.create(null) as Record<string, unknown>;\n params[slot] = record;\n }\n record[key] = value;\n }\n\n let config: FieldsConfig[number] | undefined;\n\n for (const [index, arg] of args.entries()) {\n if (fields[index]) {\n config = fields[index];\n }\n\n if (!config) {\n continue;\n }\n\n if (\"in\" in config) {\n if (config.key) {\n const field = map.get(config.key)!;\n const name = field.map || config.key;\n if (field.in) {\n writeSlot(field.in, name, arg);\n }\n } else {\n params.body = arg;\n }\n } else {\n for (const [key, value] of Object.entries(arg ?? {})) {\n const field = map.get(key);\n\n if (field) {\n if (field.in) {\n const name = field.map || key;\n writeSlot(field.in, name, value);\n } else {\n params[field.map] = value;\n }\n } else {\n const extra = extraPrefixes.find(([prefix]) =>\n key.startsWith(prefix),\n );\n\n if (extra) {\n const [prefix, slot] = extra;\n writeSlot(slot, key.slice(prefix.length), value);\n } else if (\"allowExtra\" in config && config.allowExtra) {\n for (const [slot, allowed] of Object.entries(config.allowExtra)) {\n if (allowed) {\n writeSlot(slot as Slot, key, value);\n break;\n }\n }\n }\n }\n }\n }\n }\n\n stripEmptySlots(params);\n\n return params;\n}\n","// This file is auto-generated by @hey-api/openapi-ts\n\nimport type { Config } from \"./types.gen\";\n\nexport type ServerSentEventsOptions<TData = unknown> = Omit<\n RequestInit,\n \"method\"\n> &\n Pick<Config, \"method\" | \"responseTransformer\" | \"responseValidator\"> & {\n /**\n * Fetch API implementation. You can use this option to provide a custom\n * fetch instance.\n *\n * @default globalThis.fetch\n */\n fetch?: typeof fetch;\n /**\n * Implementing clients can call request interceptors inside this hook.\n */\n onRequest?: (url: string, init: RequestInit) => Promise<Request>;\n /**\n * Callback invoked when a network or parsing error occurs during streaming.\n *\n * This option applies only if the endpoint returns a stream of events.\n *\n * @param error The error that occurred.\n */\n onSseError?: (error: unknown) => void;\n /**\n * Callback invoked when an event is streamed from the server.\n *\n * This option applies only if the endpoint returns a stream of events.\n *\n * @param event Event streamed from the server.\n * @returns Nothing (void).\n */\n onSseEvent?: (event: StreamEvent<TData>) => void;\n serializedBody?: RequestInit[\"body\"];\n /**\n * Default retry delay in milliseconds.\n *\n * This option applies only if the endpoint returns a stream of events.\n *\n * @default 3000\n */\n sseDefaultRetryDelay?: number;\n /**\n * Maximum number of retry attempts before giving up.\n */\n sseMaxRetryAttempts?: number;\n /**\n * Maximum retry delay in milliseconds.\n *\n * Applies only when exponential backoff is used.\n *\n * This option applies only if the endpoint returns a stream of events.\n *\n * @default 30000\n */\n sseMaxRetryDelay?: number;\n /**\n * Optional sleep function for retry backoff.\n *\n * Defaults to using `setTimeout`.\n */\n sseSleepFn?: (ms: number) => Promise<void>;\n url: string;\n };\n\nexport interface StreamEvent<TData = unknown> {\n data: TData;\n event?: string;\n id?: string;\n retry?: number;\n}\n\nexport type ServerSentEventsResult<\n TData = unknown,\n TReturn = void,\n TNext = unknown,\n> = {\n stream: AsyncGenerator<\n TData extends Record<string, unknown> ? TData[keyof TData] : TData,\n TReturn,\n TNext\n >;\n};\n\nexport function createSseClient<TData = unknown>({\n onRequest,\n onSseError,\n onSseEvent,\n responseTransformer,\n responseValidator,\n sseDefaultRetryDelay,\n sseMaxRetryAttempts,\n sseMaxRetryDelay,\n sseSleepFn,\n url,\n ...options\n}: ServerSentEventsOptions): ServerSentEventsResult<TData> {\n let lastEventId: string | undefined;\n\n const sleep =\n sseSleepFn ??\n ((ms: number) => new Promise((resolve) => setTimeout(resolve, ms)));\n\n const createStream = async function* () {\n let retryDelay: number = sseDefaultRetryDelay ?? 3000;\n let attempt = 0;\n const signal = options.signal ?? new AbortController().signal;\n\n while (true) {\n if (signal.aborted) break;\n\n attempt++;\n\n const headers =\n options.headers instanceof Headers\n ? options.headers\n : new Headers(options.headers as Record<string, string> | undefined);\n\n if (lastEventId !== undefined) {\n headers.set(\"Last-Event-ID\", lastEventId);\n }\n\n try {\n const requestInit: RequestInit = {\n redirect: \"follow\",\n ...options,\n body: options.serializedBody,\n headers,\n signal,\n };\n let request = new Request(url, requestInit);\n if (onRequest) {\n request = await onRequest(url, requestInit);\n }\n // fetch must be assigned here, otherwise it would throw the error:\n // TypeError: Failed to execute 'fetch' on 'Window': Illegal invocation\n const _fetch = options.fetch ?? globalThis.fetch;\n const response = await _fetch(request);\n\n if (!response.ok)\n throw new Error(\n `SSE failed: ${response.status} ${response.statusText}`,\n );\n\n if (!response.body) throw new Error(\"No body in SSE response\");\n\n const reader = response.body\n .pipeThrough(new TextDecoderStream())\n .getReader();\n\n let buffer = \"\";\n\n const abortHandler = () => {\n try {\n reader.cancel();\n } catch {\n // noop\n }\n };\n\n signal.addEventListener(\"abort\", abortHandler);\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n buffer += value;\n buffer = buffer.replace(/\\r\\n?/g, \"\\n\"); // normalize line endings\n\n const chunks = buffer.split(\"\\n\\n\");\n buffer = chunks.pop() ?? \"\";\n\n for (const chunk of chunks) {\n const lines = chunk.split(\"\\n\");\n const dataLines: Array<string> = [];\n let eventName: string | undefined;\n\n for (const line of lines) {\n if (line.startsWith(\"data:\")) {\n dataLines.push(line.replace(/^data:\\s*/, \"\"));\n } else if (line.startsWith(\"event:\")) {\n eventName = line.replace(/^event:\\s*/, \"\");\n } else if (line.startsWith(\"id:\")) {\n lastEventId = line.replace(/^id:\\s*/, \"\");\n } else if (line.startsWith(\"retry:\")) {\n const parsed = Number.parseInt(\n line.replace(/^retry:\\s*/, \"\"),\n 10,\n );\n if (!Number.isNaN(parsed)) {\n retryDelay = parsed;\n }\n }\n }\n\n let data: unknown;\n let parsedJson = false;\n\n if (dataLines.length) {\n const rawData = dataLines.join(\"\\n\");\n try {\n data = JSON.parse(rawData);\n parsedJson = true;\n } catch {\n data = rawData;\n }\n }\n\n if (parsedJson) {\n if (responseValidator) {\n await responseValidator(data);\n }\n\n if (responseTransformer) {\n data = await responseTransformer(data);\n }\n }\n\n onSseEvent?.({\n data,\n event: eventName,\n id: lastEventId,\n retry: retryDelay,\n });\n\n if (dataLines.length) {\n yield data as any;\n }\n }\n }\n } finally {\n signal.removeEventListener(\"abort\", abortHandler);\n reader.releaseLock();\n }\n\n break; // exit loop on normal completion\n } catch (error) {\n // connection failed or aborted; retry after delay\n onSseError?.(error);\n\n if (\n sseMaxRetryAttempts !== undefined &&\n attempt >= sseMaxRetryAttempts\n ) {\n break; // stop after firing error\n }\n\n // exponential backoff: double retry each attempt, cap at 30s\n const backoff = Math.min(\n retryDelay * 2 ** (attempt - 1),\n sseMaxRetryDelay ?? 30000,\n );\n await sleep(backoff);\n }\n }\n };\n\n const stream = createStream();\n\n return { stream };\n}\n","// This file is auto-generated by @hey-api/openapi-ts\n\ninterface SerializeOptions<T>\n extends SerializePrimitiveOptions, SerializerOptions<T> {}\n\ninterface SerializePrimitiveOptions {\n allowReserved?: boolean;\n name: string;\n}\n\nexport interface SerializerOptions<T> {\n /**\n * @default true\n */\n explode: boolean;\n style: T;\n}\n\nexport type ArrayStyle = \"form\" | \"spaceDelimited\" | \"pipeDelimited\";\nexport type ArraySeparatorStyle = ArrayStyle | MatrixStyle;\ntype MatrixStyle = \"label\" | \"matrix\" | \"simple\";\nexport type ObjectStyle = \"form\" | \"deepObject\";\ntype ObjectSeparatorStyle = ObjectStyle | MatrixStyle;\n\ninterface SerializePrimitiveParam extends SerializePrimitiveOptions {\n value: string;\n}\n\nexport const separatorArrayExplode = (\n style: ArraySeparatorStyle,\n): \".\" | \";\" | \",\" | \"&\" => {\n switch (style) {\n case \"label\":\n return \".\";\n case \"matrix\":\n return \";\";\n case \"simple\":\n return \",\";\n default:\n return \"&\";\n }\n};\n\nexport const separatorArrayNoExplode = (\n style: ArraySeparatorStyle,\n): \",\" | \"|\" | \"%20\" => {\n switch (style) {\n case \"form\":\n return \",\";\n case \"pipeDelimited\":\n return \"|\";\n case \"spaceDelimited\":\n return \"%20\";\n default:\n return \",\";\n }\n};\n\nexport const separatorObjectExplode = (\n style: ObjectSeparatorStyle,\n): \".\" | \";\" | \",\" | \"&\" => {\n switch (style) {\n case \"label\":\n return \".\";\n case \"matrix\":\n return \";\";\n case \"simple\":\n return \",\";\n default:\n return \"&\";\n }\n};\n\nexport const serializeArrayParam = ({\n allowReserved,\n explode,\n name,\n style,\n value,\n}: SerializeOptions<ArraySeparatorStyle> & {\n value: unknown[];\n}): string => {\n if (!explode) {\n const joinedValues = (\n allowReserved ? value : value.map((v) => encodeURIComponent(v as string))\n ).join(separatorArrayNoExplode(style));\n switch (style) {\n case \"label\":\n return `.${joinedValues}`;\n case \"matrix\":\n return `;${name}=${joinedValues}`;\n case \"simple\":\n return joinedValues;\n default:\n return `${name}=${joinedValues}`;\n }\n }\n\n const separator = separatorArrayExplode(style);\n const joinedValues = value\n .map((v) => {\n if (style === \"label\" || style === \"simple\") {\n return allowReserved ? v : encodeURIComponent(v as string);\n }\n\n return serializePrimitiveParam({\n allowReserved,\n name,\n value: v as string,\n });\n })\n .join(separator);\n return style === \"label\" || style === \"matrix\"\n ? separator + joinedValues\n : joinedValues;\n};\n\nexport const serializePrimitiveParam = ({\n allowReserved,\n name,\n value,\n}: SerializePrimitiveParam): string => {\n if (value === undefined || value === null) {\n return \"\";\n }\n\n if (typeof value === \"object\") {\n throw new Error(\n \"Deeply-nested arrays/objects aren’t supported. Provide your own `querySerializer()` to handle these.\",\n );\n }\n\n return `${name}=${allowReserved ? value : encodeURIComponent(value)}`;\n};\n\nexport const serializeObjectParam = ({\n allowReserved,\n explode,\n name,\n style,\n value,\n valueOnly,\n}: SerializeOptions<ObjectSeparatorStyle> & {\n value: Record<string, unknown> | Date;\n valueOnly?: boolean;\n}): string => {\n if (value instanceof Date) {\n return valueOnly ? value.toISOString() : `${name}=${value.toISOString()}`;\n }\n\n if (style !== \"deepObject\" && !explode) {\n let values: string[] = [];\n Object.entries(value).forEach(([key, v]) => {\n values = [\n ...values,\n key,\n allowReserved ? (v as string) : encodeURIComponent(v as string),\n ];\n });\n const joinedValues = values.join(\",\");\n switch (style) {\n case \"form\":\n return `${name}=${joinedValues}`;\n case \"label\":\n return `.${joinedValues}`;\n case \"matrix\":\n return `;${name}=${joinedValues}`;\n default:\n return joinedValues;\n }\n }\n\n const separator = separatorObjectExplode(style);\n const joinedValues = Object.entries(value)\n .map(([key, v]) =>\n serializePrimitiveParam({\n allowReserved,\n name: style === \"deepObject\" ? `${name}[${key}]` : key,\n value: v as string,\n }),\n )\n .join(separator);\n return style === \"label\" || style === \"matrix\"\n ? separator + joinedValues\n : joinedValues;\n};\n","// This file is auto-generated by @hey-api/openapi-ts\n\nimport type { BodySerializer, QuerySerializer } from \"./bodySerializer.gen\";\nimport {\n type ArraySeparatorStyle,\n serializeArrayParam,\n serializeObjectParam,\n serializePrimitiveParam,\n} from \"./pathSerializer.gen\";\n\nexport interface PathSerializer {\n path: Record<string, unknown>;\n url: string;\n}\n\nexport const PATH_PARAM_RE: RegExp = /\\{[^{}]+\\}/g;\n\nexport const defaultPathSerializer = ({\n path,\n url: _url,\n}: PathSerializer): string => {\n let url = _url;\n const matches = _url.match(PATH_PARAM_RE);\n if (matches) {\n for (const match of matches) {\n let explode = false;\n let name = match.substring(1, match.length - 1);\n let style: ArraySeparatorStyle = \"simple\";\n\n if (name.endsWith(\"*\")) {\n explode = true;\n name = name.substring(0, name.length - 1);\n }\n\n if (name.startsWith(\".\")) {\n name = name.substring(1);\n style = \"label\";\n } else if (name.startsWith(\";\")) {\n name = name.substring(1);\n style = \"matrix\";\n }\n\n const value = path[name];\n\n if (value === undefined || value === null) {\n continue;\n }\n\n if (Array.isArray(value)) {\n url = url.replace(\n match,\n serializeArrayParam({ explode, name, style, value }),\n );\n continue;\n }\n\n if (typeof value === \"object\") {\n url = url.replace(\n match,\n serializeObjectParam({\n explode,\n name,\n style,\n value: value as Record<string, unknown>,\n valueOnly: true,\n }),\n );\n continue;\n }\n\n if (style === \"matrix\") {\n url = url.replace(\n match,\n `;${serializePrimitiveParam({\n name,\n value: value as string,\n })}`,\n );\n continue;\n }\n\n const replaceValue = encodeURIComponent(\n style === \"label\" ? `.${value as string}` : (value as string),\n );\n url = url.replace(match, replaceValue);\n }\n }\n return url;\n};\n\nexport const getUrl = ({\n baseUrl,\n path,\n query,\n querySerializer,\n url: _url,\n}: {\n baseUrl?: string;\n path?: Record<string, unknown>;\n query?: Record<string, unknown>;\n querySerializer: QuerySerializer;\n url: string;\n}): string => {\n const pathUrl = _url.startsWith(\"/\") ? _url : `/${_url}`;\n let url = (baseUrl ?? \"\") + pathUrl;\n if (path) {\n url = defaultPathSerializer({ path, url });\n }\n let search = query ? querySerializer(query) : \"\";\n if (search.startsWith(\"?\")) {\n search = search.substring(1);\n }\n if (search) {\n url += `?${search}`;\n }\n return url;\n};\n\nexport function getValidRequestBody(options: {\n body?: unknown;\n bodySerializer?: BodySerializer | null;\n serializedBody?: unknown;\n}): unknown {\n const hasBody = options.body !== undefined;\n const isSerializedBody = hasBody && options.bodySerializer;\n\n if (isSerializedBody) {\n if (\"serializedBody\" in options) {\n const hasSerializedBody =\n options.serializedBody !== undefined && options.serializedBody !== \"\";\n\n return hasSerializedBody ? options.serializedBody : null;\n }\n\n // not all clients implement a serializedBody property (i.e., client-axios)\n return options.body !== \"\" ? options.body : null;\n }\n\n // plain/text body\n if (hasBody) {\n return options.body;\n }\n\n // no body was provided\n return undefined;\n}\n","// This file is auto-generated by @hey-api/openapi-ts\n\nexport type AuthToken = string | undefined;\n\nexport interface Auth {\n /**\n * Which part of the request do we use to send the auth?\n *\n * @default 'header'\n */\n in?: \"header\" | \"query\" | \"cookie\";\n /**\n * A unique identifier for the security scheme.\n *\n * Defined only when there are multiple security schemes whose `Auth`\n * shape would otherwise be identical.\n */\n key?: string;\n /**\n * Header or query parameter name.\n *\n * @default 'Authorization'\n */\n name?: string;\n scheme?: \"basic\" | \"bearer\";\n type: \"apiKey\" | \"http\";\n}\n\nexport const getAuthToken = async (\n auth: Auth,\n callback: ((auth: Auth) => Promise<AuthToken> | AuthToken) | AuthToken,\n): Promise<string | undefined> => {\n const token =\n typeof callback === \"function\" ? await callback(auth) : callback;\n\n if (!token) {\n return;\n }\n\n if (auth.scheme === \"bearer\") {\n return `Bearer ${token}`;\n }\n\n if (auth.scheme === \"basic\") {\n return `Basic ${btoa(token)}`;\n }\n\n return token;\n};\n","// This file is auto-generated by @hey-api/openapi-ts\n\nimport { getAuthToken } from \"../core/auth.gen\";\nimport type { QuerySerializerOptions } from \"../core/bodySerializer.gen\";\nimport { jsonBodySerializer } from \"../core/bodySerializer.gen\";\nimport {\n serializeArrayParam,\n serializeObjectParam,\n serializePrimitiveParam,\n} from \"../core/pathSerializer.gen\";\nimport { getUrl } from \"../core/utils.gen\";\nimport type {\n Client,\n ClientOptions,\n Config,\n RequestOptions,\n} from \"./types.gen\";\n\nexport const createQuerySerializer = <T = unknown>({\n parameters = {},\n ...args\n}: QuerySerializerOptions = {}): ((queryParams: T) => string) => {\n const querySerializer = (queryParams: T): string => {\n const search: string[] = [];\n if (queryParams && typeof queryParams === \"object\") {\n for (const name in queryParams) {\n const value = queryParams[name];\n\n if (value === undefined || value === null) {\n continue;\n }\n\n const options = parameters[name] || args;\n\n if (Array.isArray(value)) {\n const serializedArray = serializeArrayParam({\n allowReserved: options.allowReserved,\n explode: true,\n name,\n style: \"form\",\n value,\n ...options.array,\n });\n if (serializedArray) search.push(serializedArray);\n } else if (typeof value === \"object\") {\n const serializedObject = serializeObjectParam({\n allowReserved: options.allowReserved,\n explode: true,\n name,\n style: \"deepObject\",\n value: value as Record<string, unknown>,\n ...options.object,\n });\n if (serializedObject) search.push(serializedObject);\n } else {\n const serializedPrimitive = serializePrimitiveParam({\n allowReserved: options.allowReserved,\n name,\n value: value as string,\n });\n if (serializedPrimitive) search.push(serializedPrimitive);\n }\n }\n }\n return search.join(\"&\");\n };\n return querySerializer;\n};\n\n/**\n * Infers parseAs value from provided Content-Type header.\n */\nexport const getParseAs = (\n contentType: string | null,\n): Exclude<Config[\"parseAs\"], \"auto\"> => {\n if (!contentType) {\n // If no Content-Type header is provided, the best we can do is return the raw response body,\n // which is effectively the same as the 'stream' option.\n return \"stream\";\n }\n\n const cleanContent = contentType.split(\";\")[0]?.trim();\n\n if (!cleanContent) {\n return;\n }\n\n if (\n cleanContent.startsWith(\"application/json\") ||\n cleanContent.endsWith(\"+json\")\n ) {\n return \"json\";\n }\n\n if (cleanContent === \"multipart/form-data\") {\n return \"formData\";\n }\n\n if (\n [\"application/\", \"audio/\", \"image/\", \"video/\"].some((type) =>\n cleanContent.startsWith(type),\n )\n ) {\n return \"blob\";\n }\n\n if (cleanContent.startsWith(\"text/\")) {\n return \"text\";\n }\n\n return;\n};\n\nconst checkForExistence = (\n options: Pick<RequestOptions, \"auth\" | \"query\"> & {\n headers: Headers;\n },\n name?: string,\n): boolean => {\n if (!name) {\n return false;\n }\n if (\n options.headers.has(name) ||\n options.query?.[name] ||\n options.headers.get(\"Cookie\")?.includes(`${name}=`)\n ) {\n return true;\n }\n return false;\n};\n\nexport async function setAuthParams(\n options: Pick<RequestOptions, \"auth\" | \"query\" | \"security\"> & {\n headers: Headers;\n },\n): Promise<void> {\n for (const auth of options.security ?? []) {\n if (checkForExistence(options, auth.name)) {\n continue;\n }\n\n const token = await getAuthToken(auth, options.auth);\n\n if (!token) {\n continue;\n }\n\n const name = auth.name ?? \"Authorization\";\n\n switch (auth.in) {\n case \"query\":\n if (!options.query) {\n options.query = {};\n }\n options.query[name] = token;\n break;\n case \"cookie\":\n options.headers.append(\"Cookie\", `${name}=${token}`);\n break;\n case \"header\":\n default:\n options.headers.set(name, token);\n break;\n }\n }\n}\n\nexport const buildUrl: Client[\"buildUrl\"] = (options) =>\n getUrl({\n baseUrl: options.baseUrl as string,\n path: options.path,\n query: options.query,\n querySerializer:\n typeof options.querySerializer === \"function\"\n ? options.querySerializer\n : createQuerySerializer(options.querySerializer),\n url: options.url,\n });\n\nexport const mergeConfigs = (a: Config, b: Config): Config => {\n const config = { ...a, ...b };\n if (config.baseUrl?.endsWith(\"/\")) {\n config.baseUrl = config.baseUrl.substring(0, config.baseUrl.length - 1);\n }\n config.headers = mergeHeaders(a.headers, b.headers);\n return config;\n};\n\nconst headersEntries = (headers: Headers): Array<[string, string]> => {\n const entries: Array<[string, string]> = [];\n headers.forEach((value, key) => {\n entries.push([key, value]);\n });\n return entries;\n};\n\nexport const mergeHeaders = (\n ...headers: Array<Required<Config>[\"headers\"] | undefined>\n): Headers => {\n const mergedHeaders = new Headers();\n for (const header of headers) {\n if (!header) {\n continue;\n }\n\n const iterator =\n header instanceof Headers\n ? headersEntries(header)\n : Object.entries(header);\n\n for (const [key, value] of iterator) {\n if (value === null) {\n mergedHeaders.delete(key);\n } else if (Array.isArray(value)) {\n for (const v of value) {\n mergedHeaders.append(key, v as string);\n }\n } else if (value !== undefined) {\n // assume object headers are meant to be JSON stringified, i.e., their\n // content value in OpenAPI specification is 'application/json'\n mergedHeaders.set(\n key,\n typeof value === \"object\" ? JSON.stringify(value) : (value as string),\n );\n }\n }\n }\n return mergedHeaders;\n};\n\ntype ErrInterceptor<Err, Res, Req, Options> = (\n error: Err,\n /** response may be undefined due to a network error where no response object is produced */\n response: Res | undefined,\n /** request may be undefined, because error may be from building the request object itself */\n request: Req | undefined,\n options: Options,\n) => Err | Promise<Err>;\n\ntype ReqInterceptor<Req, Options> = (\n request: Req,\n options: Options,\n) => Req | Promise<Req>;\n\ntype ResInterceptor<Res, Req, Options> = (\n response: Res,\n request: Req,\n options: Options,\n) => Res | Promise<Res>;\n\nclass Interceptors<Interceptor> {\n fns: Array<Interceptor | null> = [];\n\n clear(): void {\n this.fns = [];\n }\n\n eject(id: number | Interceptor): void {\n const index = this.getInterceptorIndex(id);\n if (this.fns[index]) {\n this.fns[index] = null;\n }\n }\n\n exists(id: number | Interceptor): boolean {\n const index = this.getInterceptorIndex(id);\n return Boolean(this.fns[index]);\n }\n\n getInterceptorIndex(id: number | Interceptor): number {\n if (typeof id === \"number\") {\n return this.fns[id] ? id : -1;\n }\n return this.fns.indexOf(id);\n }\n\n update(\n id: number | Interceptor,\n fn: Interceptor,\n ): number | Interceptor | false {\n const index = this.getInterceptorIndex(id);\n if (this.fns[index]) {\n this.fns[index] = fn;\n return id;\n }\n return false;\n }\n\n use(fn: Interceptor): number {\n this.fns.push(fn);\n return this.fns.length - 1;\n }\n}\n\nexport interface Middleware<Req, Res, Err, Options> {\n error: Interceptors<ErrInterceptor<Err, Res, Req, Options>>;\n request: Interceptors<ReqInterceptor<Req, Options>>;\n response: Interceptors<ResInterceptor<Res, Req, Options>>;\n}\n\nexport const createInterceptors = <Req, Res, Err, Options>(): Middleware<\n Req,\n Res,\n Err,\n Options\n> => ({\n error: new Interceptors<ErrInterceptor<Err, Res, Req, Options>>(),\n request: new Interceptors<ReqInterceptor<Req, Options>>(),\n response: new Interceptors<ResInterceptor<Res, Req, Options>>(),\n});\n\nconst defaultQuerySerializer = createQuerySerializer({\n allowReserved: false,\n array: {\n explode: true,\n style: \"form\",\n },\n object: {\n explode: true,\n style: \"deepObject\",\n },\n});\n\nconst defaultHeaders = {\n \"Content-Type\": \"application/json\",\n};\n\nexport const createConfig = <T extends ClientOptions = ClientOptions>(\n override: Config<Omit<ClientOptions, keyof T> & T> = {},\n): Config<Omit<ClientOptions, keyof T> & T> => ({\n ...jsonBodySerializer,\n headers: defaultHeaders,\n parseAs: \"auto\",\n querySerializer: defaultQuerySerializer,\n ...override,\n});\n","// This file is auto-generated by @hey-api/openapi-ts\n\nimport { createSseClient } from \"../core/serverSentEvents.gen\";\nimport type { HttpMethod } from \"../core/types.gen\";\nimport { getValidRequestBody } from \"../core/utils.gen\";\nimport type {\n Client,\n Config,\n RequestOptions,\n ResolvedRequestOptions,\n} from \"./types.gen\";\nimport {\n buildUrl,\n createConfig,\n createInterceptors,\n getParseAs,\n mergeConfigs,\n mergeHeaders,\n setAuthParams,\n} from \"./utils.gen\";\n\ntype ReqInit = Omit<RequestInit, \"body\" | \"headers\"> & {\n body?: any;\n headers: ReturnType<typeof mergeHeaders>;\n};\n\nexport const createClient = (config: Config = {}): Client => {\n let _config = mergeConfigs(createConfig(), config);\n\n const getConfig = (): Config => ({ ..._config });\n\n const setConfig = (config: Config): Config => {\n _config = mergeConfigs(_config, config);\n return getConfig();\n };\n\n const interceptors = createInterceptors<\n Request,\n Response,\n unknown,\n ResolvedRequestOptions\n >();\n\n const beforeRequest = async <\n TData = unknown,\n TResponseStyle extends \"data\" | \"fields\" = \"fields\",\n ThrowOnError extends boolean = boolean,\n Url extends string = string,\n >(\n options: RequestOptions<TData, TResponseStyle, ThrowOnError, Url>,\n ) => {\n const opts = {\n ..._config,\n ...options,\n fetch: options.fetch ?? _config.fetch ?? globalThis.fetch,\n headers: mergeHeaders(_config.headers, options.headers),\n serializedBody: undefined as string | undefined,\n };\n\n if (opts.security) {\n await setAuthParams(opts);\n }\n\n if (opts.requestValidator) {\n await opts.requestValidator(opts);\n }\n\n if (opts.body !== undefined && opts.bodySerializer) {\n opts.serializedBody = opts.bodySerializer(opts.body) as\n | string\n | undefined;\n }\n\n // remove Content-Type header if body is empty to avoid sending invalid requests\n if (opts.body === undefined || opts.serializedBody === \"\") {\n opts.headers.delete(\"Content-Type\");\n }\n\n const resolvedOpts = opts as typeof opts &\n ResolvedRequestOptions<TResponseStyle, ThrowOnError, Url>;\n const url = buildUrl(resolvedOpts);\n\n return { opts: resolvedOpts, url };\n };\n\n const request: Client[\"request\"] = async (options) => {\n const throwOnError = options.throwOnError ?? _config.throwOnError;\n const responseStyle = options.responseStyle ?? _config.responseStyle;\n\n let request: Request | undefined;\n let response: Response | undefined;\n\n try {\n const { opts, url } = await beforeRequest(options);\n const requestInit: ReqInit = {\n redirect: \"follow\",\n ...opts,\n body: getValidRequestBody(opts),\n };\n\n request = new Request(url, requestInit);\n\n for (const fn of interceptors.request.fns) {\n if (fn) {\n request = await fn(request, opts);\n }\n }\n\n // fetch must be assigned here, otherwise it would throw the error:\n // TypeError: Failed to execute 'fetch' on 'Window': Illegal invocation\n const _fetch = opts.fetch!;\n\n response = await _fetch(request);\n\n for (const fn of interceptors.response.fns) {\n if (fn) {\n response = await fn(response, request, opts);\n }\n }\n\n const result = {\n request,\n response,\n };\n\n if (response.ok) {\n const parseAs =\n (opts.parseAs === \"auto\"\n ? getParseAs(response.headers.get(\"Content-Type\"))\n : opts.parseAs) ?? \"json\";\n\n if (\n response.status === 204 ||\n response.headers.get(\"Content-Length\") === \"0\"\n ) {\n let emptyData: any;\n switch (parseAs) {\n case \"arrayBuffer\":\n case \"blob\":\n case \"text\":\n emptyData = await response[parseAs]();\n break;\n case \"formData\":\n emptyData = new FormData();\n break;\n case \"stream\":\n emptyData = response.body;\n break;\n case \"json\":\n default:\n emptyData = {};\n break;\n }\n return opts.responseStyle === \"data\"\n ? emptyData\n : {\n data: emptyData,\n ...result,\n };\n }\n\n let data: any;\n switch (parseAs) {\n case \"arrayBuffer\":\n case \"blob\":\n case \"formData\":\n case \"text\":\n data = await response[parseAs]();\n break;\n case \"json\": {\n // Some servers return 200 with no Content-Length and empty body.\n // response.json() would throw; read as text and parse if non-empty.\n const text = await response.text();\n data = text ? JSON.parse(text) : {};\n break;\n }\n case \"stream\":\n return opts.responseStyle === \"data\"\n ? response.body\n : {\n data: response.body,\n ...result,\n };\n }\n\n if (parseAs === \"json\") {\n if (opts.responseValidator) {\n await opts.responseValidator(data);\n }\n\n if (opts.responseTransformer) {\n data = await opts.responseTransformer(data);\n }\n }\n\n return opts.responseStyle === \"data\"\n ? data\n : {\n data,\n ...result,\n };\n }\n\n const textError = await response.text();\n let jsonError: unknown;\n\n try {\n jsonError = JSON.parse(textError);\n } catch {\n // noop\n }\n\n throw jsonError ?? textError;\n } catch (error) {\n let finalError = error;\n\n for (const fn of interceptors.error.fns) {\n if (fn) {\n finalError = await fn(\n finalError,\n response,\n request,\n options as ResolvedRequestOptions,\n );\n }\n }\n\n finalError = finalError || {};\n\n if (throwOnError) {\n throw finalError;\n }\n\n // TODO: we probably want to return error and improve types\n return responseStyle === \"data\"\n ? undefined\n : {\n error: finalError,\n request,\n response,\n };\n }\n };\n\n const makeMethodFn =\n (method: Uppercase<HttpMethod>) => (options: RequestOptions) =>\n request({ ...options, method });\n\n const makeSseFn =\n (method: Uppercase<HttpMethod>) => async (options: RequestOptions) => {\n const { opts, url } = await beforeRequest(options);\n return createSseClient({\n ...opts,\n body: opts.body as BodyInit | null | undefined,\n method,\n onRequest: async (url, init) => {\n let request = new Request(url, init);\n for (const fn of interceptors.request.fns) {\n if (fn) {\n request = await fn(request, opts);\n }\n }\n return request;\n },\n serializedBody: getValidRequestBody(opts) as\n | BodyInit\n | null\n | undefined,\n url,\n });\n };\n\n const _buildUrl: Client[\"buildUrl\"] = (options) =>\n buildUrl({ ..._config, ...options });\n\n return {\n buildUrl: _buildUrl,\n connect: makeMethodFn(\"CONNECT\"),\n delete: makeMethodFn(\"DELETE\"),\n get: makeMethodFn(\"GET\"),\n getConfig,\n head: makeMethodFn(\"HEAD\"),\n interceptors,\n options: makeMethodFn(\"OPTIONS\"),\n patch: makeMethodFn(\"PATCH\"),\n post: makeMethodFn(\"POST\"),\n put: makeMethodFn(\"PUT\"),\n request,\n setConfig,\n sse: {\n connect: makeSseFn(\"CONNECT\"),\n delete: makeSseFn(\"DELETE\"),\n get: makeSseFn(\"GET\"),\n head: makeSseFn(\"HEAD\"),\n options: makeSseFn(\"OPTIONS\"),\n patch: makeSseFn(\"PATCH\"),\n post: makeSseFn(\"POST\"),\n put: makeSseFn(\"PUT\"),\n trace: makeSseFn(\"TRACE\"),\n },\n trace: makeMethodFn(\"TRACE\"),\n } as Client;\n};\n","import { createHeyApiErrorInterceptor } from \"@fluid-app/api-client-core\";\nimport { type Client, createClient } from \"@fluid-app/hey-api-fetch-runtime\";\n\nexport type PortalTenantContactsHeyApiClient = Client;\n\nexport interface PortalTenantContactsHeyApiClientConfig {\n baseUrl: string;\n fetch?: typeof fetch;\n credentials?: RequestCredentials;\n defaultHeaders?: Readonly<Record<string, string>>;\n onAuthError?: () => void;\n}\n\nfunction isAbortError(error: unknown): boolean {\n return (\n (error instanceof DOMException && error.name === \"AbortError\") ||\n (error instanceof Error && error.name === \"AbortError\")\n );\n}\n\nexport function createPortalTenantContactsHeyApiClient(\n config: PortalTenantContactsHeyApiClientConfig,\n): PortalTenantContactsHeyApiClient {\n const client = createClient({\n baseUrl: config.baseUrl,\n credentials: config.credentials,\n fetch: config.fetch,\n headers: {\n Accept: \"application/json\",\n ...config.defaultHeaders,\n },\n throwOnError: true,\n });\n\n client.interceptors.error.use(\n createHeyApiErrorInterceptor({\n onResponseError: (response) => {\n if (response.status === 401) {\n config.onAuthError?.();\n }\n },\n shouldPassThroughTransportError: isAbortError,\n }),\n );\n\n return client;\n}\n","// This file is auto-generated by @hey-api/openapi-ts\n\nimport type {\n Client,\n ClientMeta,\n Options as Options2,\n RequestResult,\n TDataShape,\n} from \"@fluid-app/hey-api-fetch-runtime\";\n\nimport type {\n ContactsBulkDestroyData,\n ContactsBulkDestroyErrors,\n ContactsBulkDestroyResponses,\n ContactsCreateData,\n ContactsCreateErrors,\n ContactsCreateResponses,\n ContactsDestroyData,\n ContactsDestroyErrors,\n ContactsDestroyResponses,\n ContactsGroupsCreateData,\n ContactsGroupsCreateErrors,\n ContactsGroupsCreateResponses,\n ContactsGroupsDestroyData,\n ContactsGroupsDestroyErrors,\n ContactsGroupsDestroyResponses,\n ContactsGroupsListData,\n ContactsGroupsListErrors,\n ContactsGroupsListResponses,\n ContactsGroupsUpdateData,\n ContactsGroupsUpdateErrors,\n ContactsGroupsUpdateResponses,\n ContactsListData,\n ContactsListErrors,\n ContactsListResponses,\n ContactsNotesCreateData,\n ContactsNotesCreateErrors,\n ContactsNotesCreateResponses,\n ContactsNotesDestroyData,\n ContactsNotesDestroyErrors,\n ContactsNotesDestroyResponses,\n ContactsNotesListData,\n ContactsNotesListErrors,\n ContactsNotesListResponses,\n ContactsNotesUpdateData,\n ContactsNotesUpdateErrors,\n ContactsNotesUpdateResponses,\n ContactsShowData,\n ContactsShowErrors,\n ContactsShowResponses,\n ContactsTasksCreateData,\n ContactsTasksCreateErrors,\n ContactsTasksCreateResponses,\n ContactsTasksDestroyData,\n ContactsTasksDestroyErrors,\n ContactsTasksDestroyResponses,\n ContactsTasksListData,\n ContactsTasksListErrors,\n ContactsTasksListResponses,\n ContactsTasksUpdateData,\n ContactsTasksUpdateErrors,\n ContactsTasksUpdateResponses,\n ContactsUpdateData,\n ContactsUpdateErrors,\n ContactsUpdateResponses,\n} from \"./types.gen\";\n\nexport type Options<\n TData extends TDataShape = TDataShape,\n ThrowOnError extends boolean = boolean,\n TResponse = unknown,\n> = Options2<TData, ThrowOnError, TResponse> & {\n /**\n * You can provide a client instance returned by `createClient()` instead of\n * individual options. This might be also useful if you want to implement a\n * custom client.\n */\n client: Client;\n /**\n * You can pass arbitrary values through the `meta` object. This can be\n * used to access values that aren't defined as part of the SDK function.\n */\n meta?: keyof ClientMeta extends never ? Record<string, unknown> : ClientMeta;\n};\n\n/**\n * List contacts with cursor pagination\n *\n * Returns a paginated list of contacts belonging to the authenticated member.\n */\nexport const contactsList = <ThrowOnError extends boolean = true>(\n options: Options<ContactsListData, ThrowOnError>,\n): RequestResult<\n ContactsListResponses,\n ContactsListErrors,\n ThrowOnError,\n \"data\"\n> =>\n options.client.get<\n ContactsListResponses,\n ContactsListErrors,\n ThrowOnError,\n \"data\"\n >({\n responseStyle: \"data\",\n security: [\n {\n in: \"cookie\",\n name: \"portal_tenant_user_id\",\n type: \"apiKey\",\n },\n ],\n url: \"/api/contacts\",\n ...options,\n });\n\n/**\n * Create a new contact\n *\n * Creates a new contact for the authenticated member.\n */\nexport const contactsCreate = <ThrowOnError extends boolean = true>(\n options: Options<ContactsCreateData, ThrowOnError>,\n): RequestResult<\n ContactsCreateResponses,\n ContactsCreateErrors,\n ThrowOnError,\n \"data\"\n> =>\n options.client.post<\n ContactsCreateResponses,\n ContactsCreateErrors,\n ThrowOnError,\n \"data\"\n >({\n responseStyle: \"data\",\n security: [\n {\n in: \"cookie\",\n name: \"portal_tenant_user_id\",\n type: \"apiKey\",\n },\n ],\n url: \"/api/contacts\",\n ...options,\n headers: {\n \"Content-Type\": \"application/json\",\n ...options.headers,\n },\n });\n\n/**\n * Delete a contact\n *\n * Soft-deletes a contact by ID.\n */\nexport const contactsDestroy = <ThrowOnError extends boolean = true>(\n options: Options<ContactsDestroyData, ThrowOnError>,\n): RequestResult<\n ContactsDestroyResponses,\n ContactsDestroyErrors,\n ThrowOnError,\n \"data\"\n> =>\n options.client.delete<\n ContactsDestroyResponses,\n ContactsDestroyErrors,\n ThrowOnError,\n \"data\"\n >({\n responseStyle: \"data\",\n security: [\n {\n in: \"cookie\",\n name: \"portal_tenant_user_id\",\n type: \"apiKey\",\n },\n ],\n url: \"/api/contacts/{id}\",\n ...options,\n });\n\n/**\n * Get a specific contact\n *\n * Returns a single contact by ID.\n */\nexport const contactsShow = <ThrowOnError extends boolean = true>(\n options: Options<ContactsShowData, ThrowOnError>,\n): RequestResult<\n ContactsShowResponses,\n ContactsShowErrors,\n ThrowOnError,\n \"data\"\n> =>\n options.client.get<\n ContactsShowResponses,\n ContactsShowErrors,\n ThrowOnError,\n \"data\"\n >({\n responseStyle: \"data\",\n security: [\n {\n in: \"cookie\",\n name: \"portal_tenant_user_id\",\n type: \"apiKey\",\n },\n ],\n url: \"/api/contacts/{id}\",\n ...options,\n });\n\n/**\n * Update a contact\n *\n * Updates an existing contact's attributes.\n */\nexport const contactsUpdate = <ThrowOnError extends boolean = true>(\n options: Options<ContactsUpdateData, ThrowOnError>,\n): RequestResult<\n ContactsUpdateResponses,\n ContactsUpdateErrors,\n ThrowOnError,\n \"data\"\n> =>\n options.client.patch<\n ContactsUpdateResponses,\n ContactsUpdateErrors,\n ThrowOnError,\n \"data\"\n >({\n responseStyle: \"data\",\n security: [\n {\n in: \"cookie\",\n name: \"portal_tenant_user_id\",\n type: \"apiKey\",\n },\n ],\n url: \"/api/contacts/{id}\",\n ...options,\n headers: {\n \"Content-Type\": \"application/json\",\n ...options.headers,\n },\n });\n\n/**\n * Delete multiple contacts\n *\n * Soft-deletes multiple contacts by their IDs.\n */\nexport const contactsBulkDestroy = <ThrowOnError extends boolean = true>(\n options: Options<ContactsBulkDestroyData, ThrowOnError>,\n): RequestResult<\n ContactsBulkDestroyResponses,\n ContactsBulkDestroyErrors,\n ThrowOnError,\n \"data\"\n> =>\n options.client.delete<\n ContactsBulkDestroyResponses,\n ContactsBulkDestroyErrors,\n ThrowOnError,\n \"data\"\n >({\n responseStyle: \"data\",\n security: [\n {\n in: \"cookie\",\n name: \"portal_tenant_user_id\",\n type: \"apiKey\",\n },\n ],\n url: \"/api/contacts/bulk\",\n ...options,\n headers: {\n \"Content-Type\": \"application/json\",\n ...options.headers,\n },\n });\n\n/**\n * List contact groups\n *\n * Returns a paginated list of contact groups belonging to the authenticated member.\n */\nexport const contactsGroupsList = <ThrowOnError extends boolean = true>(\n options: Options<ContactsGroupsListData, ThrowOnError>,\n): RequestResult<\n ContactsGroupsListResponses,\n ContactsGroupsListErrors,\n ThrowOnError,\n \"data\"\n> =>\n options.client.get<\n ContactsGroupsListResponses,\n ContactsGroupsListErrors,\n ThrowOnError,\n \"data\"\n >({\n responseStyle: \"data\",\n security: [\n {\n in: \"cookie\",\n name: \"portal_tenant_user_id\",\n type: \"apiKey\",\n },\n ],\n url: \"/api/contacts/groups\",\n ...options,\n });\n\n/**\n * Create a new group\n *\n * Creates a new contact group for the authenticated member.\n */\nexport const contactsGroupsCreate = <ThrowOnError extends boolean = true>(\n options: Options<ContactsGroupsCreateData, ThrowOnError>,\n): RequestResult<\n ContactsGroupsCreateResponses,\n ContactsGroupsCreateErrors,\n ThrowOnError,\n \"data\"\n> =>\n options.client.post<\n ContactsGroupsCreateResponses,\n ContactsGroupsCreateErrors,\n ThrowOnError,\n \"data\"\n >({\n responseStyle: \"data\",\n security: [\n {\n in: \"cookie\",\n name: \"portal_tenant_user_id\",\n type: \"apiKey\",\n },\n ],\n url: \"/api/contacts/groups\",\n ...options,\n headers: {\n \"Content-Type\": \"application/json\",\n ...options.headers,\n },\n });\n\n/**\n * Delete a group\n *\n * Removes a contact group.\n */\nexport const contactsGroupsDestroy = <ThrowOnError extends boolean = true>(\n options: Options<ContactsGroupsDestroyData, ThrowOnError>,\n): RequestResult<\n ContactsGroupsDestroyResponses,\n ContactsGroupsDestroyErrors,\n ThrowOnError,\n \"data\"\n> =>\n options.client.delete<\n ContactsGroupsDestroyResponses,\n ContactsGroupsDestroyErrors,\n ThrowOnError,\n \"data\"\n >({\n responseStyle: \"data\",\n security: [\n {\n in: \"cookie\",\n name: \"portal_tenant_user_id\",\n type: \"apiKey\",\n },\n ],\n url: \"/api/contacts/groups/{id}\",\n ...options,\n });\n\n/**\n * Update a group\n *\n * Updates an existing contact group.\n */\nexport const contactsGroupsUpdate = <ThrowOnError extends boolean = true>(\n options: Options<ContactsGroupsUpdateData, ThrowOnError>,\n): RequestResult<\n ContactsGroupsUpdateResponses,\n ContactsGroupsUpdateErrors,\n ThrowOnError,\n \"data\"\n> =>\n options.client.patch<\n ContactsGroupsUpdateResponses,\n ContactsGroupsUpdateErrors,\n ThrowOnError,\n \"data\"\n >({\n responseStyle: \"data\",\n security: [\n {\n in: \"cookie\",\n name: \"portal_tenant_user_id\",\n type: \"apiKey\",\n },\n ],\n url: \"/api/contacts/groups/{id}\",\n ...options,\n headers: {\n \"Content-Type\": \"application/json\",\n ...options.headers,\n },\n });\n\n/**\n * List notes for a contact\n *\n * Returns notes attached to a contact.\n */\nexport const contactsNotesList = <ThrowOnError extends boolean = true>(\n options: Options<ContactsNotesListData, ThrowOnError>,\n): RequestResult<\n ContactsNotesListResponses,\n ContactsNotesListErrors,\n ThrowOnError,\n \"data\"\n> =>\n options.client.get<\n ContactsNotesListResponses,\n ContactsNotesListErrors,\n ThrowOnError,\n \"data\"\n >({\n responseStyle: \"data\",\n security: [\n {\n in: \"cookie\",\n name: \"portal_tenant_user_id\",\n type: \"apiKey\",\n },\n ],\n url: \"/api/contacts/{contact_id}/notes\",\n ...options,\n });\n\n/**\n * Create a note for a contact\n *\n * Adds a new note to a contact.\n */\nexport const contactsNotesCreate = <ThrowOnError extends boolean = true>(\n options: Options<ContactsNotesCreateData, ThrowOnError>,\n): RequestResult<\n ContactsNotesCreateResponses,\n ContactsNotesCreateErrors,\n ThrowOnError,\n \"data\"\n> =>\n options.client.post<\n ContactsNotesCreateResponses,\n ContactsNotesCreateErrors,\n ThrowOnError,\n \"data\"\n >({\n responseStyle: \"data\",\n security: [\n {\n in: \"cookie\",\n name: \"portal_tenant_user_id\",\n type: \"apiKey\",\n },\n ],\n url: \"/api/contacts/{contact_id}/notes\",\n ...options,\n headers: {\n \"Content-Type\": \"application/json\",\n ...options.headers,\n },\n });\n\n/**\n * List tasks for a contact\n *\n * Returns tasks assigned to a contact.\n */\nexport const contactsTasksList = <ThrowOnError extends boolean = true>(\n options: Options<ContactsTasksListData, ThrowOnError>,\n): RequestResult<\n ContactsTasksListResponses,\n ContactsTasksListErrors,\n ThrowOnError,\n \"data\"\n> =>\n options.client.get<\n ContactsTasksListResponses,\n ContactsTasksListErrors,\n ThrowOnError,\n \"data\"\n >({\n responseStyle: \"data\",\n security: [\n {\n in: \"cookie\",\n name: \"portal_tenant_user_id\",\n type: \"apiKey\",\n },\n ],\n url: \"/api/contacts/{contact_id}/tasks\",\n ...options,\n });\n\n/**\n * Create a task for a contact\n *\n * Adds a new task to a contact.\n */\nexport const contactsTasksCreate = <ThrowOnError extends boolean = true>(\n options: Options<ContactsTasksCreateData, ThrowOnError>,\n): RequestResult<\n ContactsTasksCreateResponses,\n ContactsTasksCreateErrors,\n ThrowOnError,\n \"data\"\n> =>\n options.client.post<\n ContactsTasksCreateResponses,\n ContactsTasksCreateErrors,\n ThrowOnError,\n \"data\"\n >({\n responseStyle: \"data\",\n security: [\n {\n in: \"cookie\",\n name: \"portal_tenant_user_id\",\n type: \"apiKey\",\n },\n ],\n url: \"/api/contacts/{contact_id}/tasks\",\n ...options,\n headers: {\n \"Content-Type\": \"application/json\",\n ...options.headers,\n },\n });\n\n/**\n * Delete a note\n *\n * Removes a note from a contact.\n */\nexport const contactsNotesDestroy = <ThrowOnError extends boolean = true>(\n options: Options<ContactsNotesDestroyData, ThrowOnError>,\n): RequestResult<\n ContactsNotesDestroyResponses,\n ContactsNotesDestroyErrors,\n ThrowOnError,\n \"data\"\n> =>\n options.client.delete<\n ContactsNotesDestroyResponses,\n ContactsNotesDestroyErrors,\n ThrowOnError,\n \"data\"\n >({\n responseStyle: \"data\",\n security: [\n {\n in: \"cookie\",\n name: \"portal_tenant_user_id\",\n type: \"apiKey\",\n },\n ],\n url: \"/api/contacts/{contact_id}/notes/{id}\",\n ...options,\n });\n\n/**\n * Update a note\n *\n * Updates an existing note on a contact.\n */\nexport const contactsNotesUpdate = <ThrowOnError extends boolean = true>(\n options: Options<ContactsNotesUpdateData, ThrowOnError>,\n): RequestResult<\n ContactsNotesUpdateResponses,\n ContactsNotesUpdateErrors,\n ThrowOnError,\n \"data\"\n> =>\n options.client.patch<\n ContactsNotesUpdateResponses,\n ContactsNotesUpdateErrors,\n ThrowOnError,\n \"data\"\n >({\n responseStyle: \"data\",\n security: [\n {\n in: \"cookie\",\n name: \"portal_tenant_user_id\",\n type: \"apiKey\",\n },\n ],\n url: \"/api/contacts/{contact_id}/notes/{id}\",\n ...options,\n headers: {\n \"Content-Type\": \"application/json\",\n ...options.headers,\n },\n });\n\n/**\n * Delete a task\n *\n * Removes a task from a contact.\n */\nexport const contactsTasksDestroy = <ThrowOnError extends boolean = true>(\n options: Options<ContactsTasksDestroyData, ThrowOnError>,\n): RequestResult<\n ContactsTasksDestroyResponses,\n ContactsTasksDestroyErrors,\n ThrowOnError,\n \"data\"\n> =>\n options.client.delete<\n ContactsTasksDestroyResponses,\n ContactsTasksDestroyErrors,\n ThrowOnError,\n \"data\"\n >({\n responseStyle: \"data\",\n security: [\n {\n in: \"cookie\",\n name: \"portal_tenant_user_id\",\n type: \"apiKey\",\n },\n ],\n url: \"/api/contacts/{contact_id}/tasks/{id}\",\n ...options,\n });\n\n/**\n * Update a task\n *\n * Updates an existing task on a contact.\n */\nexport const contactsTasksUpdate = <ThrowOnError extends boolean = true>(\n options: Options<ContactsTasksUpdateData, ThrowOnError>,\n): RequestResult<\n ContactsTasksUpdateResponses,\n ContactsTasksUpdateErrors,\n ThrowOnError,\n \"data\"\n> =>\n options.client.patch<\n ContactsTasksUpdateResponses,\n ContactsTasksUpdateErrors,\n ThrowOnError,\n \"data\"\n >({\n responseStyle: \"data\",\n security: [\n {\n in: \"cookie\",\n name: \"portal_tenant_user_id\",\n type: \"apiKey\",\n },\n ],\n url: \"/api/contacts/{contact_id}/tasks/{id}\",\n ...options,\n headers: {\n \"Content-Type\": \"application/json\",\n ...options.headers,\n },\n });\n","import type { ContactsApi } from \"@fluid-app/contacts-core/contacts-api\";\nimport type { ContactsDomainApi } from \"@fluid-app/contacts-core/contacts-api-context\";\nimport type { GroupsApi } from \"@fluid-app/contacts-core/groups-api\";\nimport type { NotesApi } from \"@fluid-app/contacts-core/notes-api\";\nimport type { TasksApi } from \"@fluid-app/contacts-core/tasks-api\";\nimport type {\n Contact,\n ContactGroup,\n ContactNote,\n ContactTask,\n PaginationMeta,\n} from \"@fluid-app/contacts-core/types\";\nimport type { PortalTenantContactsHeyApiClient } from \"@fluid-app/portal-tenant-contacts-api-client/client\";\nimport {\n contactsBulkDestroy,\n contactsCreate,\n contactsDestroy,\n contactsGroupsCreate,\n contactsGroupsDestroy,\n contactsGroupsList,\n contactsGroupsUpdate,\n contactsList,\n contactsNotesCreate,\n contactsNotesDestroy,\n contactsNotesList,\n contactsNotesUpdate,\n contactsShow,\n contactsTasksCreate,\n contactsTasksDestroy,\n contactsTasksList,\n contactsTasksUpdate,\n contactsUpdate,\n} from \"@fluid-app/portal-tenant-contacts-api-client/sdk\";\nimport type {\n Contact as BffContact,\n ContactCreate,\n ContactUpdate,\n ContactsListData,\n Group,\n Note,\n Task,\n} from \"@fluid-app/portal-tenant-contacts-api-client/types\";\n\nconst EMPTY_META: PaginationMeta = {\n total_count: 0,\n total_pages: 0,\n current_page: 1,\n next_cursor: null,\n};\n\nfunction toNumericId(id: string): number {\n return Number(id);\n}\n\nfunction paginationFromBff(\n meta:\n | {\n request_id?: string | null;\n timestamp?: string;\n total_count?: number;\n pagination?: { next_cursor?: string | null };\n }\n | undefined,\n itemCount: number,\n currentPage: number,\n pageSize: number,\n): PaginationMeta {\n if (!meta) return EMPTY_META;\n\n const nextCursor = meta.pagination?.next_cursor ?? null;\n const totalCount =\n meta.total_count ??\n (nextCursor\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 ?? undefined,\n timestamp: meta.timestamp,\n };\n}\n\nfunction mapContact(raw: BffContact): Contact {\n const extended = raw as BffContact & { country?: Contact[\"country\"] };\n\n return {\n id: raw.id ?? 0,\n full_name: `${raw.first_name ?? \"\"} ${raw.last_name ?? \"\"}`.trim(),\n first_name: raw.first_name ?? null,\n last_name: raw.last_name ?? null,\n email: raw.email ?? null,\n phone: raw.phone ?? null,\n status: raw.status ?? null,\n address: raw.address ?? null,\n city: raw.city ?? null,\n state: raw.state ?? null,\n postal_code: raw.postal_code ?? null,\n avatar_url: raw.avatar_url ?? null,\n country: extended.country ?? null,\n tags: raw.tags ?? [],\n metadata: {},\n created_at: raw.created_at ?? \"\",\n updated_at: raw.updated_at ?? \"\",\n } satisfies Contact;\n}\n\nfunction mapNote(raw: Note): ContactNote {\n return {\n id: raw.id ?? 0,\n title: raw.title ?? \"\",\n body: raw.body ?? \"\",\n note_type: null,\n due_date: null,\n due_time: null,\n pinned: null,\n created_at: raw.created_at ?? \"\",\n updated_at: raw.updated_at ?? \"\",\n contact_id: raw.contact_id ?? 0,\n assets: [],\n } satisfies ContactNote;\n}\n\nfunction mapTask(raw: Task): ContactTask {\n const extended = raw as Task & { completed_at?: string | null };\n\n return {\n id: raw.id ?? 0,\n body: raw.title ?? \"\",\n due_at: raw.due_date ?? null,\n completed_at:\n extended.completed_at ??\n (raw.completed ? new Date().toISOString() : null),\n created_at: raw.created_at ?? \"\",\n contact_id: raw.contact_id ?? null,\n } satisfies ContactTask;\n}\n\nfunction mapGroup(raw: Group): ContactGroup {\n return {\n id: raw.id ?? 0,\n name: raw.name ?? \"\",\n avatar: raw.avatar ?? null,\n avatar_background: raw.avatar_background ?? null,\n contacts_count: raw.contacts_count ?? 0,\n created_at: raw.created_at ?? \"\",\n updated_at: raw.updated_at ?? \"\",\n } satisfies ContactGroup;\n}\n\nconst cursorCachesByClient = new WeakMap<\n PortalTenantContactsHeyApiClient,\n Map<string, Map<number, string>>\n>();\n\nfunction cursorCacheKey(params: Record<string, unknown> | undefined): string {\n return JSON.stringify({\n limit: params?.per_page ?? params?.limit ?? null,\n search: params?.search_query ?? params?.search ?? params?.query ?? null,\n tags: params?.tags ?? null,\n });\n}\n\nfunction cursorCacheFor(\n client: PortalTenantContactsHeyApiClient,\n params: Record<string, unknown> | undefined,\n): Map<number, string> {\n let byQuery = cursorCachesByClient.get(client);\n if (!byQuery) {\n byQuery = new Map();\n cursorCachesByClient.set(client, byQuery);\n }\n\n const key = cursorCacheKey(params);\n const existing = byQuery.get(key);\n if (existing) return existing;\n\n const cache = new Map<number, string>();\n byQuery.set(key, cache);\n return cache;\n}\n\nfunction mapListParams(\n params: Record<string, unknown> | undefined,\n cursorCache: ReadonlyMap<number, string>,\n): ContactsListData[\"query\"] | null {\n if (!params) return undefined;\n\n const page = typeof params.page === \"number\" ? params.page : 1;\n const limitValue = params.per_page ?? params.limit;\n const searchValue = params.search_query ?? params.search ?? params.query;\n const tags = Array.isArray(params.tags)\n ? params.tags.filter((tag): tag is string => typeof tag === \"string\")\n : undefined;\n\n const cursor = page > 1 ? cursorCache.get(page) : undefined;\n if (page > 1 && cursor === undefined) return null;\n\n return {\n ...(typeof limitValue === \"number\" ? { \"page[limit]\": limitValue } : {}),\n ...(cursor !== undefined ? { \"page[cursor]\": cursor } : {}),\n ...(typeof searchValue === \"string\" ? { search: searchValue } : {}),\n ...(tags ? { tags } : {}),\n };\n}\n\nfunction createContactsAdapter(\n client: PortalTenantContactsHeyApiClient,\n): ContactsApi {\n return {\n getContact: async (id) => {\n const response = await contactsShow({\n client,\n path: { id: toNumericId(id) },\n });\n return { contact: mapContact(response.contact ?? {}) };\n },\n listContacts: async (params) => {\n const page = typeof params?.page === \"number\" ? params.page : 1;\n const pageSize =\n typeof params?.per_page === \"number\" ? params.per_page : 25;\n const cursorCache = cursorCacheFor(client, params);\n const query = mapListParams(params, cursorCache);\n if (query === null) {\n return {\n contacts: [],\n meta: paginationFromBff(undefined, 0, page, pageSize),\n };\n }\n const response = await contactsList({\n client,\n ...(query ? { query } : {}),\n });\n const nextCursor = response.meta?.pagination?.next_cursor;\n if (nextCursor) cursorCache.set(page + 1, nextCursor);\n\n const contacts = (response.contacts ?? []).map(mapContact);\n return {\n contacts,\n meta: paginationFromBff(response.meta, contacts.length, page, pageSize),\n };\n },\n createContact: (data) =>\n contactsCreate({\n client,\n body: { contact: data as ContactCreate },\n }),\n updateContact: (id, data) =>\n contactsUpdate({\n client,\n path: { id: toNumericId(id) },\n body: { contact: data as ContactUpdate },\n }),\n deleteContact: (id) =>\n contactsDestroy({ client, path: { id: toNumericId(id) } }),\n bulkDeleteContacts: (ids) => contactsBulkDestroy({ client, body: { ids } }),\n };\n}\n\nfunction createNotesAdapter(\n client: PortalTenantContactsHeyApiClient,\n): NotesApi {\n return {\n listNotes: async (contactId) => {\n const response = await contactsNotesList({\n client,\n path: { contact_id: toNumericId(contactId) },\n });\n return { notes: (response.notes ?? []).map(mapNote) };\n },\n createNote: (contactId, input) =>\n contactsNotesCreate({\n client,\n path: { contact_id: toNumericId(contactId) },\n body: { note: { title: input.title, body: input.body } },\n }),\n updateNote: (noteId, contactId, input) =>\n contactsNotesUpdate({\n client,\n path: { contact_id: toNumericId(contactId), id: noteId },\n body: { note: { title: input.title, body: input.body } },\n }),\n deleteNote: (noteId, contactId) =>\n contactsNotesDestroy({\n client,\n path: { contact_id: toNumericId(contactId), id: noteId },\n }),\n };\n}\n\nfunction createTasksAdapter(\n client: PortalTenantContactsHeyApiClient,\n): TasksApi {\n return {\n listTasks: async (contactId) => {\n const response = await contactsTasksList({\n client,\n path: { contact_id: toNumericId(contactId) },\n });\n return { tasks: (response.tasks ?? []).map(mapTask) };\n },\n createTask: (contactId, input) =>\n contactsTasksCreate({\n client,\n path: { contact_id: toNumericId(contactId) },\n body: { task: { title: input.body, due_date: input.due_at } },\n }),\n updateTask: (taskId, contactId, input) =>\n contactsTasksUpdate({\n client,\n path: { contact_id: toNumericId(contactId), id: taskId },\n body: {\n task: {\n title: input.body ?? undefined,\n completed:\n input.completed_at === undefined\n ? undefined\n : input.completed_at !== null,\n due_date: input.due_at,\n },\n },\n }),\n deleteTask: (taskId, contactId) =>\n contactsTasksDestroy({\n client,\n path: { contact_id: toNumericId(contactId), id: taskId },\n }),\n };\n}\n\nfunction createGroupsAdapter(\n client: PortalTenantContactsHeyApiClient,\n): GroupsApi {\n return {\n listGroups: async () => {\n const response = await contactsGroupsList({ client });\n return { groups: (response.groups ?? []).map(mapGroup) };\n },\n createGroup: async (input) => {\n const response = await contactsGroupsCreate({\n client,\n body: { group: input },\n });\n return { group: mapGroup(response.group ?? {}) };\n },\n updateGroup: async (groupId, input) => {\n const response = await contactsGroupsUpdate({\n client,\n path: { id: groupId },\n body: { group: input },\n });\n return { group: mapGroup(response.group ?? {}) };\n },\n deleteGroup: (groupId) =>\n contactsGroupsDestroy({ client, path: { id: groupId } }),\n };\n}\n\nexport function createPortalContactsDomainApiAdapter(\n client: PortalTenantContactsHeyApiClient,\n): ContactsDomainApi {\n return {\n contacts: createContactsAdapter(client),\n notes: createNotesAdapter(client),\n tasks: createTasksAdapter(client),\n groups: createGroupsAdapter(client),\n };\n}\n","import { createContext, type ReactNode, use, useMemo } from \"react\";\nimport { useAccount } from \"../hooks/use-account\";\nimport type { FluidSDKConfig } from \"../types/config\";\n\nexport interface FluidContextValue {\n readonly config: FluidSDKConfig;\n}\n\nconst FluidContext = createContext<FluidContextValue | null>(null);\n\n/**\n * Provides SDK configuration and hydrates its country from the authenticated\n * account. Shared widget hosts use this provider as part of the exhaustive\n * portal runtime contract.\n */\nexport function FluidConfigProvider({\n children,\n config,\n}: {\n children: ReactNode;\n config: FluidSDKConfig;\n}): React.JSX.Element {\n const { data: account } = useAccount();\n const value = useMemo<FluidContextValue>(() => {\n const countryIso =\n account?.market_country_iso ?? account?.default_country_iso;\n\n return {\n config: countryIso ? { ...config, countryIso } : config,\n };\n }, [config, account?.market_country_iso, account?.default_country_iso]);\n\n return (\n <FluidContext.Provider value={value}>{children}</FluidContext.Provider>\n );\n}\n\nexport function useFluidContext(): FluidContextValue {\n const context = use(FluidContext);\n if (!context) {\n throw new Error(\"useFluidContext must be used within a FluidProvider\");\n }\n return context;\n}\n","import { useMemo, useRef, type ReactElement, type ReactNode } from \"react\";\nimport type { ContactsDomainApi } from \"@fluid-app/contacts-core/contacts-api-context\";\nimport { ContactsApiProvider } from \"@fluid-app/contacts-core/contacts-api-context\";\nimport { createPortalTenantContactsHeyApiClient } from \"@fluid-app/portal-tenant-contacts-api-client/client\";\nimport { createPortalContactsDomainApiAdapter } from \"../adapters/contacts-api-adapter\";\nimport { useFluidContext } from \"../providers/FluidConfigProvider\";\n\nexport function PortalContactsApiProvider({\n children,\n api: injectedApi,\n}: {\n api?: ContactsDomainApi;\n children: ReactNode;\n}): ReactElement {\n const { config } = useFluidContext();\n const configRef = useRef(config);\n configRef.current = config;\n const { baseUrl } = config;\n const csrfToken =\n typeof document === \"undefined\"\n ? null\n : document\n .querySelector('meta[name=\"csrf-token\"]')\n ?.getAttribute(\"content\");\n\n const client = useMemo(\n () =>\n createPortalTenantContactsHeyApiClient({\n baseUrl,\n credentials: \"include\",\n defaultHeaders: {\n ...configRef.current.defaultHeaders,\n ...(csrfToken ? { \"X-CSRF-Token\": csrfToken } : {}),\n },\n onAuthError: () => configRef.current.onAuthError?.(),\n }),\n [baseUrl, csrfToken],\n );\n\n const api = useMemo(\n () => createPortalContactsDomainApiAdapter(client),\n [client],\n );\n\n return (\n <ContactsApiProvider value={injectedApi ?? api}>\n {children}\n </ContactsApiProvider>\n );\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 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 ar: () =>\n import(\"./locale/ar.json\").then(\n (m): ContactsDict => m.default as ContactsDict,\n ),\n bg: () =>\n import(\"./locale/bg.json\").then(\n (m): ContactsDict => m.default as ContactsDict,\n ),\n bn: () =>\n import(\"./locale/bn.json\").then(\n (m): ContactsDict => m.default as ContactsDict,\n ),\n cs: () =>\n import(\"./locale/cs.json\").then(\n (m): ContactsDict => m.default as ContactsDict,\n ),\n da: () =>\n import(\"./locale/da.json\").then(\n (m): ContactsDict => m.default as ContactsDict,\n ),\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 fi: () =>\n import(\"./locale/fi.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 hi: () =>\n import(\"./locale/hi.json\").then(\n (m): ContactsDict => m.default as ContactsDict,\n ),\n hr: () =>\n import(\"./locale/hr.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 ms: () =>\n import(\"./locale/ms.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 no: () =>\n import(\"./locale/no.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 sk: () =>\n import(\"./locale/sk.json\").then(\n (m): ContactsDict => m.default as ContactsDict,\n ),\n sv: () =>\n import(\"./locale/sv.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 uk: () =>\n import(\"./locale/uk.json\").then(\n (m): ContactsDict => m.default as ContactsDict,\n ),\n vi: () =>\n import(\"./locale/vi.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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"}