@fluid-app/portal-sdk 0.1.55 → 0.1.57
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/{AppDownloadScreen-8nMV5KuQ.cjs → AppDownloadScreen-B3e3QH3E.cjs} +1 -1
- package/dist/{AppDownloadScreen-DL0cL6Hp.mjs → AppDownloadScreen-COuwjUfa.mjs} +1 -1
- package/dist/{AppDownloadScreen-DL0cL6Hp.mjs.map → AppDownloadScreen-COuwjUfa.mjs.map} +1 -1
- package/dist/{AppDownloadScreen-D9xFGiXb.mjs → AppDownloadScreen-DMTYrxWg.mjs} +1 -1
- package/dist/{AppDownloadScreen-BuxFOvdk.cjs → AppDownloadScreen-yDs-QtRS.cjs} +1 -1
- package/dist/{AppDownloadScreen-BuxFOvdk.cjs.map → AppDownloadScreen-yDs-QtRS.cjs.map} +1 -1
- package/dist/{ContactsScreen-uBuFHvAZ.mjs → ContactsScreen-1q6YYzXK.mjs} +190 -94
- package/dist/ContactsScreen-1q6YYzXK.mjs.map +1 -0
- package/dist/{ContactsScreen-DrfjJQRJ.cjs → ContactsScreen-BocpRIYk.cjs} +5 -3
- package/dist/{ContactsScreen-CsxYVQl_.cjs → ContactsScreen-EaQc1fQf.cjs} +190 -94
- package/dist/ContactsScreen-EaQc1fQf.cjs.map +1 -0
- package/dist/{ContactsScreen-BisspUdZ.mjs → ContactsScreen-U_UzEe8A.mjs} +5 -3
- package/dist/{MySiteScreen-BXotJdL4.cjs → MySiteScreen-BQDG1MIf.cjs} +3 -2
- package/dist/{MySiteScreen-DUTxskBE.mjs → MySiteScreen-BWE6kZNh.mjs} +24 -6
- package/dist/{MySiteScreen-DUTxskBE.mjs.map → MySiteScreen-BWE6kZNh.mjs.map} +1 -1
- package/dist/{MySiteScreen-C2M1r6n2.mjs → MySiteScreen-CMbbIem9.mjs} +3 -2
- package/dist/{MySiteScreen-DYtd8N1P.cjs → MySiteScreen-Dq34cH33.cjs} +23 -5
- package/dist/MySiteScreen-Dq34cH33.cjs.map +1 -0
- package/dist/{OrdersScreen-Cs6cia9e.mjs → OrdersScreen-Bez4E8IX.mjs} +3 -2
- package/dist/{OrdersScreen-2wR8W6ga.cjs → OrdersScreen-DFIm1noJ.cjs} +3 -2
- package/dist/{OrdersScreen-aJSG8C3f.mjs → OrdersScreen-DkMmE8c3.mjs} +79 -30
- package/dist/OrdersScreen-DkMmE8c3.mjs.map +1 -0
- package/dist/{OrdersScreen-BR7xTUEo.cjs → OrdersScreen-DvtDjt3L.cjs} +80 -31
- package/dist/OrdersScreen-DvtDjt3L.cjs.map +1 -0
- package/dist/{ProductsScreen-BiRq2hq5.cjs → ProductsScreen-BFsfS9XW.cjs} +5 -4
- package/dist/{ProductsScreen-C8rWxWSG.mjs → ProductsScreen-CNnlXg_I.mjs} +2 -2
- package/dist/{ProductsScreen-C8rWxWSG.mjs.map → ProductsScreen-CNnlXg_I.mjs.map} +1 -1
- package/dist/{ProductsScreen-C01TYRnt.mjs → ProductsScreen-CnywvrZt.mjs} +5 -4
- package/dist/{ProductsScreen-C2-Gmgf1.cjs → ProductsScreen-DO54qQyx.cjs} +2 -2
- package/dist/{ProductsScreen-C2-Gmgf1.cjs.map → ProductsScreen-DO54qQyx.cjs.map} +1 -1
- package/dist/{ProfileScreen-DC2pOZLZ.mjs → ProfileScreen-8nnWzPcP.mjs} +2 -1
- package/dist/{ProfileScreen-BHi41b6m.cjs → ProfileScreen-B6SwwR14.cjs} +2 -1
- package/dist/{ProfileScreen-DavG-OrZ.mjs → ProfileScreen-D4x5J95V.mjs} +10 -2
- package/dist/{ProfileScreen-DavG-OrZ.mjs.map → ProfileScreen-D4x5J95V.mjs.map} +1 -1
- package/dist/{ProfileScreen-BUQUWmWq.cjs → ProfileScreen-D5_7MMej.cjs} +9 -1
- package/dist/{ProfileScreen-BUQUWmWq.cjs.map → ProfileScreen-D5_7MMej.cjs.map} +1 -1
- package/dist/ScreenHeaderContext-CrdfLGKk.mjs +85 -0
- package/dist/ScreenHeaderContext-CrdfLGKk.mjs.map +1 -0
- package/dist/ScreenHeaderContext-eyKPyDoQ.cjs +109 -0
- package/dist/ScreenHeaderContext-eyKPyDoQ.cjs.map +1 -0
- package/dist/{ShareablesScreen-C_3E2Pgn.mjs → ShareablesScreen-2smGe_qj.mjs} +5 -4
- package/dist/{ShareablesScreen-BKPaCLC0.cjs → ShareablesScreen-CH9044d8.cjs} +3 -3
- package/dist/{ShareablesScreen-BKPaCLC0.cjs.map → ShareablesScreen-CH9044d8.cjs.map} +1 -1
- package/dist/{ShareablesScreen-BWrujM32.mjs → ShareablesScreen-DfGkgR72.mjs} +3 -3
- package/dist/{ShareablesScreen-BWrujM32.mjs.map → ShareablesScreen-DfGkgR72.mjs.map} +1 -1
- package/dist/{ShareablesScreen-BhcfHM0D.cjs → ShareablesScreen-vrbI04Hy.cjs} +5 -4
- package/dist/{ShopScreen-DwS8lZAC.cjs → ShopScreen-CHvoeAxg.cjs} +2 -1
- package/dist/{ShopScreen-DrRNRm1t.mjs → ShopScreen-CJY1sx1J.mjs} +2 -1
- package/dist/{ShopScreen-BvK9eQIi.cjs → ShopScreen-CrbD5rZR.cjs} +10 -2
- package/dist/{ShopScreen-BvK9eQIi.cjs.map → ShopScreen-CrbD5rZR.cjs.map} +1 -1
- package/dist/{ShopScreen-CG9l5JrT.mjs → ShopScreen-DwtVHSml.mjs} +11 -3
- package/dist/{ShopScreen-CG9l5JrT.mjs.map → ShopScreen-DwtVHSml.mjs.map} +1 -1
- package/dist/{SubscriptionsScreen-DV1yVAAc.mjs → SubscriptionsScreen-5NaNwpQ1.mjs} +108 -60
- package/dist/SubscriptionsScreen-5NaNwpQ1.mjs.map +1 -0
- package/dist/{SubscriptionsScreen-BB_c_4Q-.cjs → SubscriptionsScreen-BMVXP9cv.cjs} +4 -2
- package/dist/{SubscriptionsScreen-C4BJWeWK.mjs → SubscriptionsScreen-BmtUMKkL.mjs} +4 -2
- package/dist/{SubscriptionsScreen-DPOQbKs6.cjs → SubscriptionsScreen-vcSqCDso.cjs} +111 -63
- package/dist/SubscriptionsScreen-vcSqCDso.cjs.map +1 -0
- package/dist/{UpgradeScreen-D0WA4npm.cjs → UpgradeScreen-BbP-0Pcg.cjs} +1 -1
- package/dist/{UpgradeScreen-D0WA4npm.cjs.map → UpgradeScreen-BbP-0Pcg.cjs.map} +1 -1
- package/dist/{UpgradeScreen-N5cE1bG7.mjs → UpgradeScreen-D7LfdVSJ.mjs} +1 -1
- package/dist/{UpgradeScreen-N5cE1bG7.mjs.map → UpgradeScreen-D7LfdVSJ.mjs.map} +1 -1
- package/dist/{UpgradeScreen-C_rLnLD1.cjs → UpgradeScreen-DJKNVL-O.cjs} +1 -1
- package/dist/{dist-CayuD99K.mjs → dist-Cl4FsM3V.mjs} +1 -1
- package/dist/{dist-CayuD99K.mjs.map → dist-Cl4FsM3V.mjs.map} +1 -1
- package/dist/{dist-CSYoMydt.cjs → dist-Cs6PV1Tf.cjs} +1 -1
- package/dist/{dist-CSYoMydt.cjs.map → dist-Cs6PV1Tf.cjs.map} +1 -1
- package/dist/{dist-DxvUzsnh.cjs → dist-oTn1xy1Z.cjs} +1 -1
- package/dist/{dist-DxvUzsnh.cjs.map → dist-oTn1xy1Z.cjs.map} +1 -1
- package/dist/index.cjs +38 -36
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts.map +1 -1
- package/dist/index.d.mts.map +1 -1
- package/dist/index.mjs +36 -34
- package/dist/index.mjs.map +1 -1
- package/dist/{src-BZnlJmdg.mjs → order-detail-DkMYJvzl.mjs} +1 -1
- package/dist/order-detail-DkMYJvzl.mjs.map +1 -0
- package/dist/{src-DIkOTlgf.cjs → order-detail-JVq0-ps1.cjs} +1 -1
- package/dist/order-detail-JVq0-ps1.cjs.map +1 -0
- package/dist/{products-B3q5DFx1.cjs → products-BtHCYNv6.cjs} +1 -1
- package/dist/{products-B3q5DFx1.cjs.map → products-BtHCYNv6.cjs.map} +1 -1
- package/dist/{products-Dkwd_Bh0.mjs → products-DCO1hF_Q.mjs} +1 -1
- package/dist/{products-Dkwd_Bh0.mjs.map → products-DCO1hF_Q.mjs.map} +1 -1
- package/dist/{sortable.esm-DFTEWOHN.mjs → sortable.esm-DreCqRxJ.mjs} +1 -1
- package/dist/{sortable.esm-DFTEWOHN.mjs.map → sortable.esm-DreCqRxJ.mjs.map} +1 -1
- package/dist/{src-B7MRMtgx.cjs → src-BYyxE-aF.cjs} +1 -1
- package/dist/{src-B7MRMtgx.cjs.map → src-BYyxE-aF.cjs.map} +1 -1
- package/dist/src-BakNjVTk.mjs +1 -0
- package/dist/{src-CEouYGbQ.mjs → src-CzK-t4_m.mjs} +192 -245
- package/dist/src-CzK-t4_m.mjs.map +1 -0
- package/dist/{src-DdlLVUFj.cjs → src-D1poJLOQ.cjs} +197 -262
- package/dist/src-D1poJLOQ.cjs.map +1 -0
- package/dist/src-DL_WTpu5.cjs +1 -0
- package/dist/{src-MTAap-Xx.mjs → src-sa7B0kBg.mjs} +1 -1
- package/dist/{src-MTAap-Xx.mjs.map → src-sa7B0kBg.mjs.map} +1 -1
- package/dist/{use-customer-account-D0zro9w6.cjs → use-customer-account-BRdjIAmX.cjs} +1 -1
- package/dist/{use-customer-account-D0zro9w6.cjs.map → use-customer-account-BRdjIAmX.cjs.map} +1 -1
- package/dist/{use-customer-account-CT3yrTXm.mjs → use-customer-account-CgmmbLJd.mjs} +1 -1
- package/dist/{use-customer-account-CT3yrTXm.mjs.map → use-customer-account-CgmmbLJd.mjs.map} +1 -1
- package/dist/vite/index.cjs +69 -0
- package/dist/vite/index.cjs.map +1 -1
- package/dist/vite/index.d.cts +12 -1
- package/dist/vite/index.d.cts.map +1 -1
- package/dist/vite/index.d.mts +12 -1
- package/dist/vite/index.d.mts.map +1 -1
- package/dist/vite/index.mjs +69 -1
- package/dist/vite/index.mjs.map +1 -1
- package/package.json +12 -11
- package/styles/globals.css +1 -0
- package/dist/ContactsScreen-CsxYVQl_.cjs.map +0 -1
- package/dist/ContactsScreen-uBuFHvAZ.mjs.map +0 -1
- package/dist/MySiteScreen-DYtd8N1P.cjs.map +0 -1
- package/dist/OrdersScreen-BR7xTUEo.cjs.map +0 -1
- package/dist/OrdersScreen-aJSG8C3f.mjs.map +0 -1
- package/dist/SubscriptionsScreen-DPOQbKs6.cjs.map +0 -1
- package/dist/SubscriptionsScreen-DV1yVAAc.mjs.map +0 -1
- package/dist/src-BZnlJmdg.mjs.map +0 -1
- package/dist/src-CEouYGbQ.mjs.map +0 -1
- package/dist/src-DIkOTlgf.cjs.map +0 -1
- package/dist/src-DdlLVUFj.cjs.map +0 -1
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import { createContext, useContext, useEffect, useRef, useState } from "react";
|
|
2
|
+
import { jsx } from "react/jsx-runtime";
|
|
3
|
+
//#region ../react/src/shell/ScreenHeaderContext.tsx
|
|
4
|
+
/**
|
|
5
|
+
* Split into separate read/write contexts so that components calling
|
|
6
|
+
* useScreenHeaderActions (writers) don't re-render when the actions
|
|
7
|
+
* state changes — only the ScreenHeader (reader) re-renders.
|
|
8
|
+
*/
|
|
9
|
+
const ScreenHeaderWriteContext = createContext(null);
|
|
10
|
+
const ScreenHeaderReadContext = createContext(null);
|
|
11
|
+
const ScreenHeaderBreadcrumbsWriteContext = createContext(null);
|
|
12
|
+
const ScreenHeaderBreadcrumbsReadContext = createContext(null);
|
|
13
|
+
function ScreenHeaderProvider({ children }) {
|
|
14
|
+
const [actions, setActions] = useState(null);
|
|
15
|
+
const [breadcrumbs, setBreadcrumbs] = useState(null);
|
|
16
|
+
return /* @__PURE__ */ jsx(ScreenHeaderWriteContext.Provider, {
|
|
17
|
+
value: setActions,
|
|
18
|
+
children: /* @__PURE__ */ jsx(ScreenHeaderReadContext.Provider, {
|
|
19
|
+
value: actions,
|
|
20
|
+
children: /* @__PURE__ */ jsx(ScreenHeaderBreadcrumbsWriteContext.Provider, {
|
|
21
|
+
value: setBreadcrumbs,
|
|
22
|
+
children: /* @__PURE__ */ jsx(ScreenHeaderBreadcrumbsReadContext.Provider, {
|
|
23
|
+
value: breadcrumbs,
|
|
24
|
+
children
|
|
25
|
+
})
|
|
26
|
+
})
|
|
27
|
+
})
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Sets actions to display in the ScreenHeader.
|
|
32
|
+
* Returns `true` if inside a ScreenHeaderProvider (i.e., in the portal shell),
|
|
33
|
+
* `false` otherwise. Pages can use this boolean to conditionally skip
|
|
34
|
+
* rendering their own PageHeader.
|
|
35
|
+
*
|
|
36
|
+
* Cleans up actions on unmount so navigating away doesn't leave stale actions.
|
|
37
|
+
*/
|
|
38
|
+
function useScreenHeaderActions(actions) {
|
|
39
|
+
const setActions = useContext(ScreenHeaderWriteContext);
|
|
40
|
+
const setActionsRef = useRef(setActions);
|
|
41
|
+
setActionsRef.current = setActions;
|
|
42
|
+
useEffect(() => {
|
|
43
|
+
if (!setActions) return;
|
|
44
|
+
setActions(actions);
|
|
45
|
+
}, [actions, setActions]);
|
|
46
|
+
useEffect(() => {
|
|
47
|
+
return () => setActionsRef.current?.(null);
|
|
48
|
+
}, []);
|
|
49
|
+
return setActions !== null;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Sets breadcrumbs to display in the ScreenHeader (in place of the plain title).
|
|
53
|
+
* Returns `true` if inside a ScreenHeaderProvider (i.e., in the portal shell),
|
|
54
|
+
* `false` otherwise.
|
|
55
|
+
*
|
|
56
|
+
* Cleans up breadcrumbs on unmount so navigating away doesn't leave stale breadcrumbs.
|
|
57
|
+
*/
|
|
58
|
+
function useScreenHeaderBreadcrumbs(breadcrumbs) {
|
|
59
|
+
const setBreadcrumbs = useContext(ScreenHeaderBreadcrumbsWriteContext);
|
|
60
|
+
const setBreadcrumbsRef = useRef(setBreadcrumbs);
|
|
61
|
+
setBreadcrumbsRef.current = setBreadcrumbs;
|
|
62
|
+
useEffect(() => {
|
|
63
|
+
if (!setBreadcrumbs) return;
|
|
64
|
+
setBreadcrumbs(breadcrumbs);
|
|
65
|
+
}, [breadcrumbs, setBreadcrumbs]);
|
|
66
|
+
useEffect(() => {
|
|
67
|
+
return () => setBreadcrumbsRef.current?.(null);
|
|
68
|
+
}, []);
|
|
69
|
+
return setBreadcrumbs !== null;
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Reads the current screen header actions and breadcrumbs. Used internally by ScreenHeader.
|
|
73
|
+
*/
|
|
74
|
+
function useScreenHeaderContext() {
|
|
75
|
+
const actions = useContext(ScreenHeaderReadContext);
|
|
76
|
+
const breadcrumbs = useContext(ScreenHeaderBreadcrumbsReadContext);
|
|
77
|
+
return {
|
|
78
|
+
actions: actions ?? null,
|
|
79
|
+
breadcrumbs: breadcrumbs ?? null
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
//#endregion
|
|
83
|
+
export { useScreenHeaderContext as i, useScreenHeaderActions as n, useScreenHeaderBreadcrumbs as r, ScreenHeaderProvider as t };
|
|
84
|
+
|
|
85
|
+
//# sourceMappingURL=ScreenHeaderContext-CrdfLGKk.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ScreenHeaderContext-CrdfLGKk.mjs","names":[],"sources":["../../react/src/shell/ScreenHeaderContext.tsx"],"sourcesContent":["\"use client\";\n\nimport type React from \"react\";\nimport {\n createContext,\n useContext,\n useState,\n useEffect,\n useRef,\n type ReactNode,\n} from \"react\";\n\ntype SetActions = (actions: ReactNode) => void;\ntype SetBreadcrumbs = (breadcrumbs: ReactNode) => void;\n\n/**\n * Split into separate read/write contexts so that components calling\n * useScreenHeaderActions (writers) don't re-render when the actions\n * state changes — only the ScreenHeader (reader) re-renders.\n */\nconst ScreenHeaderWriteContext = createContext<SetActions | null>(null);\nconst ScreenHeaderReadContext = createContext<ReactNode>(null);\n\nconst ScreenHeaderBreadcrumbsWriteContext =\n createContext<SetBreadcrumbs | null>(null);\nconst ScreenHeaderBreadcrumbsReadContext = createContext<ReactNode>(null);\n\nexport function ScreenHeaderProvider({\n children,\n}: {\n children: ReactNode;\n}): React.JSX.Element {\n const [actions, setActions] = useState<ReactNode>(null);\n const [breadcrumbs, setBreadcrumbs] = useState<ReactNode>(null);\n\n return (\n <ScreenHeaderWriteContext.Provider value={setActions}>\n <ScreenHeaderReadContext.Provider value={actions}>\n <ScreenHeaderBreadcrumbsWriteContext.Provider value={setBreadcrumbs}>\n <ScreenHeaderBreadcrumbsReadContext.Provider value={breadcrumbs}>\n {children}\n </ScreenHeaderBreadcrumbsReadContext.Provider>\n </ScreenHeaderBreadcrumbsWriteContext.Provider>\n </ScreenHeaderReadContext.Provider>\n </ScreenHeaderWriteContext.Provider>\n );\n}\n\n/**\n * Sets actions to display in the ScreenHeader.\n * Returns `true` if inside a ScreenHeaderProvider (i.e., in the portal shell),\n * `false` otherwise. Pages can use this boolean to conditionally skip\n * rendering their own PageHeader.\n *\n * Cleans up actions on unmount so navigating away doesn't leave stale actions.\n */\nexport function useScreenHeaderActions(actions: ReactNode): boolean {\n const setActions = useContext(ScreenHeaderWriteContext);\n const setActionsRef = useRef(setActions);\n setActionsRef.current = setActions;\n\n // Update actions when the value changes\n useEffect(() => {\n if (!setActions) return;\n setActions(actions);\n }, [actions, setActions]);\n\n // Clear actions only on unmount\n useEffect(() => {\n return () => setActionsRef.current?.(null);\n }, []);\n\n return setActions !== null;\n}\n\n/**\n * Sets breadcrumbs to display in the ScreenHeader (in place of the plain title).\n * Returns `true` if inside a ScreenHeaderProvider (i.e., in the portal shell),\n * `false` otherwise.\n *\n * Cleans up breadcrumbs on unmount so navigating away doesn't leave stale breadcrumbs.\n */\nexport function useScreenHeaderBreadcrumbs(breadcrumbs: ReactNode): boolean {\n const setBreadcrumbs = useContext(ScreenHeaderBreadcrumbsWriteContext);\n const setBreadcrumbsRef = useRef(setBreadcrumbs);\n setBreadcrumbsRef.current = setBreadcrumbs;\n\n // Update breadcrumbs when the value changes\n useEffect(() => {\n if (!setBreadcrumbs) return;\n setBreadcrumbs(breadcrumbs);\n }, [breadcrumbs, setBreadcrumbs]);\n\n // Clear breadcrumbs only on unmount\n useEffect(() => {\n return () => setBreadcrumbsRef.current?.(null);\n }, []);\n\n return setBreadcrumbs !== null;\n}\n\n/**\n * Reads the current screen header actions and breadcrumbs. Used internally by ScreenHeader.\n */\nexport function useScreenHeaderContext(): {\n actions: ReactNode;\n breadcrumbs: ReactNode;\n} {\n const actions = useContext(ScreenHeaderReadContext);\n const breadcrumbs = useContext(ScreenHeaderBreadcrumbsReadContext);\n return { actions: actions ?? null, breadcrumbs: breadcrumbs ?? null };\n}\n"],"mappings":";;;;;;;;AAoBA,MAAM,2BAA2B,cAAiC,KAAK;AACvE,MAAM,0BAA0B,cAAyB,KAAK;AAE9D,MAAM,sCACJ,cAAqC,KAAK;AAC5C,MAAM,qCAAqC,cAAyB,KAAK;AAEzE,SAAgB,qBAAqB,EACnC,YAGoB;CACpB,MAAM,CAAC,SAAS,cAAc,SAAoB,KAAK;CACvD,MAAM,CAAC,aAAa,kBAAkB,SAAoB,KAAK;AAE/D,QACE,oBAAC,yBAAyB,UAA1B;EAAmC,OAAO;YACxC,oBAAC,wBAAwB,UAAzB;GAAkC,OAAO;aACvC,oBAAC,oCAAoC,UAArC;IAA8C,OAAO;cACnD,oBAAC,mCAAmC,UAApC;KAA6C,OAAO;KACjD;KAC2C,CAAA;IACD,CAAA;GACd,CAAA;EACD,CAAA;;;;;;;;;;AAYxC,SAAgB,uBAAuB,SAA6B;CAClE,MAAM,aAAa,WAAW,yBAAyB;CACvD,MAAM,gBAAgB,OAAO,WAAW;AACxC,eAAc,UAAU;AAGxB,iBAAgB;AACd,MAAI,CAAC,WAAY;AACjB,aAAW,QAAQ;IAClB,CAAC,SAAS,WAAW,CAAC;AAGzB,iBAAgB;AACd,eAAa,cAAc,UAAU,KAAK;IACzC,EAAE,CAAC;AAEN,QAAO,eAAe;;;;;;;;;AAUxB,SAAgB,2BAA2B,aAAiC;CAC1E,MAAM,iBAAiB,WAAW,oCAAoC;CACtE,MAAM,oBAAoB,OAAO,eAAe;AAChD,mBAAkB,UAAU;AAG5B,iBAAgB;AACd,MAAI,CAAC,eAAgB;AACrB,iBAAe,YAAY;IAC1B,CAAC,aAAa,eAAe,CAAC;AAGjC,iBAAgB;AACd,eAAa,kBAAkB,UAAU,KAAK;IAC7C,EAAE,CAAC;AAEN,QAAO,mBAAmB;;;;;AAM5B,SAAgB,yBAGd;CACA,MAAM,UAAU,WAAW,wBAAwB;CACnD,MAAM,cAAc,WAAW,mCAAmC;AAClE,QAAO;EAAE,SAAS,WAAW;EAAM,aAAa,eAAe;EAAM"}
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
require("./chunk-DAgNkxik.cjs");
|
|
2
|
+
let react = require("react");
|
|
3
|
+
let react_jsx_runtime = require("react/jsx-runtime");
|
|
4
|
+
//#region ../react/src/shell/ScreenHeaderContext.tsx
|
|
5
|
+
/**
|
|
6
|
+
* Split into separate read/write contexts so that components calling
|
|
7
|
+
* useScreenHeaderActions (writers) don't re-render when the actions
|
|
8
|
+
* state changes — only the ScreenHeader (reader) re-renders.
|
|
9
|
+
*/
|
|
10
|
+
const ScreenHeaderWriteContext = (0, react.createContext)(null);
|
|
11
|
+
const ScreenHeaderReadContext = (0, react.createContext)(null);
|
|
12
|
+
const ScreenHeaderBreadcrumbsWriteContext = (0, react.createContext)(null);
|
|
13
|
+
const ScreenHeaderBreadcrumbsReadContext = (0, react.createContext)(null);
|
|
14
|
+
function ScreenHeaderProvider({ children }) {
|
|
15
|
+
const [actions, setActions] = (0, react.useState)(null);
|
|
16
|
+
const [breadcrumbs, setBreadcrumbs] = (0, react.useState)(null);
|
|
17
|
+
return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(ScreenHeaderWriteContext.Provider, {
|
|
18
|
+
value: setActions,
|
|
19
|
+
children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(ScreenHeaderReadContext.Provider, {
|
|
20
|
+
value: actions,
|
|
21
|
+
children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(ScreenHeaderBreadcrumbsWriteContext.Provider, {
|
|
22
|
+
value: setBreadcrumbs,
|
|
23
|
+
children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(ScreenHeaderBreadcrumbsReadContext.Provider, {
|
|
24
|
+
value: breadcrumbs,
|
|
25
|
+
children
|
|
26
|
+
})
|
|
27
|
+
})
|
|
28
|
+
})
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Sets actions to display in the ScreenHeader.
|
|
33
|
+
* Returns `true` if inside a ScreenHeaderProvider (i.e., in the portal shell),
|
|
34
|
+
* `false` otherwise. Pages can use this boolean to conditionally skip
|
|
35
|
+
* rendering their own PageHeader.
|
|
36
|
+
*
|
|
37
|
+
* Cleans up actions on unmount so navigating away doesn't leave stale actions.
|
|
38
|
+
*/
|
|
39
|
+
function useScreenHeaderActions(actions) {
|
|
40
|
+
const setActions = (0, react.useContext)(ScreenHeaderWriteContext);
|
|
41
|
+
const setActionsRef = (0, react.useRef)(setActions);
|
|
42
|
+
setActionsRef.current = setActions;
|
|
43
|
+
(0, react.useEffect)(() => {
|
|
44
|
+
if (!setActions) return;
|
|
45
|
+
setActions(actions);
|
|
46
|
+
}, [actions, setActions]);
|
|
47
|
+
(0, react.useEffect)(() => {
|
|
48
|
+
return () => setActionsRef.current?.(null);
|
|
49
|
+
}, []);
|
|
50
|
+
return setActions !== null;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Sets breadcrumbs to display in the ScreenHeader (in place of the plain title).
|
|
54
|
+
* Returns `true` if inside a ScreenHeaderProvider (i.e., in the portal shell),
|
|
55
|
+
* `false` otherwise.
|
|
56
|
+
*
|
|
57
|
+
* Cleans up breadcrumbs on unmount so navigating away doesn't leave stale breadcrumbs.
|
|
58
|
+
*/
|
|
59
|
+
function useScreenHeaderBreadcrumbs(breadcrumbs) {
|
|
60
|
+
const setBreadcrumbs = (0, react.useContext)(ScreenHeaderBreadcrumbsWriteContext);
|
|
61
|
+
const setBreadcrumbsRef = (0, react.useRef)(setBreadcrumbs);
|
|
62
|
+
setBreadcrumbsRef.current = setBreadcrumbs;
|
|
63
|
+
(0, react.useEffect)(() => {
|
|
64
|
+
if (!setBreadcrumbs) return;
|
|
65
|
+
setBreadcrumbs(breadcrumbs);
|
|
66
|
+
}, [breadcrumbs, setBreadcrumbs]);
|
|
67
|
+
(0, react.useEffect)(() => {
|
|
68
|
+
return () => setBreadcrumbsRef.current?.(null);
|
|
69
|
+
}, []);
|
|
70
|
+
return setBreadcrumbs !== null;
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Reads the current screen header actions and breadcrumbs. Used internally by ScreenHeader.
|
|
74
|
+
*/
|
|
75
|
+
function useScreenHeaderContext() {
|
|
76
|
+
const actions = (0, react.useContext)(ScreenHeaderReadContext);
|
|
77
|
+
const breadcrumbs = (0, react.useContext)(ScreenHeaderBreadcrumbsReadContext);
|
|
78
|
+
return {
|
|
79
|
+
actions: actions ?? null,
|
|
80
|
+
breadcrumbs: breadcrumbs ?? null
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
//#endregion
|
|
84
|
+
Object.defineProperty(exports, "ScreenHeaderProvider", {
|
|
85
|
+
enumerable: true,
|
|
86
|
+
get: function() {
|
|
87
|
+
return ScreenHeaderProvider;
|
|
88
|
+
}
|
|
89
|
+
});
|
|
90
|
+
Object.defineProperty(exports, "useScreenHeaderActions", {
|
|
91
|
+
enumerable: true,
|
|
92
|
+
get: function() {
|
|
93
|
+
return useScreenHeaderActions;
|
|
94
|
+
}
|
|
95
|
+
});
|
|
96
|
+
Object.defineProperty(exports, "useScreenHeaderBreadcrumbs", {
|
|
97
|
+
enumerable: true,
|
|
98
|
+
get: function() {
|
|
99
|
+
return useScreenHeaderBreadcrumbs;
|
|
100
|
+
}
|
|
101
|
+
});
|
|
102
|
+
Object.defineProperty(exports, "useScreenHeaderContext", {
|
|
103
|
+
enumerable: true,
|
|
104
|
+
get: function() {
|
|
105
|
+
return useScreenHeaderContext;
|
|
106
|
+
}
|
|
107
|
+
});
|
|
108
|
+
|
|
109
|
+
//# sourceMappingURL=ScreenHeaderContext-eyKPyDoQ.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ScreenHeaderContext-eyKPyDoQ.cjs","names":[],"sources":["../../react/src/shell/ScreenHeaderContext.tsx"],"sourcesContent":["\"use client\";\n\nimport type React from \"react\";\nimport {\n createContext,\n useContext,\n useState,\n useEffect,\n useRef,\n type ReactNode,\n} from \"react\";\n\ntype SetActions = (actions: ReactNode) => void;\ntype SetBreadcrumbs = (breadcrumbs: ReactNode) => void;\n\n/**\n * Split into separate read/write contexts so that components calling\n * useScreenHeaderActions (writers) don't re-render when the actions\n * state changes — only the ScreenHeader (reader) re-renders.\n */\nconst ScreenHeaderWriteContext = createContext<SetActions | null>(null);\nconst ScreenHeaderReadContext = createContext<ReactNode>(null);\n\nconst ScreenHeaderBreadcrumbsWriteContext =\n createContext<SetBreadcrumbs | null>(null);\nconst ScreenHeaderBreadcrumbsReadContext = createContext<ReactNode>(null);\n\nexport function ScreenHeaderProvider({\n children,\n}: {\n children: ReactNode;\n}): React.JSX.Element {\n const [actions, setActions] = useState<ReactNode>(null);\n const [breadcrumbs, setBreadcrumbs] = useState<ReactNode>(null);\n\n return (\n <ScreenHeaderWriteContext.Provider value={setActions}>\n <ScreenHeaderReadContext.Provider value={actions}>\n <ScreenHeaderBreadcrumbsWriteContext.Provider value={setBreadcrumbs}>\n <ScreenHeaderBreadcrumbsReadContext.Provider value={breadcrumbs}>\n {children}\n </ScreenHeaderBreadcrumbsReadContext.Provider>\n </ScreenHeaderBreadcrumbsWriteContext.Provider>\n </ScreenHeaderReadContext.Provider>\n </ScreenHeaderWriteContext.Provider>\n );\n}\n\n/**\n * Sets actions to display in the ScreenHeader.\n * Returns `true` if inside a ScreenHeaderProvider (i.e., in the portal shell),\n * `false` otherwise. Pages can use this boolean to conditionally skip\n * rendering their own PageHeader.\n *\n * Cleans up actions on unmount so navigating away doesn't leave stale actions.\n */\nexport function useScreenHeaderActions(actions: ReactNode): boolean {\n const setActions = useContext(ScreenHeaderWriteContext);\n const setActionsRef = useRef(setActions);\n setActionsRef.current = setActions;\n\n // Update actions when the value changes\n useEffect(() => {\n if (!setActions) return;\n setActions(actions);\n }, [actions, setActions]);\n\n // Clear actions only on unmount\n useEffect(() => {\n return () => setActionsRef.current?.(null);\n }, []);\n\n return setActions !== null;\n}\n\n/**\n * Sets breadcrumbs to display in the ScreenHeader (in place of the plain title).\n * Returns `true` if inside a ScreenHeaderProvider (i.e., in the portal shell),\n * `false` otherwise.\n *\n * Cleans up breadcrumbs on unmount so navigating away doesn't leave stale breadcrumbs.\n */\nexport function useScreenHeaderBreadcrumbs(breadcrumbs: ReactNode): boolean {\n const setBreadcrumbs = useContext(ScreenHeaderBreadcrumbsWriteContext);\n const setBreadcrumbsRef = useRef(setBreadcrumbs);\n setBreadcrumbsRef.current = setBreadcrumbs;\n\n // Update breadcrumbs when the value changes\n useEffect(() => {\n if (!setBreadcrumbs) return;\n setBreadcrumbs(breadcrumbs);\n }, [breadcrumbs, setBreadcrumbs]);\n\n // Clear breadcrumbs only on unmount\n useEffect(() => {\n return () => setBreadcrumbsRef.current?.(null);\n }, []);\n\n return setBreadcrumbs !== null;\n}\n\n/**\n * Reads the current screen header actions and breadcrumbs. Used internally by ScreenHeader.\n */\nexport function useScreenHeaderContext(): {\n actions: ReactNode;\n breadcrumbs: ReactNode;\n} {\n const actions = useContext(ScreenHeaderReadContext);\n const breadcrumbs = useContext(ScreenHeaderBreadcrumbsReadContext);\n return { actions: actions ?? null, breadcrumbs: breadcrumbs ?? null };\n}\n"],"mappings":";;;;;;;;;AAoBA,MAAM,4BAAA,GAAA,MAAA,eAA4D,KAAK;AACvE,MAAM,2BAAA,GAAA,MAAA,eAAmD,KAAK;AAE9D,MAAM,uCAAA,GAAA,MAAA,eACiC,KAAK;AAC5C,MAAM,sCAAA,GAAA,MAAA,eAA8D,KAAK;AAEzE,SAAgB,qBAAqB,EACnC,YAGoB;CACpB,MAAM,CAAC,SAAS,eAAA,GAAA,MAAA,UAAkC,KAAK;CACvD,MAAM,CAAC,aAAa,mBAAA,GAAA,MAAA,UAAsC,KAAK;AAE/D,QACE,iBAAA,GAAA,kBAAA,KAAC,yBAAyB,UAA1B;EAAmC,OAAO;YACxC,iBAAA,GAAA,kBAAA,KAAC,wBAAwB,UAAzB;GAAkC,OAAO;aACvC,iBAAA,GAAA,kBAAA,KAAC,oCAAoC,UAArC;IAA8C,OAAO;cACnD,iBAAA,GAAA,kBAAA,KAAC,mCAAmC,UAApC;KAA6C,OAAO;KACjD;KAC2C,CAAA;IACD,CAAA;GACd,CAAA;EACD,CAAA;;;;;;;;;;AAYxC,SAAgB,uBAAuB,SAA6B;CAClE,MAAM,cAAA,GAAA,MAAA,YAAwB,yBAAyB;CACvD,MAAM,iBAAA,GAAA,MAAA,QAAuB,WAAW;AACxC,eAAc,UAAU;AAGxB,EAAA,GAAA,MAAA,iBAAgB;AACd,MAAI,CAAC,WAAY;AACjB,aAAW,QAAQ;IAClB,CAAC,SAAS,WAAW,CAAC;AAGzB,EAAA,GAAA,MAAA,iBAAgB;AACd,eAAa,cAAc,UAAU,KAAK;IACzC,EAAE,CAAC;AAEN,QAAO,eAAe;;;;;;;;;AAUxB,SAAgB,2BAA2B,aAAiC;CAC1E,MAAM,kBAAA,GAAA,MAAA,YAA4B,oCAAoC;CACtE,MAAM,qBAAA,GAAA,MAAA,QAA2B,eAAe;AAChD,mBAAkB,UAAU;AAG5B,EAAA,GAAA,MAAA,iBAAgB;AACd,MAAI,CAAC,eAAgB;AACrB,iBAAe,YAAY;IAC1B,CAAC,aAAa,eAAe,CAAC;AAGjC,EAAA,GAAA,MAAA,iBAAgB;AACd,eAAa,kBAAkB,UAAU,KAAK;IAC7C,EAAE,CAAC;AAEN,QAAO,mBAAmB;;;;;AAM5B,SAAgB,yBAGd;CACA,MAAM,WAAA,GAAA,MAAA,YAAqB,wBAAwB;CACnD,MAAM,eAAA,GAAA,MAAA,YAAyB,mCAAmC;AAClE,QAAO;EAAE,SAAS,WAAW;EAAM,aAAa,eAAe;EAAM"}
|
|
@@ -31,10 +31,11 @@ import "./SpacerWidget-DgVU58BC.mjs";
|
|
|
31
31
|
import "./TableWidget-CK5jQxjz.mjs";
|
|
32
32
|
import "./ToDoWidget-Cmvf7I6c.mjs";
|
|
33
33
|
import "./VideoWidget-ho9fGQ3V.mjs";
|
|
34
|
-
import "./
|
|
34
|
+
import "./ScreenHeaderContext-CrdfLGKk.mjs";
|
|
35
35
|
import "./dist-CMGXkSgZ.mjs";
|
|
36
36
|
import "./es-CrIkZTQ3.mjs";
|
|
37
|
-
import "./dist-
|
|
38
|
-
import
|
|
39
|
-
import "./
|
|
37
|
+
import "./dist-Cl4FsM3V.mjs";
|
|
38
|
+
import "./src-CzK-t4_m.mjs";
|
|
39
|
+
import { n as shareablesScreenPropertySchema, t as ShareablesScreen } from "./ShareablesScreen-DfGkgR72.mjs";
|
|
40
|
+
import "./sortable.esm-DreCqRxJ.mjs";
|
|
40
41
|
export { ShareablesScreen, shareablesScreenPropertySchema };
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
require("./chunk-DAgNkxik.cjs");
|
|
2
2
|
const require_use_account_clients = require("./use-account-clients-vZftsKdf.cjs");
|
|
3
|
-
const require_src = require("./src-DdlLVUFj.cjs");
|
|
4
3
|
const require_use_current_user = require("./use-current-user-437rXIp0.cjs");
|
|
5
4
|
const require_AppNavigationContext = require("./AppNavigationContext-B88_pXjo.cjs");
|
|
5
|
+
const require_src = require("./src-D1poJLOQ.cjs");
|
|
6
6
|
let react = require("react");
|
|
7
7
|
let react_jsx_runtime = require("react/jsx-runtime");
|
|
8
8
|
//#region ../../file-picker/api-client/src/client.ts
|
|
@@ -90,7 +90,7 @@ function ShareablesScreen({ background, textColor, accentColor, padding, borderR
|
|
|
90
90
|
});
|
|
91
91
|
},
|
|
92
92
|
onDeletePlaylist: async (playlistId) => {
|
|
93
|
-
const { playlists: playlistsApi } = await Promise.resolve().then(() => require("./src-
|
|
93
|
+
const { playlists: playlistsApi } = await Promise.resolve().then(() => require("./src-BYyxE-aF.cjs")).then((n) => n.src_exports);
|
|
94
94
|
await playlistsApi.deletePlaylist(domainClient, playlistId);
|
|
95
95
|
}
|
|
96
96
|
}), [
|
|
@@ -142,4 +142,4 @@ Object.defineProperty(exports, "shareablesScreenPropertySchema", {
|
|
|
142
142
|
}
|
|
143
143
|
});
|
|
144
144
|
|
|
145
|
-
//# sourceMappingURL=ShareablesScreen-
|
|
145
|
+
//# sourceMappingURL=ShareablesScreen-CH9044d8.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ShareablesScreen-BKPaCLC0.cjs","names":["useSdkClient","useCurrentUser","useAppNavigation","ShareablesCoreProvider","ShareablesUIProvider","ShareablesApp"],"sources":["../../../file-picker/api-client/src/client.ts","../src/screens/ShareablesScreen.tsx"],"sourcesContent":["import type { FetchClientInstance } from \"@fluid-app/api-client-core\";\nimport type { DamAssetCreateResponse } from \"@fluid-app/file-picker-core\";\n\nexport interface DamUploadStrategy {\n uploadFile(params: {\n file: File;\n name: string;\n description?: string;\n tags?: string[];\n onProgress?: (progress: number) => void;\n companyId?: number;\n }): Promise<DamAssetCreateResponse>;\n}\n\nexport interface FilePickerClientConfig {\n fetchClient: FetchClientInstance;\n uploadStrategy?: DamUploadStrategy;\n unsplashAccessKey?: string;\n proxyEndpoint?: string; // defaults to \"/api/proxy-url\"\n}\n\nexport interface FilePickerClient {\n fetchClient: FetchClientInstance;\n uploadStrategy?: DamUploadStrategy;\n unsplashAccessKey?: string;\n proxyEndpoint: string;\n}\n\nexport function createFilePickerClient(\n config: FilePickerClientConfig,\n): FilePickerClient {\n return {\n fetchClient: config.fetchClient,\n uploadStrategy: config.uploadStrategy,\n unsplashAccessKey: config.unsplashAccessKey,\n proxyEndpoint: config.proxyEndpoint ?? \"/api/proxy-url\",\n };\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 { ShareablesCoreProvider } from \"@fluid-app/shareables-core\";\nimport { ShareablesUIProvider, ShareablesApp } from \"@fluid-app/shareables-ui\";\nimport { createFilePickerClient } from \"@fluid-app/file-picker-api-client\";\nimport { useCurrentUser } from \"../hooks/use-current-user\";\nimport { useAppNavigation } from \"../shell/AppNavigationContext\";\nimport { useSdkClient } from \"../account/use-account-clients\";\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 { data: userData } = useCurrentUser();\n const { currentSlug, navigate } = useAppNavigation();\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 filePickerClient = useMemo(\n () => createFilePickerClient({ fetchClient: domainClient }),\n [domainClient],\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 filePickerClient,\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: async (playlistId: number) => {\n const { playlists: playlistsApi } =\n await import(\"@fluid-app/shareables-api-client\");\n await playlistsApi.deletePlaylist(domainClient, playlistId);\n },\n }),\n [userData, navigate, filePickerClient, domainClient],\n );\n\n return (\n <div {...divProps} className={`h-full ${divProps.className ?? \"\"}`}>\n <ShareablesCoreProvider config={coreConfig}>\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 onNavigate={handleNavigate}\n onBack={handleBack}\n />\n </ShareablesUIProvider>\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
|
+
{"version":3,"file":"ShareablesScreen-CH9044d8.cjs","names":["useSdkClient","useCurrentUser","useAppNavigation","ShareablesCoreProvider","ShareablesUIProvider","ShareablesApp"],"sources":["../../../file-picker/api-client/src/client.ts","../src/screens/ShareablesScreen.tsx"],"sourcesContent":["import type { FetchClientInstance } from \"@fluid-app/api-client-core\";\nimport type { DamAssetCreateResponse } from \"@fluid-app/file-picker-core\";\n\nexport interface DamUploadStrategy {\n uploadFile(params: {\n file: File;\n name: string;\n description?: string;\n tags?: string[];\n onProgress?: (progress: number) => void;\n companyId?: number;\n }): Promise<DamAssetCreateResponse>;\n}\n\nexport interface FilePickerClientConfig {\n fetchClient: FetchClientInstance;\n uploadStrategy?: DamUploadStrategy;\n unsplashAccessKey?: string;\n proxyEndpoint?: string; // defaults to \"/api/proxy-url\"\n}\n\nexport interface FilePickerClient {\n fetchClient: FetchClientInstance;\n uploadStrategy?: DamUploadStrategy;\n unsplashAccessKey?: string;\n proxyEndpoint: string;\n}\n\nexport function createFilePickerClient(\n config: FilePickerClientConfig,\n): FilePickerClient {\n return {\n fetchClient: config.fetchClient,\n uploadStrategy: config.uploadStrategy,\n unsplashAccessKey: config.unsplashAccessKey,\n proxyEndpoint: config.proxyEndpoint ?? \"/api/proxy-url\",\n };\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 { ShareablesCoreProvider } from \"@fluid-app/shareables-core\";\nimport { ShareablesUIProvider, ShareablesApp } from \"@fluid-app/shareables-ui\";\nimport { createFilePickerClient } from \"@fluid-app/file-picker-api-client\";\nimport { useCurrentUser } from \"../hooks/use-current-user\";\nimport { useAppNavigation } from \"../shell/AppNavigationContext\";\nimport { useSdkClient } from \"../account/use-account-clients\";\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 { data: userData } = useCurrentUser();\n const { currentSlug, navigate } = useAppNavigation();\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 filePickerClient = useMemo(\n () => createFilePickerClient({ fetchClient: domainClient }),\n [domainClient],\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 filePickerClient,\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: async (playlistId: number) => {\n const { playlists: playlistsApi } =\n await import(\"@fluid-app/shareables-api-client\");\n await playlistsApi.deletePlaylist(domainClient, playlistId);\n },\n }),\n [userData, navigate, filePickerClient, domainClient],\n );\n\n return (\n <div {...divProps} className={`h-full ${divProps.className ?? \"\"}`}>\n <ShareablesCoreProvider config={coreConfig}>\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 onNavigate={handleNavigate}\n onBack={handleBack}\n />\n </ShareablesUIProvider>\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,7 +1,7 @@
|
|
|
1
1
|
import { i as useSdkClient } from "./use-account-clients-yghkzBH9.mjs";
|
|
2
|
-
import { i as ShareablesCoreProvider, n as ShareablesApp, r as ShareablesUIProvider } from "./src-CEouYGbQ.mjs";
|
|
3
2
|
import { n as useCurrentUser } from "./use-current-user-D_gOoHWA.mjs";
|
|
4
3
|
import { n as useAppNavigation } from "./AppNavigationContext-DJeNcP4Y.mjs";
|
|
4
|
+
import { i as ShareablesCoreProvider, n as ShareablesApp, r as ShareablesUIProvider } from "./src-CzK-t4_m.mjs";
|
|
5
5
|
import { useCallback, useMemo } from "react";
|
|
6
6
|
import { jsx } from "react/jsx-runtime";
|
|
7
7
|
//#region ../../file-picker/api-client/src/client.ts
|
|
@@ -89,7 +89,7 @@ function ShareablesScreen({ background, textColor, accentColor, padding, borderR
|
|
|
89
89
|
});
|
|
90
90
|
},
|
|
91
91
|
onDeletePlaylist: async (playlistId) => {
|
|
92
|
-
const { playlists: playlistsApi } = await import("./src-
|
|
92
|
+
const { playlists: playlistsApi } = await import("./src-sa7B0kBg.mjs").then((n) => n.t);
|
|
93
93
|
await playlistsApi.deletePlaylist(domainClient, playlistId);
|
|
94
94
|
}
|
|
95
95
|
}), [
|
|
@@ -130,4 +130,4 @@ const shareablesScreenPropertySchema = {
|
|
|
130
130
|
//#endregion
|
|
131
131
|
export { shareablesScreenPropertySchema as n, ShareablesScreen as t };
|
|
132
132
|
|
|
133
|
-
//# sourceMappingURL=ShareablesScreen-
|
|
133
|
+
//# sourceMappingURL=ShareablesScreen-DfGkgR72.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ShareablesScreen-
|
|
1
|
+
{"version":3,"file":"ShareablesScreen-DfGkgR72.mjs","names":[],"sources":["../../../file-picker/api-client/src/client.ts","../src/screens/ShareablesScreen.tsx"],"sourcesContent":["import type { FetchClientInstance } from \"@fluid-app/api-client-core\";\nimport type { DamAssetCreateResponse } from \"@fluid-app/file-picker-core\";\n\nexport interface DamUploadStrategy {\n uploadFile(params: {\n file: File;\n name: string;\n description?: string;\n tags?: string[];\n onProgress?: (progress: number) => void;\n companyId?: number;\n }): Promise<DamAssetCreateResponse>;\n}\n\nexport interface FilePickerClientConfig {\n fetchClient: FetchClientInstance;\n uploadStrategy?: DamUploadStrategy;\n unsplashAccessKey?: string;\n proxyEndpoint?: string; // defaults to \"/api/proxy-url\"\n}\n\nexport interface FilePickerClient {\n fetchClient: FetchClientInstance;\n uploadStrategy?: DamUploadStrategy;\n unsplashAccessKey?: string;\n proxyEndpoint: string;\n}\n\nexport function createFilePickerClient(\n config: FilePickerClientConfig,\n): FilePickerClient {\n return {\n fetchClient: config.fetchClient,\n uploadStrategy: config.uploadStrategy,\n unsplashAccessKey: config.unsplashAccessKey,\n proxyEndpoint: config.proxyEndpoint ?? \"/api/proxy-url\",\n };\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 { ShareablesCoreProvider } from \"@fluid-app/shareables-core\";\nimport { ShareablesUIProvider, ShareablesApp } from \"@fluid-app/shareables-ui\";\nimport { createFilePickerClient } from \"@fluid-app/file-picker-api-client\";\nimport { useCurrentUser } from \"../hooks/use-current-user\";\nimport { useAppNavigation } from \"../shell/AppNavigationContext\";\nimport { useSdkClient } from \"../account/use-account-clients\";\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 { data: userData } = useCurrentUser();\n const { currentSlug, navigate } = useAppNavigation();\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 filePickerClient = useMemo(\n () => createFilePickerClient({ fetchClient: domainClient }),\n [domainClient],\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 filePickerClient,\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: async (playlistId: number) => {\n const { playlists: playlistsApi } =\n await import(\"@fluid-app/shareables-api-client\");\n await playlistsApi.deletePlaylist(domainClient, playlistId);\n },\n }),\n [userData, navigate, filePickerClient, domainClient],\n );\n\n return (\n <div {...divProps} className={`h-full ${divProps.className ?? \"\"}`}>\n <ShareablesCoreProvider config={coreConfig}>\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 onNavigate={handleNavigate}\n onBack={handleBack}\n />\n </ShareablesUIProvider>\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":";;;;;;;AA4BA,SAAgB,uBACd,QACkB;AAClB,QAAO;EACL,aAAa,OAAO;EACpB,gBAAgB,OAAO;EACvB,mBAAmB,OAAO;EAC1B,eAAe,OAAO,iBAAiB;EACxC;;;;;;;;;;;;;;;;;;ACCH,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,eAAe,cAAc;CACnC,MAAM,EAAE,MAAM,aAAa,gBAAgB;CAC3C,MAAM,EAAE,aAAa,aAAa,kBAAkB;CAEpD,MAAM,EAAE,QAAQ,UAAU,WAAW,qBAAqB,YAAY;CAEtE,MAAM,iBAAiB,aACpB,WAAmB,OAAgB;AAElC,WADa,KAAK,SAAS,UAAU,GAAG,OAAO,SAAS,YAC1C;IAEhB,CAAC,SAAS,CACX;CAED,MAAM,aAAa,kBAAkB;AACnC,MAAI,YAAY,OAEd,UAAS,SAAS,SAAS;MAG3B,UAAS,iBAAiB;IAE3B;EAAC;EAAU;EAAU;EAAO,CAAC;CAEhC,MAAM,aAAa,eACV;EACL,QAAQ;EACR,MAAM,WAAW,EAAE,IAAI,SAAS,IAAI,GAAG;EACvC,YAAY;EACb,GACD,CAAC,cAAc,SAAS,CACzB;CAED,MAAM,mBAAmB,cACjB,uBAAuB,EAAE,aAAa,cAAc,CAAC,EAC3D,CAAC,aAAa,CACf;CAED,MAAM,WAAW,eACR;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,OAAO,eAAuB;GAC9C,MAAM,EAAE,WAAW,iBACjB,MAAM,OAAO,sBAAA,MAAA,MAAA,EAAA,EAAA;AACf,SAAM,aAAa,eAAe,cAAc,WAAW;;EAE9D,GACD;EAAC;EAAU;EAAU;EAAkB;EAAa,CACrD;AAED,QACE,oBAAC,OAAD;EAAK,GAAI;EAAU,WAAW,UAAU,SAAS,aAAa;YAC5D,oBAAC,wBAAD;GAAwB,QAAQ;aAC9B,oBAAC,sBAAD;IAAsB,QAAQ;cAC5B,oBAAC,eAAD;KACU;KACE;KACF;KACR,gBAAgB,UAAU,SAAS;KACnC,aAAa,UAAU,SAAS;KAChC,YAAY;KACZ,QAAQ;KACR,CAAA;IACmB,CAAA;GACA,CAAA;EACrB,CAAA;;AAIV,MAAa,iCAAuD;CAClE,YAAY;CACZ,aAAa;CACb,YAAY,CAAC;EAAE,IAAI;EAAW,OAAO;EAAW,CAAC;CACjD,QAAQ,EAAE;CACX"}
|
|
@@ -32,11 +32,12 @@ require("./SpacerWidget-Br2IZFFv.cjs");
|
|
|
32
32
|
require("./TableWidget-Vcxw-se8.cjs");
|
|
33
33
|
require("./ToDoWidget-Bv6POc5R.cjs");
|
|
34
34
|
require("./VideoWidget-7Q2eqHFn.cjs");
|
|
35
|
-
require("./
|
|
35
|
+
require("./ScreenHeaderContext-eyKPyDoQ.cjs");
|
|
36
36
|
require("./dist-NpiIdjkL.cjs");
|
|
37
37
|
require("./es-qN_AsxTa.cjs");
|
|
38
|
-
require("./dist-
|
|
39
|
-
|
|
40
|
-
require("./
|
|
38
|
+
require("./dist-Cs6PV1Tf.cjs");
|
|
39
|
+
require("./src-D1poJLOQ.cjs");
|
|
40
|
+
const require_ShareablesScreen = require("./ShareablesScreen-CH9044d8.cjs");
|
|
41
|
+
require("./dist-oTn1xy1Z.cjs");
|
|
41
42
|
exports.ShareablesScreen = require_ShareablesScreen.ShareablesScreen;
|
|
42
43
|
exports.shareablesScreenPropertySchema = require_ShareablesScreen.shareablesScreenPropertySchema;
|
|
@@ -32,6 +32,7 @@ require("./SpacerWidget-Br2IZFFv.cjs");
|
|
|
32
32
|
require("./TableWidget-Vcxw-se8.cjs");
|
|
33
33
|
require("./ToDoWidget-Bv6POc5R.cjs");
|
|
34
34
|
require("./VideoWidget-7Q2eqHFn.cjs");
|
|
35
|
-
|
|
35
|
+
require("./ScreenHeaderContext-eyKPyDoQ.cjs");
|
|
36
|
+
const require_ShopScreen = require("./ShopScreen-CrbD5rZR.cjs");
|
|
36
37
|
exports.ShopScreen = require_ShopScreen.ShopScreen;
|
|
37
38
|
exports.shopScreenPropertySchema = require_ShopScreen.shopScreenPropertySchema;
|
|
@@ -31,5 +31,6 @@ import "./SpacerWidget-DgVU58BC.mjs";
|
|
|
31
31
|
import "./TableWidget-CK5jQxjz.mjs";
|
|
32
32
|
import "./ToDoWidget-Cmvf7I6c.mjs";
|
|
33
33
|
import "./VideoWidget-ho9fGQ3V.mjs";
|
|
34
|
-
import
|
|
34
|
+
import "./ScreenHeaderContext-CrdfLGKk.mjs";
|
|
35
|
+
import { n as shopScreenPropertySchema, t as ShopScreen } from "./ShopScreen-DwtVHSml.mjs";
|
|
35
36
|
export { ShopScreen, shopScreenPropertySchema };
|
|
@@ -2,9 +2,10 @@ require("./chunk-DAgNkxik.cjs");
|
|
|
2
2
|
const require_FluidProvider = require("./FluidProvider-DDcsxdbL.cjs");
|
|
3
3
|
const require_src = require("./src-DqIS-4ns.cjs");
|
|
4
4
|
const require_use_account_clients = require("./use-account-clients-vZftsKdf.cjs");
|
|
5
|
+
const require_ScreenHeaderContext = require("./ScreenHeaderContext-eyKPyDoQ.cjs");
|
|
5
6
|
const require_use_current_user = require("./use-current-user-437rXIp0.cjs");
|
|
6
7
|
const require_AppNavigationContext = require("./AppNavigationContext-B88_pXjo.cjs");
|
|
7
|
-
const require_products = require("./products-
|
|
8
|
+
const require_products = require("./products-BtHCYNv6.cjs");
|
|
8
9
|
let react = require("react");
|
|
9
10
|
let _tanstack_react_query = require("@tanstack/react-query");
|
|
10
11
|
let react_jsx_runtime = require("react/jsx-runtime");
|
|
@@ -1556,6 +1557,13 @@ function ShopScreen({ background, textColor, accentColor, padding, borderRadius,
|
|
|
1556
1557
|
const { data: userData } = require_use_current_user.useCurrentUser();
|
|
1557
1558
|
const { currentSlug, navigate } = require_AppNavigationContext.useAppNavigation();
|
|
1558
1559
|
const countryCode = config.countryIso ?? userData?.country?.iso ?? "US";
|
|
1560
|
+
require_ScreenHeaderContext.useScreenHeaderBreadcrumbs((0, react.useMemo)(() => /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_src.Breadcrumb, { children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_src.BreadcrumbList, {
|
|
1561
|
+
className: "text-lg",
|
|
1562
|
+
children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_src.BreadcrumbItem, { children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_src.BreadcrumbPage, {
|
|
1563
|
+
className: "font-semibold",
|
|
1564
|
+
children: "Shop"
|
|
1565
|
+
}) })
|
|
1566
|
+
}) }), []));
|
|
1559
1567
|
const productId = currentSlug.split("/")[1] ?? null;
|
|
1560
1568
|
return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
|
|
1561
1569
|
...divProps,
|
|
@@ -1595,4 +1603,4 @@ Object.defineProperty(exports, "shopScreenPropertySchema", {
|
|
|
1595
1603
|
}
|
|
1596
1604
|
});
|
|
1597
1605
|
|
|
1598
|
-
//# sourceMappingURL=ShopScreen-
|
|
1606
|
+
//# sourceMappingURL=ShopScreen-CrbD5rZR.cjs.map
|