@fluid-app/portal-sdk 0.1.233 → 0.1.234

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 (32) hide show
  1. package/dist/{FluidProvider-BNL_Apw2.cjs → FluidProvider-BE05KBep.cjs} +3 -2
  2. package/dist/FluidProvider-BE05KBep.cjs.map +1 -0
  3. package/dist/{FluidProvider-Dg-eouRw.mjs → FluidProvider-FtpwIsLB.mjs} +3 -2
  4. package/dist/FluidProvider-FtpwIsLB.mjs.map +1 -0
  5. package/dist/{MessagingScreen-CxpLlTW_.cjs → MessagingScreen-CKWiOb9l.cjs} +210 -105
  6. package/dist/MessagingScreen-CKWiOb9l.cjs.map +1 -0
  7. package/dist/{MessagingScreen-BMoCh4MT.cjs → MessagingScreen-CWEQmvOg.cjs} +3 -2
  8. package/dist/{MessagingScreen-Q17pdhUz.mjs → MessagingScreen-CWSeAq3b.mjs} +210 -105
  9. package/dist/MessagingScreen-CWSeAq3b.mjs.map +1 -0
  10. package/dist/{ProfileScreen-CHsIDbg8.mjs → ProfileScreen-Bt5GLOa5.mjs} +2 -2
  11. package/dist/{ProfileScreen-CHsIDbg8.mjs.map → ProfileScreen-Bt5GLOa5.mjs.map} +1 -1
  12. package/dist/{ProfileScreen-BSWw10cc.cjs → ProfileScreen-YqVWD0hn.cjs} +2 -2
  13. package/dist/{ProfileScreen-CVOS2By3.cjs → ProfileScreen-dAFNEWhY.cjs} +2 -2
  14. package/dist/{ProfileScreen-CVOS2By3.cjs.map → ProfileScreen-dAFNEWhY.cjs.map} +1 -1
  15. package/dist/{ShopScreen-CFR2O1jn.cjs → ShopScreen-C3jX_bWM.cjs} +2 -2
  16. package/dist/{ShopScreen-CLN8FFiL.mjs → ShopScreen-DbTrIjfp.mjs} +2 -2
  17. package/dist/{ShopScreen-CLN8FFiL.mjs.map → ShopScreen-DbTrIjfp.mjs.map} +1 -1
  18. package/dist/{ShopScreen-jk3Y3-x8.cjs → ShopScreen-DozZEXVi.cjs} +2 -2
  19. package/dist/{ShopScreen-jk3Y3-x8.cjs.map → ShopScreen-DozZEXVi.cjs.map} +1 -1
  20. package/dist/index.cjs +32 -18
  21. package/dist/index.cjs.map +1 -1
  22. package/dist/index.d.cts +5 -0
  23. package/dist/index.d.cts.map +1 -1
  24. package/dist/index.d.mts +5 -0
  25. package/dist/index.d.mts.map +1 -1
  26. package/dist/index.mjs +32 -18
  27. package/dist/index.mjs.map +1 -1
  28. package/package.json +15 -15
  29. package/dist/FluidProvider-BNL_Apw2.cjs.map +0 -1
  30. package/dist/FluidProvider-Dg-eouRw.mjs.map +0 -1
  31. package/dist/MessagingScreen-CxpLlTW_.cjs.map +0 -1
  32. package/dist/MessagingScreen-Q17pdhUz.mjs.map +0 -1
@@ -983,7 +983,8 @@ function mapAccount(raw) {
983
983
  bio: raw.bio ?? null,
984
984
  avatar_url: raw.avatar_url ?? null,
985
985
  slug: raw.slug ?? "",
986
- social_links: raw.social_links ?? null
986
+ social_links: raw.social_links ?? null,
987
+ recipient_id: raw.recipient_id ?? null
987
988
  };
988
989
  }
989
990
  function createAccountApiAdapter(client) {
@@ -2349,4 +2350,4 @@ Object.defineProperty(exports, "widgetPropertySchemas", {
2349
2350
  }
2350
2351
  });
2351
2352
 
