@fluid-app/portal-sdk 0.1.147 → 0.1.149
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{ContactsScreen-CRwQbaPg.mjs → ContactsScreen-DtABz7O7.mjs} +2 -2
- package/dist/ContactsScreen-DtABz7O7.mjs.map +1 -0
- package/dist/{ContactsScreen-TDXVil2l.cjs → ContactsScreen-DuKE5ruf.cjs} +1 -1
- package/dist/{ContactsScreen-D7EBGdu1.cjs → ContactsScreen-psnV3fcP.cjs} +2 -2
- package/dist/ContactsScreen-psnV3fcP.cjs.map +1 -0
- package/dist/{MessagingScreen-D6jmQG0E.cjs → MessagingScreen-B5lqBpVo.cjs} +1 -1
- package/dist/{MessagingScreen-BG-eib6U.cjs → MessagingScreen-DSU_xyHK.cjs} +2 -2
- package/dist/MessagingScreen-DSU_xyHK.cjs.map +1 -0
- package/dist/{MessagingScreen-Bt0wmxDg.mjs → MessagingScreen-gbTy8V_o.mjs} +2 -2
- package/dist/MessagingScreen-gbTy8V_o.mjs.map +1 -0
- package/dist/{ProductsScreen-D6grDsLg.mjs → ProductsScreen--hkyw5c3.mjs} +9 -16
- package/dist/ProductsScreen--hkyw5c3.mjs.map +1 -0
- package/dist/{ProductsScreen-BYziWeSs.cjs → ProductsScreen-C8wwsfu0.cjs} +14 -21
- package/dist/ProductsScreen-C8wwsfu0.cjs.map +1 -0
- package/dist/{ProductsScreen-V6jOhd4m.cjs → ProductsScreen-DG_SMNs5.cjs} +2 -2
- package/dist/{ProductsScreen-CMpMLotN.mjs → ProductsScreen-IbgDLX51.mjs} +7 -2
- package/dist/{ShareablesScreen-BpOu1VpJ.cjs → ShareablesScreen-B0JMhiKA.cjs} +41 -26
- package/dist/ShareablesScreen-B0JMhiKA.cjs.map +1 -0
- package/dist/{ShareablesScreen-7W63bXCs.mjs → ShareablesScreen-B8ZsEkgi.mjs} +32 -17
- package/dist/ShareablesScreen-B8ZsEkgi.mjs.map +1 -0
- package/dist/{ShareablesScreen-DvCp2TyE.mjs → ShareablesScreen-C2zLeoy7.mjs} +8 -2
- package/dist/{ShareablesScreen-Do-aNX-x.cjs → ShareablesScreen-Caf2fI3S.cjs} +2 -2
- package/dist/index.cjs +13 -13
- package/dist/index.d.cts.map +1 -1
- package/dist/index.d.mts.map +1 -1
- package/dist/index.mjs +13 -13
- package/dist/{use-account-clients-DdEdLQc1.mjs → use-portal-shareables-api-CCRQARQM.mjs} +60 -28
- package/dist/use-portal-shareables-api-CCRQARQM.mjs.map +1 -0
- package/dist/{use-account-clients-Db7XdaFV.cjs → use-portal-shareables-api-CwSezl14.cjs} +65 -57
- package/dist/use-portal-shareables-api-CwSezl14.cjs.map +1 -0
- package/package.json +18 -17
- package/dist/ContactsScreen-CRwQbaPg.mjs.map +0 -1
- package/dist/ContactsScreen-D7EBGdu1.cjs.map +0 -1
- package/dist/MessagingScreen-BG-eib6U.cjs.map +0 -1
- package/dist/MessagingScreen-Bt0wmxDg.mjs.map +0 -1
- package/dist/ProductsScreen-BYziWeSs.cjs.map +0 -1
- package/dist/ProductsScreen-D6grDsLg.mjs.map +0 -1
- package/dist/ShareablesScreen-7W63bXCs.mjs.map +0 -1
- package/dist/ShareablesScreen-BpOu1VpJ.cjs.map +0 -1
- package/dist/use-account-clients-Db7XdaFV.cjs.map +0 -1
- 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 {
|
|
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
|
|
12
|
-
const
|
|
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:
|
|
65
|
-
playlists:
|
|
66
|
-
fileResources:
|
|
67
|
-
share:
|
|
68
|
-
productMedia:
|
|
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
|
|
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"}
|
|
@@ -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
|
|
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 =
|
|
12
|
-
const
|
|
13
|
-
const
|
|
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)(
|
|
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)(
|
|
65
|
-
media:
|
|
66
|
-
playlists:
|
|
67
|
-
fileResources:
|
|
68
|
-
share:
|
|
69
|
-
productMedia:
|
|
70
|
-
children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(
|
|
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)(
|
|
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-
|
|
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-
|
|
42
|
+
require("./use-portal-shareables-api-CwSezl14.cjs");
|
|
43
43
|
require("./dist-Mf7Sx86H.cjs");
|
|
44
|
-
const require_ProductsScreen = require("./ProductsScreen-
|
|
44
|
+
const require_ProductsScreen = require("./ProductsScreen-C8wwsfu0.cjs");
|
|
45
45
|
exports.ProductsScreen = require_ProductsScreen.ProductsScreen;
|
|
46
46
|
exports.productsScreenPropertySchema = require_ProductsScreen.productsScreenPropertySchema;
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import "./es-C12InFRn.mjs";
|
|
2
2
|
import "./FluidProvider-BbMqSBkY.mjs";
|
|
3
3
|
import "./countries-api-context-CyU5GW3w.mjs";
|
|
4
|
+
import "./PortalTenantClientProvider-Bg0pUj4O.mjs";
|
|
5
|
+
import "./FluidAuthProvider-BOyRD49r.mjs";
|
|
4
6
|
import "./PointsWidget-CuTMhDpn.mjs";
|
|
5
7
|
import "./error-state-CLl40bNr.mjs";
|
|
6
8
|
import "./ScreenRenderer-CI2lB4S-.mjs";
|
|
@@ -35,10 +37,13 @@ import "./TableWidget-BOctcY2V.mjs";
|
|
|
35
37
|
import "./ToDoWidget-7VPXkK3Y.mjs";
|
|
36
38
|
import "./VideoWidget-UdX70Sf8.mjs";
|
|
37
39
|
import "./ScreenHeaderContext-DjSO5A8k.mjs";
|
|
40
|
+
import "./use-fluid-api-DzyyTeeh.mjs";
|
|
41
|
+
import "./use-current-user-Cj2_q6uf.mjs";
|
|
42
|
+
import "./AppNavigationContext-CAnb2Qxs.mjs";
|
|
38
43
|
import "./dist-BjehZaTg.mjs";
|
|
39
44
|
import "./SearchSort-M8cu-Jnj.mjs";
|
|
40
45
|
import "./dist-Bo6ZG9XC.mjs";
|
|
41
|
-
import "./use-
|
|
46
|
+
import "./use-portal-shareables-api-CCRQARQM.mjs";
|
|
42
47
|
import "./sortable.esm-CzzU6kIR.mjs";
|
|
43
|
-
import { n as productsScreenPropertySchema, t as ProductsScreen } from "./ProductsScreen
|
|
48
|
+
import { n as productsScreenPropertySchema, t as ProductsScreen } from "./ProductsScreen--hkyw5c3.mjs";
|
|
44
49
|
export { 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
|
|
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
|
|
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
|
|
231
|
+
return require_use_portal_shareables_api.dam_assets_destroy(client, code);
|
|
233
232
|
},
|
|
234
233
|
discardDamAsset: async (code) => {
|
|
235
|
-
return
|
|
234
|
+
return require_use_portal_shareables_api.dam_assets_discard(client, code);
|
|
236
235
|
},
|
|
237
236
|
createDamAssetPathForAssets: async (params) => {
|
|
238
|
-
return mapAssetPathCreateResponse(await
|
|
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 =
|
|
278
|
-
const
|
|
279
|
-
const
|
|
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)(
|
|
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)(
|
|
359
|
-
media:
|
|
360
|
-
playlists:
|
|
361
|
-
fileResources:
|
|
362
|
-
share:
|
|
363
|
-
productMedia:
|
|
364
|
-
children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(
|
|
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)(
|
|
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-
|
|
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":";;;;;;;;;;;;;;AAcA,SAAgB,cAAiC;CAC/C,MAAM,EAAE,SAASA,uBAAAA,cAAc;AAE/B,SAAA,GAAA,MAAA,eAAqB;EACnB,MAAM,WAAW,MAAM,aAAa;AACpC,SAAO;GACL;GACA,YAAY,aAAaC,sBAAAA,WAAW;GACpC,OAAO,aAAaA,sBAAAA,WAAW;GAC/B,SACE,aAAaA,sBAAAA,WAAW,SAAS,aAAaA,sBAAAA,WAAW;GAC5D;IACA,CAAC,MAAM,UAAU,CAAC;;;;ACRvB,MAAa,mBAA6CC,IAAAA,EAAE,OAAO;CACjE,IAAIA,IAAAA,EAAE,QAAQ;CACd,KAAKA,IAAAA,EAAE,QAAQ,CAAC,UAAU;CAC1B,WAAWA,IAAAA,EAAE,QAAQ;CACrB,WAAWA,IAAAA,EAAE,QAAQ;CACrB,SAASA,IAAAA,EAAE,KAAK,CAAC,UAAU;CAC3B,YAAYA,IAAAA,EAAE,QAAQ;CACtB,YAAYA,IAAAA,EAAE,QAAQ;CACtB,SAASA,IAAAA,EAAE,SAAS;CACpB,aAAaA,IAAAA,EAAE,SAAS;CACxB,SAASA,IAAAA,EAAE,SAAS;CACpB,YAAYA,IAAAA,EAAE,QAAQ;CACtB,mBAAmBA,IAAAA,EAAE,QAAQ;CAC7B,MAAMA,IAAAA,EAAE,MAAMA,IAAAA,EAAE,QAAQ,CAAC;CAC1B,CAAC;AAiBF,MAAa,iBAAyCA,IAAAA,EAAE,OAAO;CAC7D,IAAIA,IAAAA,EAAE,QAAQ;CACd,gBAAgBA,IAAAA,EAAE,QAAQ;CAC1B,UAAUA,IAAAA,EAAE,QAAQ;CACpB,MAAMA,IAAAA,EAAE,QAAQ;CAChB,SAASA,IAAAA,EAAE,QAAQ;CACnB,YAAYA,IAAAA,EAAE,QAAQ;CACtB,oBAAoBA,IAAAA,EAAE,QAAQ;CAC9B,qBAAqBA,IAAAA,EAAE,QAAQ,CAAC,UAAU;CAC1C,aAAaA,IAAAA,EAAE,QAAQ;CACvB,MAAMA,IAAAA,EAAE,QAAQ;CAChB,YAAYA,IAAAA,EAAE,QAAQ;CACtB,UAAUA,IAAAA,EAAE,MAAM,iBAAiB,CAAC,UAAU;CAC/C,CAAC;AAUF,MAAa,0BAAwDA,IAAAA,EAClE,OAAO;CACN,YAAYA,IAAAA,EACT,MAAM,CAACA,IAAAA,EAAE,QAAQ,EAAEA,IAAAA,EAAE,OAAOA,IAAAA,EAAE,QAAQ,EAAEA,IAAAA,EAAE,SAAS,CAAC,CAAC,CAAC,CACtD,UAAU;CACb,MAAMA,IAAAA,EAAE,MAAM,CAACA,IAAAA,EAAE,QAAQ,EAAEA,IAAAA,EAAE,OAAOA,IAAAA,EAAE,QAAQ,EAAEA,IAAAA,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,UAAU;CACzE,UAAUA,IAAAA,EACP,MAAM,CAACA,IAAAA,EAAE,QAAQ,EAAEA,IAAAA,EAAE,OAAOA,IAAAA,EAAE,QAAQ,EAAEA,IAAAA,EAAE,SAAS,CAAC,CAAC,CAAC,CACtD,UAAU;CACb,UAAUA,IAAAA,EACP,MAAM,CAACA,IAAAA,EAAE,MAAMA,IAAAA,EAAE,SAAS,CAAC,EAAEA,IAAAA,EAAE,OAAOA,IAAAA,EAAE,QAAQ,EAAEA,IAAAA,EAAE,SAAS,CAAC,CAAC,CAAC,CAChE,UAAU;CACd,CAAC,CACD,aAAa;AAEhB,MAAa,gBAAgDA,IAAAA,EAAE,OAC7DA,IAAAA,EAAE,QAAQ,EACVA,IAAAA,EAAE,MAAM;CACNA,IAAAA,EAAE,WAAW,cAAc;CAC3B;CACA;CACD,CAAC,CACH;AAQD,MAAa,yBAAsDA,IAAAA,EAAE,OAAO;CAC1E,MAAMA,IAAAA,EAAE,QAAQ;CAChB,MAAM;CACN,MAAMA,IAAAA,EACH,OAAO,EACN,aAAaA,IAAAA,EAAE,QAAQ,CAAC,UAAU,EACnC,CAAC,CACD,UAAU;CACd,CAAC;AAYAA,IAAAA,EAAE,OAAO,EACP,OAAOA,IAAAA,EAAE,OAAO;CACd,MAAMA,IAAAA,EAAE,KAAK;CACb,MAAMA,IAAAA,EAAE,QAAQ;CAChB,aAAaA,IAAAA,EAAE,QAAQ,CAAC,UAAU;CAClC,MAAMA,IAAAA,EAAE,QAAQ,CAAC,UAAU;CAC5B,CAAC,EACH,CAAC;AAQFA,IAAAA,EAAE,OAAO;CACP,OAAO;CACP,MAAMA,IAAAA,EAAE,OAAO;EACb,YAAYA,IAAAA,EAAE,QAAQ;EACtB,WAAWA,IAAAA,EAAE,QAAQ;EACtB,CAAC;CACH,CAAC;AAaFA,IAAAA,EAAE,OAAO;CACP,mBAAmBA,IAAAA,EAAE,OAAO;EAC1B,WAAWA,IAAAA,EAAE,QAAQ;EACrB,MAAMA,IAAAA,EAAE,QAAQ,CAAC,UAAU;EAC3B,aAAaA,IAAAA,EAAE,QAAQ,CAAC,UAAU;EACnC,CAAC;CACF,kBAAkBA,IAAAA,EAAE,SAAS,CAAC,UAAU;CACzC,CAAC;AA2BFA,IAAAA,EAAE,OAAO;CACP,OAAOA,IAAAA,EACJ,OAAO;EACN,MAAMA,IAAAA,EAAE,KAAK;EACb,MAAMA,IAAAA,EAAE,QAAQ;EAChB,aAAaA,IAAAA,EAAE,QAAQ,CAAC,UAAU;EAClC,MAAMA,IAAAA,EAAE,QAAQ,CAAC,UAAU;EAC5B,CAAC,CACD,UAAU;CACb,YAAYA,IAAAA,EACT,OAAO;EACN,WAAWA,IAAAA,EAAE,QAAQ;EACrB,WAAWA,IAAAA,EAAE,QAAQ;EACrB,MAAMA,IAAAA,EAAE,QAAQ;EAChB,MAAMA,IAAAA,EAAE,QAAQ,CAAC,UAAU;EAC3B,aAAaA,IAAAA,EAAE,QAAQ,CAAC,UAAU;EAClC,MAAMA,IAAAA,EAAE,QAAQ,CAAC,UAAU;EAC5B,CAAC,CACD,UAAU;CACb,mBAAmBA,IAAAA,EAChB,OAAO;EACN,WAAWA,IAAAA,EAAE,QAAQ;EACrB,MAAMA,IAAAA,EAAE,QAAQ,CAAC,UAAU;EAC3B,aAAaA,IAAAA,EAAE,QAAQ,CAAC,UAAU;EACnC,CAAC,CACD,UAAU;CACb,kBAAkBA,IAAAA,EAAE,SAAS,CAAC,UAAU;CACzC,CAAC;AAQFA,IAAAA,EAAE,OAAO;CACP,OAAOA,IAAAA,EAAE,OAAO;EACd,IAAIA,IAAAA,EAAE,QAAQ;EACd,gBAAgBA,IAAAA,EAAE,QAAQ;EAC1B,MAAMA,IAAAA,EAAE,QAAQ;EACjB,CAAC;CACF,MAAMA,IAAAA,EAAE,OAAO;EACb,YAAYA,IAAAA,EAAE,QAAQ;EACtB,WAAWA,IAAAA,EAAE,QAAQ;EACtB,CAAC;CACH,CAAC;;;ACtOJ,MAAM,yBAAsDC,IAAAA,EAAE,OAAO;CACnE,MAAMA,IAAAA,EAAE,QAAQ;CAChB,aAAaA,IAAAA,EAAE,QAAQ;CACvB,MAAMA,IAAAA,EAAE,QAAQ;CACjB,CAAC;;;;;;;;AASF,eAAsB,cACpB,KACA,gBAAwB,kBACG;CAC3B,MAAM,WAAW,MAAM,MAAM,eAAe;EAC1C,QAAQ;EACR,SAAS,EACP,gBAAgB,oBACjB;EACD,MAAM,KAAK,UAAU,EAAE,KAAK,CAAC;EAC9B,CAAC;AAEF,KAAI,CAAC,SAAS,IAAI;EAChB,MAAM,YAAY,MAAM,SAAS,MAAM,CAAC,aAAa,EACnD,OAAO,6BACR,EAAE;AACH,QAAM,IAAI,MACP,UAAiC,SAAS,QAAQ,SAAS,SAC7D;;CAGH,MAAM,OAAgB,MAAM,SAAS,MAAM;AAC3C,QAAO,uBAAuB,MAAM,KAAK;;;;;;;;;;ACL3C,SAAS,kBACP,UACwB;CACxB,MAAM,MAAM,SAAS,SAAS,EAAE;AAChC,QAAO;EACL,OAAO,eAAe,MAAM;GAC1B,GAAG;GACH,gBAAgB,IAAI,kBAAkB;GACtC,UAAU,IAAI,YAAY;GAC1B,SAAS,IAAI,WAAW;GACxB,aAAa,IAAI,eAAe;GAChC,oBAAoB,IAAI,sBAAsB;GAC/C,CAAC;EACF,MAAM;GACJ,YAAY,SAAS,MAAM,cAAc;GACzC,WAAW,SAAS,MAAM,8BAAa,IAAI,MAAM,EAAC,aAAa;GAChE;EACF;;;;;AAMH,SAAS,2BACP,UAC4B;CAC5B,MAAM,YAAY,SAAS,cAAc,EAAE;AAC3C,QAAO;EACL,OAAO;GACL,IAAI,UAAU,MAAM;GACpB,gBAAgB,UAAU,QAAQ;GAClC,MAAM,UAAU,cAAc;GAC/B;EACD,MAAM;GACJ,YAAY,SAAS,MAAM,cAAc;GACzC,WAAW,SAAS,MAAM,8BAAa,IAAI,MAAM,EAAC,aAAa;GAChE;EACF;;;;;;;;;;;;;;;;;;AAmBH,SAAgB,uCACd,QACe;AACf,QAAO;EACL,gBAAgB,OACd,WACoC;GAIpC,MAAM,WAAW,IAAI,UAAU;AAC/B,YAAS,OAAO,eAAe,OAAO,KAAK;AAC3C,YAAS,OAAO,eAAe,OAAO,KAAK;AAE3C,OAAI,OAAO,YACT,UAAS,OAAO,sBAAsB,OAAO,YAAY;AAG3D,OAAI,OAAO,QAAQ,OAAO,KAAK,SAAS,EACtC,UAAS,OAAO,eAAe,OAAO,KAAK,KAAK,IAAI,CAAC;AAUvD,UAAO,kBANL,MAAM,OAAO,oBACX,2BACA,UACA,EAAE,QAAQ,QAAQ,CACnB,CAE+B;;EAGpC,gBAAgB,OACd,WAC8B;GAC9B,MAAM,WAAW,MAAA,kCAAA,UACf,QACA,OACD;AACD,UAAO,uBAAuB,MAAM;IAClC,GAAG;IACH,MAAM,SAAS,OACX,EAAE,aAAa,SAAS,KAAK,YAAY,eAAe,KAAA,GAAW,GACnE,KAAA;IACL,CAAC;;EAGJ,gBAAgB,OAAO,SAAmC;AACxD,UAAA,kCAAA,mBAA8C,QAAQ,KAAK;;EAG7D,iBAAiB,OAAO,SAAmC;AACzD,UAAA,kCAAA,mBAA8C,QAAQ,KAAK;;EAG7D,6BAA6B,OAC3B,WACwC;AAMxC,UAAO,2BALU,MAAA,kCAAA,uBACf,QACA,OAAO,MACP,EAAE,YAAY,EAAE,MAAM,OAAO,YAAY,KAAK,IAAI,EAAE,EAAE,CACvD,CAC0C;;EAG7C,gBAAgB,OACd,QACA,OACA,aACoC;AACpC,SAAM,IAAI,MACR,uJAED;;EAGH,gBAAgB,QAAgB,cAAc,IAAI;EACnD;;;;;;;;AChKH,SAAgB,yBAAwC;CACtD,MAAM,SAASC,mCAAAA,uBAAuB;AACtC,SAAA,GAAA,MAAA,eACQ,uCAAuC,OAAO,EACpD,CAAC,OAAO,CACT;;;;;;;;;ACJH,SAAgB,wBAA6C;CAC3D,MAAM,SAASC,mCAAAA,uBAAuB;AACtC,SAAA,GAAA,MAAA,eAAqBC,kCAAAA,mCAAmC,OAAO,EAAE,CAAC,OAAO,CAAC;;;;;;;;;;;;;;;;;;AC+B5E,SAAS,qBAAqB,aAI5B;CAEA,MAAM,oBAAoB,YAAY,QAAQ,aAAa,GAAG;AAC9D,KAAI,CAAC,kBACH,QAAO;EAAE,QAAQ;EAAM,UAAU;EAAM,QAAQ;EAAM;CAGvD,MAAM,QAAQ,kBAAkB,MAAM,IAAI;AAI1C,QAAO;EAAE,QAHM,MAAM,MAAM;EAGV,UAFA,MAAM,MAAM;EAEF,QADZ,MAAM,MAAM;EACQ;;AAGrC,SAAgB,iBAAiB,EAE/B,YACA,WACA,aACA,SACA,cAEA,GAAG,YACwC;CAC3C,MAAM,eAAeC,kCAAAA,cAAc;CACnC,MAAM,gBAAgBC,kCAAAA,wBAAwB;CAC9C,MAAM,EAAE,aAAa,sBAAsB;CAC3C,MAAM,gBAAgB,wBAAwB;CAC9C,MAAM,mBAAmB,uBAAuB;CAChD,MAAM,EAAE,MAAM,aAAaC,yBAAAA,gBAAgB;CAC3C,MAAM,EAAE,aAAa,aAAaC,6BAAAA,kBAAkB;CACpD,MAAM,EAAE,eAAe,aAAa;CAEpC,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;CAED,MAAM,EAAE,QAAQ,UAAU,WAAW,qBAAqB,YAAY;CAEtE,MAAM,kBAAA,GAAA,MAAA,cACH,WAAmB,OAAgB;AAElC,WADa,KAAK,SAAS,UAAU,GAAG,OAAO,SAAS,YAC1C;IAEhB,CAAC,SAAS,CACX;CAED,MAAM,cAAA,GAAA,MAAA,mBAA+B;AACnC,MAAI,YAAY,OAEd,UAAS,SAAS,SAAS;MAG3B,UAAS,iBAAiB;IAE3B;EAAC;EAAU;EAAU;EAAO,CAAC;CAEhC,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,aACG,UAAoD,gBACrD;EACF,UAAU;EACV,WAAW,SAAiB;GAE1B,MAAM,YAAY,KAAK,QAAQ,OAAO,GAAG;AAKzC,YAHiB,UAAU,WAAW,SAAS,GAC3C,YACA,SAAS,YACK;;EAEpB,YAAY,SAGN;AACJ,WAAQ,KAAK,gBAAgB,KAAK,KAAK,IAAI,KAAK,QAAQ;;EAE1D;EACA,kBAAkB,OAAO,WAGnB;GACJ,MAAM,cAAe,UACjB;AACJ,OAAI,CAAC,YAAa,OAAM,IAAI,MAAM,kBAAkB;AACpD,UAAO,aAAa,KAClB,mBAAmB,YAAY,yBAC/B;IACE,iBAAiB,OAAO;IACxB,mBAAmB,OAAO;IAC3B,CACF;;EAEH,kBAAkB,aACd,KAAA,IACA,OAAO,eAAuB;AAC5B,SAAM,iBAAiB,eAAe,WAAW;;EAEvD,UAAU;EACX,GACD;EACE;EACA;EACA;EACA;EACA;EACA;EACD,CACF;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,eAAD;MACU;MACE;MACF;MACR,gBAAgB,UAAU,SAAS;MACnC,aAAa,UAAU,SAAS;MACjB;MACD;MACd,YAAY;MACZ,QAAQ;MACR,CAAA;KACmB,CAAA;IACD,CAAA;GACD,CAAA;EACrB,CAAA;;AAIV,MAAa,iCAAuD;CAClE,YAAY;CACZ,aAAa;CACb,YAAY,CAAC;EAAE,IAAI;EAAW,OAAO;EAAW,CAAC;CACjD,QAAQ,EAAE;CACX"}
|
|
@@ -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
|
|
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
|
|
278
|
-
const
|
|
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:
|
|
359
|
-
playlists:
|
|
360
|
-
fileResources:
|
|
361
|
-
share:
|
|
362
|
-
productMedia:
|
|
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-
|
|
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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"}
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import "./es-C12InFRn.mjs";
|
|
2
2
|
import "./FluidProvider-BbMqSBkY.mjs";
|
|
3
3
|
import "./countries-api-context-CyU5GW3w.mjs";
|
|
4
|
+
import "./PortalTenantClientProvider-Bg0pUj4O.mjs";
|
|
5
|
+
import "./FluidAuthProvider-BOyRD49r.mjs";
|
|
4
6
|
import "./PointsWidget-CuTMhDpn.mjs";
|
|
5
7
|
import "./error-state-CLl40bNr.mjs";
|
|
6
8
|
import "./ScreenRenderer-CI2lB4S-.mjs";
|
|
@@ -34,11 +36,15 @@ import "./SpacerWidget-9tOfP4Zf.mjs";
|
|
|
34
36
|
import "./TableWidget-BOctcY2V.mjs";
|
|
35
37
|
import "./ToDoWidget-7VPXkK3Y.mjs";
|
|
36
38
|
import "./VideoWidget-UdX70Sf8.mjs";
|
|
39
|
+
import "./use-fluid-auth-DU_VCFeG.mjs";
|
|
37
40
|
import "./ScreenHeaderContext-DjSO5A8k.mjs";
|
|
38
|
-
import
|
|
41
|
+
import "./use-fluid-api-DzyyTeeh.mjs";
|
|
42
|
+
import "./use-current-user-Cj2_q6uf.mjs";
|
|
43
|
+
import { n as shareablesScreenPropertySchema, t as ShareablesScreen } from "./ShareablesScreen-B8ZsEkgi.mjs";
|
|
44
|
+
import "./AppNavigationContext-CAnb2Qxs.mjs";
|
|
39
45
|
import "./dist-BjehZaTg.mjs";
|
|
40
46
|
import "./SearchSort-M8cu-Jnj.mjs";
|
|
41
47
|
import "./dist-Bo6ZG9XC.mjs";
|
|
42
|
-
import "./use-
|
|
48
|
+
import "./use-portal-shareables-api-CCRQARQM.mjs";
|
|
43
49
|
import "./sortable.esm-CzzU6kIR.mjs";
|
|
44
50
|
export { ShareablesScreen, shareablesScreenPropertySchema };
|
|
@@ -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-
|
|
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-
|
|
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;
|