@fluid-app/portal-sdk 0.1.147 → 0.1.148

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 (27) hide show
  1. package/dist/{ProductsScreen-D6grDsLg.mjs → ProductsScreen--hkyw5c3.mjs} +9 -16
  2. package/dist/ProductsScreen--hkyw5c3.mjs.map +1 -0
  3. package/dist/{ProductsScreen-CMpMLotN.mjs → ProductsScreen-C5BF7B4b.mjs} +2 -2
  4. package/dist/{ProductsScreen-BYziWeSs.cjs → ProductsScreen-C8wwsfu0.cjs} +14 -21
  5. package/dist/ProductsScreen-C8wwsfu0.cjs.map +1 -0
  6. package/dist/{ProductsScreen-V6jOhd4m.cjs → ProductsScreen-DG_SMNs5.cjs} +2 -2
  7. package/dist/{ShareablesScreen-BpOu1VpJ.cjs → ShareablesScreen-B0JMhiKA.cjs} +41 -26
  8. package/dist/ShareablesScreen-B0JMhiKA.cjs.map +1 -0
  9. package/dist/{ShareablesScreen-7W63bXCs.mjs → ShareablesScreen-B8ZsEkgi.mjs} +32 -17
  10. package/dist/ShareablesScreen-B8ZsEkgi.mjs.map +1 -0
  11. package/dist/{ShareablesScreen-Do-aNX-x.cjs → ShareablesScreen-Caf2fI3S.cjs} +2 -2
  12. package/dist/{ShareablesScreen-DvCp2TyE.mjs → ShareablesScreen-DutWYuKD.mjs} +2 -2
  13. package/dist/index.cjs +7 -7
  14. package/dist/index.d.cts.map +1 -1
  15. package/dist/index.d.mts.map +1 -1
  16. package/dist/index.mjs +7 -7
  17. package/dist/{use-account-clients-DdEdLQc1.mjs → use-portal-shareables-api-CCRQARQM.mjs} +60 -28
  18. package/dist/use-portal-shareables-api-CCRQARQM.mjs.map +1 -0
  19. package/dist/{use-account-clients-Db7XdaFV.cjs → use-portal-shareables-api-CwSezl14.cjs} +65 -57
  20. package/dist/use-portal-shareables-api-CwSezl14.cjs.map +1 -0
  21. package/package.json +16 -15
  22. package/dist/ProductsScreen-BYziWeSs.cjs.map +0 -1
  23. package/dist/ProductsScreen-D6grDsLg.mjs.map +0 -1
  24. package/dist/ShareablesScreen-7W63bXCs.mjs.map +0 -1
  25. package/dist/ShareablesScreen-BpOu1VpJ.cjs.map +0 -1
  26. package/dist/use-account-clients-Db7XdaFV.cjs.map +0 -1
  27. package/dist/use-account-clients-DdEdLQc1.mjs.map +0 -1
@@ -1,15 +1,13 @@
1
- import { n as usePortalTenantClient } from "./PortalTenantClientProvider-Bg0pUj4O.mjs";
2
1
  import { n as useCurrentUser } from "./use-current-user-Cj2_q6uf.mjs";
3
2
  import { n as useAppNavigation } from "./AppNavigationContext-CAnb2Qxs.mjs";
4
- import { f as ProductsApp, g as ShareablesCoreProvider, h as ShareablesApiProvider, i as createPortalTenantFilesShareablesAdapter, m as ShareablesUIProvider, n as createPortalTenantProductMediaShareablesAdapter, o as createPortalTenantPlaylistsShareablesAdapter, r as createPortalTenantSharesShareablesAdapter, s as createPortalTenantMediaShareablesAdapter, t as useSdkClient } from "./use-account-clients-DdEdLQc1.mjs";
5
- import { t as usePortalProductsClient } from "./use-portal-products-client-cK-Vbzv_.mjs";
3
+ import { c as ProductsApp, d as ShareablesApiProvider, f as ShareablesCoreProvider, s as useSdkClient, t as usePortalShareablesApi, u as ShareablesUIProvider } from "./use-portal-shareables-api-CCRQARQM.mjs";
6
4
  import { useCallback, useMemo } from "react";
7
5
  import { jsx } from "react/jsx-runtime";
8
6
  //#region src/screens/ProductsScreen.tsx