2352
- //# sourceMappingURL=FluidProvider-BNL_Apw2.cjs.map
2353
+ //# sourceMappingURL=FluidProvider-BE05KBep.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FluidProvider-BE05KBep.cjs","names":["#providerCalled","#provider","portalTenantPay.addresses_list","portalTenantPay.addresses_create","portalTenantPay.addresses_update","portalTenantPay.addresses_destroy","portalTenantPay.payment_methods_list","portalTenantPay.payment_methods_create","portalTenantPay.payment_methods_update","portalTenantPay.payment_methods_destroy","portalTenantPay.payment_methods_vault_show","portalTenantPay.points_ledgers_list","mapMeta","portalTenantStore.countries_list","portalTenantStore.languages_list","portalTenantMysite.mysite_profile_show","portalTenantMysite.mysite_profile_update","portalTenantMysite.mysite_settings_update","portalTenantMysite.mysite_links_list","portalTenantMysite.mysite_links_create","portalTenantMysite.mysite_links_update","portalTenantMysite.mysite_links_destroy","portalTenantMysite.mysite_links_bulk_reorder","portalTenantMysite.mysite_favorites_list","portalTenantMysite.mysite_favorites_create","portalTenantMysite.mysite_favorites_destroy","portalTenantMysite.mysite_favorites_bulk_reorder","portalTenantMysite.mysite_themes_list","resolveTheme","portalTenantMysite.mysite_profile_show","portalTenantPay.points_ledgers_list","usePortalTenantClient","WidgetsApiProvider","QueryClient","createPortalTenantFetchClient","createPortalTenantContentFetchClient","QueryClientProvider","PortalTenantClientProvider","AccountApiProvider","StoreApiProvider","PayApiProvider","CountriesApiProvider","MySiteApiProvider","DataSourceApiProvider","DataSourceRegistryProvider","RegistryProvider"],"sources":["../../../../node_modules/.pnpm/@tanstack+query-core@5.90.12/node_modules/@tanstack/query-core/build/modern/timeoutManager.js","../../../../node_modules/.pnpm/@tanstack+query-core@5.90.12/node_modules/@tanstack/query-core/build/modern/utils.js","../../../../node_modules/.pnpm/@tanstack+query-core@5.90.12/node_modules/@tanstack/query-core/build/modern/notifyManager.js","../../../../node_modules/.pnpm/@tanstack+query-persist-client-core@5.91.11/node_modules/@tanstack/query-persist-client-core/build/modern/createPersister.js","../../../platform/query-persister/src/persister.ts","../../core/src/app-definition-api-context.ts","../../../store/core/src/languages-api-context.ts","../../../platform/api-client-core/src/fetch-client.ts","../src/adapters/data-source-api-adapter.ts","../src/adapters/app-definition-api-adapter.ts","../src/adapters/account-api-adapter.ts","../src/adapters/store-api-adapter.ts","../../../api-clients/portal-tenant-pay/src/namespaces/portal_tenant_pay.ts","../src/adapters/pay-api-adapter.ts","../../../api-clients/portal-tenant-store/src/namespaces/portal_tenant_store.ts","../src/adapters/countries-api-adapter.ts","../src/adapters/languages-api-adapter.ts","../../../api-clients/portal-tenant-mysite/src/namespaces/portal_tenant_mysite.ts","../src/adapters/mysite-api-adapter.ts","../src/providers/FluidThemeProvider.tsx","../src/adapters/widgets-api-adapter.ts","../src/widgets/PortalWidgetsApiProvider.tsx","../../core/src/widget-utils/utils.ts","../../widgets/src/widgets/index.ts","../src/core/default-widget-registry.ts","../src/providers/FluidProvider.tsx"],"sourcesContent":["// src/timeoutManager.ts\nvar defaultTimeoutProvider = {\n // We need the wrapper function syntax below instead of direct references to\n // global setTimeout etc.\n //\n // BAD: `setTimeout: setTimeout`\n // GOOD: `setTimeout: (cb, delay) => setTimeout(cb, delay)`\n //\n // If we use direct references here, then anything that wants to spy on or\n // replace the global setTimeout (like tests) won't work since we'll already\n // have a hard reference to the original implementation at the time when this\n // file was imported.\n setTimeout: (callback, delay) => setTimeout(callback, delay),\n clearTimeout: (timeoutId) => clearTimeout(timeoutId),\n setInterval: (callback, delay) => setInterval(callback, delay),\n clearInterval: (intervalId) => clearInterval(intervalId)\n};\nvar TimeoutManager = class {\n // We cannot have TimeoutManager<T> as we must instantiate it with a concrete\n // type at app boot; and if we leave that type, then any new timer provider\n // would need to support ReturnType<typeof setTimeout>, which is infeasible.\n //\n // We settle for type safety for the TimeoutProvider type, and accept that\n // this class is unsafe internally to allow for extension.\n #provider = defaultTimeoutProvider;\n #providerCalled = false;\n setTimeoutProvider(provider) {\n if (process.env.NODE_ENV !== \"production\") {\n if (this.#providerCalled && provider !== this.#provider) {\n console.error(\n `[timeoutManager]: Switching provider after calls to previous provider might result in unexpected behavior.`,\n { previous: this.#provider, provider }\n );\n }\n }\n this.#provider = provider;\n if (process.env.NODE_ENV !== \"production\") {\n this.#providerCalled = false;\n }\n }\n setTimeout(callback, delay) {\n if (process.env.NODE_ENV !== \"production\") {\n this.#providerCalled = true;\n }\n return this.#provider.setTimeout(callback, delay);\n }\n clearTimeout(timeoutId) {\n this.#provider.clearTimeout(timeoutId);\n }\n setInterval(callback, delay) {\n if (process.env.NODE_ENV !== \"production\") {\n this.#providerCalled = true;\n }\n return this.#provider.setInterval(callback, delay);\n }\n clearInterval(intervalId) {\n this.#provider.clearInterval(intervalId);\n }\n};\nvar timeoutManager = new TimeoutManager();\nfunction systemSetTimeoutZero(callback) {\n setTimeout(callback, 0);\n}\nexport {\n TimeoutManager,\n defaultTimeoutProvider,\n systemSetTimeoutZero,\n timeoutManager\n};\n//# sourceMappingURL=timeoutManager.js.map","// src/utils.ts\nimport { timeoutManager } from \"./timeoutManager.js\";\nvar isServer = typeof window === \"undefined\" || \"Deno\" in globalThis;\nfunction noop() {\n}\nfunction functionalUpdate(updater, input) {\n return typeof updater === \"function\" ? updater(input) : updater;\n}\nfunction isValidTimeout(value) {\n return typeof value === \"number\" && value >= 0 && value !== Infinity;\n}\nfunction timeUntilStale(updatedAt, staleTime) {\n return Math.max(updatedAt + (staleTime || 0) - Date.now(), 0);\n}\nfunction resolveStaleTime(staleTime, query) {\n return typeof staleTime === \"function\" ? staleTime(query) : staleTime;\n}\nfunction resolveEnabled(enabled, query) {\n return typeof enabled === \"function\" ? enabled(query) : enabled;\n}\nfunction matchQuery(filters, query) {\n const {\n type = \"all\",\n exact,\n fetchStatus,\n predicate,\n queryKey,\n stale\n } = filters;\n if (queryKey) {\n if (exact) {\n if (query.queryHash !== hashQueryKeyByOptions(queryKey, query.options)) {\n return false;\n }\n } else if (!partialMatchKey(query.queryKey, queryKey)) {\n return false;\n }\n }\n if (type !== \"all\") {\n const isActive = query.isActive();\n if (type === \"active\" && !isActive) {\n return false;\n }\n if (type === \"inactive\" && isActive) {\n return false;\n }\n }\n if (typeof stale === \"boolean\" && query.isStale() !== stale) {\n return false;\n }\n if (fetchStatus && fetchStatus !== query.state.fetchStatus) {\n return false;\n }\n if (predicate && !predicate(query)) {\n return false;\n }\n return true;\n}\nfunction matchMutation(filters, mutation) {\n const { exact, status, predicate, mutationKey } = filters;\n if (mutationKey) {\n if (!mutation.options.mutationKey) {\n return false;\n }\n if (exact) {\n if (hashKey(mutation.options.mutationKey) !== hashKey(mutationKey)) {\n return false;\n }\n } else if (!partialMatchKey(mutation.options.mutationKey, mutationKey)) {\n return false;\n }\n }\n if (status && mutation.state.status !== status) {\n return false;\n }\n if (predicate && !predicate(mutation)) {\n return false;\n }\n return true;\n}\nfunction hashQueryKeyByOptions(queryKey, options) {\n const hashFn = options?.queryKeyHashFn || hashKey;\n return hashFn(queryKey);\n}\nfunction hashKey(queryKey) {\n return JSON.stringify(\n queryKey,\n (_, val) => isPlainObject(val) ? Object.keys(val).sort().reduce((result, key) => {\n result[key] = val[key];\n return result;\n }, {}) : val\n );\n}\nfunction partialMatchKey(a, b) {\n if (a === b) {\n return true;\n }\n if (typeof a !== typeof b) {\n return false;\n }\n if (a && b && typeof a === \"object\" && typeof b === \"object\") {\n return Object.keys(b).every((key) => partialMatchKey(a[key], b[key]));\n }\n return false;\n}\nvar hasOwn = Object.prototype.hasOwnProperty;\nfunction replaceEqualDeep(a, b) {\n if (a === b) {\n return a;\n }\n const array = isPlainArray(a) && isPlainArray(b);\n if (!array && !(isPlainObject(a) && isPlainObject(b))) return b;\n const aItems = array ? a : Object.keys(a);\n const aSize = aItems.length;\n const bItems = array ? b : Object.keys(b);\n const bSize = bItems.length;\n const copy = array ? new Array(bSize) : {};\n let equalItems = 0;\n for (let i = 0; i < bSize; i++) {\n const key = array ? i : bItems[i];\n const aItem = a[key];\n const bItem = b[key];\n if (aItem === bItem) {\n copy[key] = aItem;\n if (array ? i < aSize : hasOwn.call(a, key)) equalItems++;\n continue;\n }\n if (aItem === null || bItem === null || typeof aItem !== \"object\" || typeof bItem !== \"object\") {\n copy[key] = bItem;\n continue;\n }\n const v = replaceEqualDeep(aItem, bItem);\n copy[key] = v;\n if (v === aItem) equalItems++;\n }\n return aSize === bSize && equalItems === aSize ? a : copy;\n}\nfunction shallowEqualObjects(a, b) {\n if (!b || Object.keys(a).length !== Object.keys(b).length) {\n return false;\n }\n for (const key in a) {\n if (a[key] !== b[key]) {\n return false;\n }\n }\n return true;\n}\nfunction isPlainArray(value) {\n return Array.isArray(value) && value.length === Object.keys(value).length;\n}\nfunction isPlainObject(o) {\n if (!hasObjectPrototype(o)) {\n return false;\n }\n const ctor = o.constructor;\n if (ctor === void 0) {\n return true;\n }\n const prot = ctor.prototype;\n if (!hasObjectPrototype(prot)) {\n return false;\n }\n if (!prot.hasOwnProperty(\"isPrototypeOf\")) {\n return false;\n }\n if (Object.getPrototypeOf(o) !== Object.prototype) {\n return false;\n }\n return true;\n}\nfunction hasObjectPrototype(o) {\n return Object.prototype.toString.call(o) === \"[object Object]\";\n}\nfunction sleep(timeout) {\n return new Promise((resolve) => {\n timeoutManager.setTimeout(resolve, timeout);\n });\n}\nfunction replaceData(prevData, data, options) {\n if (typeof options.structuralSharing === \"function\") {\n return options.structuralSharing(prevData, data);\n } else if (options.structuralSharing !== false) {\n if (process.env.NODE_ENV !== \"production\") {\n try {\n return replaceEqualDeep(prevData, data);\n } catch (error) {\n console.error(\n `Structural sharing requires data to be JSON serializable. To fix this, turn off structuralSharing or return JSON-serializable data from your queryFn. [${options.queryHash}]: ${error}`\n );\n throw error;\n }\n }\n return replaceEqualDeep(prevData, data);\n }\n return data;\n}\nfunction keepPreviousData(previousData) {\n return previousData;\n}\nfunction addToEnd(items, item, max = 0) {\n const newItems = [...items, item];\n return max && newItems.length > max ? newItems.slice(1) : newItems;\n}\nfunction addToStart(items, item, max = 0) {\n const newItems = [item, ...items];\n return max && newItems.length > max ? newItems.slice(0, -1) : newItems;\n}\nvar skipToken = Symbol();\nfunction ensureQueryFn(options, fetchOptions) {\n if (process.env.NODE_ENV !== \"production\") {\n if (options.queryFn === skipToken) {\n console.error(\n `Attempted to invoke queryFn when set to skipToken. This is likely a configuration error. Query hash: '${options.queryHash}'`\n );\n }\n }\n if (!options.queryFn && fetchOptions?.initialPromise) {\n return () => fetchOptions.initialPromise;\n }\n if (!options.queryFn || options.queryFn === skipToken) {\n return () => Promise.reject(new Error(`Missing queryFn: '${options.queryHash}'`));\n }\n return options.queryFn;\n}\nfunction shouldThrowError(throwOnError, params) {\n if (typeof throwOnError === \"function\") {\n return throwOnError(...params);\n }\n return !!throwOnError;\n}\nexport {\n addToEnd,\n addToStart,\n ensureQueryFn,\n functionalUpdate,\n hashKey,\n hashQueryKeyByOptions,\n isPlainArray,\n isPlainObject,\n isServer,\n isValidTimeout,\n keepPreviousData,\n matchMutation,\n matchQuery,\n noop,\n partialMatchKey,\n replaceData,\n replaceEqualDeep,\n resolveEnabled,\n resolveStaleTime,\n shallowEqualObjects,\n shouldThrowError,\n skipToken,\n sleep,\n timeUntilStale\n};\n//# sourceMappingURL=utils.js.map","// src/notifyManager.ts\nimport { systemSetTimeoutZero } from \"./timeoutManager.js\";\nvar defaultScheduler = systemSetTimeoutZero;\nfunction createNotifyManager() {\n let queue = [];\n let transactions = 0;\n let notifyFn = (callback) => {\n callback();\n };\n let batchNotifyFn = (callback) => {\n callback();\n };\n let scheduleFn = defaultScheduler;\n const schedule = (callback) => {\n if (transactions) {\n queue.push(callback);\n } else {\n scheduleFn(() => {\n notifyFn(callback);\n });\n }\n };\n const flush = () => {\n const originalQueue = queue;\n queue = [];\n if (originalQueue.length) {\n scheduleFn(() => {\n batchNotifyFn(() => {\n originalQueue.forEach((callback) => {\n notifyFn(callback);\n });\n });\n });\n }\n };\n return {\n batch: (callback) => {\n let result;\n transactions++;\n try {\n result = callback();\n } finally {\n transactions--;\n if (!transactions) {\n flush();\n }\n }\n return result;\n },\n /**\n * All calls to the wrapped function will be batched.\n */\n batchCalls: (callback) => {\n return (...args) => {\n schedule(() => {\n callback(...args);\n });\n };\n },\n schedule,\n /**\n * Use this method to set a custom notify function.\n * This can be used to for example wrap notifications with `React.act` while running tests.\n */\n setNotifyFunction: (fn) => {\n notifyFn = fn;\n },\n /**\n * Use this method to set a custom function to batch notifications together into a single tick.\n * By default React Query will use the batch function provided by ReactDOM or React Native.\n */\n setBatchNotifyFunction: (fn) => {\n batchNotifyFn = fn;\n },\n setScheduler: (fn) => {\n scheduleFn = fn;\n }\n };\n}\nvar notifyManager = createNotifyManager();\nexport {\n createNotifyManager,\n defaultScheduler,\n notifyManager\n};\n//# sourceMappingURL=notifyManager.js.map","// src/createPersister.ts\nimport {\n hashKey,\n matchQuery,\n notifyManager,\n partialMatchKey\n} from \"@tanstack/query-core\";\nvar PERSISTER_KEY_PREFIX = \"tanstack-query\";\nfunction experimental_createQueryPersister({\n storage,\n buster = \"\",\n maxAge = 1e3 * 60 * 60 * 24,\n serialize = JSON.stringify,\n deserialize = JSON.parse,\n prefix = PERSISTER_KEY_PREFIX,\n refetchOnRestore = true,\n filters\n}) {\n function isExpiredOrBusted(persistedQuery) {\n if (persistedQuery.state.dataUpdatedAt) {\n const queryAge = Date.now() - persistedQuery.state.dataUpdatedAt;\n const expired = queryAge > maxAge;\n const busted = persistedQuery.buster !== buster;\n if (expired || busted) {\n return true;\n }\n return false;\n }\n return true;\n }\n async function retrieveQuery(queryHash, afterRestoreMacroTask) {\n if (storage != null) {\n const storageKey = `${prefix}-${queryHash}`;\n try {\n const storedData = await storage.getItem(storageKey);\n if (storedData) {\n const persistedQuery = await deserialize(storedData);\n if (isExpiredOrBusted(persistedQuery)) {\n await storage.removeItem(storageKey);\n } else {\n if (afterRestoreMacroTask) {\n notifyManager.schedule(\n () => afterRestoreMacroTask(persistedQuery)\n );\n }\n return persistedQuery.state.data;\n }\n }\n } catch (err) {\n if (process.env.NODE_ENV === \"development\") {\n console.error(err);\n console.warn(\n \"Encountered an error attempting to restore query cache from persisted location.\"\n );\n }\n await storage.removeItem(storageKey);\n }\n }\n return;\n }\n async function persistQueryByKey(queryKey, queryClient) {\n if (storage != null) {\n const query = queryClient.getQueryCache().find({ queryKey });\n if (query) {\n await persistQuery(query);\n } else {\n if (process.env.NODE_ENV === \"development\") {\n console.warn(\n \"Could not find query to be persisted. QueryKey:\",\n JSON.stringify(queryKey)\n );\n }\n }\n }\n }\n async function persistQuery(query) {\n if (storage != null) {\n const storageKey = `${prefix}-${query.queryHash}`;\n storage.setItem(\n storageKey,\n await serialize({\n state: query.state,\n queryKey: query.queryKey,\n queryHash: query.queryHash,\n buster\n })\n );\n }\n }\n async function persisterFn(queryFn, ctx, query) {\n const matchesFilter = filters ? matchQuery(filters, query) : true;\n if (matchesFilter && query.state.data === void 0 && storage != null) {\n const restoredData = await retrieveQuery(\n query.queryHash,\n (persistedQuery) => {\n query.setState({\n dataUpdatedAt: persistedQuery.state.dataUpdatedAt,\n errorUpdatedAt: persistedQuery.state.errorUpdatedAt\n });\n if (refetchOnRestore === \"always\" || refetchOnRestore === true && query.isStale()) {\n query.fetch();\n }\n }\n );\n if (restoredData !== void 0) {\n return Promise.resolve(restoredData);\n }\n }\n const queryFnResult = await queryFn(ctx);\n if (matchesFilter && storage != null) {\n notifyManager.schedule(() => {\n persistQuery(query);\n });\n }\n return Promise.resolve(queryFnResult);\n }\n async function persisterGc() {\n if (storage?.entries) {\n const entries = await storage.entries();\n for (const [key, value] of entries) {\n if (key.startsWith(prefix)) {\n const persistedQuery = await deserialize(value);\n if (isExpiredOrBusted(persistedQuery)) {\n await storage.removeItem(key);\n }\n }\n }\n } else if (process.env.NODE_ENV === \"development\") {\n throw new Error(\n \"Provided storage does not implement `entries` method. Garbage collection is not possible without ability to iterate over storage items.\"\n );\n }\n }\n async function restoreQueries(queryClient, filters2 = {}) {\n const { exact, queryKey } = filters2;\n if (storage?.entries) {\n const entries = await storage.entries();\n for (const [key, value] of entries) {\n if (key.startsWith(prefix)) {\n const persistedQuery = await deserialize(value);\n if (isExpiredOrBusted(persistedQuery)) {\n await storage.removeItem(key);\n continue;\n }\n if (queryKey) {\n if (exact) {\n if (persistedQuery.queryHash !== hashKey(queryKey)) {\n continue;\n }\n } else if (!partialMatchKey(persistedQuery.queryKey, queryKey)) {\n continue;\n }\n }\n queryClient.setQueryData(\n persistedQuery.queryKey,\n persistedQuery.state.data,\n {\n updatedAt: persistedQuery.state.dataUpdatedAt\n }\n );\n }\n }\n } else if (process.env.NODE_ENV === \"development\") {\n throw new Error(\n \"Provided storage does not implement `entries` method. Restoration of all stored entries is not possible without ability to iterate over storage items.\"\n );\n }\n }\n return {\n persisterFn,\n persistQuery,\n persistQueryByKey,\n retrieveQuery,\n persisterGc,\n restoreQueries\n };\n}\nexport {\n PERSISTER_KEY_PREFIX,\n experimental_createQueryPersister\n};\n//# sourceMappingURL=createPersister.js.map","import {\n type AsyncStorage,\n experimental_createQueryPersister,\n type PersistedQuery,\n} from \"@tanstack/react-query-persist-client\";\n\nconst DB_NAME = \"fluid_tanstack_query_cache\";\nconst STORE_NAME = \"fluid_queries\";\nconst VERSION = 1;\n\nlet dbPromise: Promise<IDBDatabase> | null = null;\n\n// Exported for testing - allows resetting internal state between tests\nexport function _resetForTesting(): void {\n dbPromise = null;\n}\n\nexport async function deleteDatabase(reason: string = \"error\"): Promise<void> {\n return new Promise((resolve, reject) => {\n console.warn(`[IDB] Deleting database due to ${reason}`);\n const req = indexedDB.deleteDatabase(DB_NAME);\n req.onsuccess = () => {\n console.log(\"[IDB] Database deleted successfully\");\n dbPromise = null; // ensure next getDb() opens a fresh connection\n resolve();\n };\n req.onerror = () => {\n console.error(\"[IDB] Failed to delete database:\", req.error);\n reject(req.error ?? new Error(\"deleteDatabase failed\"));\n };\n req.onblocked = () => {\n console.warn(\"[IDB] Delete blocked: close all tabs using this database\");\n // Resolve anyway so callers (e.g. clearCompanyCache) don't hang\n // indefinitely. The delete will complete once blocking connections close.\n dbPromise = null; // best-effort: allow fresh open on next access\n resolve();\n };\n });\n}\n\nfunction openDatabase(): Promise<IDBDatabase> {\n return new Promise((resolve, reject) => {\n const req = indexedDB.open(DB_NAME, VERSION);\n\n req.onupgradeneeded = () => {\n const upgradeDb = req.result;\n if (!upgradeDb.objectStoreNames.contains(STORE_NAME)) {\n upgradeDb.createObjectStore(STORE_NAME);\n }\n };\n\n req.onsuccess = () => {\n const conn = req.result;\n conn.onversionchange = () => {\n console.trace(\"[IDB] version change – closing connection\");\n conn.close();\n // clear the cached promise so the next getDb call re-opens a connection\n dbPromise = null;\n };\n resolve(conn);\n };\n\n req.onblocked = () => {\n console.warn(\"[IDB] open blocked: another connection is holding the DB\");\n };\n\n req.onerror = () => {\n reject(\n req.error instanceof Error\n ? req.error\n : new Error(`IndexedDB open failed: ${String(req.error)}`),\n );\n };\n });\n}\n\nasync function getDbWithRecovery(): Promise<IDBDatabase> {\n try {\n return await openDatabase();\n } catch (err) {\n // First open failed - try to delete and recreate\n console.warn(\"[IDB] Initial open failed, attempting recovery:\", err);\n try {\n await deleteDatabase();\n console.log(\"[IDB] Retrying database open after deletion\");\n return await openDatabase();\n } catch (retryErr) {\n console.error(\"[IDB] Recovery failed:\", retryErr);\n throw retryErr;\n }\n }\n}\n\nfunction getDb(): Promise<IDBDatabase> {\n if (dbPromise) return dbPromise;\n\n // Create the promise and cache it immediately to prevent race conditions\n // All concurrent calls will share this same promise\n dbPromise = getDbWithRecovery().catch((err) => {\n // On failure, clear the cache so next call can retry fresh\n dbPromise = null;\n throw err;\n });\n\n return dbPromise;\n}\n\n// Exported for testing - allows direct testing of storage operations\nexport const storage: AsyncStorage<PersistedQuery> = {\n async getItem(key: string) {\n try {\n const db = await getDb();\n return new Promise<PersistedQuery | undefined>((res) => {\n try {\n const r = db\n .transaction(STORE_NAME, \"readonly\")\n .objectStore(STORE_NAME)\n .get(key);\n r.onsuccess = () => res(r.result as PersistedQuery);\n r.onerror = () => {\n console.trace(\"[IDB] getItem error:\", r.error);\n res(undefined);\n };\n } catch (txErr) {\n // Transaction creation failed (e.g., stale connection)\n console.trace(\"[IDB] getItem transaction error:\", txErr);\n res(undefined);\n }\n });\n } catch (err) {\n // getDb() failed - try to recover with a fresh connection\n console.trace(\"[IDB] getItem getDb error:\", err);\n try {\n const db = await getDb();\n // Use fresh connection directly - getDb() already handles recovery\n return new Promise<PersistedQuery | undefined>((res) => {\n try {\n const r = db\n .transaction(STORE_NAME, \"readonly\")\n .objectStore(STORE_NAME)\n .get(key);\n r.onsuccess = () => res(r.result as PersistedQuery);\n r.onerror = () => {\n console.trace(\"[IDB] getItem retry error:\", r.error);\n res(undefined);\n };\n } catch (txErr) {\n console.trace(\"[IDB] getItem retry transaction error:\", txErr);\n res(undefined);\n }\n });\n } catch (recoveryErr) {\n console.trace(\"[IDB] getItem recovery failed:\", recoveryErr);\n }\n return undefined;\n }\n },\n\n async setItem(key: string, value: PersistedQuery) {\n // JSON round-trip strips non-cloneable properties (functions, class instances)\n // before IndexedDB's structured clone algorithm runs. Without this, IDB\n // throws DataCloneError. Theme Color objects are now kept out of the cache\n // via the select pattern, but other queries may still have non-cloneable data.\n const cloneableValue = JSON.parse(JSON.stringify(value));\n try {\n const db = await getDb();\n if (!db) return;\n await new Promise<void>((resolve) => {\n try {\n const req = db\n .transaction(STORE_NAME, \"readwrite\")\n .objectStore(STORE_NAME)\n .put(cloneableValue, key);\n req.onsuccess = () => resolve();\n req.onerror = () => {\n console.trace(\"[IDB] setItem error:\", req.error);\n resolve();\n };\n } catch (txErr) {\n console.trace(\"[IDB] setItem transaction error:\", txErr);\n resolve();\n }\n });\n } catch (err) {\n // getDb() failed - try to recover with a fresh connection\n console.trace(\"[IDB] setItem getDb error:\", err);\n try {\n const db = await getDb();\n // Use fresh connection directly - getDb() already handles recovery\n await new Promise<void>((resolve) => {\n try {\n const req = db\n .transaction(STORE_NAME, \"readwrite\")\n .objectStore(STORE_NAME)\n .put(cloneableValue, key);\n req.onsuccess = () => resolve();\n req.onerror = () => {\n console.trace(\"[IDB] setItem retry error:\", req.error);\n resolve();\n };\n } catch (txErr) {\n console.trace(\"[IDB] setItem retry transaction error:\", txErr);\n resolve();\n }\n });\n } catch (recoveryErr) {\n console.trace(\"[IDB] setItem recovery failed:\", recoveryErr);\n }\n }\n },\n\n async removeItem(key: string) {\n try {\n const db = await getDb();\n if (!db) return;\n await new Promise<void>((resolve) => {\n try {\n const req = db\n .transaction(STORE_NAME, \"readwrite\")\n .objectStore(STORE_NAME)\n .delete(key);\n req.onsuccess = () => resolve();\n req.onerror = () => {\n console.trace(\"[IDB] removeItem error:\", req.error);\n resolve();\n };\n } catch (txErr) {\n console.trace(\"[IDB] removeItem transaction error:\", txErr);\n resolve();\n }\n });\n } catch (err) {\n // getDb() failed - try to recover with a fresh connection\n console.trace(\"[IDB] removeItem getDb error:\", err);\n try {\n const db = await getDb();\n // Use fresh connection directly - getDb() already handles recovery\n await new Promise<void>((resolve) => {\n try {\n const req = db\n .transaction(STORE_NAME, \"readwrite\")\n .objectStore(STORE_NAME)\n .delete(key);\n req.onsuccess = () => resolve();\n req.onerror = () => {\n console.trace(\"[IDB] removeItem retry error:\", req.error);\n resolve();\n };\n } catch (txErr) {\n console.trace(\"[IDB] removeItem retry transaction error:\", txErr);\n resolve();\n }\n });\n } catch (recoveryErr) {\n console.trace(\"[IDB] removeItem recovery failed:\", recoveryErr);\n }\n }\n },\n};\n\n// Factory function to create persister - only call this client-side\nexport function createPersister(): ReturnType<\n typeof experimental_createQueryPersister\n> {\n return experimental_createQueryPersister<PersistedQuery>({\n storage,\n serialize: (persistedQuery) => persistedQuery,\n deserialize: (cached) => cached,\n });\n}\n","import { createContext, useContext, type Provider } from \"react\";\nimport type { AppDefinitionApi } from \"./app-definition-api\";\n\nconst AppDefinitionApiContext = createContext<AppDefinitionApi | null>(null);\n\nexport const AppDefinitionApiProvider: Provider<AppDefinitionApi | null> =\n AppDefinitionApiContext.Provider;\n\nexport function useAppDefinitionApi(): AppDefinitionApi {\n const api = useContext(AppDefinitionApiContext);\n if (!api) {\n throw new Error(\n \"useAppDefinitionApi must be used within an AppDefinitionApiProvider\",\n );\n }\n return api;\n}\n","import { createContext, useContext, type Provider } from \"react\";\nimport type { LanguagesApi } from \"./languages-api\";\n\nconst LanguagesApiContext = createContext<LanguagesApi | null>(null);\n\nexport const LanguagesApiProvider: Provider<LanguagesApi | null> =\n LanguagesApiContext.Provider;\n\nexport function useLanguagesApi(): LanguagesApi {\n const api = useContext(LanguagesApiContext);\n if (!api) {\n throw new Error(\n \"useLanguagesApi must be used within a LanguagesApiProvider\",\n );\n }\n return api;\n}\n","/**\n * Minimal, framework-agnostic fetch client for Fluid APIs\n * Compatible with fluid-admin patterns but usable standalone\n */\n\nexport interface FetchClientConfig {\n /**\n * Base URL for all requests (e.g., \"https://api.fluid.app/api\")\n */\n baseUrl: string;\n\n /**\n * Optional function to get auth token\n * Return null/undefined if no token available\n */\n getAuthToken?: () => string | null | Promise<string | null>;\n\n /**\n * Optional callback when 401 auth error occurs\n */\n onAuthError?: () => void;\n\n /**\n * Default headers to include in all requests\n * Example: { \"x-fluid-client\": \"admin\" }\n */\n defaultHeaders?: Record<string, string>;\n\n /**\n * Credentials mode for fetch requests.\n * Set to `\"include\"` for cookie-based (same-origin BFF) authentication.\n * @default undefined (browser default: \"same-origin\")\n */\n credentials?: RequestCredentials;\n}\n\nexport interface RequestOptions {\n method?: \"GET\" | \"POST\" | \"PUT\" | \"DELETE\" | \"PATCH\";\n headers?: Record<string, string>;\n params?: Record<string, unknown>;\n body?: unknown;\n signal?: AbortSignal;\n}\n\n/**\n * API Error class compatible with fluid-admin's ApiError\n */\nexport class ApiError extends Error {\n public readonly status: number;\n public readonly data: unknown;\n\n constructor(message: string, status: number, data?: unknown) {\n super(message);\n this.name = \"ApiError\";\n this.status = status;\n this.data = data;\n\n if (\"captureStackTrace\" in Error) {\n (\n Error as {\n captureStackTrace: (\n target: Error,\n constructor: NewableFunction,\n ) => void;\n }\n ).captureStackTrace(this, ApiError);\n }\n }\n\n toJSON(): { name: string; message: string; status: number; data: unknown } {\n return {\n name: this.name,\n message: this.message,\n status: this.status,\n data: this.data,\n };\n }\n}\n\n/**\n * Type guard for ApiError\n */\nexport function isApiError(error: unknown): error is ApiError {\n return error instanceof ApiError;\n}\n\nexport interface FetchClientInstance {\n request: <TResponse = unknown>(\n endpoint: string,\n options?: RequestOptions,\n ) => Promise<TResponse>;\n requestWithFormData: <TResponse = unknown>(\n endpoint: string,\n formData: FormData,\n options?: Omit<RequestOptions, \"body\" | \"params\"> & {\n method?: \"POST\" | \"PUT\" | \"PATCH\";\n },\n ) => Promise<TResponse>;\n get: <TResponse = unknown>(\n endpoint: string,\n params?: Record<string, unknown>,\n options?: Omit<RequestOptions, \"method\" | \"params\">,\n ) => Promise<TResponse>;\n post: <TResponse = unknown>(\n endpoint: string,\n body?: unknown,\n options?: Omit<RequestOptions, \"method\" | \"body\">,\n ) => Promise<TResponse>;\n put: <TResponse = unknown>(\n endpoint: string,\n body?: unknown,\n options?: Omit<RequestOptions, \"method\" | \"body\">,\n ) => Promise<TResponse>;\n patch: <TResponse = unknown>(\n endpoint: string,\n body?: unknown,\n options?: Omit<RequestOptions, \"method\" | \"body\">,\n ) => Promise<TResponse>;\n delete: <TResponse = unknown>(\n endpoint: string,\n options?: Omit<RequestOptions, \"method\">,\n ) => Promise<TResponse>;\n}\n\n/**\n * Creates a configured fetch client instance\n */\nexport function createFetchClient(\n config: FetchClientConfig,\n): FetchClientInstance {\n const {\n baseUrl,\n getAuthToken,\n onAuthError,\n defaultHeaders = {},\n credentials,\n } = config;\n\n /**\n * Build headers for a request\n */\n async function buildHeaders(\n customHeaders?: Record<string, string>,\n ): Promise<Record<string, string>> {\n const headers: Record<string, string> = {\n Accept: \"application/json\",\n \"Content-Type\": \"application/json\",\n ...defaultHeaders,\n ...customHeaders,\n };\n\n // Add auth token if available\n if (getAuthToken) {\n const token = await getAuthToken();\n if (token) {\n headers.Authorization = `Bearer ${token}`;\n }\n }\n\n return headers;\n }\n\n /**\n * Join baseUrl + endpoint via string concatenation (matches fetchApi).\n * Using `new URL(endpoint, baseUrl)` would strip any path prefix from\n * baseUrl (e.g. \"/api\") when the endpoint starts with \"/\".\n */\n function joinUrl(endpoint: string): string {\n return `${baseUrl}${endpoint}`;\n }\n\n /**\n * Build URL with query parameters for GET requests\n * Compatible with fluid-admin's query param handling\n */\n function buildUrl(\n endpoint: string,\n params?: Record<string, unknown>,\n ): string {\n const fullUrl = joinUrl(endpoint);\n\n if (!params || Object.keys(params).length === 0) {\n return fullUrl;\n }\n\n const queryString = new URLSearchParams();\n\n Object.entries(params).forEach(([key, value]) => {\n if (value === undefined || value === null) {\n return; // Skip undefined/null values\n }\n\n if (Array.isArray(value)) {\n // Handle arrays like Rails expects: key[]\n value.forEach((item) => queryString.append(`${key}[]`, String(item)));\n } else if (typeof value === \"object\") {\n // Handle nested objects: key[subkey]\n Object.entries(value).forEach(([subKey, subValue]) => {\n if (subValue === undefined || subValue === null) {\n return;\n }\n\n if (Array.isArray(subValue)) {\n subValue.forEach((item) =>\n queryString.append(`${key}[${subKey}][]`, String(item)),\n );\n } else {\n queryString.append(`${key}[${subKey}]`, String(subValue));\n }\n });\n } else {\n queryString.append(key, String(value));\n }\n });\n\n const qs = queryString.toString();\n return qs ? `${fullUrl}?${qs}` : fullUrl;\n }\n\n /**\n * Shared response handler for both JSON and FormData requests.\n * Handles auth errors, non-OK responses, 204 No Content, and JSON parsing.\n */\n async function handleResponse<TResponse>(\n response: Response,\n method: string,\n _url: string,\n ): Promise<TResponse> {\n if (response.status === 401 && onAuthError) {\n onAuthError();\n }\n\n if (!response.ok) {\n // Read body as text first to avoid SyntaxError from response.json()\n // when server returns non-JSON bodies with application/json content-type.\n const errorText = await response.text().catch(() => \"\");\n const contentType = response.headers.get(\"content-type\");\n\n if (contentType?.includes(\"application/json\")) {\n let data: Record<string, unknown>;\n try {\n data = JSON.parse(errorText);\n } catch {\n throw new ApiError(\n errorText.slice(0, 200) ||\n `${method} request failed with status ${response.status}`,\n response.status,\n null,\n );\n }\n const msg = (data.message || data.error_message) as string | undefined;\n throw new ApiError(\n msg || `${method} request failed`,\n response.status,\n data.errors || data,\n );\n } else {\n throw new ApiError(\n `${method} request failed with status ${response.status}`,\n response.status,\n null,\n );\n }\n }\n\n if (\n response.status === 204 ||\n response.headers.get(\"content-length\") === \"0\"\n ) {\n return null as TResponse;\n }\n\n const contentType = response.headers.get(\"content-type\");\n\n if (contentType?.includes(\"application/json\")) {\n try {\n const data = await response.json();\n return data as TResponse;\n } catch {\n try {\n // API declared JSON content-type but body isn't valid JSON\n const text = await response.text();\n return text as TResponse;\n } catch {\n return null as TResponse;\n }\n }\n }\n\n // Non-JSON response (text/plain, text/html, etc.)\n return null as TResponse;\n }\n\n /**\n * Main request function\n */\n async function request<TResponse = unknown>(\n endpoint: string,\n options: RequestOptions = {},\n ): Promise<TResponse> {\n const {\n method = \"GET\",\n headers: customHeaders,\n params,\n body,\n signal,\n } = options;\n\n const url = params ? buildUrl(endpoint, params) : joinUrl(endpoint);\n\n const headers = await buildHeaders(customHeaders);\n\n let response: Response;\n\n try {\n const fetchOptions: RequestInit = { method, headers };\n if (credentials) fetchOptions.credentials = credentials;\n const serializedBody =\n body && method !== \"GET\" ? JSON.stringify(body) : null;\n if (serializedBody) fetchOptions.body = serializedBody;\n if (signal) fetchOptions.signal = signal;\n response = await fetch(url, fetchOptions);\n } catch (networkError) {\n throw new ApiError(\n `Network error: ${networkError instanceof Error ? networkError.message : \"Unknown network error\"}`,\n 0,\n null,\n );\n }\n\n return handleResponse<TResponse>(response, method, url);\n }\n\n /**\n * Request with FormData (for file uploads)\n */\n async function requestWithFormData<TResponse = unknown>(\n endpoint: string,\n formData: FormData,\n options: Omit<RequestOptions, \"body\" | \"params\"> & {\n method?: \"POST\" | \"PUT\" | \"PATCH\";\n } = {},\n ): Promise<TResponse> {\n const { method = \"POST\", headers: customHeaders, signal } = options;\n\n const url = joinUrl(endpoint);\n const headers = await buildHeaders(customHeaders);\n\n // Remove Content-Type to let browser set it with boundary\n delete headers[\"Content-Type\"];\n\n let response: Response;\n\n try {\n const fetchOptions: RequestInit = { method, headers, body: formData };\n if (credentials) fetchOptions.credentials = credentials;\n if (signal) fetchOptions.signal = signal;\n response = await fetch(url, fetchOptions);\n } catch (networkError) {\n throw new ApiError(\n `Network error: ${networkError instanceof Error ? networkError.message : \"Unknown network error\"}`,\n 0,\n null,\n );\n }\n\n return handleResponse<TResponse>(response, method, url);\n }\n\n // Return client with convenience methods\n return {\n request: request,\n requestWithFormData: requestWithFormData,\n\n // Convenience methods for common HTTP verbs\n get: <TResponse = unknown>(\n endpoint: string,\n params?: Record<string, unknown>,\n options?: Omit<RequestOptions, \"method\" | \"params\">,\n ): Promise<TResponse> =>\n request<TResponse>(endpoint, {\n ...options,\n method: \"GET\" as const,\n ...(params && { params }),\n }),\n\n post: <TResponse = unknown>(\n endpoint: string,\n body?: unknown,\n options?: Omit<RequestOptions, \"method\" | \"body\">,\n ): Promise<TResponse> =>\n request<TResponse>(endpoint, {\n ...options,\n method: \"POST\",\n body,\n }),\n\n put: <TResponse = unknown>(\n endpoint: string,\n body?: unknown,\n options?: Omit<RequestOptions, \"method\" | \"body\">,\n ): Promise<TResponse> =>\n request<TResponse>(endpoint, {\n ...options,\n method: \"PUT\",\n body,\n }),\n\n patch: <TResponse = unknown>(\n endpoint: string,\n body?: unknown,\n options?: Omit<RequestOptions, \"method\" | \"body\">,\n ): Promise<TResponse> =>\n request<TResponse>(endpoint, {\n ...options,\n method: \"PATCH\",\n body,\n }),\n\n delete: <TResponse = unknown>(\n endpoint: string,\n options?: Omit<RequestOptions, \"method\">,\n ): Promise<TResponse> =>\n request<TResponse>(endpoint, {\n ...options,\n method: \"DELETE\",\n }),\n };\n}\n\nexport type FetchClient = FetchClientInstance;\n","import type { DataSourceApi } from \"@fluid-app/portal-core/data-source-api\";\nimport type {\n DataSourceShareableType,\n NormalizedOrder,\n NormalizedSubscription,\n RepContentOptions,\n ShareableResource,\n} from \"@fluid-app/portal-core/data-source-api-types\";\nimport type { FetchClient } from \"@fluid-app/portal-tenant-api-client\";\nimport { portalTenant } from \"@fluid-app/portal-tenant-api-client\";\nimport type { FetchClient as ContentFetchClient } from \"@fluid-app/portal-tenant-content-api-client\";\nimport { portalTenantContent } from \"@fluid-app/portal-tenant-content-api-client\";\n\n/**\n * Throws an AbortError if the signal is already aborted. Used as a manual\n * guard around the generated client calls since they don't yet accept\n * RequestOptions.signal — this at least short-circuits before and after\n * the network call so stale results don't overwrite fresh ones.\n */\nfunction throwIfAborted(signal?: AbortSignal): void {\n if (signal?.aborted) {\n throw new DOMException(\"Aborted\", \"AbortError\");\n }\n}\n\nfunction bffNotSupported(op: string): never {\n throw new Error(\n `[portal-tenant-adapter] \"${op}\" is not available on the portal-tenant BFF. ` +\n `Wire the legacy adapter for this feature, or re-add the endpoint to the BFF spec.`,\n );\n}\n\ntype MetricsPeriod = \"7d\" | \"30d\" | \"90d\" | \"1y\" | \"all\";\n\nfunction isProduction(): boolean {\n const g = globalThis as { process?: { env?: { NODE_ENV?: string } } };\n return g.process?.env?.NODE_ENV === \"production\";\n}\n\nfunction narrowPeriod(value: string | undefined): MetricsPeriod | undefined {\n if (\n value === \"7d\" ||\n value === \"30d\" ||\n value === \"90d\" ||\n value === \"1y\" ||\n value === \"all\"\n ) {\n return value;\n }\n if (value !== undefined && !isProduction()) {\n console.warn(`[portal-sdk] narrowPeriod: unknown value \"${value}\" dropped`);\n }\n return undefined;\n}\n\ntype MetricsQuery = { period?: MetricsPeriod; limit?: number };\n\nasync function fetchShareVisited(\n shareableType: DataSourceShareableType,\n client: FetchClient,\n contentClient: ContentFetchClient,\n query: MetricsQuery,\n): Promise<ShareableResource[]> {\n switch (shareableType) {\n case \"products\": {\n const response = await portalTenant.product_by_shares(client, query);\n return (response.resources ?? []).map(\n (r) => ({ ...r, id: r.id ?? 0 }) satisfies ShareableResource,\n );\n }\n case \"media\": {\n const response = await portalTenantContent.content_media_by_shares(\n contentClient,\n query,\n );\n return (response.resources ?? []).map(\n (r) => ({ ...r, id: r.id ?? 0 }) satisfies ShareableResource,\n );\n }\n case \"libraries\": {\n const response = await portalTenantContent.content_playlists_by_shares(\n contentClient,\n query,\n );\n return (response.resources ?? []).map(\n (r) => ({ ...r, id: r.id ?? 0 }) satisfies ShareableResource,\n );\n }\n case \"pages\": {\n const response = await portalTenantContent.content_pages_by_shares(\n contentClient,\n query,\n );\n return (response.resources ?? []).map(\n (r) => ({ ...r, id: r.id ?? 0 }) satisfies ShareableResource,\n );\n }\n case \"enrollment_packs\": {\n const response = await portalTenant.enrollment_pack_by_shares(\n client,\n query,\n );\n return (response.resources ?? []).map(\n (r) => ({ ...r, id: r.id ?? 0 }) satisfies ShareableResource,\n );\n }\n case \"promotions\":\n bffNotSupported(`fetchMostShared(${shareableType})`);\n }\n}\n\nasync function fetchVisited(\n shareableType: DataSourceShareableType,\n client: FetchClient,\n contentClient: ContentFetchClient,\n query: MetricsQuery,\n): Promise<ShareableResource[]> {\n switch (shareableType) {\n case \"products\": {\n const response = await portalTenant.product_by_visits(client, query);\n return (response.resources ?? []).map(\n (r) => ({ ...r, id: r.id ?? 0 }) satisfies ShareableResource,\n );\n }\n case \"media\": {\n const response = await portalTenantContent.content_media_by_visits(\n contentClient,\n query,\n );\n return (response.resources ?? []).map(\n (r) => ({ ...r, id: r.id ?? 0 }) satisfies ShareableResource,\n );\n }\n case \"libraries\": {\n const response = await portalTenantContent.content_playlists_by_visits(\n contentClient,\n query,\n );\n return (response.resources ?? []).map(\n (r) => ({ ...r, id: r.id ?? 0 }) satisfies ShareableResource,\n );\n }\n case \"pages\": {\n const response = await portalTenantContent.content_pages_by_visits(\n contentClient,\n query,\n );\n return (response.resources ?? []).map(\n (r) => ({ ...r, id: r.id ?? 0 }) satisfies ShareableResource,\n );\n }\n case \"enrollment_packs\": {\n const response = await portalTenant.enrollment_pack_by_visits(\n client,\n query,\n );\n return (response.resources ?? []).map(\n (r) => ({ ...r, id: r.id ?? 0 }) satisfies ShareableResource,\n );\n }\n case \"promotions\":\n bffNotSupported(`fetchMostViewed(${shareableType})`);\n }\n}\n\nfunction toMetricsQuery(options: RepContentOptions): MetricsQuery {\n const query: MetricsQuery = {};\n const period = narrowPeriod(options.period);\n if (period) query.period = period;\n if (options.limit != null) query.limit = options.limit;\n return query;\n}\n\ntype RawOrder = NonNullable<\n Awaited<ReturnType<typeof portalTenant.orders_list>>[\"orders\"]\n>[number];\n\n/**\n * Map a BFF order response to the port's NormalizedOrder shape.\n * Centralizes the boundary between BFF wire format and our canonical type\n * so schema drift surfaces at compile time rather than producing silent\n * `undefined`s in the consumer transformer.\n *\n * Field mapping: BFF `token` → `order_number` (user-facing identifier),\n * `total` → `amount`/`total_display_amount` (legacy shape had both),\n * `line_items[0]` → `first_item` (first product in the order).\n */\nfunction toNormalizedOrder(raw: RawOrder): NormalizedOrder {\n const firstLineItem = raw.line_items?.[0];\n return {\n id: raw.id ?? 0,\n order_number: raw.token ?? undefined,\n amount: raw.total ?? undefined,\n total_display_amount: raw.total ?? undefined,\n status: raw.status ?? undefined,\n created_at: raw.created_at ?? undefined,\n first_item: firstLineItem\n ? {\n title: firstLineItem.product_name ?? undefined,\n // BFF OrderLineItem doesn't include an image; leave undefined so\n // the transformer falls back to its default empty-string handling.\n image_url: undefined,\n }\n : undefined,\n token: raw.token ?? undefined,\n };\n}\n\ntype RawSubscription = NonNullable<\n Awaited<ReturnType<typeof portalTenant.subscriptions_list>>[\"subscriptions\"]\n>[number];\n\n/**\n * Map a BFF subscription response to the port's NormalizedSubscription shape.\n * Field name mapping: BFF `token` → `subscription_token`, `total` → `price`,\n * `next_billing_date` → `next_bill_date`, top-level `product` → `variant.product`.\n */\nfunction toNormalizedSubscription(\n raw: RawSubscription,\n): NormalizedSubscription {\n const product = raw.product ?? undefined;\n return {\n id: raw.id ?? 0,\n subscription_token: raw.token ?? undefined,\n price: raw.total ?? undefined,\n status: raw.status ?? undefined,\n next_bill_date: raw.next_billing_date ?? undefined,\n variant: product\n ? {\n product: {\n title: product.name ?? undefined,\n image_url: product.image_url ?? undefined,\n price_in_currency: raw.original_price ?? undefined,\n },\n }\n : undefined,\n };\n}\n\n/**\n * Creates a DataSourceApi adapter backed by portal-tenant BFF clients.\n * Uses cookie-based auth (credentials: \"include\") — no explicit auth headers.\n */\nexport function createDataSourceApiAdapter(\n client: FetchClient,\n contentClient: ContentFetchClient,\n): DataSourceApi {\n return {\n async fetchMostShared(_repId, options) {\n throwIfAborted(options.signal);\n const query = toMetricsQuery(options);\n const result = await fetchShareVisited(\n options.shareableType,\n client,\n contentClient,\n query,\n );\n throwIfAborted(options.signal);\n return result;\n },\n\n async fetchMostViewed(_repId, options) {\n throwIfAborted(options.signal);\n const query = toMetricsQuery(options);\n const result = await fetchVisited(\n options.shareableType,\n client,\n contentClient,\n query,\n );\n throwIfAborted(options.signal);\n return result;\n },\n\n async fetchOrders(_customerId, options) {\n throwIfAborted(options?.signal);\n const params: Record<string, unknown> = {};\n if (options?.limit != null) params[\"page[limit]\"] = options.limit;\n if (options?.status && options.status !== \"all\")\n params.status = options.status;\n\n const response = await portalTenant.orders_list(client, params);\n throwIfAborted(options?.signal);\n return (response.orders ?? []).map(toNormalizedOrder);\n },\n\n async fetchSubscriptions(_customerId, options) {\n throwIfAborted(options?.signal);\n const params: Record<string, unknown> = {};\n if (options?.limit != null) params[\"page[limit]\"] = options.limit;\n if (options?.status && options.status !== \"all\")\n params.status = options.status;\n\n const response = await portalTenant.subscriptions_list(client, params);\n throwIfAborted(options?.signal);\n return (response.subscriptions ?? []).map(toNormalizedSubscription);\n },\n\n // TODO: forward `signal` once the generated portal-tenant client functions\n // accept RequestOptions. Until then, guard manually before and after the\n // network call so aborted queries don't render stale data.\n async fetchResource(type, id, signal) {\n throwIfAborted(signal);\n switch (type) {\n case \"Product\": {\n const response = await portalTenant.products_show(client, id);\n throwIfAborted(signal);\n const product = response.product;\n if (!product) throw new Error(`Product ${id} not found`);\n return {\n ...product,\n id: product.id ?? 0,\n shareable_type: \"Product\",\n } satisfies ShareableResource;\n }\n case \"Medium\": {\n const response = await portalTenantContent.media_show(\n contentClient,\n id,\n );\n throwIfAborted(signal);\n const media = response.media;\n if (!media) throw new Error(`Medium ${id} not found`);\n return {\n ...media,\n id: media.id ?? 0,\n shareable_type: \"Medium\",\n } satisfies ShareableResource;\n }\n case \"EnrollmentPack\": {\n const response = await portalTenant.enrollment_packs_show(client, id);\n throwIfAborted(signal);\n const pack = response.enrollment_pack;\n if (!pack) throw new Error(`EnrollmentPack ${id} not found`);\n return {\n ...pack,\n id: pack.id ?? 0,\n shareable_type: \"EnrollmentPack\",\n } satisfies ShareableResource;\n }\n case \"Page\": {\n const response = await portalTenantContent.pages_show(\n contentClient,\n id,\n );\n throwIfAborted(signal);\n const page = response.page;\n if (!page) throw new Error(`Page ${id} not found`);\n return {\n ...page,\n id: page.id ?? 0,\n shareable_type: \"Page\",\n } satisfies ShareableResource;\n }\n case \"Library\": {\n // Libraries are served by the playlists endpoint on the BFF\n const response = await portalTenantContent.playlists_show(\n contentClient,\n id,\n );\n throwIfAborted(signal);\n const playlist = response.playlist;\n if (!playlist) throw new Error(`Library ${id} not found`);\n return {\n ...playlist,\n id: playlist.id ?? 0,\n shareable_type: \"Library\",\n } satisfies ShareableResource;\n }\n default:\n throw new Error(`Unknown resource type: ${type}`);\n }\n },\n\n // TODO: forward `signal` once the generated portal-tenant client functions\n // accept RequestOptions. filterId validation is centralized in\n // staticFetcher so the legacy and BFF adapters behave identically.\n async fetchProductsByFilter(filterType, filterId, signal) {\n throwIfAborted(signal);\n if (filterType === \"tags\") {\n throw new Error(\"Tags data source is not yet supported.\");\n }\n\n const params: Record<string, unknown> =\n filterType === \"collections\"\n ? { collection_id: Number(filterId) }\n : { category_id: Number(filterId) };\n\n const response = await portalTenant.products_list(client, params);\n throwIfAborted(signal);\n return (response.products ?? []).map(\n (p) => ({ ...p, id: p.id ?? 0 }) satisfies ShareableResource,\n );\n },\n };\n}\n","import type { AppDefinitionApi } from \"@fluid-app/portal-core/app-definition-api\";\nimport type {\n AppDefinitionResponse,\n AppManifest,\n AppManifestResponse,\n} from \"@fluid-app/portal-core/app-definition-types\";\nimport type { FetchClient } from \"@fluid-app/portal-tenant-api-client\";\nimport { portalTenant } from \"@fluid-app/portal-tenant-api-client\";\n\n/**\n * Creates an AppDefinitionApi adapter backed by the portal-tenant BFF client.\n *\n * Maps the generated `app_manifest_show` response to the `AppDefinitionApi`\n * port, applying runtime defaults for optional BFF fields so TypeScript\n * catches schema drift at compile time via `satisfies`.\n */\nexport function createAppDefinitionApiAdapter(\n client: FetchClient,\n): AppDefinitionApi {\n async function fetchManifest(): Promise<AppManifestResponse> {\n const response = await portalTenant.app_manifest_show(client);\n return {\n manifest: response.manifest,\n meta: {\n request_id: response.meta?.request_id ?? \"\",\n timestamp: response.meta?.timestamp ?? \"\",\n },\n } satisfies AppManifestResponse;\n }\n\n return {\n fetchManifest,\n fetchDefinition: async () => {\n const { manifest, meta } = await fetchManifest();\n return {\n definition: mapManifestToDefinition(manifest),\n meta,\n } satisfies AppDefinitionResponse;\n },\n };\n}\n\n/**\n * Synthesize the legacy `{ definition }` shape from the new manifest\n * response. Retained only so deprecated callers keep building.\n */\nfunction mapManifestToDefinition(\n manifest: AppManifest,\n): AppDefinitionResponse[\"definition\"] {\n return {\n id: manifest.definition_id ?? 0,\n name: manifest.name ?? \"\",\n version: manifest.published_version?.toString() ?? null,\n components: [],\n active: true,\n };\n}\n","import type { AccountApi } from \"@fluid-app/portal-core/account-api\";\nimport type {\n AccountMemberType,\n AccountRep,\n AccountResponse,\n UpdateAccountBody,\n} from \"@fluid-app/portal-core/account-types\";\nimport type { FetchClient } from \"@fluid-app/portal-tenant-api-client\";\nimport { portalTenant } from \"@fluid-app/portal-tenant-api-client\";\n\nfunction mapAccount(\n raw: Partial<\n NonNullable<\n Awaited<ReturnType<typeof portalTenant.account_show>>[\"account\"]\n >\n >,\n): AccountRep {\n return {\n id: raw.id ?? 0,\n member_type: (raw.member_type ?? \"rep\") satisfies AccountMemberType,\n first_name: raw.first_name ?? \"\",\n last_name: raw.last_name ?? \"\",\n email: raw.email ?? \"\",\n phone: raw.phone ?? null,\n bio: raw.bio ?? null,\n avatar_url: raw.avatar_url ?? null,\n slug: raw.slug ?? \"\",\n social_links: (raw.social_links ?? null) as Record<string, string> | null,\n recipient_id: raw.recipient_id ?? null,\n } satisfies AccountRep;\n}\n\nexport function createAccountApiAdapter(client: FetchClient): AccountApi {\n return {\n fetchAccount: async () => {\n const response = await portalTenant.account_show(client);\n return {\n account: mapAccount(response.account ?? {}),\n meta: {\n request_id: response.meta?.request_id ?? \"\",\n timestamp: response.meta?.timestamp ?? \"\",\n },\n } satisfies AccountResponse;\n },\n\n updateAccount: async (body: UpdateAccountBody) => {\n const response = await portalTenant.account_update(client, body);\n return {\n account: mapAccount(response.account ?? {}),\n meta: {\n request_id: response.meta?.request_id ?? \"\",\n timestamp: response.meta?.timestamp ?? \"\",\n },\n } satisfies AccountResponse;\n },\n };\n}\n","import type { StoreApi } from \"@fluid-app/portal-core/store-api\";\nimport type { Store, StoreResponse } from \"@fluid-app/portal-core/store-types\";\nimport type { FetchClient } from \"@fluid-app/portal-tenant-api-client\";\nimport { portalTenant } from \"@fluid-app/portal-tenant-api-client\";\n\nfunction mapStore(\n raw: Partial<\n NonNullable<Awaited<ReturnType<typeof portalTenant.store_show>>[\"store\"]>\n >,\n): Store {\n return {\n id: raw.id ?? 0,\n name: raw.name ?? \"\",\n subdomain: raw.subdomain ?? \"\",\n logo_url: raw.logo_url ?? null,\n icon_url: raw.icon_url ?? null,\n appstore_url: raw.appstore_url ?? null,\n playstore_url: raw.playstore_url ?? null,\n } satisfies Store;\n}\n\nexport function createStoreApiAdapter(client: FetchClient): StoreApi {\n return {\n fetchStore: async () => {\n const response = await portalTenant.store_show(client);\n return {\n store: mapStore(response.store ?? {}),\n meta: {\n request_id: response.meta?.request_id ?? \"\",\n timestamp: response.meta?.timestamp ?? \"\",\n },\n } satisfies StoreResponse;\n },\n };\n}\n","/**\n * Generated API client functions for portal_tenant_pay\n *\n * DO NOT EDIT THIS FILE DIRECTLY\n * This file is auto-generated. To update:\n * 1. Update the OpenAPI spec file\n * 2. Run: pnpm generate\n */\n\nimport type { FetchClient } from \"../lib/fetch-client\";\nimport type { operations } from \"../generated/portal-tenant-pay\";\n\n// ============================================================================\n// addresses\n// ============================================================================\n\n/**\n * List addresses\n * Returns addresses associated with the member's customer record in this tenant.\n *\n * @param client - Fetch client instance\n * @param [params] - params\n */\nexport async function addresses_list(\n client: FetchClient,\n params?: operations[\"addresses_list\"][\"parameters\"][\"query\"],\n): Promise<\n operations[\"addresses_list\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.get(`/api/pay/addresses`, params);\n}\n\n/**\n * Create an address\n * Adds a new address to the member's customer record. If an identical address already exists it is returned instead of creating a duplicate.\n *\n * @param client - Fetch client instance\n * @param body - body\n */\nexport async function addresses_create(\n client: FetchClient,\n body: operations[\"addresses_create\"][\"requestBody\"][\"content\"][\"application/json\"],\n): Promise<\n operations[\"addresses_create\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.post(`/api/pay/addresses`, body);\n}\n\n/**\n * Update an address\n * Creates a new address with the merged attributes and discards the old one, preserving references from existing orders.\n *\n * @param client - Fetch client instance\n * @param id - id\n * @param body - body\n */\nexport async function addresses_update(\n client: FetchClient,\n id: string | number,\n body: operations[\"addresses_update\"][\"requestBody\"][\"content\"][\"application/json\"],\n): Promise<\n operations[\"addresses_update\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.patch(`/api/pay/addresses/${id}`, body);\n}\n\n/**\n * Delete an address\n * Removes an address from the member's customer record. The default address cannot be removed.\n *\n * @param client - Fetch client instance\n * @param id - id\n */\nexport async function addresses_destroy(\n client: FetchClient,\n id: string | number,\n): Promise<\n operations[\"addresses_destroy\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.delete(`/api/pay/addresses/${id}`);\n}\n\n// ============================================================================\n// payment-methods\n// ============================================================================\n\n/**\n * List payment methods\n * Returns displayable payment methods on the member's customer record, excluding Apple Pay sources.\n *\n * @param client - Fetch client instance\n * @param [params] - params\n */\nexport async function payment_methods_list(\n client: FetchClient,\n params?: operations[\"payment_methods_list\"][\"parameters\"][\"query\"],\n): Promise<\n operations[\"payment_methods_list\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.get(`/api/pay/payment_methods`, params);\n}\n\n/**\n * Create a payment method\n * Tokenizes and stores a new payment method via the vault provider. Requires a vault token obtained from the vault credentials endpoint.\n *\n * @param client - Fetch client instance\n * @param body - body\n */\nexport async function payment_methods_create(\n client: FetchClient,\n body: operations[\"payment_methods_create\"][\"requestBody\"][\"content\"][\"application/json\"],\n): Promise<\n operations[\"payment_methods_create\"][\"responses\"][201][\"content\"][\"application/json\"]\n> {\n return client.post(`/api/pay/payment_methods`, body);\n}\n\n/**\n * Update a payment method\n * Updates a payment method's attributes. Supports setting as default and replacing the card's billing address.\n *\n * @param client - Fetch client instance\n * @param id - id\n * @param body - body\n */\nexport async function payment_methods_update(\n client: FetchClient,\n id: string | number,\n body: operations[\"payment_methods_update\"][\"requestBody\"][\"content\"][\"application/json\"],\n): Promise<\n operations[\"payment_methods_update\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.patch(`/api/pay/payment_methods/${id}`, body);\n}\n\n/**\n * Delete a payment method\n * Removes a payment method from the member's customer record. If the removed method was the default, the default is cleared.\n *\n * @param client - Fetch client instance\n * @param id - id\n */\nexport async function payment_methods_destroy(\n client: FetchClient,\n id: string | number,\n): Promise<\n operations[\"payment_methods_destroy\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.delete(`/api/pay/payment_methods/${id}`);\n}\n\n/**\n * Get vault credentials\n * Returns a short-lived vault token and environment identifier for initializing the client-side payment vault SDK.\n *\n * @param client - Fetch client instance\n \n */\nexport async function payment_methods_vault_show(\n client: FetchClient,\n): Promise<\n operations[\"payment_methods_vault_show\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.get(`/api/pay/payment_methods/vault`);\n}\n\n// ============================================================================\n// points-ledgers\n// ============================================================================\n\n/**\n * List points ledger entries\n * Returns loyalty points ledger entries for the member's customer record in this tenant, ordered by most recent first. Returns 403 if the company does not have reward points enabled.\n *\n * @param client - Fetch client instance\n * @param [params] - params\n */\nexport async function points_ledgers_list(\n client: FetchClient,\n params?: operations[\"points_ledgers_list\"][\"parameters\"][\"query\"],\n): Promise<\n operations[\"points_ledgers_list\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.get(`/api/pay/points_ledgers`, params);\n}\n","import type { PayApi } from \"@fluid-app/portal-core/pay-api\";\nimport type {\n PayAddress,\n PayPaymentMethod,\n CreateAddressBody,\n CreatePaymentMethodBody,\n UpdatePaymentMethodBody,\n VaultResponse,\n PointsLedgersResponse,\n} from \"@fluid-app/portal-core/pay-types\";\nimport type { FetchClient } from \"@fluid-app/portal-tenant-api-client\";\nimport { portalTenantPay } from \"@fluid-app/portal-tenant-pay-api-client\";\n\n// ---------------------------------------------------------------------------\n// BFF response type helpers\n// ---------------------------------------------------------------------------\n\ntype BffAddress = NonNullable<\n Awaited<ReturnType<typeof portalTenantPay.addresses_list>>[\"addresses\"]\n>[number];\n\ntype BffPaymentMethod = NonNullable<\n Awaited<\n ReturnType<typeof portalTenantPay.payment_methods_list>\n >[\"payment_methods\"]\n>[number];\n\n// ---------------------------------------------------------------------------\n// BFF → port type mappers\n// ---------------------------------------------------------------------------\n\nfunction mapAddress(raw: BffAddress): PayAddress {\n return {\n id: raw.id ?? 0,\n name: raw.name ?? null,\n street1: raw.street1 ?? \"\",\n street2: raw.street2 ?? null,\n city: raw.city ?? \"\",\n state: raw.state ?? \"\",\n zip: raw.zip ?? \"\",\n country: raw.country ?? \"\",\n default: raw.default ?? false,\n created_at: raw.created_at ?? null,\n updated_at: raw.updated_at ?? null,\n };\n}\n\nfunction mapBillingAddress(\n raw: NonNullable<BffPaymentMethod[\"billing_address\"]>,\n): PayAddress {\n return {\n id: raw.id ?? 0,\n name: raw.name ?? null,\n street1: raw.street1 ?? \"\",\n street2: raw.street2 ?? null,\n city: raw.city ?? \"\",\n state: raw.state ?? \"\",\n zip: raw.zip ?? \"\",\n country: raw.country ?? \"\",\n default: false,\n created_at: raw.created_at ?? null,\n updated_at: raw.updated_at ?? null,\n };\n}\n\nfunction mapPaymentMethod(raw: BffPaymentMethod): PayPaymentMethod {\n return {\n id: raw.id ?? 0,\n type: raw.type ?? \"card\",\n brand: raw.brand ?? null,\n last_four: raw.last_four ?? \"\",\n exp_month: raw.exp_month ?? null,\n exp_year: raw.exp_year ?? null,\n default: raw.default ?? false,\n billing_address: raw.billing_address\n ? mapBillingAddress(raw.billing_address)\n : null,\n created_at: raw.created_at ?? null,\n updated_at: raw.updated_at ?? null,\n };\n}\n\n// ---------------------------------------------------------------------------\n// Adapter factory\n// ---------------------------------------------------------------------------\n\nexport function createPortalTenantPayAdapter(client: FetchClient): PayApi {\n return {\n fetchAddresses: async () => {\n const response = await portalTenantPay.addresses_list(client);\n return {\n addresses: (response.addresses ?? []).map(mapAddress),\n meta: {\n request_id: response.meta?.request_id ?? \"\",\n timestamp: response.meta?.timestamp ?? \"\",\n },\n };\n },\n\n createAddress: async (body: CreateAddressBody) => {\n await portalTenantPay.addresses_create(client, body);\n },\n\n updateAddress: async (addressId: number, body: CreateAddressBody) => {\n await portalTenantPay.addresses_update(client, addressId, body);\n },\n\n deleteAddress: async (addressId: number) => {\n await portalTenantPay.addresses_destroy(client, addressId);\n },\n\n fetchPaymentMethods: async () => {\n const response = await portalTenantPay.payment_methods_list(client);\n return {\n payment_methods: (response.payment_methods ?? []).map(mapPaymentMethod),\n meta: {\n request_id: response.meta?.request_id ?? \"\",\n timestamp: response.meta?.timestamp ?? \"\",\n },\n };\n },\n\n createPaymentMethod: async (body: CreatePaymentMethodBody) => {\n await portalTenantPay.payment_methods_create(client, body);\n },\n\n updatePaymentMethod: async (\n paymentMethodId: number,\n body: UpdatePaymentMethodBody,\n ) => {\n await portalTenantPay.payment_methods_update(\n client,\n paymentMethodId,\n body,\n );\n },\n\n deletePaymentMethod: async (paymentMethodId: number) => {\n await portalTenantPay.payment_methods_destroy(client, paymentMethodId);\n },\n\n fetchVaultCredentials: async () => {\n const response = await portalTenantPay.payment_methods_vault_show(client);\n return {\n vault: {\n vault_id: response.vault?.vault_id ?? \"\",\n environment: response.vault?.environment ?? \"sandbox\",\n route_id: response.vault?.route_id ?? null,\n },\n meta: {\n request_id: response.meta?.request_id ?? \"\",\n timestamp: response.meta?.timestamp ?? \"\",\n },\n } satisfies VaultResponse;\n },\n\n fetchPointsLedgers: async () => {\n const response = await portalTenantPay.points_ledgers_list(client);\n return {\n points_ledgers: (response.points_ledgers ?? []).map((entry) => ({\n id: entry.id ?? 0,\n amount: entry.amount ?? 0,\n total_balance: entry.total_balance ?? 0,\n metadata: (entry.metadata as Record<string, unknown>) ?? null,\n created_at: entry.created_at ?? \"\",\n })),\n meta: {\n request_id: response.meta?.request_id ?? \"\",\n timestamp: response.meta?.timestamp ?? \"\",\n },\n } satisfies PointsLedgersResponse;\n },\n };\n}\n","/**\n * Generated API client functions for portal_tenant_store\n *\n * DO NOT EDIT THIS FILE DIRECTLY\n * This file is auto-generated. To update:\n * 1. Update the OpenAPI spec file\n * 2. Run: pnpm generate\n */\n\nimport type { FetchClient } from \"../lib/fetch-client\";\nimport type { operations } from \"../generated/portal-tenant-store\";\n\n// ============================================================================\n// countries\n// ============================================================================\n\n/**\n * List available countries\n * Returns countries enabled for the tenant store, each with its ISO 3166 subdivisions (states/provinces).\n *\n * @param client - Fetch client instance\n * @param [params] - params\n */\nexport async function countries_list(\n client: FetchClient,\n params?: operations[\"countries_list\"][\"parameters\"][\"query\"],\n): Promise<\n operations[\"countries_list\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.get(`/api/store/countries`, params);\n}\n\n// ============================================================================\n// currencies\n// ============================================================================\n\n/**\n * List supported currencies\n * Returns the distinct set of currencies derived from the tenant company's enabled countries, sorted by name.\n *\n * @param client - Fetch client instance\n \n */\nexport async function currencies_list(\n client: FetchClient,\n): Promise<\n operations[\"currencies_list\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.get(`/api/store/currencies`);\n}\n\n// ============================================================================\n// languages\n// ============================================================================\n\n/**\n * List available languages\n * Returns languages enabled for the tenant store, sorted by name.\n *\n * @param client - Fetch client instance\n * @param [params] - params\n */\nexport async function languages_list(\n client: FetchClient,\n params?: operations[\"languages_list\"][\"parameters\"][\"query\"],\n): Promise<\n operations[\"languages_list\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.get(`/api/store/languages`, params);\n}\n","import type {\n CountriesApi,\n countries,\n} from \"@fluid-app/store-core/countries-api\";\nimport type { FetchClient } from \"@fluid-app/portal-tenant-api-client\";\nimport { portalTenantStore } from \"@fluid-app/portal-tenant-store-api-client\";\n\n/**\n * Maps a BFF state to the port's State shape.\n */\nfunction mapState(\n raw: NonNullable<\n NonNullable<\n Awaited<ReturnType<typeof portalTenantStore.countries_list>>[\"countries\"]\n >[number][\"states\"]\n >[number],\n): countries.State {\n return {\n code: raw.code ?? \"\",\n name: raw.name ?? \"\",\n };\n}\n\n/**\n * Maps a BFF country to the port's Country shape.\n */\nfunction mapCountry(\n raw: NonNullable<\n Awaited<ReturnType<typeof portalTenantStore.countries_list>>[\"countries\"]\n >[number],\n): countries.Country {\n return {\n code: raw.code ?? \"\",\n name: raw.name ?? \"\",\n currency_code: raw.currency_code ?? \"\",\n states: (raw.states ?? []).map(mapState),\n };\n}\n\n/**\n * Maps the BFF meta envelope to the port's ApiMeta shape.\n */\nfunction mapMeta(\n raw: Awaited<ReturnType<typeof portalTenantStore.countries_list>>[\"meta\"],\n): countries.CountriesListResponse[\"meta\"] {\n return {\n request_id: raw?.request_id ?? null,\n timestamp: raw?.timestamp ?? \"\",\n pagination: raw?.pagination\n ? {\n cursor: raw.pagination.cursor ?? null,\n limit: raw.pagination.limit,\n next_cursor: raw.pagination.next_cursor ?? null,\n prev_cursor: raw.pagination.prev_cursor ?? null,\n }\n : undefined,\n };\n}\n\n/**\n * Creates a CountriesApi adapter backed by the portal-tenant store BFF.\n *\n * Maps the generated portal-tenant-store namespace functions to the abstract\n * CountriesApi port, closing over the FetchClient so consumers don't need\n * to pass it per-call.\n */\nexport function createCountriesApiAdapter(client: FetchClient): CountriesApi {\n return {\n listCountries: async (params) => {\n const response = await portalTenantStore.countries_list(client, {\n \"page[cursor]\": params?.cursor,\n \"page[limit]\": params?.limit,\n });\n return {\n countries: (response.countries ?? []).map(mapCountry),\n meta: mapMeta(response.meta),\n };\n },\n };\n}\n","import type {\n LanguagesApi,\n languages,\n} from \"@fluid-app/store-core/languages-api\";\nimport type { FetchClient } from \"@fluid-app/portal-tenant-api-client\";\nimport { portalTenantStore } from \"@fluid-app/portal-tenant-store-api-client\";\n\n/**\n * Maps a BFF language to the port's Language shape.\n */\nfunction mapLanguage(\n raw: NonNullable<\n Awaited<ReturnType<typeof portalTenantStore.languages_list>>[\"languages\"]\n >[number],\n): languages.Language {\n return {\n code: raw.code ?? \"\",\n name: raw.name ?? \"\",\n };\n}\n\n/**\n * Maps the BFF meta envelope to the port's ApiMeta shape.\n */\nfunction mapMeta(\n raw: Awaited<ReturnType<typeof portalTenantStore.languages_list>>[\"meta\"],\n): languages.LanguagesListResponse[\"meta\"] {\n return {\n request_id: raw?.request_id ?? null,\n timestamp: raw?.timestamp ?? \"\",\n pagination: raw?.pagination\n ? {\n cursor: raw.pagination.cursor ?? null,\n limit: raw.pagination.limit,\n next_cursor: raw.pagination.next_cursor ?? null,\n prev_cursor: raw.pagination.prev_cursor ?? null,\n }\n : undefined,\n };\n}\n\n/**\n * Creates a LanguagesApi adapter backed by the portal-tenant store BFF.\n *\n * Maps the generated portal-tenant-store namespace functions to the abstract\n * LanguagesApi port, closing over the FetchClient so consumers don't need\n * to pass it per-call.\n */\nexport function createLanguagesApiAdapter(client: FetchClient): LanguagesApi {\n return {\n listLanguages: async (params) => {\n const response = await portalTenantStore.languages_list(client, {\n \"page[cursor]\": params?.cursor,\n \"page[limit]\": params?.limit,\n });\n return {\n languages: (response.languages ?? []).map(mapLanguage),\n meta: mapMeta(response.meta),\n };\n },\n };\n}\n","/**\n * Generated API client functions for portal_tenant_mysite\n *\n * DO NOT EDIT THIS FILE DIRECTLY\n * This file is auto-generated. To update:\n * 1. Update the OpenAPI spec file\n * 2. Run: pnpm generate\n */\n\nimport type { FetchClient } from \"../lib/fetch-client\";\nimport type { operations } from \"../generated/portal-tenant-mysite\";\n\n// ============================================================================\n// mysite\n// ============================================================================\n\n/**\n * Get MySite profile for the current user\n * Returns the member's MySite profile.\n *\n * @param client - Fetch client instance\n \n */\nexport async function mysite_profile_show(\n client: FetchClient,\n): Promise<\n operations[\"mysite_profile_show\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.get(`/api/mysite/profile`);\n}\n\n/**\n * Update MySite profile\n * Updates the member's MySite profile fields.\n *\n * @param client - Fetch client instance\n * @param body - body\n */\nexport async function mysite_profile_update(\n client: FetchClient,\n body: operations[\"mysite_profile_update\"][\"requestBody\"][\"content\"][\"application/json\"],\n): Promise<\n operations[\"mysite_profile_update\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.put(`/api/mysite/profile`, body);\n}\n\n/**\n * List available MySite themes\n * Returns available MySite themes.\n *\n * @param client - Fetch client instance\n * @param [params] - params\n */\nexport async function mysite_themes_list(\n client: FetchClient,\n params?: operations[\"mysite_themes_list\"][\"parameters\"][\"query\"],\n): Promise<\n operations[\"mysite_themes_list\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.get(`/api/mysite/themes`, params);\n}\n\n/**\n * Get MySite settings for the current user\n * Returns the member's MySite settings.\n *\n * @param client - Fetch client instance\n \n */\nexport async function mysite_settings_show(\n client: FetchClient,\n): Promise<\n operations[\"mysite_settings_show\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.get(`/api/mysite/settings`);\n}\n\n/**\n * Update MySite settings\n * Updates the member's MySite settings.\n *\n * @param client - Fetch client instance\n * @param body - body\n */\nexport async function mysite_settings_update(\n client: FetchClient,\n body: operations[\"mysite_settings_update\"][\"requestBody\"][\"content\"][\"application/json\"],\n): Promise<\n operations[\"mysite_settings_update\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.put(`/api/mysite/settings`, body);\n}\n\n/**\n * List MySite links for the current user\n * Returns the member's MySite links, ordered by position.\n *\n * @param client - Fetch client instance\n * @param [params] - params\n */\nexport async function mysite_links_list(\n client: FetchClient,\n params?: operations[\"mysite_links_list\"][\"parameters\"][\"query\"],\n): Promise<\n operations[\"mysite_links_list\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.get(`/api/mysite/links`, params);\n}\n\n/**\n * Create a MySite link\n * Adds a new link to the member's MySite.\n *\n * @param client - Fetch client instance\n * @param body - body\n */\nexport async function mysite_links_create(\n client: FetchClient,\n body: operations[\"mysite_links_create\"][\"requestBody\"][\"content\"][\"application/json\"],\n): Promise<\n operations[\"mysite_links_create\"][\"responses\"][201][\"content\"][\"application/json\"]\n> {\n return client.post(`/api/mysite/links`, body);\n}\n\n/**\n * Update a MySite link\n * Updates an existing MySite link.\n *\n * @param client - Fetch client instance\n * @param id - id\n * @param body - body\n */\nexport async function mysite_links_update(\n client: FetchClient,\n id: string | number,\n body: operations[\"mysite_links_update\"][\"requestBody\"][\"content\"][\"application/json\"],\n): Promise<\n operations[\"mysite_links_update\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.put(`/api/mysite/links/${id}`, body);\n}\n\n/**\n * Delete a MySite link\n * Removes a link from the member's MySite.\n *\n * @param client - Fetch client instance\n * @param id - id\n */\nexport async function mysite_links_destroy(\n client: FetchClient,\n id: string | number,\n): Promise<\n operations[\"mysite_links_destroy\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.delete(`/api/mysite/links/${id}`);\n}\n\n/**\n * Reorder MySite links\n * Reorders MySite links by providing an ordered list of IDs.\n *\n * @param client - Fetch client instance\n * @param body - body\n */\nexport async function mysite_links_bulk_reorder(\n client: FetchClient,\n body: operations[\"mysite_links_bulk_reorder\"][\"requestBody\"][\"content\"][\"application/json\"],\n): Promise<\n operations[\"mysite_links_bulk_reorder\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.patch(`/api/mysite/links/bulk`, body);\n}\n\n/**\n * List MySite favorites\n * Returns the member's MySite favorites (products, playlists, etc.).\n *\n * @param client - Fetch client instance\n * @param [params] - params\n */\nexport async function mysite_favorites_list(\n client: FetchClient,\n params?: operations[\"mysite_favorites_list\"][\"parameters\"][\"query\"],\n): Promise<\n operations[\"mysite_favorites_list\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.get(`/api/mysite/favorites`, params);\n}\n\n/**\n * Add a product to MySite favorites\n * Adds a product to the member's MySite favorites.\n *\n * @param client - Fetch client instance\n * @param body - body\n */\nexport async function mysite_favorites_create(\n client: FetchClient,\n body: operations[\"mysite_favorites_create\"][\"requestBody\"][\"content\"][\"application/json\"],\n): Promise<\n operations[\"mysite_favorites_create\"][\"responses\"][201][\"content\"][\"application/json\"]\n> {\n return client.post(`/api/mysite/favorites`, body);\n}\n\n/**\n * Remove a product from MySite favorites\n * Removes a product from the member's MySite favorites.\n *\n * @param client - Fetch client instance\n * @param id - id\n */\nexport async function mysite_favorites_destroy(\n client: FetchClient,\n id: string | number,\n): Promise<\n operations[\"mysite_favorites_destroy\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.delete(`/api/mysite/favorites/${id}`);\n}\n\n/**\n * Reorder MySite favorites\n * Reorders MySite favorites by providing an ordered list of IDs.\n *\n * @param client - Fetch client instance\n * @param body - body\n */\nexport async function mysite_favorites_bulk_reorder(\n client: FetchClient,\n body: operations[\"mysite_favorites_bulk_reorder\"][\"requestBody\"][\"content\"][\"application/json\"],\n): Promise<\n operations[\"mysite_favorites_bulk_reorder\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.patch(`/api/mysite/favorites/bulk`, body);\n}\n","import type { MySiteApi } from \"@fluid-app/mysite-core/mysite-api\";\nimport type {\n MySiteProfile,\n MySiteLink,\n MySiteFavorite,\n MySiteTheme,\n UpdateProfileBody,\n UpdateSettingsBody,\n CreateLinkBody,\n UpdateLinkBody,\n AddFavoriteBody,\n} from \"@fluid-app/mysite-core/mysite-api-types\";\nimport type { FetchClient } from \"@fluid-app/portal-tenant-api-client\";\nimport { portalTenantMysite } from \"@fluid-app/portal-tenant-mysite-api-client\";\n\n// ---------------------------------------------------------------------------\n// BFF response type helpers\n// ---------------------------------------------------------------------------\n\ntype BffProfile = NonNullable<\n Awaited<ReturnType<typeof portalTenantMysite.mysite_profile_show>>[\"profile\"]\n>;\n\ntype BffLink = NonNullable<\n Awaited<ReturnType<typeof portalTenantMysite.mysite_links_list>>[\"links\"]\n>[number];\n\ntype BffFavorite = NonNullable<\n Awaited<\n ReturnType<typeof portalTenantMysite.mysite_favorites_list>\n >[\"favorites\"]\n>[number];\n\ntype BffTheme = NonNullable<\n Awaited<ReturnType<typeof portalTenantMysite.mysite_themes_list>>[\"themes\"]\n>[number];\n\n// ---------------------------------------------------------------------------\n// BFF -> port type mappers\n// ---------------------------------------------------------------------------\n\nfunction mapProfile(raw: BffProfile): MySiteProfile {\n return {\n id: raw.id ?? 0,\n mysite_url: raw.mysite_url ?? null,\n mysite_views: raw.mysite_views ?? 0,\n mysite_leads: raw.mysite_leads ?? 0,\n theme_id: raw.theme_id ?? null,\n bio: raw.bio ?? null,\n avatar_url: raw.avatar_url ?? null,\n display_name: raw.display_name ?? null,\n slug: raw.slug ?? null,\n } satisfies MySiteProfile;\n}\n\nfunction mapLink(raw: BffLink): MySiteLink {\n return {\n id: raw.id ?? 0,\n url: raw.url ?? \"\",\n title: raw.title ?? \"\",\n position: raw.position ?? 0,\n } satisfies MySiteLink;\n}\n\nfunction mapFavorite(raw: BffFavorite): MySiteFavorite {\n return {\n id: raw.id ?? 0,\n favoriteable_id: raw.favoriteable_id ?? raw.product_id ?? 0,\n favoriteable_type: raw.favoriteable_type ?? \"Product\",\n name: raw.name ?? raw.product_name ?? null,\n image_url: raw.image_url ?? raw.product_image_url ?? null,\n product_id: raw.product_id ?? raw.favoriteable_id ?? 0,\n product_name: raw.product_name ?? raw.name ?? null,\n product_image_url: raw.product_image_url ?? raw.image_url ?? null,\n position: raw.position ?? 0,\n created_at: raw.created_at ?? null,\n } satisfies MySiteFavorite;\n}\n\nfunction mapTheme(raw: BffTheme): MySiteTheme {\n return {\n id: raw.id ?? 0,\n name: raw.name ?? \"\",\n preview_url: raw.preview_url ?? null,\n } satisfies MySiteTheme;\n}\n\n// ---------------------------------------------------------------------------\n// Adapter factory\n// ---------------------------------------------------------------------------\n\nexport function createMySiteApiAdapter(client: FetchClient): MySiteApi {\n return {\n fetchProfile: async () => {\n const res = await portalTenantMysite.mysite_profile_show(client);\n return mapProfile((res.profile ?? {}) as BffProfile);\n },\n\n updateProfile: async (body: UpdateProfileBody) => {\n const res = await portalTenantMysite.mysite_profile_update(client, {\n profile: {\n display_name: body.display_name,\n bio: body.bio,\n avatar_url: body.avatar_url,\n },\n });\n return mapProfile((res.profile ?? {}) as BffProfile);\n },\n\n updateSettings: async (body: UpdateSettingsBody) => {\n await Promise.all([\n body.theme_id !== undefined\n ? portalTenantMysite.mysite_settings_update(client, {\n settings: { theme_id: body.theme_id },\n })\n : Promise.resolve(),\n body.slug !== undefined\n ? portalTenantMysite.mysite_profile_update(client, {\n profile: { slug: body.slug },\n })\n : Promise.resolve(),\n ]);\n },\n\n listLinks: async () => {\n const res = await portalTenantMysite.mysite_links_list(client);\n return (res.links ?? []).map(mapLink);\n },\n\n createLink: async (body: CreateLinkBody) => {\n const res = await portalTenantMysite.mysite_links_create(client, {\n link: { title: body.title, url: body.url },\n });\n return mapLink((res.link ?? {}) as BffLink);\n },\n\n updateLink: async (linkId: number, body: UpdateLinkBody) => {\n const res = await portalTenantMysite.mysite_links_update(client, linkId, {\n link: { title: body.title, url: body.url },\n });\n return mapLink((res.link ?? {}) as BffLink);\n },\n\n deleteLink: async (linkId: number) => {\n await portalTenantMysite.mysite_links_destroy(client, linkId);\n },\n\n reorderLinks: async (orderedIds: number[]) => {\n const res = await portalTenantMysite.mysite_links_bulk_reorder(client, {\n ordered_ids: orderedIds,\n });\n return (res.links ?? []).map(mapLink);\n },\n\n listFavorites: async () => {\n const res = await portalTenantMysite.mysite_favorites_list(client);\n return (res.favorites ?? []).map(mapFavorite);\n },\n\n addFavorite: async (body: AddFavoriteBody) => {\n const res = await portalTenantMysite.mysite_favorites_create(client, {\n favorite: { product_id: body.product_id },\n });\n return mapFavorite((res.favorite ?? {}) as BffFavorite);\n },\n\n deleteFavorite: async (favoriteId: number) => {\n await portalTenantMysite.mysite_favorites_destroy(client, favoriteId);\n },\n\n reorderFavorites: async (orderedIds: number[]) => {\n const res = await portalTenantMysite.mysite_favorites_bulk_reorder(\n client,\n { ordered_ids: orderedIds },\n );\n return (res.favorites ?? []).map(mapFavorite);\n },\n\n listThemes: async () => {\n const res = await portalTenantMysite.mysite_themes_list(client);\n return (res.themes ?? []).map(mapTheme);\n },\n };\n}\n","/**\n * Theme Provider for Fluid SDK\n * Handles CSS variable injection using portal-core's theme engine.\n * Accepts ThemeDefinition objects and resolves them into CSS via generateThemeCSS.\n */\n\nimport {\n createContext,\n useContext,\n useState,\n useEffect,\n useMemo,\n useCallback,\n type ReactNode,\n} from \"react\";\nimport type { ThemeDefinition } from \"../types/theme\";\nimport {\n resolveTheme,\n applyTheme as coreApplyTheme,\n removeTheme,\n} from \"../themes\";\n\ntype ThemeMode = \"light\" | \"dark\";\n\n/**\n * Context value for theme management.\n * All properties are readonly since context values should not be mutated by consumers.\n */\ninterface ThemeContextValue {\n /** Currently active theme definition */\n readonly currentTheme: ThemeDefinition | null;\n /** Switch to a different theme */\n readonly setTheme: (theme: ThemeDefinition) => void;\n /** Switch between light and dark mode for the current theme */\n readonly setThemeMode: (mode: ThemeMode) => void;\n /** Current theme mode */\n readonly mode: ThemeMode | undefined;\n}\n\nconst ThemeContext = createContext<ThemeContextValue | null>(null);\n\nexport interface FluidThemeProviderProps {\n children: ReactNode;\n /** Initial theme to apply */\n initialTheme?: ThemeDefinition;\n /** Container element for scoped theme application (defaults to document.documentElement) */\n container?: HTMLElement | null;\n}\n\n/**\n * Apply a theme to the DOM using the shared portal-core pipeline.\n * Also sets data attributes on the container for CSS selector targeting.\n */\nfunction applyThemeToDOM(\n theme: ThemeDefinition,\n mode: ThemeMode | undefined,\n container: HTMLElement | null,\n): void {\n const target = container ?? document.documentElement;\n\n // Use shared resolve + inject pipeline from portal-core\n const resolved = resolveTheme(theme);\n coreApplyTheme(resolved);\n\n // Set data attributes for CSS selector targeting\n target.dataset.theme = theme.id;\n if (mode) {\n target.dataset.themeMode = mode;\n } else {\n delete target.dataset.themeMode;\n }\n}\n\nexport function FluidThemeProvider({\n children,\n initialTheme,\n container,\n}: FluidThemeProviderProps): React.JSX.Element {\n const [currentTheme, setCurrentTheme] = useState<ThemeDefinition | null>(\n initialTheme ?? null,\n );\n const [mode, setMode] = useState<ThemeMode | undefined>(undefined);\n\n // Apply theme CSS when theme or mode changes\n useEffect(() => {\n if (currentTheme) {\n applyThemeToDOM(currentTheme, mode, container ?? null);\n }\n\n return () => {\n if (currentTheme) {\n removeTheme(currentTheme.id);\n }\n };\n }, [currentTheme, mode, container]);\n\n const setTheme = useCallback((theme: ThemeDefinition) => {\n setCurrentTheme(theme);\n }, []);\n\n const setThemeMode = useCallback((newMode: ThemeMode) => {\n setMode(newMode);\n }, []);\n\n const value = useMemo(\n () =>\n ({\n currentTheme,\n setTheme,\n setThemeMode,\n mode,\n }) satisfies ThemeContextValue,\n [currentTheme, setTheme, setThemeMode, mode],\n );\n\n return (\n <ThemeContext.Provider value={value}>{children}</ThemeContext.Provider>\n );\n}\n\n/**\n * Hook to access theme context\n * Must be used within a FluidThemeProvider\n */\nexport function useThemeContext(): ThemeContextValue {\n const context = useContext(ThemeContext);\n if (!context) {\n throw new Error(\"useThemeContext must be used within a FluidThemeProvider\");\n }\n return context;\n}\n","import type { WidgetsApi } from \"@fluid-app/portal-core/widgets-api\";\nimport type {\n Activity,\n ActivitySlug,\n CalendarEvent,\n CalendarEventDescription,\n CatchUp,\n MySiteData,\n PointsData,\n PointsEntry,\n Todo,\n} from \"@fluid-app/portal-core/widgets-api-types\";\nimport type { FetchClient } from \"@fluid-app/portal-tenant-api-client\";\nimport { portalTenant } from \"@fluid-app/portal-tenant-api-client\";\nimport { portalTenantMysite } from \"@fluid-app/portal-tenant-mysite-api-client\";\nimport { portalTenantPay } from \"@fluid-app/portal-tenant-pay-api-client\";\n\n// ---------------------------------------------------------------------------\n// BFF response types\n// ---------------------------------------------------------------------------\n\ntype BffCalendarEvent = NonNullable<\n Awaited<\n ReturnType<typeof portalTenant.calendar_events_list>\n >[\"calendar_events\"]\n>[number];\n\ntype BffTodo = NonNullable<\n Awaited<ReturnType<typeof portalTenant.todos_list>>[\"todos\"]\n>[number];\n\ntype BffActivity = NonNullable<\n Awaited<ReturnType<typeof portalTenant.activities_list>>[\"activities\"]\n>[number];\n\ntype BffCatchUp = NonNullable<\n Awaited<ReturnType<typeof portalTenant.catch_ups_list>>[\"catch_ups\"]\n>[number];\n\ntype BffPointsLedger = NonNullable<\n Awaited<\n ReturnType<typeof portalTenantPay.points_ledgers_list>\n >[\"points_ledgers\"]\n>[number];\n\ntype BffMySiteProfile = NonNullable<\n Awaited<ReturnType<typeof portalTenantMysite.mysite_profile_show>>[\"profile\"]\n>;\n\n// ---------------------------------------------------------------------------\n// BFF transforms\n// ---------------------------------------------------------------------------\n\nfunction mapBffCalendarEvent(event: BffCalendarEvent): CalendarEvent {\n return {\n id: event.id,\n title: event.title,\n color: event.color ?? null,\n start: event.start,\n end: event.end,\n description: null,\n url: null,\n active: null,\n timeZone: null,\n status: null,\n imageUrl: null,\n images: null,\n venue: null,\n countries: null,\n hasTomorrow: null,\n hasYesterday: null,\n isAllDay: null,\n } satisfies CalendarEvent;\n}\n\nfunction mapBffTodo(raw: BffTodo): Todo {\n return {\n id: raw.id,\n body: raw.body,\n dueAt: raw.due_at ?? null,\n completedAt: raw.completed_at ?? null,\n createdAt: raw.created_at,\n contactId: raw.contact_id ?? null,\n contactName: raw.contact_name ?? null,\n } satisfies Todo;\n}\n\n// Typing as `Record<ActivitySlug, true>` makes TS reject this object when a\n// new value is added to `ActivitySlug` and not registered here, so the slug\n// guard stays exhaustive without a separate test.\nconst KNOWN_ACTIVITY_SLUGS: Record<ActivitySlug, true> = {\n abandoned_cart: true,\n announcements: true,\n cart_items_added: true,\n comment_reply: true,\n direct_message: true,\n fantasy_point: true,\n new_lead: true,\n order_placed: true,\n page_views: true,\n page_views_contact: true,\n tasks: true,\n upcoming_event: true,\n video: true,\n video_complete: true,\n video_complete_contact: true,\n video_contact: true,\n message_received: true,\n message_sent: true,\n new_cart_items_added: true,\n smart_link_clicked: true,\n review_left: true,\n};\n\nfunction isActivitySlug(slug: string): slug is ActivitySlug {\n return Object.hasOwn(KNOWN_ACTIVITY_SLUGS, slug);\n}\n\nfunction mapBffActivity(raw: BffActivity): Activity | null {\n if (!isActivitySlug(raw.slug)) {\n console.warn(\n `[portal-sdk] mapBffActivity: unknown activity slug \"${raw.slug}\" dropped (id=${raw.id})`,\n );\n return null;\n }\n return {\n id: raw.id,\n userName: raw.user_name,\n avatarUrl: raw.avatar_url ?? null,\n activityType: formatActivityType(raw.slug),\n targetName: raw.target_name,\n timestamp: raw.created_at,\n slug: raw.slug,\n } satisfies Activity;\n}\n\nfunction mapBffCatchUp(raw: BffCatchUp): CatchUp {\n return {\n id: raw.id,\n suggestionTitle: raw.suggestion_title,\n } satisfies CatchUp;\n}\n\nfunction formatBffPointsDescription(ledger: BffPointsLedger): string {\n const metadata = ledger.metadata as\n | { transaction_type?: string; source?: { reason?: string } }\n | undefined;\n\n if (metadata?.transaction_type) {\n return metadata.transaction_type\n .split(\"_\")\n .map((w) => w.charAt(0).toUpperCase() + w.slice(1))\n .join(\" \");\n }\n if (metadata?.source?.reason) {\n return metadata.source.reason;\n }\n if (ledger.created_at) {\n const date = new Date(ledger.created_at);\n return `Transaction ${date.toLocaleDateString(\"en-US\", { month: \"long\", day: \"numeric\" })}`;\n }\n return \"Points Transaction\";\n}\n\nfunction mapBffPointsLedger(ledgers: BffPointsLedger[]): PointsData {\n const sorted = [...ledgers].sort(\n (a, b) =>\n new Date(b.created_at ?? 0).getTime() -\n new Date(a.created_at ?? 0).getTime(),\n );\n const balance = sorted[0]?.total_balance ?? 0;\n\n const entries: PointsEntry[] = sorted.map((ledger) => ({\n id: ledger.id,\n description: formatBffPointsDescription(ledger),\n amount: ledger.amount,\n createdAt: ledger.created_at ?? \"\",\n }));\n\n return { balance, entries } satisfies PointsData;\n}\n\nfunction mapBffMySiteProfile(profile: BffMySiteProfile): MySiteData {\n return {\n url: profile.mysite_url ?? null,\n views: profile.mysite_views ?? 0,\n leads: profile.mysite_leads ?? 0,\n userName: profile.display_name ?? \"User\",\n } satisfies MySiteData;\n}\n\n// ---------------------------------------------------------------------------\n// BFF sub-adapter (private)\n// ---------------------------------------------------------------------------\n\nfunction createBffWidgetsAdapter(client: FetchClient): Partial<WidgetsApi> {\n return {\n async fetchCalendarEvents() {\n try {\n const response = await portalTenant.calendar_events_list(client);\n return (response.calendar_events ?? [])\n .filter((e) => e.start && e.end)\n .map(mapBffCalendarEvent);\n } catch (error) {\n throw new Error(\"Failed to fetch calendar events\", { cause: error });\n }\n },\n\n async fetchTodos() {\n try {\n const response = await portalTenant.todos_list(client);\n return (response.todos ?? []).map(mapBffTodo);\n } catch (error) {\n throw new Error(\"Failed to fetch todos\", { cause: error });\n }\n },\n\n async fetchActivities() {\n try {\n const response = await portalTenant.activities_list(client);\n return (response.activities ?? [])\n .map(mapBffActivity)\n .filter((activity): activity is Activity => activity !== null);\n } catch (error) {\n throw new Error(\"Failed to fetch activities\", { cause: error });\n }\n },\n\n async fetchCatchUps() {\n try {\n const response = await portalTenant.catch_ups_list(client);\n return (response.catch_ups ?? []).map(mapBffCatchUp);\n } catch (error) {\n throw new Error(\"Failed to fetch catch ups\", { cause: error });\n }\n },\n\n async updateTodo(id, completed) {\n try {\n const response = await portalTenant.todos_update(client, id, {\n todo: { completed },\n });\n return mapBffTodo(response.todo);\n } catch (error) {\n throw new Error(\"Failed to update todo\", { cause: error });\n }\n },\n\n async fetchMySite() {\n try {\n const response = await portalTenantMysite.mysite_profile_show(client);\n return mapBffMySiteProfile(\n response.profile ?? ({} as BffMySiteProfile),\n );\n } catch (error) {\n throw new Error(\"Failed to fetch MySite data\", { cause: error });\n }\n },\n\n async fetchPointsLedger() {\n try {\n const response = await portalTenantPay.points_ledgers_list(client);\n return mapBffPointsLedger(response.points_ledgers ?? []);\n } catch (error) {\n throw new Error(\"Failed to fetch points ledger\", { cause: error });\n }\n },\n };\n}\n\n// ---------------------------------------------------------------------------\n// Legacy API-internal shapes (not exported)\n// ---------------------------------------------------------------------------\n\ntype TodoContact = {\n id: number;\n first_name: string;\n last_name: string;\n};\n\ntype ApiTodo = {\n id: number;\n body: string;\n due_at: string | null;\n completed_at: string | null;\n created_at: string;\n contact: TodoContact | null;\n};\n\ntype ActivityContact = {\n id: number;\n token: string | null;\n first_name: string | null;\n last_name: string | null;\n avatar_url: string | null;\n full_name: string | null;\n email: string | null;\n phone: string | null;\n city: string | null;\n state: string | null;\n};\n\ntype ActivityVisitor = {\n id: number;\n ip_address: string | null;\n city: string | null;\n state: string | null;\n country: string | null;\n utm_source: string | null;\n utm_campaign: string | null;\n};\n\ntype ApiActivity = {\n id: number;\n user_id: number;\n title: string;\n description: string | null;\n read_at: string | null;\n created_at: string;\n relation_type: string;\n company_id: number;\n state: \"new\" | \"earlier\";\n slug: ActivitySlug;\n relation: Record<string, unknown>;\n contact: ActivityContact | null;\n visitor: ActivityVisitor | null;\n};\n\ntype ActivityPaginationInfo = {\n current: number;\n previous: number | null;\n next: number | null;\n per_page: number;\n pages: number;\n count: number;\n};\n\ntype ActivityApiResponse = [\n { pagination: ActivityPaginationInfo },\n { items: ApiActivity[] },\n];\n\ntype ApiPointsLedger = {\n id: number;\n amount: number;\n company_id: number;\n created_at: string;\n customer_id: number;\n metadata: {\n transaction_type?: string;\n source?: { name?: string; reason?: string };\n };\n total_balance: number;\n updated_at: string;\n};\n\ntype PointsLedgerApiResponse = {\n points_ledgers: ApiPointsLedger[];\n meta: {\n request_id: string;\n timestamp: string;\n pagination: {\n current_page: number;\n total_pages: number;\n total_count: number;\n per_page: number;\n };\n };\n};\n\ntype ApiCalendarEventDescription = {\n id?: number | null;\n name?: string | null;\n body?: string | null;\n record_type?: string | null;\n record_id?: number | null;\n created_at?: string | null;\n updated_at?: string | null;\n locale?: string | null;\n};\n\ntype ApiCalendarEvent = {\n id: number;\n title: string;\n description?: ApiCalendarEventDescription | null;\n color?: string | null;\n url?: string | null;\n start: string;\n end: string;\n active?: boolean | null;\n time_zone?: string | null;\n status?: string | null;\n image_url?: string | null;\n images?: unknown[] | null;\n venue?: string | null;\n countries?: string[] | null;\n hasTomorrow?: boolean | null;\n hasYesterday?: boolean | null;\n isAllDay?: boolean | null;\n};\n\ntype ApiCatchUp = {\n id: number;\n suggestion_title: string;\n};\n\ntype ApiMySite = {\n mysite_url?: string | null;\n mysite_views?: number | null;\n mysite_leads?: number | null;\n name?: string | null;\n first_name?: string | null;\n};\n\n// ---------------------------------------------------------------------------\n// Legacy transforms\n// ---------------------------------------------------------------------------\n\nfunction mapCalendarEventDescription(\n raw: ApiCalendarEventDescription,\n): CalendarEventDescription {\n return {\n id: raw.id,\n name: raw.name,\n body: raw.body,\n recordType: raw.record_type,\n recordId: raw.record_id,\n createdAt: raw.created_at,\n updatedAt: raw.updated_at,\n locale: raw.locale,\n };\n}\n\nfunction mapCalendarEvent(event: ApiCalendarEvent): CalendarEvent {\n return {\n id: event.id,\n title: event.title,\n description: event.description\n ? mapCalendarEventDescription(event.description)\n : event.description,\n color: event.color,\n url: event.url,\n start: event.start,\n end: event.end,\n active: event.active,\n timeZone: event.time_zone,\n status: event.status,\n imageUrl: event.image_url,\n images: event.images,\n venue: event.venue,\n countries: event.countries,\n hasTomorrow: event.hasTomorrow,\n hasYesterday: event.hasYesterday,\n isAllDay: event.isAllDay,\n };\n}\n\nfunction mapCatchUp(raw: ApiCatchUp): CatchUp {\n return {\n id: raw.id,\n suggestionTitle: raw.suggestion_title,\n };\n}\n\nfunction transformTodos(rawData: ApiTodo[]): Todo[] {\n return rawData.map((todo) => ({\n id: todo.id,\n body: todo.body,\n dueAt: todo.due_at,\n completedAt: todo.completed_at,\n createdAt: todo.created_at,\n contactId: todo.contact?.id ?? null,\n contactName: todo.contact\n ? `${todo.contact.first_name} ${todo.contact.last_name}`\n : null,\n }));\n}\n\nfunction formatActivityType(slug: string): string {\n return slug\n .split(\"_\")\n .map((word) => word.charAt(0).toUpperCase() + word.slice(1))\n .join(\" \");\n}\n\nfunction getActivityUserName(\n contact: ActivityContact | null,\n visitor: ActivityVisitor | null,\n): string {\n if (contact?.full_name) {\n return contact.full_name;\n }\n if (contact?.first_name && contact?.last_name) {\n return `${contact.first_name} ${contact.last_name}`;\n }\n if (visitor?.city && visitor?.state) {\n return `Visitor from ${visitor.city}, ${visitor.state}`;\n }\n return \"Unknown Visitor\";\n}\n\nfunction transformActivities(rawData: ActivityApiResponse): Activity[] {\n const itemsObj = rawData[1];\n if (!itemsObj?.items) return [];\n\n return itemsObj.items\n .map((activity) => ({\n id: activity.id,\n userName: getActivityUserName(activity.contact, activity.visitor),\n avatarUrl: activity.contact?.avatar_url ?? null,\n activityType: formatActivityType(activity.slug),\n targetName: activity.description || activity.title,\n timestamp: activity.created_at,\n slug: activity.slug,\n }))\n .sort(\n (a, b) =>\n new Date(b.timestamp).getTime() - new Date(a.timestamp).getTime(),\n );\n}\n\nfunction formatLegacyPointsDescription(ledger: ApiPointsLedger): string {\n if (ledger.metadata?.transaction_type) {\n return ledger.metadata.transaction_type\n .split(\"_\")\n .map((w) => w.charAt(0).toUpperCase() + w.slice(1))\n .join(\" \");\n }\n if (ledger.metadata?.source?.reason) {\n return ledger.metadata.source.reason;\n }\n const date = new Date(ledger.created_at);\n return `Transaction ${date.toLocaleDateString(\"en-US\", { month: \"long\", day: \"numeric\" })}`;\n}\n\nfunction transformLegacyPointsLedger(\n data: PointsLedgerApiResponse,\n): PointsData {\n const ledgers = data.points_ledgers;\n\n // Sort newest-first so the current balance comes from the most recent entry.\n const sorted = [...ledgers].sort(\n (a, b) =>\n new Date(b.created_at).getTime() - new Date(a.created_at).getTime(),\n );\n const balance = sorted[0]?.total_balance ?? 0;\n\n const entries: PointsEntry[] = sorted.map((ledger) => ({\n id: ledger.id,\n description: formatLegacyPointsDescription(ledger),\n amount: ledger.amount,\n createdAt: ledger.created_at,\n }));\n\n return { balance, entries } satisfies PointsData;\n}\n\n// ---------------------------------------------------------------------------\n// Legacy sub-adapter (private)\n// ---------------------------------------------------------------------------\n\nexport interface LegacyWidgetsApiConfig {\n baseUrl: string | undefined;\n getApiHeaders: (() => Record<string, string>) | undefined;\n}\n\nexport function createLegacyWidgetsApiAdapter(\n config: LegacyWidgetsApiConfig,\n): WidgetsApi {\n function buildHeaders(): Record<string, string> {\n return {\n \"content-type\": \"application/json\",\n ...config.getApiHeaders?.(),\n };\n }\n\n function prefix(path: string): string {\n const base = config.baseUrl ?? \"\";\n return `${base}${path}`;\n }\n\n return {\n async fetchCalendarEvents(signal?: AbortSignal) {\n const response = await fetch(\n prefix(\"/events.json?event_timeline=upcoming\"),\n { headers: buildHeaders(), signal },\n );\n if (!response.ok) {\n throw new Error(`Failed to fetch calendar events: ${response.status}`);\n }\n const data = (await response.json()) as ApiCalendarEvent[];\n return data.map(mapCalendarEvent);\n },\n\n async fetchTodos(signal?: AbortSignal) {\n const response = await fetch(prefix(\"/tasks\"), {\n headers: buildHeaders(),\n signal,\n });\n if (!response.ok) {\n throw new Error(`Failed to fetch todos: ${response.status}`);\n }\n const data = (await response.json()) as ApiTodo[];\n return transformTodos(data);\n },\n\n async updateTodo(id: number, completed: boolean) {\n const response = await fetch(prefix(`/tasks/${id}`), {\n method: \"PATCH\",\n headers: buildHeaders(),\n body: JSON.stringify({\n task: { completed_at: completed ? new Date().toISOString() : null },\n }),\n });\n if (!response.ok) {\n throw new Error(`Failed to update todo: ${response.status}`);\n }\n const data = (await response.json()) as ApiTodo;\n const [transformed] = transformTodos([data]);\n if (!transformed) {\n throw new Error(\"Failed to update todo: empty response\");\n }\n return transformed;\n },\n\n async fetchActivities(signal?: AbortSignal) {\n const response = await fetch(prefix(\"/v1.1/activities.json\"), {\n headers: buildHeaders(),\n signal,\n });\n if (!response.ok) {\n throw new Error(`Failed to fetch activities: ${response.status}`);\n }\n const data = (await response.json()) as ActivityApiResponse;\n return transformActivities(data);\n },\n\n async fetchCatchUps(signal?: AbortSignal) {\n const response = await fetch(prefix(\"/affiliate_catch_up_actions.json\"), {\n headers: buildHeaders(),\n signal,\n });\n if (!response.ok) {\n throw new Error(`Failed to fetch catch ups: ${response.status}`);\n }\n const data = (await response.json()) as ApiCatchUp[];\n return data.map(mapCatchUp);\n },\n\n async fetchMySite(signal?: AbortSignal) {\n const response = await fetch(prefix(\"/me\"), {\n headers: buildHeaders(),\n signal,\n });\n if (!response.ok) {\n throw new Error(`Failed to fetch MySite data: ${response.status}`);\n }\n const data = (await response.json()) as ApiMySite;\n return {\n url: data.mysite_url ?? null,\n views: data.mysite_views ?? 0,\n leads: data.mysite_leads ?? 0,\n userName: data.name || data.first_name || \"User\",\n } satisfies MySiteData;\n },\n\n async fetchPointsLedger(customerId: string, signal?: AbortSignal) {\n const response = await fetch(\n prefix(\n `/v202506/customers/${customerId}/points_ledgers?page=1&per_page=100&sort_by=created_at&sort_dir=desc`,\n ),\n { headers: buildHeaders(), signal },\n );\n if (!response.ok) {\n throw new Error(`Failed to fetch points ledger: ${response.status}`);\n }\n const data = (await response.json()) as PointsLedgerApiResponse;\n return transformLegacyPointsLedger(data);\n },\n } satisfies WidgetsApi;\n}\n\n// ---------------------------------------------------------------------------\n// Public composite factory\n// ---------------------------------------------------------------------------\n\nexport function createPortalWidgetsApiAdapter(\n client: FetchClient,\n legacyConfig: LegacyWidgetsApiConfig,\n): WidgetsApi {\n const bff = createBffWidgetsAdapter(client);\n const legacy = createLegacyWidgetsApiAdapter(legacyConfig);\n\n return { ...legacy, ...bff } satisfies WidgetsApi;\n}\n","import { useMemo, useRef, type ReactNode } from \"react\";\nimport { WidgetsApiProvider } from \"@fluid-app/portal-core/widgets-api-context\";\nimport { usePortalTenantClient } from \"../providers/PortalTenantClientProvider\";\nimport {\n createPortalWidgetsApiAdapter,\n type LegacyWidgetsApiConfig,\n} from \"../adapters/widgets-api-adapter\";\n\n// Invariant: `baseUrl` must match the `baseUrl` from DataSourceRegistryConfig,\n// since widget hooks use that value in their query keys.\nexport interface PortalWidgetsApiProviderProps {\n baseUrl: string | undefined;\n getApiHeaders: (() => Record<string, string>) | undefined;\n children: ReactNode;\n}\n\nexport function PortalWidgetsApiProvider({\n baseUrl,\n getApiHeaders,\n children,\n}: PortalWidgetsApiProviderProps): React.JSX.Element {\n const client = usePortalTenantClient();\n const getApiHeadersRef = useRef(getApiHeaders);\n getApiHeadersRef.current = getApiHeaders;\n\n const api = useMemo(\n () =>\n createPortalWidgetsApiAdapter(client, {\n baseUrl,\n getApiHeaders: () => getApiHeadersRef.current?.() ?? {},\n } satisfies LegacyWidgetsApiConfig),\n [client, baseUrl],\n );\n\n return <WidgetsApiProvider value={api}>{children}</WidgetsApiProvider>;\n}\n","import type { AnyComponent } from \"../types/widget-schema\";\nimport type { WidgetSchema, TypedWidgetSchema } from \"../types\";\nimport type { ShareableItem } from \"../types/shareable-item\";\nimport type { WidgetManifest } from \"../registries/widget-manifest\";\n\nexport function createWidgetRegistry<\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n T extends Record<string, AnyComponent>,\n>(registry: T, plugins?: WidgetManifest[]): T {\n if (!plugins || plugins.length === 0) {\n return registry;\n }\n\n const pluginEntries = Object.fromEntries(\n plugins.map((p) => [p.type, p.component]),\n );\n\n return { ...registry, ...pluginEntries } as T;\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function createScreen<T extends Record<string, AnyComponent>>(\n registry: T,\n widgets: TypedWidgetSchema<T>[],\n): TypedWidgetSchema<T>[] {\n // Validate that all widget types exist in the registry at runtime\n widgets.forEach((widget) => {\n if (!(widget.type in registry)) {\n throw new Error(\n `Widget type \"${String(widget.type)}\" not found in registry`,\n );\n }\n });\n return widgets;\n}\n\n// Helper to create WidgetSchema from shareable item\nexport function createWidgetFromShareable(item: ShareableItem): WidgetSchema {\n const isVideo = item.kind === \"video\" || !!item.videoUrl;\n\n if (isVideo && item.videoUrl) {\n return {\n type: \"VideoWidget\",\n props: {\n src: item.videoUrl,\n poster: item.imageUrl,\n caption: item.title,\n },\n };\n }\n\n return {\n type: \"ImageWidget\",\n props: {\n src: item.imageUrl,\n alt: item.title || \"Image\",\n objectFit: \"cover\",\n },\n };\n}\n","import type { WidgetPropertySchema } from \"@fluid-app/portal-core/registries\";\n\n// Widget Components\nexport { AlertWidget, alertWidgetPropertySchema } from \"./AlertWidget\";\nexport {\n BulletListWidget,\n bulletListWidgetPropertySchema,\n} from \"./BulletListWidget\";\nexport { CalendarWidget, calendarWidgetPropertySchema } from \"./CalendarWidget\";\nexport { CardWidget, cardWidgetPropertySchema } from \"./CardWidget\";\nexport { CarouselWidget, carouselWidgetPropertySchema } from \"./CarouselWidget\";\nexport { CatchUpWidget, catchUpWidgetPropertySchema } from \"./CatchUpWidget\";\nexport { ChartWidget, chartWidgetPropertySchema } from \"./ChartWidget\";\nexport {\n ContainerWidget,\n containerWidgetPropertySchema,\n} from \"./ContainerWidget\";\nexport { EmbedWidget, embedWidgetPropertySchema } from \"./EmbedWidget\";\nexport { ImageWidget, imageWidgetPropertySchema } from \"./ImageWidget\";\nexport { LayoutWidget, layoutWidgetPropertySchema } from \"./LayoutWidget\";\nexport { LinkWidget, linkWidgetPropertySchema } from \"./LinkWidget\";\nexport { ListWidget, listWidgetPropertySchema } from \"./ListWidget\";\nexport { MySiteWidget, mySiteWidgetPropertySchema } from \"./MySiteWidget\";\nexport { NestedWidget, nestedWidgetPropertySchema } from \"./NestedWidget\";\nexport { PointsWidget, pointsWidgetPropertySchema } from \"./PointsWidget\";\nexport {\n QuickLinksWidget,\n quickLinksWidgetPropertySchema,\n} from \"./QuickLinksWidget\";\nexport {\n QuickShareWidget,\n quickShareWidgetPropertySchema,\n} from \"./QuickShareWidget\";\nexport {\n RecentActivityWidget,\n recentActivityWidgetPropertySchema,\n} from \"./RecentActivityWidget\";\nexport {\n SeparatorWidget,\n separatorWidgetPropertySchema,\n} from \"./SeparatorWidget\";\nexport { SpacerWidget, spacerWidgetPropertySchema } from \"./SpacerWidget\";\nexport { TableWidget, tableWidgetPropertySchema } from \"./TableWidget\";\nexport { TextWidget, textWidgetPropertySchema } from \"./TextWidget\";\nexport { ToDoWidget, toDoWidgetPropertySchema } from \"./ToDoWidget\";\nexport { VideoWidget, videoWidgetPropertySchema } from \"./VideoWidget\";\n\n// Re-export gapValues from core (used by widgets)\nexport { gapValues } from \"../core/fields\";\n\n// Re-export all property schemas as a collection\nexport const widgetPropertySchemas = {\n AlertWidget: (): Promise<WidgetPropertySchema> =>\n import(\"./AlertWidget\").then((m) => m.alertWidgetPropertySchema),\n BulletListWidget: (): Promise<WidgetPropertySchema> =>\n import(\"./BulletListWidget\").then((m) => m.bulletListWidgetPropertySchema),\n CalendarWidget: (): Promise<WidgetPropertySchema> =>\n import(\"./CalendarWidget\").then((m) => m.calendarWidgetPropertySchema),\n CardWidget: (): Promise<WidgetPropertySchema> =>\n import(\"./CardWidget\").then((m) => m.cardWidgetPropertySchema),\n CarouselWidget: (): Promise<WidgetPropertySchema> =>\n import(\"./CarouselWidget\").then((m) => m.carouselWidgetPropertySchema),\n CatchUpWidget: (): Promise<WidgetPropertySchema> =>\n import(\"./CatchUpWidget\").then((m) => m.catchUpWidgetPropertySchema),\n ChartWidget: (): Promise<WidgetPropertySchema> =>\n import(\"./ChartWidget\").then((m) => m.chartWidgetPropertySchema),\n ContainerWidget: (): Promise<WidgetPropertySchema> =>\n import(\"./ContainerWidget\").then((m) => m.containerWidgetPropertySchema),\n EmbedWidget: (): Promise<WidgetPropertySchema> =>\n import(\"./EmbedWidget\").then((m) => m.embedWidgetPropertySchema),\n ImageWidget: (): Promise<WidgetPropertySchema> =>\n import(\"./ImageWidget\").then((m) => m.imageWidgetPropertySchema),\n LayoutWidget: (): Promise<WidgetPropertySchema> =>\n import(\"./LayoutWidget\").then((m) => m.layoutWidgetPropertySchema),\n LinkWidget: (): Promise<WidgetPropertySchema> =>\n import(\"./LinkWidget\").then((m) => m.linkWidgetPropertySchema),\n ListWidget: (): Promise<WidgetPropertySchema> =>\n import(\"./ListWidget\").then((m) => m.listWidgetPropertySchema),\n MySiteWidget: (): Promise<WidgetPropertySchema> =>\n import(\"./MySiteWidget\").then((m) => m.mySiteWidgetPropertySchema),\n NestedWidget: (): Promise<WidgetPropertySchema> =>\n import(\"./NestedWidget\").then((m) => m.nestedWidgetPropertySchema),\n PointsWidget: (): Promise<WidgetPropertySchema> =>\n import(\"./PointsWidget\").then((m) => m.pointsWidgetPropertySchema),\n QuickLinksWidget: (): Promise<WidgetPropertySchema> =>\n import(\"./QuickLinksWidget\").then((m) => m.quickLinksWidgetPropertySchema),\n QuickShareWidget: (): Promise<WidgetPropertySchema> =>\n import(\"./QuickShareWidget\").then((m) => m.quickShareWidgetPropertySchema),\n RecentActivityWidget: (): Promise<WidgetPropertySchema> =>\n import(\"./RecentActivityWidget\").then(\n (m) => m.recentActivityWidgetPropertySchema,\n ),\n SeparatorWidget: (): Promise<WidgetPropertySchema> =>\n import(\"./SeparatorWidget\").then((m) => m.separatorWidgetPropertySchema),\n SpacerWidget: (): Promise<WidgetPropertySchema> =>\n import(\"./SpacerWidget\").then((m) => m.spacerWidgetPropertySchema),\n TableWidget: (): Promise<WidgetPropertySchema> =>\n import(\"./TableWidget\").then((m) => m.tableWidgetPropertySchema),\n TextWidget: (): Promise<WidgetPropertySchema> =>\n import(\"./TextWidget\").then((m) => m.textWidgetPropertySchema),\n ToDoWidget: (): Promise<WidgetPropertySchema> =>\n import(\"./ToDoWidget\").then((m) => m.toDoWidgetPropertySchema),\n VideoWidget: (): Promise<WidgetPropertySchema> =>\n import(\"./VideoWidget\").then((m) => m.videoWidgetPropertySchema),\n};\n","/**\n * Default widget registry for SDK apps.\n * Maps widget type names to their view-only components from portal-widgets.\n */\n\nimport type { WidgetRegistry } from \"@fluid-app/portal-core/types\";\nimport { createWidgetRegistry } from \"@fluid-app/portal-core/widget-utils\";\nimport {\n AlertWidget,\n BulletListWidget,\n CalendarWidget,\n CardWidget,\n CarouselWidget,\n CatchUpWidget,\n ChartWidget,\n ContainerWidget,\n EmbedWidget,\n ImageWidget,\n LayoutWidget,\n LinkWidget,\n ListWidget,\n MySiteWidget,\n NestedWidget,\n PointsWidget,\n QuickLinksWidget,\n QuickShareWidget,\n RecentActivityWidget,\n SeparatorWidget,\n SpacerWidget,\n TableWidget,\n TextWidget,\n ToDoWidget,\n VideoWidget,\n} from \"@fluid-app/portal-widgets/widgets\";\n\nexport const DEFAULT_SDK_WIDGET_REGISTRY: WidgetRegistry = createWidgetRegistry(\n {\n AlertWidget,\n BulletListWidget,\n CalendarWidget,\n CardWidget,\n CarouselWidget,\n CatchUpWidget,\n ChartWidget,\n ContainerWidget,\n EmbedWidget,\n ImageWidget,\n LayoutWidget,\n LinkWidget,\n ListWidget,\n MySiteWidget,\n NestedWidget,\n PointsWidget,\n QuickLinksWidget,\n QuickShareWidget,\n RecentActivityWidget,\n SeparatorWidget,\n SpacerWidget,\n TableWidget,\n TextWidget,\n ToDoWidget,\n VideoWidget,\n },\n);\n","/**\n * Main Fluid SDK Provider\n * Wraps QueryClientProvider and FluidThemeProvider\n */\n\nimport {\n createContext,\n useContext,\n useCallback,\n useMemo,\n useRef,\n type ReactNode,\n} from \"react\";\nimport { QueryClient, QueryClientProvider } from \"@tanstack/react-query\";\nimport { createPersister } from \"@fluid-app/query-persister\";\nimport { AppDefinitionApiProvider } from \"@fluid-app/portal-core/app-definition-api-context\";\nimport { DataSourceApiProvider } from \"@fluid-app/portal-core/data-source-api-context\";\nimport { AccountApiProvider } from \"@fluid-app/portal-core/account-api-context\";\nimport { StoreApiProvider } from \"@fluid-app/portal-core/store-api-context\";\nimport { PayApiProvider } from \"@fluid-app/portal-core/pay-api-context\";\nimport { MySiteApiProvider } from \"@fluid-app/mysite-core/mysite-api-context\";\nimport { CountriesApiProvider } from \"@fluid-app/store-core/countries-api-context\";\nimport { LanguagesApiProvider } from \"@fluid-app/store-core/languages-api-context\";\nimport { createFetchClient as createPortalTenantFetchClient } from \"@fluid-app/portal-tenant-api-client\";\nimport { createFetchClient as createPortalTenantContentFetchClient } from \"@fluid-app/portal-tenant-content-api-client\";\nimport { createDataSourceApiAdapter } from \"../adapters/data-source-api-adapter\";\nimport { createAppDefinitionApiAdapter } from \"../adapters/app-definition-api-adapter\";\nimport { createAccountApiAdapter } from \"../adapters/account-api-adapter\";\nimport { createStoreApiAdapter } from \"../adapters/store-api-adapter\";\nimport { createPortalTenantPayAdapter } from \"../adapters/pay-api-adapter\";\nimport { createCountriesApiAdapter } from \"../adapters/countries-api-adapter\";\nimport { createLanguagesApiAdapter } from \"../adapters/languages-api-adapter\";\nimport { createMySiteApiAdapter } from \"../adapters/mysite-api-adapter\";\nimport { FluidThemeProvider } from \"./FluidThemeProvider\";\nimport { PortalTenantClientProvider } from \"./PortalTenantClientProvider\";\nimport { DataSourceRegistryProvider } from \"@fluid-app/portal-react/data-sources/registry-context\";\nimport { RegistryProvider } from \"@fluid-app/portal-widgets/contexts\";\nimport { PortalWidgetsApiProvider } from \"../widgets/PortalWidgetsApiProvider\";\nimport { DEFAULT_SDK_WIDGET_REGISTRY } from \"../core/default-widget-registry\";\nimport type { FluidSDKConfig } from \"../types/config\";\nimport type { ThemeDefinition } from \"../types/theme\";\n\n/**\n * Context value for FluidProvider.\n * All properties are readonly since context values should not be mutated by consumers.\n */\ninterface FluidContextValue {\n /** SDK configuration */\n readonly config: FluidSDKConfig;\n}\n\nconst FluidContext = createContext<FluidContextValue | null>(null);\n\nexport interface FluidProviderProps {\n /** SDK configuration (baseUrl, auth, etc.) */\n config: FluidSDKConfig;\n /** React children */\n children: ReactNode;\n /** Optional custom QueryClient instance */\n queryClient?: QueryClient;\n /** Optional initial theme */\n initialTheme?: ThemeDefinition;\n /** Optional container for scoped theme application */\n themeContainer?: HTMLElement | null;\n /** Optional custom widget registry (defaults to all built-in widgets) */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n widgetRegistry?: Record<string, React.ComponentType<any>>;\n /** Dynamic variables for data source endpoint path substitution (e.g., { rep_id: \"123\" }) */\n variables?: Record<string, string>;\n}\n\n/**\n * Main provider for the Fluid Portal SDK\n *\n * @example\n * ```tsx\n * import { FluidProvider } from \"@fluid-app/portal-sdk\";\n *\n * function App() {\n * return (\n * <FluidProvider\n * config={{ baseUrl: \"\" }}\n * >\n * <YourApp />\n * </FluidProvider>\n * );\n * }\n * ```\n */\nexport function FluidProvider({\n config,\n children,\n queryClient,\n initialTheme,\n themeContainer,\n widgetRegistry,\n variables,\n}: FluidProviderProps): React.JSX.Element {\n // Create default QueryClient if none provided\n // Using lazy initialization to ensure it's only created once\n const defaultQueryClient = useMemo(() => {\n const persister =\n typeof window !== \"undefined\" && !import.meta.env?.DEV\n ? createPersister()\n : undefined;\n\n return new QueryClient({\n defaultOptions: {\n queries: {\n staleTime: 1000 * 60, // 1 minute\n retry: 1,\n persister: persister?.persisterFn,\n },\n },\n });\n }, []);\n\n // Keep latest config in a ref so client creation reads current values\n const configRef = useRef(config);\n configRef.current = config;\n\n // Read the CSRF token from the <meta name=\"csrf-token\"> tag that Rails\n // embeds in the HTML. Required for non-GET requests to the BFF.\n const csrfToken =\n typeof document !== \"undefined\"\n ? document\n .querySelector('meta[name=\"csrf-token\"]')\n ?.getAttribute(\"content\")\n : null;\n\n const portalTenantClient = useMemo(\n () =>\n createPortalTenantFetchClient({\n baseUrl: configRef.current.baseUrl,\n onAuthError: () => configRef.current.onAuthError?.(),\n credentials: \"include\",\n defaultHeaders: {\n ...(csrfToken ? { \"X-CSRF-Token\": csrfToken } : {}),\n },\n }),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [config.baseUrl, csrfToken],\n );\n\n // Create portal-tenant content FetchClient for media, pages, and playlists endpoints\n const portalTenantContentClient = useMemo(\n () =>\n createPortalTenantContentFetchClient({\n baseUrl: configRef.current.baseUrl,\n onAuthError: () => configRef.current.onAuthError?.(),\n credentials: \"include\",\n defaultHeaders: {\n ...(csrfToken ? { \"X-CSRF-Token\": csrfToken } : {}),\n },\n }),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [config.baseUrl, csrfToken],\n );\n\n // Create DataSourceApi adapter backed by BFF clients\n const dataSourceApi = useMemo(\n () =>\n createDataSourceApiAdapter(portalTenantClient, portalTenantContentClient),\n [portalTenantClient, portalTenantContentClient],\n );\n\n // Create AppDefinitionApi adapter for dependency inversion\n const appDefinitionApi = useMemo(\n () => createAppDefinitionApiAdapter(portalTenantClient),\n [portalTenantClient],\n );\n\n // Create AccountApi adapter for dependency inversion\n const accountApi = useMemo(\n () => createAccountApiAdapter(portalTenantClient),\n [portalTenantClient],\n );\n\n // Create StoreApi adapter for dependency inversion\n const storeApi = useMemo(\n () => createStoreApiAdapter(portalTenantClient),\n [portalTenantClient],\n );\n\n // Create PayApi adapter for dependency inversion\n const payApi = useMemo(\n () => createPortalTenantPayAdapter(portalTenantClient),\n [portalTenantClient],\n );\n\n // Create CountriesApi adapter for dependency inversion\n const countriesApi = useMemo(\n () => createCountriesApiAdapter(portalTenantClient),\n [portalTenantClient],\n );\n\n // Create LanguagesApi adapter for dependency inversion\n const languagesApi = useMemo(\n () => createLanguagesApiAdapter(portalTenantClient),\n [portalTenantClient],\n );\n\n // Create MySiteApi adapter for dependency inversion\n const mysiteApi = useMemo(\n () => createMySiteApiAdapter(portalTenantClient),\n [portalTenantClient],\n );\n\n // Context value only changes when baseUrl changes, but captures the live\n // config so consumers reading non-baseUrl fields (filestackApiKey,\n // onAuthError, defaultHeaders) see current values after parent re-renders.\n const contextValue = useMemo(\n () => ({ config }) satisfies FluidContextValue,\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [config.baseUrl],\n );\n\n // Stable callback to provide auth headers for data source fetchers.\n // Auth is handled by session cookies via `credentials: 'include'` on fetch calls.\n const getApiHeaders = useCallback((): Record<string, string> => {\n return {\n \"Content-Type\": \"application/json\",\n };\n }, []);\n\n // Data source endpoints (e.g., /company/v1/products) expect the base URL\n // to include /api, matching fluid-admin's NEXT_PUBLIC_API_URL pattern.\n const dataSourceBaseUrl = useMemo(() => {\n const base = config.baseUrl.replace(/\\/+$/, \"\");\n return base.endsWith(\"/api\") ? base : `${base}/api`;\n }, [config.baseUrl]);\n\n // Variables for data source path interpolation (e.g., { rep_id: \"123\" }).\n // Must be passed explicitly via the `variables` prop.\n const effectiveVariables = variables;\n\n // Build theme provider props conditionally to satisfy exactOptionalPropertyTypes\n // We only pass props that are defined to avoid passing `undefined` explicitly\n const themeProviderProps = {\n ...(initialTheme !== undefined && { initialTheme }),\n ...(themeContainer !== undefined && { container: themeContainer }),\n };\n\n // Use provided registry or fall back to the default SDK widget registry\n const registry = widgetRegistry ?? DEFAULT_SDK_WIDGET_REGISTRY;\n\n return (\n <QueryClientProvider client={queryClient ?? defaultQueryClient}>\n <FluidContext.Provider value={contextValue}>\n <PortalTenantClientProvider value={portalTenantClient}>\n <AppDefinitionApiProvider value={appDefinitionApi}>\n <AccountApiProvider value={accountApi}>\n <StoreApiProvider value={storeApi}>\n <PayApiProvider value={payApi}>\n <CountriesApiProvider value={countriesApi}>\n <LanguagesApiProvider value={languagesApi}>\n <MySiteApiProvider value={mysiteApi}>\n <DataSourceApiProvider value={dataSourceApi}>\n <ProviderStack\n baseUrl={dataSourceBaseUrl}\n getApiHeaders={getApiHeaders}\n variables={effectiveVariables}\n registry={registry}\n themeProviderProps={themeProviderProps}\n >\n {children}\n </ProviderStack>\n </DataSourceApiProvider>\n </MySiteApiProvider>\n </LanguagesApiProvider>\n </CountriesApiProvider>\n </PayApiProvider>\n </StoreApiProvider>\n </AccountApiProvider>\n </AppDefinitionApiProvider>\n </PortalTenantClientProvider>\n </FluidContext.Provider>\n </QueryClientProvider>\n );\n}\n\n/**\n * Inner component that sets up data source providers and theme.\n * Must be rendered inside FluidContext.Provider + QueryClientProvider.\n */\nfunction ProviderStack({\n baseUrl,\n getApiHeaders,\n variables,\n registry,\n themeProviderProps,\n children,\n}: {\n baseUrl: string;\n getApiHeaders: () => Record<string, string>;\n variables: Record<string, string> | undefined;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n registry: Record<string, React.ComponentType<any>>;\n themeProviderProps: Record<string, unknown>;\n children: ReactNode;\n}): React.JSX.Element {\n return (\n <DataSourceRegistryProvider\n baseUrl={baseUrl}\n getApiHeaders={getApiHeaders}\n variables={variables}\n >\n {/* Global: widgets render from PageRouter across system screens,\n custom pages, and data-driven builder screens. */}\n <PortalWidgetsApiProvider baseUrl={baseUrl} getApiHeaders={getApiHeaders}>\n <RegistryProvider registry={registry}>\n <FluidThemeProvider {...themeProviderProps}>\n {children}\n </FluidThemeProvider>\n </RegistryProvider>\n </PortalWidgetsApiProvider>\n </DataSourceRegistryProvider>\n );\n}\n\n/**\n * Hook to access the Fluid context\n * Must be used within a FluidProvider\n */\nexport function useFluidContext(): FluidContextValue {\n const context = useContext(FluidContext);\n if (!context) {\n throw new Error(\"useFluidContext must be used within a FluidProvider\");\n }\n return context;\n}\n"],"x_google_ignoreList":[0,1,2,3],"mappings":"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"}
@@ -967,7 +967,8 @@ function mapAccount(raw) {
967
967
  bio: raw.bio ?? null,
968
968
  avatar_url: raw.avatar_url ?? null,
969
969
  slug: raw.slug ?? "",
970
- social_links: raw.social_links ?? null
970
+ social_links: raw.social_links ?? null,
971
+ recipient_id: raw.recipient_id ?? null
971
972
  };
972
973
  }
973
974
  function createAccountApiAdapter(client) {
@@ -2250,4 +2251,4 @@ function useFluidContext() {
2250
2251
  //#endregion
2251
2252
  export { createScreen as a, FluidThemeProvider as c, useLanguagesApi as d, useAppDefinitionApi as f, widgetPropertySchemas as i, useThemeContext as l, deleteDatabase as m, useFluidContext as n, createWidgetFromShareable as o, createPersister as p, DEFAULT_SDK_WIDGET_REGISTRY as r, createWidgetRegistry as s, FluidProvider as t, ApiError as u };
2252
2253
 
2253
- //# sourceMappingURL=FluidProvider-Dg-eouRw.mjs.map
2254
+ //# sourceMappingURL=FluidProvider-FtpwIsLB.mjs.map