9
7
  function ProductsScreen({ background, textColor, accentColor, padding, borderRadius, ...divProps }) {
10
8
  const domainClient = useSdkClient();
11
- const portalProductsApi = usePortalProductsClient();
12
- const portalTenantClient = usePortalTenantClient();
9
+ const shareablesApi = usePortalShareablesApi();
10
+ const { productsApi: portalProductsApi } = shareablesApi;
13
11
  const { data: userData } = useCurrentUser();
14
12
  const { currentSlug, navigate } = useAppNavigation();
15
13
  const fetchProducts = useCallback(async (search, cursor, limit) => {
@@ -37,11 +35,6 @@ function ProductsScreen({ background, textColor, accentColor, padding, borderRad
37
35
  user: userData ? { id: userData.id } : null,
38
36
  repContext: true
39
37
  }), [domainClient, userData]);
40
- const mediaAdapter = useMemo(() => createPortalTenantMediaShareablesAdapter(portalTenantClient), [portalTenantClient]);
41
- const playlistsAdapter = useMemo(() => createPortalTenantPlaylistsShareablesAdapter(portalTenantClient), [portalTenantClient]);
42
- const filesAdapter = useMemo(() => createPortalTenantFilesShareablesAdapter(portalTenantClient), [portalTenantClient]);
43
- const sharesAdapter = useMemo(() => createPortalTenantSharesShareablesAdapter(portalTenantClient), [portalTenantClient]);
44
- const productMediaAdapter = useMemo(() => createPortalTenantProductMediaShareablesAdapter(portalProductsApi), [portalProductsApi]);
45
38
  const uiConfig = useMemo(() => ({
46
39
  user: userData ? {
47
40
  id: userData.id,
@@ -61,11 +54,11 @@ function ProductsScreen({ background, textColor, accentColor, padding, borderRad
61
54
  children: /* @__PURE__ */ jsx(ShareablesCoreProvider, {
62
55
  config: coreConfig,
63
56
  children: /* @__PURE__ */ jsx(ShareablesApiProvider, {
64
- media: mediaAdapter,
65
- playlists: playlistsAdapter,
66
- fileResources: filesAdapter,
67
- share: sharesAdapter,
68
- productMedia: productMediaAdapter,
57
+ media: shareablesApi.media,
58
+ playlists: shareablesApi.playlists,
59
+ fileResources: shareablesApi.fileResources,
60
+ share: shareablesApi.share,
61
+ productMedia: shareablesApi.productMedia,
69
62
  children: /* @__PURE__ */ jsx(ShareablesUIProvider, {
70
63
  config: uiConfig,
71
64
  children: /* @__PURE__ */ jsx(ProductsApp, {
@@ -94,4 +87,4 @@ const productsScreenPropertySchema = {
94
87
  //#endregion
95
88
  export { productsScreenPropertySchema as n, ProductsScreen as t };
96
89
 
97
- //# sourceMappingURL=ProductsScreen-D6grDsLg.mjs.map
90
+ //# sourceMappingURL=ProductsScreen--hkyw5c3.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ProductsScreen--hkyw5c3.mjs","names":[],"sources":["../src/screens/ProductsScreen.tsx"],"sourcesContent":["import { useCallback, useMemo, type ComponentProps } from \"react\";\nimport type {\n BackgroundValue,\n BorderRadiusOptions,\n ColorOptions,\n PaddingOptions,\n} from \"../types\";\nimport type { WidgetPropertySchema } from \"../registries/property-schema-types\";\nimport {\n ShareablesCoreProvider,\n ShareablesApiProvider,\n} from \"@fluid-app/shareables-core\";\nimport { ShareablesUIProvider, ProductsApp } from \"@fluid-app/shareables-ui\";\nimport { useCurrentUser } from \"../hooks/use-current-user\";\nimport { useAppNavigation } from \"../shell/AppNavigationContext\";\nimport { useSdkClient } from \"../account/use-account-clients\";\nimport { usePortalShareablesApi } from \"../shareables/use-portal-shareables-api\";\n\ntype ProductsScreenProps = ComponentProps<\"div\"> & {\n background?: BackgroundValue;\n textColor?: ColorOptions;\n accentColor?: ColorOptions;\n padding?: PaddingOptions;\n borderRadius?: BorderRadiusOptions;\n};\n\nexport function ProductsScreen({\n /* eslint-disable @typescript-eslint/no-unused-vars -- destructured to exclude from divProps spread */\n background,\n textColor,\n accentColor,\n padding,\n borderRadius,\n /* eslint-enable @typescript-eslint/no-unused-vars */\n ...divProps\n}: ProductsScreenProps): React.JSX.Element {\n const domainClient = useSdkClient();\n const shareablesApi = usePortalShareablesApi();\n const { productsApi: portalProductsApi } = shareablesApi;\n const { data: userData } = useCurrentUser();\n const { currentSlug, navigate } = useAppNavigation();\n\n const fetchProducts = useCallback(\n async (search: string, cursor?: string, limit?: number) => {\n if (search) {\n return portalProductsApi.searchProducts(search, { cursor, limit });\n }\n return portalProductsApi.listProducts({ cursor, limit });\n },\n [portalProductsApi],\n );\n\n const fetchProduct = useCallback(\n async (id: string | number) => portalProductsApi.getProduct(id),\n [portalProductsApi],\n );\n\n // Extract product ID from slug: \"products/123\" → \"123\"\n const productId = useMemo(() => {\n const match = currentSlug.match(/^products\\/(.+)/);\n return match?.[1] ?? null;\n }, [currentSlug]);\n\n const handleSelectProduct = useCallback(\n (id: string) => {\n navigate(`products/${id}`);\n },\n [navigate],\n );\n\n const handleBack = useCallback(() => {\n navigate(\"products\");\n }, [navigate]);\n\n const coreConfig = useMemo(\n () => ({\n client: domainClient,\n user: userData ? { id: userData.id } : null,\n repContext: true,\n }),\n [domainClient, userData],\n );\n\n const uiConfig = useMemo(\n () => ({\n user: userData\n ? {\n id: userData.id,\n company: userData.company\n ? { logo_url: userData.company.logo_url }\n : null,\n }\n : undefined,\n basePath: \"\",\n navigate: (path: string) => {\n navigate(path);\n },\n showToast: (opts: {\n title: string;\n type: \"success\" | \"error\" | \"warning\";\n }) => {\n console.log(`[Products] ${opts.type}: ${opts.title}`);\n },\n }),\n [userData, navigate],\n );\n\n return (\n <div {...divProps} className={`h-full ${divProps.className ?? \"\"}`}>\n <ShareablesCoreProvider config={coreConfig}>\n <ShareablesApiProvider\n media={shareablesApi.media}\n playlists={shareablesApi.playlists}\n fileResources={shareablesApi.fileResources}\n share={shareablesApi.share}\n productMedia={shareablesApi.productMedia}\n >\n <ShareablesUIProvider config={uiConfig}>\n <ProductsApp\n countryCode={userData?.country?.iso}\n companyLogoUrl={userData?.company?.logo_url}\n fetchProducts={fetchProducts}\n fetchProduct={fetchProduct}\n productId={productId}\n onSelectProduct={handleSelectProduct}\n onBack={handleBack}\n />\n </ShareablesUIProvider>\n </ShareablesApiProvider>\n </ShareablesCoreProvider>\n </div>\n );\n}\n\nexport const productsScreenPropertySchema: WidgetPropertySchema = {\n widgetType: \"ProductsScreen\",\n displayName: \"Products Screen\",\n tabsConfig: [{ id: \"styling\", label: \"Styling\" }],\n fields: [],\n} as const satisfies WidgetPropertySchema;\n"],"mappings":";;;;;;AA0BA,SAAgB,eAAe,EAE7B,YACA,WACA,aACA,SACA,cAEA,GAAG,YACsC;CACzC,MAAM,eAAe,cAAc;CACnC,MAAM,gBAAgB,wBAAwB;CAC9C,MAAM,EAAE,aAAa,sBAAsB;CAC3C,MAAM,EAAE,MAAM,aAAa,gBAAgB;CAC3C,MAAM,EAAE,aAAa,aAAa,kBAAkB;CAEpD,MAAM,gBAAgB,YACpB,OAAO,QAAgB,QAAiB,UAAmB;AACzD,MAAI,OACF,QAAO,kBAAkB,eAAe,QAAQ;GAAE;GAAQ;GAAO,CAAC;AAEpE,SAAO,kBAAkB,aAAa;GAAE;GAAQ;GAAO,CAAC;IAE1D,CAAC,kBAAkB,CACpB;CAED,MAAM,eAAe,YACnB,OAAO,OAAwB,kBAAkB,WAAW,GAAG,EAC/D,CAAC,kBAAkB,CACpB;CAGD,MAAM,YAAY,cAAc;AAE9B,SADc,YAAY,MAAM,kBAAkB,GACnC,MAAM;IACpB,CAAC,YAAY,CAAC;CAEjB,MAAM,sBAAsB,aACzB,OAAe;AACd,WAAS,YAAY,KAAK;IAE5B,CAAC,SAAS,CACX;CAED,MAAM,aAAa,kBAAkB;AACnC,WAAS,WAAW;IACnB,CAAC,SAAS,CAAC;CAEd,MAAM,aAAa,eACV;EACL,QAAQ;EACR,MAAM,WAAW,EAAE,IAAI,SAAS,IAAI,GAAG;EACvC,YAAY;EACb,GACD,CAAC,cAAc,SAAS,CACzB;CAED,MAAM,WAAW,eACR;EACL,MAAM,WACF;GACE,IAAI,SAAS;GACb,SAAS,SAAS,UACd,EAAE,UAAU,SAAS,QAAQ,UAAU,GACvC;GACL,GACD,KAAA;EACJ,UAAU;EACV,WAAW,SAAiB;AAC1B,YAAS,KAAK;;EAEhB,YAAY,SAGN;AACJ,WAAQ,IAAI,cAAc,KAAK,KAAK,IAAI,KAAK,QAAQ;;EAExD,GACD,CAAC,UAAU,SAAS,CACrB;AAED,QACE,oBAAC,OAAD;EAAK,GAAI;EAAU,WAAW,UAAU,SAAS,aAAa;YAC5D,oBAAC,wBAAD;GAAwB,QAAQ;aAC9B,oBAAC,uBAAD;IACE,OAAO,cAAc;IACrB,WAAW,cAAc;IACzB,eAAe,cAAc;IAC7B,OAAO,cAAc;IACrB,cAAc,cAAc;cAE5B,oBAAC,sBAAD;KAAsB,QAAQ;eAC5B,oBAAC,aAAD;MACE,aAAa,UAAU,SAAS;MAChC,gBAAgB,UAAU,SAAS;MACpB;MACD;MACH;MACX,iBAAiB;MACjB,QAAQ;MACR,CAAA;KACmB,CAAA;IACD,CAAA;GACD,CAAA;EACrB,CAAA;;AAIV,MAAa,+BAAqD;CAChE,YAAY;CACZ,aAAa;CACb,YAAY,CAAC;EAAE,IAAI;EAAW,OAAO;EAAW,CAAC;CACjD,QAAQ,EAAE;CACX"}
@@ -38,7 +38,7 @@ import "./ScreenHeaderContext-DjSO5A8k.mjs";
38
38
  import "./dist-BjehZaTg.mjs";
39
39
  import "./SearchSort-M8cu-Jnj.mjs";
40
40
  import "./dist-Bo6ZG9XC.mjs";
41
- import "./use-account-clients-DdEdLQc1.mjs";
41
+ import "./use-portal-shareables-api-CCRQARQM.mjs";
42
42
  import "./sortable.esm-CzzU6kIR.mjs";
43
- import { n as productsScreenPropertySchema, t as ProductsScreen } from "./ProductsScreen-D6grDsLg.mjs";
43
+ import { n as productsScreenPropertySchema, t as ProductsScreen } from "./ProductsScreen--hkyw5c3.mjs";
44
44
  export { ProductsScreen, productsScreenPropertySchema };
@@ -1,16 +1,14 @@
1
1
  require("./chunk-9hOWP6kD.cjs");
2
- const require_PortalTenantClientProvider = require("./PortalTenantClientProvider-B_cJW53Y.cjs");
3
2
  const require_use_current_user = require("./use-current-user-0N-2bZRJ.cjs");
4
3
  const require_AppNavigationContext = require("./AppNavigationContext-Cenx07xI.cjs");
5
- const require_use_account_clients = require("./use-account-clients-Db7XdaFV.cjs");
6
- const require_use_portal_products_client = require("./use-portal-products-client-CYenp38s.cjs");
4
+ const require_use_portal_shareables_api = require("./use-portal-shareables-api-CwSezl14.cjs");
7
5
  let react = require("react");
8
6
  let react_jsx_runtime = require("react/jsx-runtime");
9
7
  //#region src/screens/ProductsScreen.tsx
10
8
  function ProductsScreen({ background, textColor, accentColor, padding, borderRadius, ...divProps }) {
11
- const domainClient = require_use_account_clients.useSdkClient();
12
- const portalProductsApi = require_use_portal_products_client.usePortalProductsClient();
13
- const portalTenantClient = require_PortalTenantClientProvider.usePortalTenantClient();
9
+ const domainClient = require_use_portal_shareables_api.useSdkClient();
10
+ const shareablesApi = require_use_portal_shareables_api.usePortalShareablesApi();
11
+ const { productsApi: portalProductsApi } = shareablesApi;
14
12
  const { data: userData } = require_use_current_user.useCurrentUser();
15
13
  const { currentSlug, navigate } = require_AppNavigationContext.useAppNavigation();
16
14
  const fetchProducts = (0, react.useCallback)(async (search, cursor, limit) => {
@@ -38,11 +36,6 @@ function ProductsScreen({ background, textColor, accentColor, padding, borderRad
38
36
  user: userData ? { id: userData.id } : null,
39
37
  repContext: true
40
38
  }), [domainClient, userData]);
41
- const mediaAdapter = (0, react.useMemo)(() => require_use_account_clients.createPortalTenantMediaShareablesAdapter(portalTenantClient), [portalTenantClient]);
42
- const playlistsAdapter = (0, react.useMemo)(() => require_use_account_clients.createPortalTenantPlaylistsShareablesAdapter(portalTenantClient), [portalTenantClient]);
43
- const filesAdapter = (0, react.useMemo)(() => require_use_account_clients.createPortalTenantFilesShareablesAdapter(portalTenantClient), [portalTenantClient]);
44
- const sharesAdapter = (0, react.useMemo)(() => require_use_account_clients.createPortalTenantSharesShareablesAdapter(portalTenantClient), [portalTenantClient]);
45
- const productMediaAdapter = (0, react.useMemo)(() => require_use_account_clients.createPortalTenantProductMediaShareablesAdapter(portalProductsApi), [portalProductsApi]);
46
39
  const uiConfig = (0, react.useMemo)(() => ({
47
40
  user: userData ? {
48
41
  id: userData.id,
@@ -59,17 +52,17 @@ function ProductsScreen({ background, textColor, accentColor, padding, borderRad
59
52
  return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
60
53
  ...divProps,
61
54
  className: `h-full ${divProps.className ?? ""}`,
62
- children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_use_account_clients.ShareablesCoreProvider, {
55
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_use_portal_shareables_api.ShareablesCoreProvider, {
63
56
  config: coreConfig,
64
- children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_use_account_clients.ShareablesApiProvider, {
65
- media: mediaAdapter,
66
- playlists: playlistsAdapter,
67
- fileResources: filesAdapter,
68
- share: sharesAdapter,
69
- productMedia: productMediaAdapter,
70
- children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_use_account_clients.ShareablesUIProvider, {
57
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_use_portal_shareables_api.ShareablesApiProvider, {
58
+ media: shareablesApi.media,
59
+ playlists: shareablesApi.playlists,
60
+ fileResources: shareablesApi.fileResources,
61
+ share: shareablesApi.share,
62
+ productMedia: shareablesApi.productMedia,
63
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_use_portal_shareables_api.ShareablesUIProvider, {
71
64
  config: uiConfig,
72
- children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_use_account_clients.ProductsApp, {
65
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_use_portal_shareables_api.ProductsApp, {
73
66
  countryCode: userData?.country?.iso,
74
67
  companyLogoUrl: userData?.company?.logo_url,
75
68
  fetchProducts,
@@ -106,4 +99,4 @@ Object.defineProperty(exports, "productsScreenPropertySchema", {
106
99
  }
107
100
  });
108
101
 
109
- //# sourceMappingURL=ProductsScreen-BYziWeSs.cjs.map
102
+ //# sourceMappingURL=ProductsScreen-C8wwsfu0.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ProductsScreen-C8wwsfu0.cjs","names":["useSdkClient","usePortalShareablesApi","useCurrentUser","useAppNavigation","ShareablesCoreProvider","ShareablesApiProvider","ShareablesUIProvider","ProductsApp"],"sources":["../src/screens/ProductsScreen.tsx"],"sourcesContent":["import { useCallback, useMemo, type ComponentProps } from \"react\";\nimport type {\n BackgroundValue,\n BorderRadiusOptions,\n ColorOptions,\n PaddingOptions,\n} from \"../types\";\nimport type { WidgetPropertySchema } from \"../registries/property-schema-types\";\nimport {\n ShareablesCoreProvider,\n ShareablesApiProvider,\n} from \"@fluid-app/shareables-core\";\nimport { ShareablesUIProvider, ProductsApp } from \"@fluid-app/shareables-ui\";\nimport { useCurrentUser } from \"../hooks/use-current-user\";\nimport { useAppNavigation } from \"../shell/AppNavigationContext\";\nimport { useSdkClient } from \"../account/use-account-clients\";\nimport { usePortalShareablesApi } from \"../shareables/use-portal-shareables-api\";\n\ntype ProductsScreenProps = ComponentProps<\"div\"> & {\n background?: BackgroundValue;\n textColor?: ColorOptions;\n accentColor?: ColorOptions;\n padding?: PaddingOptions;\n borderRadius?: BorderRadiusOptions;\n};\n\nexport function ProductsScreen({\n /* eslint-disable @typescript-eslint/no-unused-vars -- destructured to exclude from divProps spread */\n background,\n textColor,\n accentColor,\n padding,\n borderRadius,\n /* eslint-enable @typescript-eslint/no-unused-vars */\n ...divProps\n}: ProductsScreenProps): React.JSX.Element {\n const domainClient = useSdkClient();\n const shareablesApi = usePortalShareablesApi();\n const { productsApi: portalProductsApi } = shareablesApi;\n const { data: userData } = useCurrentUser();\n const { currentSlug, navigate } = useAppNavigation();\n\n const fetchProducts = useCallback(\n async (search: string, cursor?: string, limit?: number) => {\n if (search) {\n return portalProductsApi.searchProducts(search, { cursor, limit });\n }\n return portalProductsApi.listProducts({ cursor, limit });\n },\n [portalProductsApi],\n );\n\n const fetchProduct = useCallback(\n async (id: string | number) => portalProductsApi.getProduct(id),\n [portalProductsApi],\n );\n\n // Extract product ID from slug: \"products/123\" → \"123\"\n const productId = useMemo(() => {\n const match = currentSlug.match(/^products\\/(.+)/);\n return match?.[1] ?? null;\n }, [currentSlug]);\n\n const handleSelectProduct = useCallback(\n (id: string) => {\n navigate(`products/${id}`);\n },\n [navigate],\n );\n\n const handleBack = useCallback(() => {\n navigate(\"products\");\n }, [navigate]);\n\n const coreConfig = useMemo(\n () => ({\n client: domainClient,\n user: userData ? { id: userData.id } : null,\n repContext: true,\n }),\n [domainClient, userData],\n );\n\n const uiConfig = useMemo(\n () => ({\n user: userData\n ? {\n id: userData.id,\n company: userData.company\n ? { logo_url: userData.company.logo_url }\n : null,\n }\n : undefined,\n basePath: \"\",\n navigate: (path: string) => {\n navigate(path);\n },\n showToast: (opts: {\n title: string;\n type: \"success\" | \"error\" | \"warning\";\n }) => {\n console.log(`[Products] ${opts.type}: ${opts.title}`);\n },\n }),\n [userData, navigate],\n );\n\n return (\n <div {...divProps} className={`h-full ${divProps.className ?? \"\"}`}>\n <ShareablesCoreProvider config={coreConfig}>\n <ShareablesApiProvider\n media={shareablesApi.media}\n playlists={shareablesApi.playlists}\n fileResources={shareablesApi.fileResources}\n share={shareablesApi.share}\n productMedia={shareablesApi.productMedia}\n >\n <ShareablesUIProvider config={uiConfig}>\n <ProductsApp\n countryCode={userData?.country?.iso}\n companyLogoUrl={userData?.company?.logo_url}\n fetchProducts={fetchProducts}\n fetchProduct={fetchProduct}\n productId={productId}\n onSelectProduct={handleSelectProduct}\n onBack={handleBack}\n />\n </ShareablesUIProvider>\n </ShareablesApiProvider>\n </ShareablesCoreProvider>\n </div>\n );\n}\n\nexport const productsScreenPropertySchema: WidgetPropertySchema = {\n widgetType: \"ProductsScreen\",\n displayName: \"Products Screen\",\n tabsConfig: [{ id: \"styling\", label: \"Styling\" }],\n fields: [],\n} as const satisfies WidgetPropertySchema;\n"],"mappings":";;;;;;;AA0BA,SAAgB,eAAe,EAE7B,YACA,WACA,aACA,SACA,cAEA,GAAG,YACsC;CACzC,MAAM,eAAeA,kCAAAA,cAAc;CACnC,MAAM,gBAAgBC,kCAAAA,wBAAwB;CAC9C,MAAM,EAAE,aAAa,sBAAsB;CAC3C,MAAM,EAAE,MAAM,aAAaC,yBAAAA,gBAAgB;CAC3C,MAAM,EAAE,aAAa,aAAaC,6BAAAA,kBAAkB;CAEpD,MAAM,iBAAA,GAAA,MAAA,aACJ,OAAO,QAAgB,QAAiB,UAAmB;AACzD,MAAI,OACF,QAAO,kBAAkB,eAAe,QAAQ;GAAE;GAAQ;GAAO,CAAC;AAEpE,SAAO,kBAAkB,aAAa;GAAE;GAAQ;GAAO,CAAC;IAE1D,CAAC,kBAAkB,CACpB;CAED,MAAM,gBAAA,GAAA,MAAA,aACJ,OAAO,OAAwB,kBAAkB,WAAW,GAAG,EAC/D,CAAC,kBAAkB,CACpB;CAGD,MAAM,aAAA,GAAA,MAAA,eAA0B;AAE9B,SADc,YAAY,MAAM,kBAAkB,GACnC,MAAM;IACpB,CAAC,YAAY,CAAC;CAEjB,MAAM,uBAAA,GAAA,MAAA,cACH,OAAe;AACd,WAAS,YAAY,KAAK;IAE5B,CAAC,SAAS,CACX;CAED,MAAM,cAAA,GAAA,MAAA,mBAA+B;AACnC,WAAS,WAAW;IACnB,CAAC,SAAS,CAAC;CAEd,MAAM,cAAA,GAAA,MAAA,gBACG;EACL,QAAQ;EACR,MAAM,WAAW,EAAE,IAAI,SAAS,IAAI,GAAG;EACvC,YAAY;EACb,GACD,CAAC,cAAc,SAAS,CACzB;CAED,MAAM,YAAA,GAAA,MAAA,gBACG;EACL,MAAM,WACF;GACE,IAAI,SAAS;GACb,SAAS,SAAS,UACd,EAAE,UAAU,SAAS,QAAQ,UAAU,GACvC;GACL,GACD,KAAA;EACJ,UAAU;EACV,WAAW,SAAiB;AAC1B,YAAS,KAAK;;EAEhB,YAAY,SAGN;AACJ,WAAQ,IAAI,cAAc,KAAK,KAAK,IAAI,KAAK,QAAQ;;EAExD,GACD,CAAC,UAAU,SAAS,CACrB;AAED,QACE,iBAAA,GAAA,kBAAA,KAAC,OAAD;EAAK,GAAI;EAAU,WAAW,UAAU,SAAS,aAAa;YAC5D,iBAAA,GAAA,kBAAA,KAACC,kCAAAA,wBAAD;GAAwB,QAAQ;aAC9B,iBAAA,GAAA,kBAAA,KAACC,kCAAAA,uBAAD;IACE,OAAO,cAAc;IACrB,WAAW,cAAc;IACzB,eAAe,cAAc;IAC7B,OAAO,cAAc;IACrB,cAAc,cAAc;cAE5B,iBAAA,GAAA,kBAAA,KAACC,kCAAAA,sBAAD;KAAsB,QAAQ;eAC5B,iBAAA,GAAA,kBAAA,KAACC,kCAAAA,aAAD;MACE,aAAa,UAAU,SAAS;MAChC,gBAAgB,UAAU,SAAS;MACpB;MACD;MACH;MACX,iBAAiB;MACjB,QAAQ;MACR,CAAA;KACmB,CAAA;IACD,CAAA;GACD,CAAA;EACrB,CAAA;;AAIV,MAAa,+BAAqD;CAChE,YAAY;CACZ,aAAa;CACb,YAAY,CAAC;EAAE,IAAI;EAAW,OAAO;EAAW,CAAC;CACjD,QAAQ,EAAE;CACX"}
@@ -39,8 +39,8 @@ require("./dist-C-JA9EGF.cjs");
39
39
  require("./es-D_ZSl548.cjs");
40
40
  require("./SearchSort-29u6qhlf.cjs");
41
41
  require("./dist-CAB6oMLL.cjs");
42
- require("./use-account-clients-Db7XdaFV.cjs");
42
+ require("./use-portal-shareables-api-CwSezl14.cjs");
43
43
  require("./dist-Mf7Sx86H.cjs");
44
- const require_ProductsScreen = require("./ProductsScreen-BYziWeSs.cjs");
44
+ const require_ProductsScreen = require("./ProductsScreen-C8wwsfu0.cjs");
45
45
  exports.ProductsScreen = require_ProductsScreen.ProductsScreen;
46
46
  exports.productsScreenPropertySchema = require_ProductsScreen.productsScreenPropertySchema;
@@ -4,8 +4,7 @@ const require_PortalTenantClientProvider = require("./PortalTenantClientProvider
4
4
  const require_use_fluid_auth = require("./use-fluid-auth-B4N-Fy0N.cjs");
5
5
  const require_use_current_user = require("./use-current-user-0N-2bZRJ.cjs");
6
6
  const require_AppNavigationContext = require("./AppNavigationContext-Cenx07xI.cjs");
7
- const require_use_account_clients = require("./use-account-clients-Db7XdaFV.cjs");
8
- const require_use_portal_products_client = require("./use-portal-products-client-CYenp38s.cjs");
7
+ const require_use_portal_shareables_api = require("./use-portal-shareables-api-CwSezl14.cjs");
9
8
  let react = require("react");
10
9
  let react_jsx_runtime = require("react/jsx-runtime");
11
10
  let zod = require("zod");
@@ -222,20 +221,20 @@ function createPortalTenantFilePickerApiAdapter(client) {
222
221
  return mapCreateResponse(await client.requestWithFormData("/api/content/dam/assets", formData, { method: "POST" }));
223
222
  },
224
223
  queryDamAssets: async (params) => {
225
- const response = await require_use_account_clients.dam_query(client, params);
224
+ const response = await require_use_portal_shareables_api.dam_query(client, params);
226
225
  return damQueryResponseSchema.parse({
227
226
  ...response,
228
227
  meta: response.meta ? { next_cursor: response.meta.pagination?.next_cursor ?? void 0 } : void 0
229
228
  });
230
229
  },
231
230
  deleteDamAsset: async (code) => {
232
- return require_use_account_clients.dam_assets_destroy(client, code);
231
+ return require_use_portal_shareables_api.dam_assets_destroy(client, code);
233
232
  },
234
233
  discardDamAsset: async (code) => {
235
- return require_use_account_clients.dam_assets_discard(client, code);
234
+ return require_use_portal_shareables_api.dam_assets_discard(client, code);
236
235
  },
237
236
  createDamAssetPathForAssets: async (params) => {
238
- return mapAssetPathCreateResponse(await require_use_account_clients.dam_asset_paths_create(client, params.code, { asset_path: { path: params.asset_paths.join(",") } }));
237
+ return mapAssetPathCreateResponse(await require_use_portal_shareables_api.dam_asset_paths_create(client, params.code, { asset_path: { path: params.asset_paths.join(",") } }));
239
238
  },
240
239
  searchUnsplash: async (_query, _page, _perPage) => {
241
240
  throw new Error("Unsplash search is not available through the portal-tenant BFF. Configure an Unsplash access key and use the standard FilePickerApi adapter instead.");
@@ -244,6 +243,27 @@ function createPortalTenantFilePickerApiAdapter(client) {
244
243
  };
245
244
  }
246
245
  //#endregion
246
+ //#region src/shareables/use-portal-file-picker-api.ts
247
+ /**
248
+ * Returns a FilePickerApi adapter backed by the portal-tenant BFF client.
249
+ * Screens consume this hook instead of importing the adapter factory directly.
250
+ */
251
+ function usePortalFilePickerApi() {
252
+ const client = require_PortalTenantClientProvider.usePortalTenantClient();
253
+ return (0, react.useMemo)(() => createPortalTenantFilePickerApiAdapter(client), [client]);
254
+ }
255
+ //#endregion
256
+ //#region src/shareables/use-portal-playlists-api.ts
257
+ /**
258
+ * Returns the port-level ContentPlaylistsApi adapter backed by the
259
+ * portal-tenant BFF client. Used for standalone playlist operations
260
+ * (e.g. deletePlaylist) that operate outside ShareablesApiProvider.
261
+ */
262
+ function usePortalPlaylistsApi() {
263
+ const client = require_PortalTenantClientProvider.usePortalTenantClient();
264
+ return (0, react.useMemo)(() => require_use_portal_shareables_api.createPortalTenantPlaylistsAdapter(client), [client]);
265
+ }
266
+ //#endregion
247
267
  //#region src/screens/ShareablesScreen.tsx
248
268
  /**
249
269
  * Parse the current shareables sub-route from the full slug.
@@ -274,9 +294,11 @@ function parseShareablesRoute(currentSlug) {
274
294
  };
275
295
  }
276
296
  function ShareablesScreen({ background, textColor, accentColor, padding, borderRadius, ...divProps }) {
277
- const domainClient = require_use_account_clients.useSdkClient();
278
- const portalProductsApi = require_use_portal_products_client.usePortalProductsClient();
279
- const portalTenantClient = require_PortalTenantClientProvider.usePortalTenantClient();
297
+ const domainClient = require_use_portal_shareables_api.useSdkClient();
298
+ const shareablesApi = require_use_portal_shareables_api.usePortalShareablesApi();
299
+ const { productsApi: portalProductsApi } = shareablesApi;
300
+ const filePickerApi = usePortalFilePickerApi();
301
+ const playlistsAdapter = usePortalPlaylistsApi();
280
302
  const { data: userData } = require_use_current_user.useCurrentUser();
281
303
  const { currentSlug, navigate } = require_AppNavigationContext.useAppNavigation();
282
304
  const { isCustomer } = useUserType();
@@ -308,13 +330,6 @@ function ShareablesScreen({ background, textColor, accentColor, padding, borderR
308
330
  user: userData ? { id: userData.id } : null,
309
331
  repContext: true
310
332
  }), [domainClient, userData]);
311
- const playlistsAdapter = (0, react.useMemo)(() => require_use_account_clients.createPortalTenantPlaylistsAdapter(portalTenantClient), [portalTenantClient]);
312
- const mediaAdapter = (0, react.useMemo)(() => require_use_account_clients.createPortalTenantMediaShareablesAdapter(portalTenantClient), [portalTenantClient]);
313
- const playlistsShareablesAdapter = (0, react.useMemo)(() => require_use_account_clients.createPortalTenantPlaylistsShareablesAdapter(portalTenantClient), [portalTenantClient]);
314
- const filesAdapter = (0, react.useMemo)(() => require_use_account_clients.createPortalTenantFilesShareablesAdapter(portalTenantClient), [portalTenantClient]);
315
- const sharesAdapter = (0, react.useMemo)(() => require_use_account_clients.createPortalTenantSharesShareablesAdapter(portalTenantClient), [portalTenantClient]);
316
- const productMediaAdapter = (0, react.useMemo)(() => require_use_account_clients.createPortalTenantProductMediaShareablesAdapter(portalProductsApi), [portalProductsApi]);
317
- const filePickerApi = (0, react.useMemo)(() => createPortalTenantFilePickerApiAdapter(portalTenantClient), [portalTenantClient]);
318
333
  const uiConfig = (0, react.useMemo)(() => ({
319
334
  user: userData ? {
320
335
  id: userData.id,
@@ -353,17 +368,17 @@ function ShareablesScreen({ background, textColor, accentColor, padding, borderR
353
368
  return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
354
369
  ...divProps,
355
370
  className: `h-full ${divProps.className ?? ""}`,
356
- children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_use_account_clients.ShareablesCoreProvider, {
371
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_use_portal_shareables_api.ShareablesCoreProvider, {
357
372
  config: coreConfig,
358
- children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_use_account_clients.ShareablesApiProvider, {
359
- media: mediaAdapter,
360
- playlists: playlistsShareablesAdapter,
361
- fileResources: filesAdapter,
362
- share: sharesAdapter,
363
- productMedia: productMediaAdapter,
364
- children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_use_account_clients.ShareablesUIProvider, {
373
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_use_portal_shareables_api.ShareablesApiProvider, {
374
+ media: shareablesApi.media,
375
+ playlists: shareablesApi.playlists,
376
+ fileResources: shareablesApi.fileResources,
377
+ share: shareablesApi.share,
378
+ productMedia: shareablesApi.productMedia,
379
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_use_portal_shareables_api.ShareablesUIProvider, {
365
380
  config: uiConfig,
366
- children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_use_account_clients.ShareablesApp, {
381
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_use_portal_shareables_api.ShareablesApp, {
367
382
  screen,
368
383
  detailId,
369
384
  action,
@@ -408,4 +423,4 @@ Object.defineProperty(exports, "useUserType", {
408
423
  }
409
424
  });
410
425
 
411
- //# sourceMappingURL=ShareablesScreen-BpOu1VpJ.cjs.map
426
+ //# sourceMappingURL=ShareablesScreen-B0JMhiKA.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ShareablesScreen-B0JMhiKA.cjs","names":["useFluidAuth","USER_TYPES","z","z","usePortalTenantClient","usePortalTenantClient","createPortalTenantPlaylistsAdapter","useSdkClient","usePortalShareablesApi","useCurrentUser","useAppNavigation","ShareablesCoreProvider","ShareablesApiProvider","ShareablesUIProvider","ShareablesApp"],"sources":["../src/hooks/use-user-type.ts","../../../file-picker/core/src/schemas/dam.ts","../../../file-picker/api-client/src/api/url-proxy.ts","../../../file-picker/api-client/src/portal-tenant-adapter.ts","../src/shareables/use-portal-file-picker-api.ts","../src/shareables/use-portal-playlists-api.ts","../src/screens/ShareablesScreen.tsx"],"sourcesContent":["import { useMemo } from \"react\";\nimport { useFluidAuth } from \"./use-fluid-auth\";\nimport { USER_TYPES, type UserType } from \"../auth/types\";\n\nexport interface UseUserTypeResult {\n userType: UserType | null;\n isCustomer: boolean;\n isRep: boolean;\n isAdmin: boolean;\n}\n\n/**\n * Convenience hook for user-type checks in the portal SDK.\n */\nexport function useUserType(): UseUserTypeResult {\n const { user } = useFluidAuth();\n\n return useMemo(() => {\n const userType = user?.user_type ?? null;\n return {\n userType,\n isCustomer: userType === USER_TYPES.customer,\n isRep: userType === USER_TYPES.rep,\n isAdmin:\n userType === USER_TYPES.admin || userType === USER_TYPES.root_admin,\n };\n }, [user?.user_type]);\n}\n","import { z } from \"zod\";\n\ntype DamVariantApi = {\n id: string;\n url: string | null;\n file_name: string;\n mime_type: string;\n content: any;\n created_at: string;\n updated_at: string;\n default: boolean;\n is_original: boolean;\n is_text: boolean;\n media_type: string;\n processing_status: string;\n tags: string[];\n};\n\nexport const damVariantSchema: z.ZodType<DamVariantApi> = z.object({\n id: z.string(),\n url: z.string().nullable(),\n file_name: z.string(),\n mime_type: z.string(),\n content: z.any().nullable(),\n created_at: z.string(),\n updated_at: z.string(),\n default: z.boolean(),\n is_original: z.boolean(),\n is_text: z.boolean(),\n media_type: z.string(),\n processing_status: z.string(),\n tags: z.array(z.string()),\n});\n\ntype DamAssetApi = {\n id: number;\n canonical_path: string;\n category: string;\n code: string;\n company: string;\n created_at: string;\n default_variant_id: string;\n default_variant_url?: string;\n description: string;\n name: string;\n updated_at: string;\n variants?: DamVariantApi[];\n};\n\nexport const damAssetSchema: z.ZodType<DamAssetApi> = z.object({\n id: z.number(),\n canonical_path: z.string(),\n category: z.string(),\n code: z.string(),\n company: z.string(),\n created_at: z.string(),\n default_variant_id: z.string(),\n default_variant_url: z.string().optional(),\n description: z.string(),\n name: z.string(),\n updated_at: z.string(),\n variants: z.array(damVariantSchema).optional(),\n});\n\ntype DamTreeFolderNode = {\n asset_code?: string | Record<string, unknown>;\n name?: string | Record<string, unknown>;\n category?: string | Record<string, unknown>;\n variants?: unknown[] | Record<string, unknown>;\n [key: string]: unknown;\n};\n\nexport const damTreeFolderNodeSchema: z.ZodType<DamTreeFolderNode> = z\n .object({\n asset_code: z\n .union([z.string(), z.record(z.string(), z.unknown())])\n .optional(),\n name: z.union([z.string(), z.record(z.string(), z.unknown())]).optional(),\n category: z\n .union([z.string(), z.record(z.string(), z.unknown())])\n .optional(),\n variants: z\n .union([z.array(z.unknown()), z.record(z.string(), z.unknown())])\n .optional(),\n })\n .passthrough();\n\nexport const damTreeSchema: z.ZodType<Record<string, any>> = z.record(\n z.string(),\n z.union([\n z.lazy(() => damTreeSchema),\n damAssetSchema,\n damTreeFolderNodeSchema,\n ]),\n);\n\ntype DamQueryResponse = {\n path: string;\n tree: Record<string, any>;\n meta?: { next_cursor?: string };\n};\n\nexport const damQueryResponseSchema: z.ZodType<DamQueryResponse> = z.object({\n path: z.string(),\n tree: damTreeSchema,\n meta: z\n .object({\n next_cursor: z.string().optional(),\n })\n .optional(),\n});\n\ntype DamAssetCreateRequest = {\n asset: {\n file: any;\n name: string;\n description?: string;\n tags?: string;\n };\n};\n\nexport const damAssetCreateRequestSchema: z.ZodType<DamAssetCreateRequest> =\n z.object({\n asset: z.object({\n file: z.any(),\n name: z.string(),\n description: z.string().optional(),\n tags: z.string().optional(),\n }),\n });\n\ntype DamAssetCreateResponse = {\n asset: DamAssetApi;\n meta: { request_id: string; timestamp: string };\n};\n\nexport const damAssetCreateResponseSchema: z.ZodType<DamAssetCreateResponse> =\n z.object({\n asset: damAssetSchema,\n meta: z.object({\n request_id: z.string(),\n timestamp: z.string(),\n }),\n });\n\n// Schema for creating asset with placeholder (for ImageKit direct upload)\ntype DamAssetCreateWithPlaceholderRequest = {\n placeholder_asset: {\n mime_type: string;\n name?: string;\n description?: string;\n };\n skip_autotagging?: boolean;\n};\n\nexport const damAssetCreateWithPlaceholderRequestSchema: z.ZodType<DamAssetCreateWithPlaceholderRequest> =\n z.object({\n placeholder_asset: z.object({\n mime_type: z.string(),\n name: z.string().optional(),\n description: z.string().optional(),\n }),\n skip_autotagging: z.boolean().optional(),\n });\n\n// Schema for creating asset path without file upload (legacy)\ntype DamAssetPathCreateRequest = {\n asset?: {\n file: any;\n name: string;\n description?: string;\n tags?: string;\n };\n text_asset?: {\n file_name: string;\n mime_type: string;\n text: string;\n name?: string;\n description?: string;\n tags?: string;\n };\n placeholder_asset?: {\n mime_type: string;\n name?: string;\n description?: string;\n };\n skip_autotagging?: boolean;\n};\n\nexport const damAssetPathCreateRequestSchema: z.ZodType<DamAssetPathCreateRequest> =\n z.object({\n asset: z\n .object({\n file: z.any(),\n name: z.string(),\n description: z.string().optional(),\n tags: z.string().optional(),\n })\n .optional(),\n text_asset: z\n .object({\n file_name: z.string(),\n mime_type: z.string(),\n text: z.string(),\n name: z.string().optional(),\n description: z.string().optional(),\n tags: z.string().optional(),\n })\n .optional(),\n placeholder_asset: z\n .object({\n mime_type: z.string(),\n name: z.string().optional(),\n description: z.string().optional(),\n })\n .optional(),\n skip_autotagging: z.boolean().optional(),\n });\n\ntype DamAssetPathCreateResponse = {\n asset: { id: number; canonical_path: string; name: string };\n meta: { request_id: string; timestamp: string };\n};\n\nexport const damAssetPathCreateResponseSchema: z.ZodType<DamAssetPathCreateResponse> =\n z.object({\n asset: z.object({\n id: z.number(),\n canonical_path: z.string(),\n name: z.string(),\n }),\n meta: z.object({\n request_id: z.string(),\n timestamp: z.string(),\n }),\n });\n\nexport type { DamVariantApi, DamAssetApi };\nexport type DamTreeApi = z.infer<typeof damTreeSchema>;\nexport type { DamQueryResponse };\nexport type { DamAssetCreateRequest };\nexport type { DamAssetCreateResponse };\nexport type { DamAssetCreateWithPlaceholderRequest };\nexport type { DamAssetPathCreateRequest };\nexport type { DamAssetPathCreateResponse };\n","import { z } from \"zod\";\nimport type { UrlProxyResponse } from \"@fluid-app/file-picker-core\";\n\nexport type { UrlProxyResponse };\n\nconst urlProxyResponseSchema: z.ZodType<UrlProxyResponse> = z.object({\n data: z.string(),\n contentType: z.string(),\n size: z.number(),\n});\n\n/**\n * Proxy a URL fetch through the backend to bypass CORS restrictions.\n * The backend fetches the file and returns it as base64-encoded data.\n *\n * @param url - The URL to fetch\n * @param proxyEndpoint - The proxy endpoint (defaults to \"/api/proxy-url\")\n */\nexport async function proxyUrlFetch(\n url: string,\n proxyEndpoint: string = \"/api/proxy-url\",\n): Promise<UrlProxyResponse> {\n const response = await fetch(proxyEndpoint, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({ url }),\n });\n\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({\n error: \"Failed to proxy URL fetch\",\n }));\n throw new Error(\n (errorData as { error?: string }).error || `HTTP ${response.status}`,\n );\n }\n\n const data: unknown = await response.json();\n return urlProxyResponseSchema.parse(data);\n}\n","import type { FetchClientInstance } from \"@fluid-app/api-client-core\";\nimport {\n damAssetSchema,\n damQueryResponseSchema,\n type CreateDamAssetParams,\n type CreateDamAssetPathForAssetsParams,\n type DamAssetCreateResponse,\n type DamAssetPathCreateResponse,\n type DamQueryParams,\n type DamQueryResponse,\n type FilePickerApi,\n type UnsplashSearchResponse,\n} from \"@fluid-app/file-picker-core\";\nimport {\n portalTenantContent,\n type operations,\n} from \"@fluid-app/portal-tenant-content-api-client\";\nimport { proxyUrlFetch } from \"./api/url-proxy\";\n\n/** BFF create response — derived from the generated OpenAPI types. */\ntype DamAssetCreateBffResponse = Awaited<\n ReturnType<typeof portalTenantContent.dam_assets_create>\n>;\n\n/** BFF asset path create response — derived from the generated OpenAPI types. */\ntype DamAssetPathCreateBffResponse = Awaited<\n ReturnType<typeof portalTenantContent.dam_asset_paths_create>\n>;\n\n/**\n * Maps a BFF DAM asset to the file-picker port's DamAssetCreateResponse shape.\n *\n * The BFF response includes nullable meta.request_id (from Api::Response),\n * while the port schema requires a string. We coalesce to empty string.\n */\nfunction mapCreateResponse(\n response: DamAssetCreateBffResponse,\n): DamAssetCreateResponse {\n const raw = response.asset ?? {};\n return {\n asset: damAssetSchema.parse({\n ...raw,\n canonical_path: raw.canonical_path ?? \"\",\n category: raw.category ?? \"\",\n company: raw.company ?? \"\",\n description: raw.description ?? \"\",\n default_variant_id: raw.default_variant_id ?? \"\",\n }),\n meta: {\n request_id: response.meta?.request_id ?? \"\",\n timestamp: response.meta?.timestamp ?? new Date().toISOString(),\n },\n };\n}\n\n/**\n * Maps a BFF asset path response to the file-picker port's shape.\n */\nfunction mapAssetPathCreateResponse(\n response: DamAssetPathCreateBffResponse,\n): DamAssetPathCreateResponse {\n const assetPath = response.asset_path ?? {};\n return {\n asset: {\n id: assetPath.id ?? 0,\n canonical_path: assetPath.path ?? \"\",\n name: assetPath.asset_code ?? \"\",\n },\n meta: {\n request_id: response.meta?.request_id ?? \"\",\n timestamp: response.meta?.timestamp ?? new Date().toISOString(),\n },\n };\n}\n\n/**\n * Creates a FilePickerApi adapter backed by the portal-tenant BFF's\n * `/api/content/dam/*` endpoints, using cookie-based auth via the\n * provided FetchClient.\n *\n * Unsplash search is not available through the BFF — callers that need\n * Unsplash should use the legacy adapter or provide their own\n * implementation.\n *\n * The `onProgress` callback in `createDamAsset` is not supported — the\n * underlying `fetch` API does not expose upload progress events.\n *\n * URL proxy delegates to the same-origin `/api/proxy-url` endpoint\n * (served by the hosting app, not the BFF) for CORS bypass, identical\n * to the legacy adapter behaviour.\n */\nexport function createPortalTenantFilePickerApiAdapter(\n client: FetchClientInstance,\n): FilePickerApi {\n return {\n createDamAsset: async (\n params: CreateDamAssetParams,\n ): Promise<DamAssetCreateResponse> => {\n // The generated dam_assets_create uses client.post (JSON body), but\n // file uploads require multipart/form-data. Use requestWithFormData\n // directly, typing the response from the generated operation type.\n const formData = new FormData();\n formData.append(\"asset[file]\", params.file);\n formData.append(\"asset[name]\", params.name);\n\n if (params.description) {\n formData.append(\"asset[description]\", params.description);\n }\n\n if (params.tags && params.tags.length > 0) {\n formData.append(\"asset[tags]\", params.tags.join(\",\"));\n }\n\n const response =\n await client.requestWithFormData<DamAssetCreateBffResponse>(\n \"/api/content/dam/assets\",\n formData,\n { method: \"POST\" },\n );\n\n return mapCreateResponse(response);\n },\n\n queryDamAssets: async (\n params: DamQueryParams,\n ): Promise<DamQueryResponse> => {\n const response = await portalTenantContent.dam_query(\n client,\n params satisfies operations[\"dam_query\"][\"requestBody\"][\"content\"][\"application/json\"],\n );\n return damQueryResponseSchema.parse({\n ...response,\n meta: response.meta\n ? { next_cursor: response.meta.pagination?.next_cursor ?? undefined }\n : undefined,\n });\n },\n\n deleteDamAsset: async (code: string): Promise<unknown> => {\n return portalTenantContent.dam_assets_destroy(client, code);\n },\n\n discardDamAsset: async (code: string): Promise<unknown> => {\n return portalTenantContent.dam_assets_discard(client, code);\n },\n\n createDamAssetPathForAssets: async (\n params: CreateDamAssetPathForAssetsParams,\n ): Promise<DamAssetPathCreateResponse> => {\n const response = await portalTenantContent.dam_asset_paths_create(\n client,\n params.code,\n { asset_path: { path: params.asset_paths.join(\",\") } },\n );\n return mapAssetPathCreateResponse(response);\n },\n\n searchUnsplash: async (\n _query: string,\n _page?: number,\n _perPage?: number,\n ): Promise<UnsplashSearchResponse> => {\n throw new Error(\n \"Unsplash search is not available through the portal-tenant BFF. \" +\n \"Configure an Unsplash access key and use the standard FilePickerApi adapter instead.\",\n );\n },\n\n proxyUrlFetch: (url: string) => proxyUrlFetch(url),\n };\n}\n","import { useMemo } from \"react\";\nimport type { FilePickerApi } from \"@fluid-app/file-picker-core\";\nimport { createPortalTenantFilePickerApiAdapter } from \"@fluid-app/file-picker-api-client\";\nimport { usePortalTenantClient } from \"../providers/PortalTenantClientProvider\";\n\n/**\n * Returns a FilePickerApi adapter backed by the portal-tenant BFF client.\n * Screens consume this hook instead of importing the adapter factory directly.\n */\nexport function usePortalFilePickerApi(): FilePickerApi {\n const client = usePortalTenantClient();\n return useMemo(\n () => createPortalTenantFilePickerApiAdapter(client),\n [client],\n );\n}\n","import { useMemo } from \"react\";\nimport type { ContentPlaylistsApi } from \"@fluid-app/shareables-core/playlists-api\";\nimport { createPortalTenantPlaylistsAdapter } from \"@fluid-app/shareables-api-client\";\nimport { usePortalTenantClient } from \"../providers/PortalTenantClientProvider\";\n\n/**\n * Returns the port-level ContentPlaylistsApi adapter backed by the\n * portal-tenant BFF client. Used for standalone playlist operations\n * (e.g. deletePlaylist) that operate outside ShareablesApiProvider.\n */\nexport function usePortalPlaylistsApi(): ContentPlaylistsApi {\n const client = usePortalTenantClient();\n return useMemo(() => createPortalTenantPlaylistsAdapter(client), [client]);\n}\n","import { useCallback, useMemo, type ComponentProps } from \"react\";\nimport type {\n BackgroundValue,\n BorderRadiusOptions,\n ColorOptions,\n PaddingOptions,\n} from \"../types\";\nimport type { WidgetPropertySchema } from \"../registries/property-schema-types\";\nimport {\n ShareablesCoreProvider,\n ShareablesApiProvider,\n} from \"@fluid-app/shareables-core\";\nimport { ShareablesUIProvider, ShareablesApp } from \"@fluid-app/shareables-ui\";\nimport { useCurrentUser } from \"../hooks/use-current-user\";\nimport { useAppNavigation } from \"../shell/AppNavigationContext\";\nimport { useSdkClient } from \"../account/use-account-clients\";\nimport { useUserType } from \"../hooks/use-user-type\";\nimport { usePortalShareablesApi } from \"../shareables/use-portal-shareables-api\";\nimport { usePortalFilePickerApi } from \"../shareables/use-portal-file-picker-api\";\nimport { usePortalPlaylistsApi } from \"../shareables/use-portal-playlists-api\";\n\ntype ShareablesScreenProps = ComponentProps<\"div\"> & {\n background?: BackgroundValue;\n textColor?: ColorOptions;\n accentColor?: ColorOptions;\n padding?: PaddingOptions;\n borderRadius?: BorderRadiusOptions;\n};\n\n/**\n * Parse the current shareables sub-route from the full slug.\n *\n * System nav slugs are \"share/products\", \"share/media\", \"share/playlists\".\n * Detail pages append an ID: \"share/products/123\", \"share/media/456\".\n *\n * \"share/products\" → screen=\"products\", detailId=null\n * \"share/products/123\" → screen=\"products\", detailId=\"123\"\n * \"share/media/456\" → screen=\"media\", detailId=\"456\"\n * \"share/playlists\" → screen=\"playlists\", detailId=null\n * \"share/playlists/789\" → screen=\"playlists\", detailId=\"789\"\n * \"share/files\" → screen=\"files\", detailId=null\n * \"share\" → screen=null (default to products)\n */\nfunction parseShareablesRoute(currentSlug: string): {\n screen: string | null;\n detailId: string | null;\n action: string | null;\n} {\n // Strip the \"share\" prefix\n const slugWithoutPrefix = currentSlug.replace(/^share\\/?/, \"\");\n if (!slugWithoutPrefix) {\n return { screen: null, detailId: null, action: null };\n }\n\n const parts = slugWithoutPrefix.split(\"/\");\n const screen = parts[0] || null;\n const detailId = parts[1] || null;\n const action = parts[2] || null;\n return { screen, detailId, action };\n}\n\nexport function ShareablesScreen({\n /* eslint-disable @typescript-eslint/no-unused-vars -- destructured to exclude from divProps spread */\n background,\n textColor,\n accentColor,\n padding,\n borderRadius,\n /* eslint-enable @typescript-eslint/no-unused-vars */\n ...divProps\n}: ShareablesScreenProps): React.JSX.Element {\n const domainClient = useSdkClient();\n const shareablesApi = usePortalShareablesApi();\n const { productsApi: portalProductsApi } = shareablesApi;\n const filePickerApi = usePortalFilePickerApi();\n const playlistsAdapter = usePortalPlaylistsApi();\n const { data: userData } = useCurrentUser();\n const { currentSlug, navigate } = useAppNavigation();\n const { isCustomer } = useUserType();\n\n const fetchProducts = useCallback(\n async (search: string, cursor?: string, limit?: number) => {\n if (search) {\n return portalProductsApi.searchProducts(search, { cursor, limit });\n }\n return portalProductsApi.listProducts({ cursor, limit });\n },\n [portalProductsApi],\n );\n\n const fetchProduct = useCallback(\n async (id: string | number) => portalProductsApi.getProduct(id),\n [portalProductsApi],\n );\n\n const { screen, detailId, action } = parseShareablesRoute(currentSlug);\n\n const handleNavigate = useCallback(\n (subScreen: string, id?: string) => {\n const path = id ? `share/${subScreen}/${id}` : `share/${subScreen}`;\n navigate(path);\n },\n [navigate],\n );\n\n const handleBack = useCallback(() => {\n if (detailId && screen) {\n // Navigate back to the listing for the current screen\n navigate(`share/${screen}`);\n } else {\n // Navigate to the default shareables screen\n navigate(\"share/products\");\n }\n }, [navigate, detailId, screen]);\n\n const coreConfig = useMemo(\n () => ({\n client: domainClient,\n user: userData ? { id: userData.id } : null,\n repContext: true,\n }),\n [domainClient, userData],\n );\n\n const uiConfig = useMemo(\n () => ({\n user: userData\n ? {\n id: userData.id,\n company: userData.company\n ? { logo_url: userData.company.logo_url }\n : null,\n }\n : undefined,\n affiliateId:\n (userData as { affiliate_id?: number } | undefined)?.affiliate_id ??\n null,\n basePath: \"\",\n navigate: (path: string) => {\n // Strip leading slash — cards generate paths like \"/share/product/123\"\n const cleanPath = path.replace(/^\\//, \"\");\n // Ensure share/ prefix — screen components pass relative paths like \"media/new\"\n const prefixed = cleanPath.startsWith(\"share/\")\n ? cleanPath\n : `share/${cleanPath}`;\n navigate(prefixed);\n },\n showToast: (opts: {\n title: string;\n type: \"success\" | \"error\" | \"warning\";\n }) => {\n console.warn(`[Shareables] ${opts.type}: ${opts.title}`);\n },\n filePickerApi,\n onToggleFavorite: async (params: {\n favoriteableId: number;\n favoriteableType: string;\n }) => {\n const affiliateId = (userData as { affiliate_id?: number } | undefined)\n ?.affiliate_id;\n if (!affiliateId) throw new Error(\"No affiliate ID\");\n return domainClient.post<{ is_favorited: boolean }>(\n `/user_companies/${affiliateId}/favorites/toggle.json`,\n {\n favoriteable_id: params.favoriteableId,\n favoriteable_type: params.favoriteableType,\n },\n );\n },\n onDeletePlaylist: isCustomer\n ? undefined\n : async (playlistId: number) => {\n await playlistsAdapter.deletePlaylist(playlistId);\n },\n readOnly: isCustomer,\n }),\n [\n userData,\n navigate,\n filePickerApi,\n domainClient,\n isCustomer,\n playlistsAdapter,\n ],\n );\n\n return (\n <div {...divProps} className={`h-full ${divProps.className ?? \"\"}`}>\n <ShareablesCoreProvider config={coreConfig}>\n <ShareablesApiProvider\n media={shareablesApi.media}\n playlists={shareablesApi.playlists}\n fileResources={shareablesApi.fileResources}\n share={shareablesApi.share}\n productMedia={shareablesApi.productMedia}\n >\n <ShareablesUIProvider config={uiConfig}>\n <ShareablesApp\n screen={screen}\n detailId={detailId}\n action={action}\n companyLogoUrl={userData?.company?.logo_url}\n countryCode={userData?.country?.iso}\n fetchProducts={fetchProducts}\n fetchProduct={fetchProduct}\n onNavigate={handleNavigate}\n onBack={handleBack}\n />\n </ShareablesUIProvider>\n </ShareablesApiProvider>\n </ShareablesCoreProvider>\n </div>\n );\n}\n\nexport const shareablesScreenPropertySchema: WidgetPropertySchema = {\n widgetType: \"ShareablesScreen\",\n displayName: \"Shareables Screen\",\n tabsConfig: [{ id: \"styling\", label: \"Styling\" }],\n fields: [],\n} as const satisfies WidgetPropertySchema;\n"],"mappings":"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"}
@@ -3,8 +3,7 @@ import { n as usePortalTenantClient } from "./PortalTenantClientProvider-Bg0pUj4
3
3
  import { t as useFluidAuth } from "./use-fluid-auth-DU_VCFeG.mjs";
4
4
  import { n as useCurrentUser } from "./use-current-user-Cj2_q6uf.mjs";
5
5
  import { n as useAppNavigation } from "./AppNavigationContext-CAnb2Qxs.mjs";
6
- import { a as createPortalTenantPlaylistsAdapter, c as dam_asset_paths_create, d as dam_query, g as ShareablesCoreProvider, h as ShareablesApiProvider, i as createPortalTenantFilesShareablesAdapter, l as dam_assets_destroy, m as ShareablesUIProvider, n as createPortalTenantProductMediaShareablesAdapter, o as createPortalTenantPlaylistsShareablesAdapter, p as ShareablesApp, r as createPortalTenantSharesShareablesAdapter, s as createPortalTenantMediaShareablesAdapter, t as useSdkClient, u as dam_assets_discard } from "./use-account-clients-DdEdLQc1.mjs";
7
- import { t as usePortalProductsClient } from "./use-portal-products-client-cK-Vbzv_.mjs";
6
+ import { a as dam_assets_discard, d as ShareablesApiProvider, f as ShareablesCoreProvider, i as dam_assets_destroy, l as ShareablesApp, n as createPortalTenantPlaylistsAdapter, o as dam_query, r as dam_asset_paths_create, s as useSdkClient, t as usePortalShareablesApi, u as ShareablesUIProvider } from "./use-portal-shareables-api-CCRQARQM.mjs";
8
7
  import { useCallback, useMemo } from "react";
9
8
  import { jsx } from "react/jsx-runtime";
10
9
  import { z } from "zod";
@@ -243,6 +242,27 @@ function createPortalTenantFilePickerApiAdapter(client) {
243
242
  };
244
243
  }
245
244
  //#endregion
245
+ //#region src/shareables/use-portal-file-picker-api.ts
246
+ /**
247
+ * Returns a FilePickerApi adapter backed by the portal-tenant BFF client.
248
+ * Screens consume this hook instead of importing the adapter factory directly.
249
+ */
250
+ function usePortalFilePickerApi() {
251
+ const client = usePortalTenantClient();
252
+ return useMemo(() => createPortalTenantFilePickerApiAdapter(client), [client]);
253
+ }
254
+ //#endregion
255
+ //#region src/shareables/use-portal-playlists-api.ts
256
+ /**
257
+ * Returns the port-level ContentPlaylistsApi adapter backed by the
258
+ * portal-tenant BFF client. Used for standalone playlist operations
259
+ * (e.g. deletePlaylist) that operate outside ShareablesApiProvider.
260
+ */
261
+ function usePortalPlaylistsApi() {
262
+ const client = usePortalTenantClient();
263
+ return useMemo(() => createPortalTenantPlaylistsAdapter(client), [client]);
264
+ }
265
+ //#endregion
246
266
  //#region src/screens/ShareablesScreen.tsx
247
267
  /**
248
268
  * Parse the current shareables sub-route from the full slug.
@@ -274,8 +294,10 @@ function parseShareablesRoute(currentSlug) {
274
294
  }
275
295
  function ShareablesScreen({ background, textColor, accentColor, padding, borderRadius, ...divProps }) {
276
296
  const domainClient = useSdkClient();
277
- const portalProductsApi = usePortalProductsClient();
278
- const portalTenantClient = usePortalTenantClient();
297
+ const shareablesApi = usePortalShareablesApi();
298
+ const { productsApi: portalProductsApi } = shareablesApi;
299
+ const filePickerApi = usePortalFilePickerApi();
300
+ const playlistsAdapter = usePortalPlaylistsApi();
279
301
  const { data: userData } = useCurrentUser();
280
302
  const { currentSlug, navigate } = useAppNavigation();
281
303
  const { isCustomer } = useUserType();
@@ -307,13 +329,6 @@ function ShareablesScreen({ background, textColor, accentColor, padding, borderR
307
329
  user: userData ? { id: userData.id } : null,
308
330
  repContext: true
309
331
  }), [domainClient, userData]);
310
- const playlistsAdapter = useMemo(() => createPortalTenantPlaylistsAdapter(portalTenantClient), [portalTenantClient]);
311
- const mediaAdapter = useMemo(() => createPortalTenantMediaShareablesAdapter(portalTenantClient), [portalTenantClient]);
312
- const playlistsShareablesAdapter = useMemo(() => createPortalTenantPlaylistsShareablesAdapter(portalTenantClient), [portalTenantClient]);
313
- const filesAdapter = useMemo(() => createPortalTenantFilesShareablesAdapter(portalTenantClient), [portalTenantClient]);
314
- const sharesAdapter = useMemo(() => createPortalTenantSharesShareablesAdapter(portalTenantClient), [portalTenantClient]);
315
- const productMediaAdapter = useMemo(() => createPortalTenantProductMediaShareablesAdapter(portalProductsApi), [portalProductsApi]);
316
- const filePickerApi = useMemo(() => createPortalTenantFilePickerApiAdapter(portalTenantClient), [portalTenantClient]);
317
332
  const uiConfig = useMemo(() => ({
318
333
  user: userData ? {
319
334
  id: userData.id,
@@ -355,11 +370,11 @@ function ShareablesScreen({ background, textColor, accentColor, padding, borderR
355
370
  children: /* @__PURE__ */ jsx(ShareablesCoreProvider, {
356
371
  config: coreConfig,
357
372
  children: /* @__PURE__ */ jsx(ShareablesApiProvider, {
358
- media: mediaAdapter,
359
- playlists: playlistsShareablesAdapter,
360
- fileResources: filesAdapter,
361
- share: sharesAdapter,
362
- productMedia: productMediaAdapter,
373
+ media: shareablesApi.media,
374
+ playlists: shareablesApi.playlists,
375
+ fileResources: shareablesApi.fileResources,
376
+ share: shareablesApi.share,
377
+ productMedia: shareablesApi.productMedia,
363
378
  children: /* @__PURE__ */ jsx(ShareablesUIProvider, {
364
379
  config: uiConfig,
365
380
  children: /* @__PURE__ */ jsx(ShareablesApp, {
@@ -390,4 +405,4 @@ const shareablesScreenPropertySchema = {
390
405
  //#endregion
391
406
  export { shareablesScreenPropertySchema as n, useUserType as r, ShareablesScreen as t };
392
407
 
393
- //# sourceMappingURL=ShareablesScreen-7W63bXCs.mjs.map
408
+ //# sourceMappingURL=ShareablesScreen-B8ZsEkgi.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ShareablesScreen-B8ZsEkgi.mjs","names":["portalTenantContent.dam_query","portalTenantContent.dam_assets_destroy","portalTenantContent.dam_assets_discard","portalTenantContent.dam_asset_paths_create"],"sources":["../src/hooks/use-user-type.ts","../../../file-picker/core/src/schemas/dam.ts","../../../file-picker/api-client/src/api/url-proxy.ts","../../../file-picker/api-client/src/portal-tenant-adapter.ts","../src/shareables/use-portal-file-picker-api.ts","../src/shareables/use-portal-playlists-api.ts","../src/screens/ShareablesScreen.tsx"],"sourcesContent":["import { useMemo } from \"react\";\nimport { useFluidAuth } from \"./use-fluid-auth\";\nimport { USER_TYPES, type UserType } from \"../auth/types\";\n\nexport interface UseUserTypeResult {\n userType: UserType | null;\n isCustomer: boolean;\n isRep: boolean;\n isAdmin: boolean;\n}\n\n/**\n * Convenience hook for user-type checks in the portal SDK.\n */\nexport function useUserType(): UseUserTypeResult {\n const { user } = useFluidAuth();\n\n return useMemo(() => {\n const userType = user?.user_type ?? null;\n return {\n userType,\n isCustomer: userType === USER_TYPES.customer,\n isRep: userType === USER_TYPES.rep,\n isAdmin:\n userType === USER_TYPES.admin || userType === USER_TYPES.root_admin,\n };\n }, [user?.user_type]);\n}\n","import { z } from \"zod\";\n\ntype DamVariantApi = {\n id: string;\n url: string | null;\n file_name: string;\n mime_type: string;\n content: any;\n created_at: string;\n updated_at: string;\n default: boolean;\n is_original: boolean;\n is_text: boolean;\n media_type: string;\n processing_status: string;\n tags: string[];\n};\n\nexport const damVariantSchema: z.ZodType<DamVariantApi> = z.object({\n id: z.string(),\n url: z.string().nullable(),\n file_name: z.string(),\n mime_type: z.string(),\n content: z.any().nullable(),\n created_at: z.string(),\n updated_at: z.string(),\n default: z.boolean(),\n is_original: z.boolean(),\n is_text: z.boolean(),\n media_type: z.string(),\n processing_status: z.string(),\n tags: z.array(z.string()),\n});\n\ntype DamAssetApi = {\n id: number;\n canonical_path: string;\n category: string;\n code: string;\n company: string;\n created_at: string;\n default_variant_id: string;\n default_variant_url?: string;\n description: string;\n name: string;\n updated_at: string;\n variants?: DamVariantApi[];\n};\n\nexport const damAssetSchema: z.ZodType<DamAssetApi> = z.object({\n id: z.number(),\n canonical_path: z.string(),\n category: z.string(),\n code: z.string(),\n company: z.string(),\n created_at: z.string(),\n default_variant_id: z.string(),\n default_variant_url: z.string().optional(),\n description: z.string(),\n name: z.string(),\n updated_at: z.string(),\n variants: z.array(damVariantSchema).optional(),\n});\n\ntype DamTreeFolderNode = {\n asset_code?: string | Record<string, unknown>;\n name?: string | Record<string, unknown>;\n category?: string | Record<string, unknown>;\n variants?: unknown[] | Record<string, unknown>;\n [key: string]: unknown;\n};\n\nexport const damTreeFolderNodeSchema: z.ZodType<DamTreeFolderNode> = z\n .object({\n asset_code: z\n .union([z.string(), z.record(z.string(), z.unknown())])\n .optional(),\n name: z.union([z.string(), z.record(z.string(), z.unknown())]).optional(),\n category: z\n .union([z.string(), z.record(z.string(), z.unknown())])\n .optional(),\n variants: z\n .union([z.array(z.unknown()), z.record(z.string(), z.unknown())])\n .optional(),\n })\n .passthrough();\n\nexport const damTreeSchema: z.ZodType<Record<string, any>> = z.record(\n z.string(),\n z.union([\n z.lazy(() => damTreeSchema),\n damAssetSchema,\n damTreeFolderNodeSchema,\n ]),\n);\n\ntype DamQueryResponse = {\n path: string;\n tree: Record<string, any>;\n meta?: { next_cursor?: string };\n};\n\nexport const damQueryResponseSchema: z.ZodType<DamQueryResponse> = z.object({\n path: z.string(),\n tree: damTreeSchema,\n meta: z\n .object({\n next_cursor: z.string().optional(),\n })\n .optional(),\n});\n\ntype DamAssetCreateRequest = {\n asset: {\n file: any;\n name: string;\n description?: string;\n tags?: string;\n };\n};\n\nexport const damAssetCreateRequestSchema: z.ZodType<DamAssetCreateRequest> =\n z.object({\n asset: z.object({\n file: z.any(),\n name: z.string(),\n description: z.string().optional(),\n tags: z.string().optional(),\n }),\n });\n\ntype DamAssetCreateResponse = {\n asset: DamAssetApi;\n meta: { request_id: string; timestamp: string };\n};\n\nexport const damAssetCreateResponseSchema: z.ZodType<DamAssetCreateResponse> =\n z.object({\n asset: damAssetSchema,\n meta: z.object({\n request_id: z.string(),\n timestamp: z.string(),\n }),\n });\n\n// Schema for creating asset with placeholder (for ImageKit direct upload)\ntype DamAssetCreateWithPlaceholderRequest = {\n placeholder_asset: {\n mime_type: string;\n name?: string;\n description?: string;\n };\n skip_autotagging?: boolean;\n};\n\nexport const damAssetCreateWithPlaceholderRequestSchema: z.ZodType<DamAssetCreateWithPlaceholderRequest> =\n z.object({\n placeholder_asset: z.object({\n mime_type: z.string(),\n name: z.string().optional(),\n description: z.string().optional(),\n }),\n skip_autotagging: z.boolean().optional(),\n });\n\n// Schema for creating asset path without file upload (legacy)\ntype DamAssetPathCreateRequest = {\n asset?: {\n file: any;\n name: string;\n description?: string;\n tags?: string;\n };\n text_asset?: {\n file_name: string;\n mime_type: string;\n text: string;\n name?: string;\n description?: string;\n tags?: string;\n };\n placeholder_asset?: {\n mime_type: string;\n name?: string;\n description?: string;\n };\n skip_autotagging?: boolean;\n};\n\nexport const damAssetPathCreateRequestSchema: z.ZodType<DamAssetPathCreateRequest> =\n z.object({\n asset: z\n .object({\n file: z.any(),\n name: z.string(),\n description: z.string().optional(),\n tags: z.string().optional(),\n })\n .optional(),\n text_asset: z\n .object({\n file_name: z.string(),\n mime_type: z.string(),\n text: z.string(),\n name: z.string().optional(),\n description: z.string().optional(),\n tags: z.string().optional(),\n })\n .optional(),\n placeholder_asset: z\n .object({\n mime_type: z.string(),\n name: z.string().optional(),\n description: z.string().optional(),\n })\n .optional(),\n skip_autotagging: z.boolean().optional(),\n });\n\ntype DamAssetPathCreateResponse = {\n asset: { id: number; canonical_path: string; name: string };\n meta: { request_id: string; timestamp: string };\n};\n\nexport const damAssetPathCreateResponseSchema: z.ZodType<DamAssetPathCreateResponse> =\n z.object({\n asset: z.object({\n id: z.number(),\n canonical_path: z.string(),\n name: z.string(),\n }),\n meta: z.object({\n request_id: z.string(),\n timestamp: z.string(),\n }),\n });\n\nexport type { DamVariantApi, DamAssetApi };\nexport type DamTreeApi = z.infer<typeof damTreeSchema>;\nexport type { DamQueryResponse };\nexport type { DamAssetCreateRequest };\nexport type { DamAssetCreateResponse };\nexport type { DamAssetCreateWithPlaceholderRequest };\nexport type { DamAssetPathCreateRequest };\nexport type { DamAssetPathCreateResponse };\n","import { z } from \"zod\";\nimport type { UrlProxyResponse } from \"@fluid-app/file-picker-core\";\n\nexport type { UrlProxyResponse };\n\nconst urlProxyResponseSchema: z.ZodType<UrlProxyResponse> = z.object({\n data: z.string(),\n contentType: z.string(),\n size: z.number(),\n});\n\n/**\n * Proxy a URL fetch through the backend to bypass CORS restrictions.\n * The backend fetches the file and returns it as base64-encoded data.\n *\n * @param url - The URL to fetch\n * @param proxyEndpoint - The proxy endpoint (defaults to \"/api/proxy-url\")\n */\nexport async function proxyUrlFetch(\n url: string,\n proxyEndpoint: string = \"/api/proxy-url\",\n): Promise<UrlProxyResponse> {\n const response = await fetch(proxyEndpoint, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({ url }),\n });\n\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({\n error: \"Failed to proxy URL fetch\",\n }));\n throw new Error(\n (errorData as { error?: string }).error || `HTTP ${response.status}`,\n );\n }\n\n const data: unknown = await response.json();\n return urlProxyResponseSchema.parse(data);\n}\n","import type { FetchClientInstance } from \"@fluid-app/api-client-core\";\nimport {\n damAssetSchema,\n damQueryResponseSchema,\n type CreateDamAssetParams,\n type CreateDamAssetPathForAssetsParams,\n type DamAssetCreateResponse,\n type DamAssetPathCreateResponse,\n type DamQueryParams,\n type DamQueryResponse,\n type FilePickerApi,\n type UnsplashSearchResponse,\n} from \"@fluid-app/file-picker-core\";\nimport {\n portalTenantContent,\n type operations,\n} from \"@fluid-app/portal-tenant-content-api-client\";\nimport { proxyUrlFetch } from \"./api/url-proxy\";\n\n/** BFF create response — derived from the generated OpenAPI types. */\ntype DamAssetCreateBffResponse = Awaited<\n ReturnType<typeof portalTenantContent.dam_assets_create>\n>;\n\n/** BFF asset path create response — derived from the generated OpenAPI types. */\ntype DamAssetPathCreateBffResponse = Awaited<\n ReturnType<typeof portalTenantContent.dam_asset_paths_create>\n>;\n\n/**\n * Maps a BFF DAM asset to the file-picker port's DamAssetCreateResponse shape.\n *\n * The BFF response includes nullable meta.request_id (from Api::Response),\n * while the port schema requires a string. We coalesce to empty string.\n */\nfunction mapCreateResponse(\n response: DamAssetCreateBffResponse,\n): DamAssetCreateResponse {\n const raw = response.asset ?? {};\n return {\n asset: damAssetSchema.parse({\n ...raw,\n canonical_path: raw.canonical_path ?? \"\",\n category: raw.category ?? \"\",\n company: raw.company ?? \"\",\n description: raw.description ?? \"\",\n default_variant_id: raw.default_variant_id ?? \"\",\n }),\n meta: {\n request_id: response.meta?.request_id ?? \"\",\n timestamp: response.meta?.timestamp ?? new Date().toISOString(),\n },\n };\n}\n\n/**\n * Maps a BFF asset path response to the file-picker port's shape.\n */\nfunction mapAssetPathCreateResponse(\n response: DamAssetPathCreateBffResponse,\n): DamAssetPathCreateResponse {\n const assetPath = response.asset_path ?? {};\n return {\n asset: {\n id: assetPath.id ?? 0,\n canonical_path: assetPath.path ?? \"\",\n name: assetPath.asset_code ?? \"\",\n },\n meta: {\n request_id: response.meta?.request_id ?? \"\",\n timestamp: response.meta?.timestamp ?? new Date().toISOString(),\n },\n };\n}\n\n/**\n * Creates a FilePickerApi adapter backed by the portal-tenant BFF's\n * `/api/content/dam/*` endpoints, using cookie-based auth via the\n * provided FetchClient.\n *\n * Unsplash search is not available through the BFF — callers that need\n * Unsplash should use the legacy adapter or provide their own\n * implementation.\n *\n * The `onProgress` callback in `createDamAsset` is not supported — the\n * underlying `fetch` API does not expose upload progress events.\n *\n * URL proxy delegates to the same-origin `/api/proxy-url` endpoint\n * (served by the hosting app, not the BFF) for CORS bypass, identical\n * to the legacy adapter behaviour.\n */\nexport function createPortalTenantFilePickerApiAdapter(\n client: FetchClientInstance,\n): FilePickerApi {\n return {\n createDamAsset: async (\n params: CreateDamAssetParams,\n ): Promise<DamAssetCreateResponse> => {\n // The generated dam_assets_create uses client.post (JSON body), but\n // file uploads require multipart/form-data. Use requestWithFormData\n // directly, typing the response from the generated operation type.\n const formData = new FormData();\n formData.append(\"asset[file]\", params.file);\n formData.append(\"asset[name]\", params.name);\n\n if (params.description) {\n formData.append(\"asset[description]\", params.description);\n }\n\n if (params.tags && params.tags.length > 0) {\n formData.append(\"asset[tags]\", params.tags.join(\",\"));\n }\n\n const response =\n await client.requestWithFormData<DamAssetCreateBffResponse>(\n \"/api/content/dam/assets\",\n formData,\n { method: \"POST\" },\n );\n\n return mapCreateResponse(response);\n },\n\n queryDamAssets: async (\n params: DamQueryParams,\n ): Promise<DamQueryResponse> => {\n const response = await portalTenantContent.dam_query(\n client,\n params satisfies operations[\"dam_query\"][\"requestBody\"][\"content\"][\"application/json\"],\n );\n return damQueryResponseSchema.parse({\n ...response,\n meta: response.meta\n ? { next_cursor: response.meta.pagination?.next_cursor ?? undefined }\n : undefined,\n });\n },\n\n deleteDamAsset: async (code: string): Promise<unknown> => {\n return portalTenantContent.dam_assets_destroy(client, code);\n },\n\n discardDamAsset: async (code: string): Promise<unknown> => {\n return portalTenantContent.dam_assets_discard(client, code);\n },\n\n createDamAssetPathForAssets: async (\n params: CreateDamAssetPathForAssetsParams,\n ): Promise<DamAssetPathCreateResponse> => {\n const response = await portalTenantContent.dam_asset_paths_create(\n client,\n params.code,\n { asset_path: { path: params.asset_paths.join(\",\") } },\n );\n return mapAssetPathCreateResponse(response);\n },\n\n searchUnsplash: async (\n _query: string,\n _page?: number,\n _perPage?: number,\n ): Promise<UnsplashSearchResponse> => {\n throw new Error(\n \"Unsplash search is not available through the portal-tenant BFF. \" +\n \"Configure an Unsplash access key and use the standard FilePickerApi adapter instead.\",\n );\n },\n\n proxyUrlFetch: (url: string) => proxyUrlFetch(url),\n };\n}\n","import { useMemo } from \"react\";\nimport type { FilePickerApi } from \"@fluid-app/file-picker-core\";\nimport { createPortalTenantFilePickerApiAdapter } from \"@fluid-app/file-picker-api-client\";\nimport { usePortalTenantClient } from \"../providers/PortalTenantClientProvider\";\n\n/**\n * Returns a FilePickerApi adapter backed by the portal-tenant BFF client.\n * Screens consume this hook instead of importing the adapter factory directly.\n */\nexport function usePortalFilePickerApi(): FilePickerApi {\n const client = usePortalTenantClient();\n return useMemo(\n () => createPortalTenantFilePickerApiAdapter(client),\n [client],\n );\n}\n","import { useMemo } from \"react\";\nimport type { ContentPlaylistsApi } from \"@fluid-app/shareables-core/playlists-api\";\nimport { createPortalTenantPlaylistsAdapter } from \"@fluid-app/shareables-api-client\";\nimport { usePortalTenantClient } from \"../providers/PortalTenantClientProvider\";\n\n/**\n * Returns the port-level ContentPlaylistsApi adapter backed by the\n * portal-tenant BFF client. Used for standalone playlist operations\n * (e.g. deletePlaylist) that operate outside ShareablesApiProvider.\n */\nexport function usePortalPlaylistsApi(): ContentPlaylistsApi {\n const client = usePortalTenantClient();\n return useMemo(() => createPortalTenantPlaylistsAdapter(client), [client]);\n}\n","import { useCallback, useMemo, type ComponentProps } from \"react\";\nimport type {\n BackgroundValue,\n BorderRadiusOptions,\n ColorOptions,\n PaddingOptions,\n} from \"../types\";\nimport type { WidgetPropertySchema } from \"../registries/property-schema-types\";\nimport {\n ShareablesCoreProvider,\n ShareablesApiProvider,\n} from \"@fluid-app/shareables-core\";\nimport { ShareablesUIProvider, ShareablesApp } from \"@fluid-app/shareables-ui\";\nimport { useCurrentUser } from \"../hooks/use-current-user\";\nimport { useAppNavigation } from \"../shell/AppNavigationContext\";\nimport { useSdkClient } from \"../account/use-account-clients\";\nimport { useUserType } from \"../hooks/use-user-type\";\nimport { usePortalShareablesApi } from \"../shareables/use-portal-shareables-api\";\nimport { usePortalFilePickerApi } from \"../shareables/use-portal-file-picker-api\";\nimport { usePortalPlaylistsApi } from \"../shareables/use-portal-playlists-api\";\n\ntype ShareablesScreenProps = ComponentProps<\"div\"> & {\n background?: BackgroundValue;\n textColor?: ColorOptions;\n accentColor?: ColorOptions;\n padding?: PaddingOptions;\n borderRadius?: BorderRadiusOptions;\n};\n\n/**\n * Parse the current shareables sub-route from the full slug.\n *\n * System nav slugs are \"share/products\", \"share/media\", \"share/playlists\".\n * Detail pages append an ID: \"share/products/123\", \"share/media/456\".\n *\n * \"share/products\" → screen=\"products\", detailId=null\n * \"share/products/123\" → screen=\"products\", detailId=\"123\"\n * \"share/media/456\" → screen=\"media\", detailId=\"456\"\n * \"share/playlists\" → screen=\"playlists\", detailId=null\n * \"share/playlists/789\" → screen=\"playlists\", detailId=\"789\"\n * \"share/files\" → screen=\"files\", detailId=null\n * \"share\" → screen=null (default to products)\n */\nfunction parseShareablesRoute(currentSlug: string): {\n screen: string | null;\n detailId: string | null;\n action: string | null;\n} {\n // Strip the \"share\" prefix\n const slugWithoutPrefix = currentSlug.replace(/^share\\/?/, \"\");\n if (!slugWithoutPrefix) {\n return { screen: null, detailId: null, action: null };\n }\n\n const parts = slugWithoutPrefix.split(\"/\");\n const screen = parts[0] || null;\n const detailId = parts[1] || null;\n const action = parts[2] || null;\n return { screen, detailId, action };\n}\n\nexport function ShareablesScreen({\n /* eslint-disable @typescript-eslint/no-unused-vars -- destructured to exclude from divProps spread */\n background,\n textColor,\n accentColor,\n padding,\n borderRadius,\n /* eslint-enable @typescript-eslint/no-unused-vars */\n ...divProps\n}: ShareablesScreenProps): React.JSX.Element {\n const domainClient = useSdkClient();\n const shareablesApi = usePortalShareablesApi();\n const { productsApi: portalProductsApi } = shareablesApi;\n const filePickerApi = usePortalFilePickerApi();\n const playlistsAdapter = usePortalPlaylistsApi();\n const { data: userData } = useCurrentUser();\n const { currentSlug, navigate } = useAppNavigation();\n const { isCustomer } = useUserType();\n\n const fetchProducts = useCallback(\n async (search: string, cursor?: string, limit?: number) => {\n if (search) {\n return portalProductsApi.searchProducts(search, { cursor, limit });\n }\n return portalProductsApi.listProducts({ cursor, limit });\n },\n [portalProductsApi],\n );\n\n const fetchProduct = useCallback(\n async (id: string | number) => portalProductsApi.getProduct(id),\n [portalProductsApi],\n );\n\n const { screen, detailId, action } = parseShareablesRoute(currentSlug);\n\n const handleNavigate = useCallback(\n (subScreen: string, id?: string) => {\n const path = id ? `share/${subScreen}/${id}` : `share/${subScreen}`;\n navigate(path);\n },\n [navigate],\n );\n\n const handleBack = useCallback(() => {\n if (detailId && screen) {\n // Navigate back to the listing for the current screen\n navigate(`share/${screen}`);\n } else {\n // Navigate to the default shareables screen\n navigate(\"share/products\");\n }\n }, [navigate, detailId, screen]);\n\n const coreConfig = useMemo(\n () => ({\n client: domainClient,\n user: userData ? { id: userData.id } : null,\n repContext: true,\n }),\n [domainClient, userData],\n );\n\n const uiConfig = useMemo(\n () => ({\n user: userData\n ? {\n id: userData.id,\n company: userData.company\n ? { logo_url: userData.company.logo_url }\n : null,\n }\n : undefined,\n affiliateId:\n (userData as { affiliate_id?: number } | undefined)?.affiliate_id ??\n null,\n basePath: \"\",\n navigate: (path: string) => {\n // Strip leading slash — cards generate paths like \"/share/product/123\"\n const cleanPath = path.replace(/^\\//, \"\");\n // Ensure share/ prefix — screen components pass relative paths like \"media/new\"\n const prefixed = cleanPath.startsWith(\"share/\")\n ? cleanPath\n : `share/${cleanPath}`;\n navigate(prefixed);\n },\n showToast: (opts: {\n title: string;\n type: \"success\" | \"error\" | \"warning\";\n }) => {\n console.warn(`[Shareables] ${opts.type}: ${opts.title}`);\n },\n filePickerApi,\n onToggleFavorite: async (params: {\n favoriteableId: number;\n favoriteableType: string;\n }) => {\n const affiliateId = (userData as { affiliate_id?: number } | undefined)\n ?.affiliate_id;\n if (!affiliateId) throw new Error(\"No affiliate ID\");\n return domainClient.post<{ is_favorited: boolean }>(\n `/user_companies/${affiliateId}/favorites/toggle.json`,\n {\n favoriteable_id: params.favoriteableId,\n favoriteable_type: params.favoriteableType,\n },\n );\n },\n onDeletePlaylist: isCustomer\n ? undefined\n : async (playlistId: number) => {\n await playlistsAdapter.deletePlaylist(playlistId);\n },\n readOnly: isCustomer,\n }),\n [\n userData,\n navigate,\n filePickerApi,\n domainClient,\n isCustomer,\n playlistsAdapter,\n ],\n );\n\n return (\n <div {...divProps} className={`h-full ${divProps.className ?? \"\"}`}>\n <ShareablesCoreProvider config={coreConfig}>\n <ShareablesApiProvider\n media={shareablesApi.media}\n playlists={shareablesApi.playlists}\n fileResources={shareablesApi.fileResources}\n share={shareablesApi.share}\n productMedia={shareablesApi.productMedia}\n >\n <ShareablesUIProvider config={uiConfig}>\n <ShareablesApp\n screen={screen}\n detailId={detailId}\n action={action}\n companyLogoUrl={userData?.company?.logo_url}\n countryCode={userData?.country?.iso}\n fetchProducts={fetchProducts}\n fetchProduct={fetchProduct}\n onNavigate={handleNavigate}\n onBack={handleBack}\n />\n </ShareablesUIProvider>\n </ShareablesApiProvider>\n </ShareablesCoreProvider>\n </div>\n );\n}\n\nexport const shareablesScreenPropertySchema: WidgetPropertySchema = {\n widgetType: \"ShareablesScreen\",\n displayName: \"Shareables Screen\",\n tabsConfig: [{ id: \"styling\", label: \"Styling\" }],\n fields: [],\n} as const satisfies WidgetPropertySchema;\n"],"mappings":"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"}
@@ -35,12 +35,12 @@ require("./TableWidget-ClKJOfOs.cjs");
35
35
  require("./ToDoWidget-Ci1sonDp.cjs");
36
36
  require("./VideoWidget-BsKyKf0O.cjs");
37
37
  require("./ScreenHeaderContext-DRIKmM2G.cjs");
38
- const require_ShareablesScreen = require("./ShareablesScreen-BpOu1VpJ.cjs");
38
+ const require_ShareablesScreen = require("./ShareablesScreen-B0JMhiKA.cjs");
39
39
  require("./dist-C-JA9EGF.cjs");
40
40
  require("./es-D_ZSl548.cjs");
41
41
  require("./SearchSort-29u6qhlf.cjs");
42
42
  require("./dist-CAB6oMLL.cjs");
43
- require("./use-account-clients-Db7XdaFV.cjs");
43
+ require("./use-portal-shareables-api-CwSezl14.cjs");
44
44
  require("./dist-Mf7Sx86H.cjs");
45
45
  exports.ShareablesScreen = require_ShareablesScreen.ShareablesScreen;
46
46
  exports.shareablesScreenPropertySchema = require_ShareablesScreen.shareablesScreenPropertySchema;
@@ -35,10 +35,10 @@ import "./TableWidget-BOctcY2V.mjs";
35
35
  import "./ToDoWidget-7VPXkK3Y.mjs";
36
36
  import "./VideoWidget-UdX70Sf8.mjs";
37
37
  import "./ScreenHeaderContext-DjSO5A8k.mjs";
38
- import { n as shareablesScreenPropertySchema, t as ShareablesScreen } from "./ShareablesScreen-7W63bXCs.mjs";
38
+ import { n as shareablesScreenPropertySchema, t as ShareablesScreen } from "./ShareablesScreen-B8ZsEkgi.mjs";
39
39
  import "./dist-BjehZaTg.mjs";
40
40
  import "./SearchSort-M8cu-Jnj.mjs";
41
41
  import "./dist-Bo6ZG9XC.mjs";
42
- import "./use-account-clients-DdEdLQc1.mjs";
42
+ import "./use-portal-shareables-api-CCRQARQM.mjs";
43
43
  import "./sortable.esm-CzzU6kIR.mjs";
44
44
  export { ShareablesScreen, shareablesScreenPropertySchema };