@fluid-app/portal-sdk 0.1.97 → 0.1.99

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (122) hide show
  1. package/dist/{AppDownloadScreen-DpxltF8z.cjs → AppDownloadScreen-BcK2snUL.cjs} +2 -2
  2. package/dist/{AppDownloadScreen-DpxltF8z.cjs.map → AppDownloadScreen-BcK2snUL.cjs.map} +1 -1
  3. package/dist/{AppDownloadScreen-BMOcvPF1.cjs → AppDownloadScreen-CwLZzr-7.cjs} +9 -9
  4. package/dist/{AppDownloadScreen-BrRZShlm.mjs → AppDownloadScreen-rO--O0pk.mjs} +2 -2
  5. package/dist/{AppDownloadScreen-BrRZShlm.mjs.map → AppDownloadScreen-rO--O0pk.mjs.map} +1 -1
  6. package/dist/{CarouselWidget-D48n9SsA.cjs → CarouselWidget-CAiMfcdg.cjs} +2 -2
  7. package/dist/{CarouselWidget-D48n9SsA.cjs.map → CarouselWidget-CAiMfcdg.cjs.map} +1 -1
  8. package/dist/{CarouselWidget-CNf1MR95.cjs → CarouselWidget-DXA_unMC.cjs} +2 -2
  9. package/dist/{CarouselWidget-dqjnsx9d.mjs → CarouselWidget-Hre6Pz6P.mjs} +2 -2
  10. package/dist/{CarouselWidget-dqjnsx9d.mjs.map → CarouselWidget-Hre6Pz6P.mjs.map} +1 -1
  11. package/dist/{ContactsScreen-CZ0gortp.mjs → ContactsScreen-BGwqGlpV.mjs} +2 -2
  12. package/dist/{ContactsScreen-CZ0gortp.mjs.map → ContactsScreen-BGwqGlpV.mjs.map} +1 -1
  13. package/dist/{ContactsScreen-1S3tfYu2.cjs → ContactsScreen-CkSeaPyz.cjs} +2 -2
  14. package/dist/{ContactsScreen-1S3tfYu2.cjs.map → ContactsScreen-CkSeaPyz.cjs.map} +1 -1
  15. package/dist/{ContactsScreen-CAI3msL5.cjs → ContactsScreen-D4WQ59ib.cjs} +9 -9
  16. package/dist/{FluidProvider-C8sXuPhI.mjs → FluidProvider-CWYquEIF.mjs} +13 -13
  17. package/dist/{FluidProvider-C8sXuPhI.mjs.map → FluidProvider-CWYquEIF.mjs.map} +1 -1
  18. package/dist/{FluidProvider-roApesp3.cjs → FluidProvider-CyzA2g75.cjs} +13 -13
  19. package/dist/{FluidProvider-roApesp3.cjs.map → FluidProvider-CyzA2g75.cjs.map} +1 -1
  20. package/dist/{ImageWidget-C8bQdTkz.mjs → ImageWidget-DE9Fp_oH.mjs} +2 -2
  21. package/dist/{ImageWidget-C8bQdTkz.mjs.map → ImageWidget-DE9Fp_oH.mjs.map} +1 -1
  22. package/dist/{ImageWidget-DSMtD54I.cjs → ImageWidget-DKen6mq7.cjs} +2 -2
  23. package/dist/{ImageWidget-DSMtD54I.cjs.map → ImageWidget-DKen6mq7.cjs.map} +1 -1
  24. package/dist/{ListWidget-BDHYpRri.cjs → ListWidget-BVMMpxC0.cjs} +2 -2
  25. package/dist/{ListWidget-6rzwiSHu.mjs → ListWidget-CBLZ8CjD.mjs} +2 -2
  26. package/dist/{ListWidget-6rzwiSHu.mjs.map → ListWidget-CBLZ8CjD.mjs.map} +1 -1
  27. package/dist/{ListWidget-CdE-JgyF.cjs → ListWidget-KxIwLQtv.cjs} +2 -2
  28. package/dist/{ListWidget-CdE-JgyF.cjs.map → ListWidget-KxIwLQtv.cjs.map} +1 -1
  29. package/dist/{MediaRenderer-C_maibNT.mjs → MediaRenderer-Cfvg51w8.mjs} +68 -43
  30. package/dist/MediaRenderer-Cfvg51w8.mjs.map +1 -0
  31. package/dist/{MediaRenderer-CSrxxSt4.cjs → MediaRenderer-p7hExkdt.cjs} +68 -43
  32. package/dist/MediaRenderer-p7hExkdt.cjs.map +1 -0
  33. package/dist/{MessagingScreen-CJOd1XEc.cjs → MessagingScreen-5jw8KSLQ.cjs} +9 -9
  34. package/dist/{MessagingScreen-D-rz6Q91.cjs → MessagingScreen-B9CCsimy.cjs} +3 -3
  35. package/dist/{MessagingScreen-D-rz6Q91.cjs.map → MessagingScreen-B9CCsimy.cjs.map} +1 -1
  36. package/dist/{MessagingScreen-Cq5frHOu.mjs → MessagingScreen-BGr41874.mjs} +10 -9
  37. package/dist/{MessagingScreen-CkM93okb.mjs → MessagingScreen-DTXSZ-Oa.mjs} +3 -3
  38. package/dist/{MessagingScreen-CkM93okb.mjs.map → MessagingScreen-DTXSZ-Oa.mjs.map} +1 -1
  39. package/dist/{MySiteScreen-DvU2pZz6.cjs → MySiteScreen-2IzxVfpO.cjs} +9 -9
  40. package/dist/{MySiteScreen-DDn-LF3O.cjs → MySiteScreen-BSFb-n7n.cjs} +2 -2
  41. package/dist/{MySiteScreen-DDn-LF3O.cjs.map → MySiteScreen-BSFb-n7n.cjs.map} +1 -1
  42. package/dist/{MySiteScreen-CPbfU_IZ.mjs → MySiteScreen-Bvyx63pT.mjs} +2 -2
  43. package/dist/{MySiteScreen-CPbfU_IZ.mjs.map → MySiteScreen-Bvyx63pT.mjs.map} +1 -1
  44. package/dist/{NestedWidget-VLIlkeTO.mjs → NestedWidget-DIwW-wM7.mjs} +2 -2
  45. package/dist/{NestedWidget-VLIlkeTO.mjs.map → NestedWidget-DIwW-wM7.mjs.map} +1 -1
  46. package/dist/{NestedWidget-BvzfHeEB.cjs → NestedWidget-DYWk_L7c.cjs} +2 -2
  47. package/dist/{NestedWidget-Dt-pcMt3.cjs → NestedWidget-G17JLI8g.cjs} +2 -2
  48. package/dist/{NestedWidget-Dt-pcMt3.cjs.map → NestedWidget-G17JLI8g.cjs.map} +1 -1
  49. package/dist/{OrdersScreen-CFoaFECU.cjs → OrdersScreen-Bf4o3Kty.cjs} +3 -3
  50. package/dist/{OrdersScreen-CFoaFECU.cjs.map → OrdersScreen-Bf4o3Kty.cjs.map} +1 -1
  51. package/dist/{OrdersScreen-BaK2X85Y.cjs → OrdersScreen-DCzYEgsP.cjs} +9 -9
  52. package/dist/{OrdersScreen-kv-WHzAT.mjs → OrdersScreen-Djdeji9g.mjs} +3 -3
  53. package/dist/{OrdersScreen-kv-WHzAT.mjs.map → OrdersScreen-Djdeji9g.mjs.map} +1 -1
  54. package/dist/{ProductsScreen-DxM9yGUe.mjs → ProductsScreen-6J79mnIB.mjs} +4 -4
  55. package/dist/{ProductsScreen-DxM9yGUe.mjs.map → ProductsScreen-6J79mnIB.mjs.map} +1 -1
  56. package/dist/{ProductsScreen-D-H2I5f1.mjs → ProductsScreen-DCPVyEyQ.mjs} +13 -13
  57. package/dist/{ProductsScreen-De2dqFa0.cjs → ProductsScreen-DZnKtPBp.cjs} +10 -10
  58. package/dist/{ProductsScreen-9nEL6Y3b.cjs → ProductsScreen-PJ95OcSX.cjs} +4 -4
  59. package/dist/{ProductsScreen-9nEL6Y3b.cjs.map → ProductsScreen-PJ95OcSX.cjs.map} +1 -1
  60. package/dist/{ProfileScreen-HhhjGnaj.cjs → ProfileScreen-B46jd4Ic.cjs} +9 -9
  61. package/dist/{ProfileScreen-BVNBgqev.mjs → ProfileScreen-CUsGRCB7.mjs} +3 -3
  62. package/dist/{ProfileScreen-BVNBgqev.mjs.map → ProfileScreen-CUsGRCB7.mjs.map} +1 -1
  63. package/dist/{ProfileScreen-C9x02V7u.cjs → ProfileScreen-DtmReqa8.cjs} +3 -3
  64. package/dist/{ProfileScreen-C9x02V7u.cjs.map → ProfileScreen-DtmReqa8.cjs.map} +1 -1
  65. package/dist/ShareablesScreen-CVT7u2hN.cjs +398 -0
  66. package/dist/ShareablesScreen-CVT7u2hN.cjs.map +1 -0
  67. package/dist/ShareablesScreen-Cy7w85IH.mjs +380 -0
  68. package/dist/ShareablesScreen-Cy7w85IH.mjs.map +1 -0
  69. package/dist/{ShareablesScreen-DWLYxLHA.cjs → ShareablesScreen-Dk5EQGMa.cjs} +10 -10
  70. package/dist/{ShareablesScreen-CEZqZez3.mjs → ShareablesScreen-jAj9hmif.mjs} +13 -13
  71. package/dist/{ShopScreen-BMgp7sPi.mjs → ShopScreen-AGvcqUii.mjs} +4 -4
  72. package/dist/{ShopScreen-BMgp7sPi.mjs.map → ShopScreen-AGvcqUii.mjs.map} +1 -1
  73. package/dist/{ShopScreen-B7Rpew_K.cjs → ShopScreen-DgBjP_8D.cjs} +4 -4
  74. package/dist/{ShopScreen-B7Rpew_K.cjs.map → ShopScreen-DgBjP_8D.cjs.map} +1 -1
  75. package/dist/{ShopScreen-CxjJQ-Oh.cjs → ShopScreen-wYtLEGXo.cjs} +9 -9
  76. package/dist/{SubscriptionsScreen-D0c9J3ug.cjs → SubscriptionsScreen-BqOb2kYR.cjs} +9 -9
  77. package/dist/{SubscriptionsScreen-DBBeoyvD.cjs → SubscriptionsScreen-BrLlvFJn.cjs} +3 -3
  78. package/dist/{SubscriptionsScreen-DBBeoyvD.cjs.map → SubscriptionsScreen-BrLlvFJn.cjs.map} +1 -1
  79. package/dist/{SubscriptionsScreen-CRANhpmr.mjs → SubscriptionsScreen-C5YWtYfE.mjs} +3 -3
  80. package/dist/{SubscriptionsScreen-CRANhpmr.mjs.map → SubscriptionsScreen-C5YWtYfE.mjs.map} +1 -1
  81. package/dist/{TableWidget-CniHh-ug.mjs → TableWidget-CC4XnRF2.mjs} +2 -2
  82. package/dist/{TableWidget-CniHh-ug.mjs.map → TableWidget-CC4XnRF2.mjs.map} +1 -1
  83. package/dist/{TableWidget-6Mui98HQ.cjs → TableWidget-DiqQBV7-.cjs} +2 -2
  84. package/dist/{TableWidget-6Mui98HQ.cjs.map → TableWidget-DiqQBV7-.cjs.map} +1 -1
  85. package/dist/{TableWidget-pZhHgb5f.cjs → TableWidget-DmwVP_Lm.cjs} +2 -2
  86. package/dist/{VideoWidget-D-7VTnG1.cjs → VideoWidget-BmVIIfvM.cjs} +2 -2
  87. package/dist/{VideoWidget-D-7VTnG1.cjs.map → VideoWidget-BmVIIfvM.cjs.map} +1 -1
  88. package/dist/{VideoWidget-2f5fuWwH.mjs → VideoWidget-CpUPsOI7.mjs} +2 -2
  89. package/dist/{VideoWidget-2f5fuWwH.mjs.map → VideoWidget-CpUPsOI7.mjs.map} +1 -1
  90. package/dist/index.cjs +42 -42
  91. package/dist/index.d.cts.map +1 -1
  92. package/dist/index.d.mts.map +1 -1
  93. package/dist/index.mjs +42 -42
  94. package/dist/{src-D9jWnRlX.mjs → src-BrwLqPPh.mjs} +90 -269
  95. package/dist/src-BrwLqPPh.mjs.map +1 -0
  96. package/dist/{src-C3R03o4d.cjs → src-Dlsw83js.cjs} +95 -268
  97. package/dist/src-Dlsw83js.cjs.map +1 -0
  98. package/dist/{use-account-clients-BUJ8gkPI.cjs → use-account-clients-CkDfPpCR.cjs} +2 -2
  99. package/dist/{use-account-clients-BUJ8gkPI.cjs.map → use-account-clients-CkDfPpCR.cjs.map} +1 -1
  100. package/dist/{use-account-clients-B278xE7A.mjs → use-account-clients-Dsqx0mKw.mjs} +2 -2
  101. package/dist/{use-account-clients-B278xE7A.mjs.map → use-account-clients-Dsqx0mKw.mjs.map} +1 -1
  102. package/dist/{use-current-user-BlZn_jR2.mjs → use-current-user-BMI-LR9t.mjs} +3 -3
  103. package/dist/{use-current-user-BlZn_jR2.mjs.map → use-current-user-BMI-LR9t.mjs.map} +1 -1
  104. package/dist/{use-current-user-D84vQEB5.cjs → use-current-user-LLJ1GtNB.cjs} +3 -3
  105. package/dist/{use-current-user-D84vQEB5.cjs.map → use-current-user-LLJ1GtNB.cjs.map} +1 -1
  106. package/dist/{use-customer-account-DSR6VNmL.cjs → use-customer-account-DZW_YY9d.cjs} +3 -3
  107. package/dist/{use-customer-account-DSR6VNmL.cjs.map → use-customer-account-DZW_YY9d.cjs.map} +1 -1
  108. package/dist/{use-customer-account-DqzsUJ02.mjs → use-customer-account-DzOD3vLz.mjs} +3 -3
  109. package/dist/{use-customer-account-DqzsUJ02.mjs.map → use-customer-account-DzOD3vLz.mjs.map} +1 -1
  110. package/dist/{use-fluid-api-CVYfAcJM.mjs → use-fluid-api-CaSYWFuj.mjs} +2 -2
  111. package/dist/{use-fluid-api-CVYfAcJM.mjs.map → use-fluid-api-CaSYWFuj.mjs.map} +1 -1
  112. package/dist/{use-fluid-api-5vFjbTFA.cjs → use-fluid-api-Kw0AKvCs.cjs} +2 -2
  113. package/dist/{use-fluid-api-5vFjbTFA.cjs.map → use-fluid-api-Kw0AKvCs.cjs.map} +1 -1
  114. package/package.json +14 -14
  115. package/dist/MediaRenderer-CSrxxSt4.cjs.map +0 -1
  116. package/dist/MediaRenderer-C_maibNT.mjs.map +0 -1
  117. package/dist/ShareablesScreen-B1T6QFc4.mjs +0 -159
  118. package/dist/ShareablesScreen-B1T6QFc4.mjs.map +0 -1
  119. package/dist/ShareablesScreen-HZ0XSOvN.cjs +0 -177
  120. package/dist/ShareablesScreen-HZ0XSOvN.cjs.map +0 -1
  121. package/dist/src-C3R03o4d.cjs.map +0 -1
  122. package/dist/src-D9jWnRlX.mjs.map +0 -1
@@ -1,159 +0,0 @@
1
- import { mt as USER_TYPES } from "./FluidProvider-C8sXuPhI.mjs";
2
- import { a as useFluidAuth, r as useSdkClient } from "./use-account-clients-B278xE7A.mjs";
3
- import { n as useCurrentUser } from "./use-current-user-BlZn_jR2.mjs";
4
- import { n as useAppNavigation } from "./AppNavigationContext-Du3Qq0yc.mjs";
5
- import { a as ShareablesCoreProvider, i as ShareablesApiProvider, n as ShareablesApp, r as ShareablesUIProvider } from "./src-D9jWnRlX.mjs";
6
- import { n as createShareablesApiAdapter } from "./src-DryOJTBW.mjs";
7
- import { useCallback, useMemo } from "react";
8
- import { jsx } from "react/jsx-runtime";
9
- //#region src/hooks/use-user-type.ts
10
- /**
11
- * Convenience hook for user-type checks in the portal SDK.
12
- */
13
- function useUserType() {
14
- const { user } = useFluidAuth();
15
- return useMemo(() => {
16
- const userType = user?.user_type ?? null;
17
- return {
18
- userType,
19
- isCustomer: userType === USER_TYPES.customer,
20
- isRep: userType === USER_TYPES.rep,
21
- isAdmin: userType === USER_TYPES.admin || userType === USER_TYPES.root_admin
22
- };
23
- }, [user?.user_type]);
24
- }
25
- //#endregion
26
- //#region ../../file-picker/api-client/src/client.ts
27
- function createFilePickerClient(config) {
28
- return {
29
- fetchClient: config.fetchClient,
30
- uploadStrategy: config.uploadStrategy,
31
- unsplashAccessKey: config.unsplashAccessKey,
32
- proxyEndpoint: config.proxyEndpoint ?? "/api/proxy-url"
33
- };
34
- }
35
- //#endregion
36
- //#region src/screens/ShareablesScreen.tsx
37
- /**
38
- * Parse the current shareables sub-route from the full slug.
39
- *
40
- * System nav slugs are "share/products", "share/media", "share/playlists".
41
- * Detail pages append an ID: "share/products/123", "share/media/456".
42
- *
43
- * "share/products" → screen="products", detailId=null
44
- * "share/products/123" → screen="products", detailId="123"
45
- * "share/media/456" → screen="media", detailId="456"
46
- * "share/playlists" → screen="playlists", detailId=null
47
- * "share/playlists/789" → screen="playlists", detailId="789"
48
- * "share/files" → screen="files", detailId=null
49
- * "share" → screen=null (default to products)
50
- */
51
- function parseShareablesRoute(currentSlug) {
52
- const slugWithoutPrefix = currentSlug.replace(/^share\/?/, "");
53
- if (!slugWithoutPrefix) return {
54
- screen: null,
55
- detailId: null,
56
- action: null
57
- };
58
- const parts = slugWithoutPrefix.split("/");
59
- return {
60
- screen: parts[0] || null,
61
- detailId: parts[1] || null,
62
- action: parts[2] || null
63
- };
64
- }
65
- function ShareablesScreen({ background, textColor, accentColor, padding, borderRadius, ...divProps }) {
66
- const domainClient = useSdkClient();
67
- const { data: userData } = useCurrentUser();
68
- const { currentSlug, navigate } = useAppNavigation();
69
- const { isCustomer } = useUserType();
70
- const { screen, detailId, action } = parseShareablesRoute(currentSlug);
71
- const handleNavigate = useCallback((subScreen, id) => {
72
- navigate(id ? `share/${subScreen}/${id}` : `share/${subScreen}`);
73
- }, [navigate]);
74
- const handleBack = useCallback(() => {
75
- if (detailId && screen) navigate(`share/${screen}`);
76
- else navigate("share/products");
77
- }, [
78
- navigate,
79
- detailId,
80
- screen
81
- ]);
82
- const coreConfig = useMemo(() => ({
83
- client: domainClient,
84
- user: userData ? { id: userData.id } : null,
85
- repContext: true
86
- }), [domainClient, userData]);
87
- const shareablesApi = useMemo(() => createShareablesApiAdapter(domainClient, { repContext: true }), [domainClient]);
88
- const filePickerClient = useMemo(() => createFilePickerClient({ fetchClient: domainClient }), [domainClient]);
89
- const uiConfig = useMemo(() => ({
90
- user: userData ? {
91
- id: userData.id,
92
- company: userData.company ? { logo_url: userData.company.logo_url } : null
93
- } : void 0,
94
- affiliateId: userData?.affiliate_id ?? null,
95
- basePath: "",
96
- navigate: (path) => {
97
- const cleanPath = path.replace(/^\//, "");
98
- navigate(cleanPath.startsWith("share/") ? cleanPath : `share/${cleanPath}`);
99
- },
100
- showToast: (opts) => {
101
- console.warn(`[Shareables] ${opts.type}: ${opts.title}`);
102
- },
103
- filePickerClient,
104
- onToggleFavorite: async (params) => {
105
- const affiliateId = userData?.affiliate_id;
106
- if (!affiliateId) throw new Error("No affiliate ID");
107
- return domainClient.post(`/user_companies/${affiliateId}/favorites/toggle.json`, {
108
- favoriteable_id: params.favoriteableId,
109
- favoriteable_type: params.favoriteableType
110
- });
111
- },
112
- onDeletePlaylist: isCustomer ? void 0 : async (playlistId) => {
113
- const { playlists: playlistsApi } = await import("./src-DryOJTBW.mjs").then((n) => n.t);
114
- await playlistsApi.deletePlaylist(domainClient, playlistId);
115
- },
116
- readOnly: isCustomer
117
- }), [
118
- userData,
119
- navigate,
120
- filePickerClient,
121
- domainClient,
122
- isCustomer
123
- ]);
124
- return /* @__PURE__ */ jsx("div", {
125
- ...divProps,
126
- className: `h-full ${divProps.className ?? ""}`,
127
- children: /* @__PURE__ */ jsx(ShareablesCoreProvider, {
128
- config: coreConfig,
129
- children: /* @__PURE__ */ jsx(ShareablesApiProvider, {
130
- api: shareablesApi,
131
- children: /* @__PURE__ */ jsx(ShareablesUIProvider, {
132
- config: uiConfig,
133
- children: /* @__PURE__ */ jsx(ShareablesApp, {
134
- screen,
135
- detailId,
136
- action,
137
- companyLogoUrl: userData?.company?.logo_url,
138
- countryCode: userData?.country?.iso,
139
- onNavigate: handleNavigate,
140
- onBack: handleBack
141
- })
142
- })
143
- })
144
- })
145
- });
146
- }
147
- const shareablesScreenPropertySchema = {
148
- widgetType: "ShareablesScreen",
149
- displayName: "Shareables Screen",
150
- tabsConfig: [{
151
- id: "styling",
152
- label: "Styling"
153
- }],
154
- fields: []
155
- };
156
- //#endregion
157
- export { shareablesScreenPropertySchema as n, useUserType as r, ShareablesScreen as t };
158
-
159
- //# sourceMappingURL=ShareablesScreen-B1T6QFc4.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ShareablesScreen-B1T6QFc4.mjs","names":[],"sources":["../src/hooks/use-user-type.ts","../../../file-picker/api-client/src/client.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 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 {\n ShareablesCoreProvider,\n ShareablesApiProvider,\n type ShareablesApi,\n} from \"@fluid-app/shareables-core\";\nimport { ShareablesUIProvider, ShareablesApp } from \"@fluid-app/shareables-ui\";\nimport { createShareablesApiAdapter } from \"@fluid-app/shareables-api-client\";\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\";\nimport { useUserType } from \"../hooks/use-user-type\";\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 const { isCustomer } = useUserType();\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 shareablesApi = useMemo<ShareablesApi>(\n () => createShareablesApiAdapter(domainClient, { repContext: true }),\n [domainClient],\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: isCustomer\n ? undefined\n : async (playlistId: number) => {\n const { playlists: playlistsApi } =\n await import(\"@fluid-app/shareables-api-client\");\n await playlistsApi.deletePlaylist(domainClient, playlistId);\n },\n readOnly: isCustomer,\n }),\n [userData, navigate, filePickerClient, domainClient, isCustomer],\n );\n\n return (\n <div {...divProps} className={`h-full ${divProps.className ?? \"\"}`}>\n <ShareablesCoreProvider config={coreConfig}>\n <ShareablesApiProvider api={shareablesApi}>\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 </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,177 +0,0 @@
1
- require("./chunk-9hOWP6kD.cjs");
2
- const require_FluidProvider = require("./FluidProvider-roApesp3.cjs");
3
- const require_use_account_clients = require("./use-account-clients-BUJ8gkPI.cjs");
4
- const require_use_current_user = require("./use-current-user-D84vQEB5.cjs");
5
- const require_AppNavigationContext = require("./AppNavigationContext-Agp0UkCQ.cjs");
6
- const require_src = require("./src-C3R03o4d.cjs");
7
- const require_src$1 = require("./src-CMByt6YP.cjs");
8
- let react = require("react");
9
- let react_jsx_runtime = require("react/jsx-runtime");
10
- //#region src/hooks/use-user-type.ts
11
- /**
12
- * Convenience hook for user-type checks in the portal SDK.
13
- */
14
- function useUserType() {
15
- const { user } = require_use_account_clients.useFluidAuth();
16
- return (0, react.useMemo)(() => {
17
- const userType = user?.user_type ?? null;
18
- return {
19
- userType,
20
- isCustomer: userType === require_FluidProvider.USER_TYPES.customer,
21
- isRep: userType === require_FluidProvider.USER_TYPES.rep,
22
- isAdmin: userType === require_FluidProvider.USER_TYPES.admin || userType === require_FluidProvider.USER_TYPES.root_admin
23
- };
24
- }, [user?.user_type]);
25
- }
26
- //#endregion
27
- //#region ../../file-picker/api-client/src/client.ts
28
- function createFilePickerClient(config) {
29
- return {
30
- fetchClient: config.fetchClient,
31
- uploadStrategy: config.uploadStrategy,
32
- unsplashAccessKey: config.unsplashAccessKey,
33
- proxyEndpoint: config.proxyEndpoint ?? "/api/proxy-url"
34
- };
35
- }
36
- //#endregion
37
- //#region src/screens/ShareablesScreen.tsx
38
- /**
39
- * Parse the current shareables sub-route from the full slug.
40
- *
41
- * System nav slugs are "share/products", "share/media", "share/playlists".
42
- * Detail pages append an ID: "share/products/123", "share/media/456".
43
- *
44
- * "share/products" → screen="products", detailId=null
45
- * "share/products/123" → screen="products", detailId="123"
46
- * "share/media/456" → screen="media", detailId="456"
47
- * "share/playlists" → screen="playlists", detailId=null
48
- * "share/playlists/789" → screen="playlists", detailId="789"
49
- * "share/files" → screen="files", detailId=null
50
- * "share" → screen=null (default to products)
51
- */
52
- function parseShareablesRoute(currentSlug) {
53
- const slugWithoutPrefix = currentSlug.replace(/^share\/?/, "");
54
- if (!slugWithoutPrefix) return {
55
- screen: null,
56
- detailId: null,
57
- action: null
58
- };
59
- const parts = slugWithoutPrefix.split("/");
60
- return {
61
- screen: parts[0] || null,
62
- detailId: parts[1] || null,
63
- action: parts[2] || null
64
- };
65
- }
66
- function ShareablesScreen({ background, textColor, accentColor, padding, borderRadius, ...divProps }) {
67
- const domainClient = require_use_account_clients.useSdkClient();
68
- const { data: userData } = require_use_current_user.useCurrentUser();
69
- const { currentSlug, navigate } = require_AppNavigationContext.useAppNavigation();
70
- const { isCustomer } = useUserType();
71
- const { screen, detailId, action } = parseShareablesRoute(currentSlug);
72
- const handleNavigate = (0, react.useCallback)((subScreen, id) => {
73
- navigate(id ? `share/${subScreen}/${id}` : `share/${subScreen}`);
74
- }, [navigate]);
75
- const handleBack = (0, react.useCallback)(() => {
76
- if (detailId && screen) navigate(`share/${screen}`);
77
- else navigate("share/products");
78
- }, [
79
- navigate,
80
- detailId,
81
- screen
82
- ]);
83
- const coreConfig = (0, react.useMemo)(() => ({
84
- client: domainClient,
85
- user: userData ? { id: userData.id } : null,
86
- repContext: true
87
- }), [domainClient, userData]);
88
- const shareablesApi = (0, react.useMemo)(() => require_src$1.createShareablesApiAdapter(domainClient, { repContext: true }), [domainClient]);
89
- const filePickerClient = (0, react.useMemo)(() => createFilePickerClient({ fetchClient: domainClient }), [domainClient]);
90
- const uiConfig = (0, react.useMemo)(() => ({
91
- user: userData ? {
92
- id: userData.id,
93
- company: userData.company ? { logo_url: userData.company.logo_url } : null
94
- } : void 0,
95
- affiliateId: userData?.affiliate_id ?? null,
96
- basePath: "",
97
- navigate: (path) => {
98
- const cleanPath = path.replace(/^\//, "");
99
- navigate(cleanPath.startsWith("share/") ? cleanPath : `share/${cleanPath}`);
100
- },
101
- showToast: (opts) => {
102
- console.warn(`[Shareables] ${opts.type}: ${opts.title}`);
103
- },
104
- filePickerClient,
105
- onToggleFavorite: async (params) => {
106
- const affiliateId = userData?.affiliate_id;
107
- if (!affiliateId) throw new Error("No affiliate ID");
108
- return domainClient.post(`/user_companies/${affiliateId}/favorites/toggle.json`, {
109
- favoriteable_id: params.favoriteableId,
110
- favoriteable_type: params.favoriteableType
111
- });
112
- },
113
- onDeletePlaylist: isCustomer ? void 0 : async (playlistId) => {
114
- const { playlists: playlistsApi } = await Promise.resolve().then(() => require("./src-CMByt6YP.cjs")).then((n) => n.src_exports);
115
- await playlistsApi.deletePlaylist(domainClient, playlistId);
116
- },
117
- readOnly: isCustomer
118
- }), [
119
- userData,
120
- navigate,
121
- filePickerClient,
122
- domainClient,
123
- isCustomer
124
- ]);
125
- return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
126
- ...divProps,
127
- className: `h-full ${divProps.className ?? ""}`,
128
- children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_src.ShareablesCoreProvider, {
129
- config: coreConfig,
130
- children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_src.ShareablesApiProvider, {
131
- api: shareablesApi,
132
- children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_src.ShareablesUIProvider, {
133
- config: uiConfig,
134
- children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_src.ShareablesApp, {
135
- screen,
136
- detailId,
137
- action,
138
- companyLogoUrl: userData?.company?.logo_url,
139
- countryCode: userData?.country?.iso,
140
- onNavigate: handleNavigate,
141
- onBack: handleBack
142
- })
143
- })
144
- })
145
- })
146
- });
147
- }
148
- const shareablesScreenPropertySchema = {
149
- widgetType: "ShareablesScreen",
150
- displayName: "Shareables Screen",
151
- tabsConfig: [{
152
- id: "styling",
153
- label: "Styling"
154
- }],
155
- fields: []
156
- };
157
- //#endregion
158
- Object.defineProperty(exports, "ShareablesScreen", {
159
- enumerable: true,
160
- get: function() {
161
- return ShareablesScreen;
162
- }
163
- });
164
- Object.defineProperty(exports, "shareablesScreenPropertySchema", {
165
- enumerable: true,
166
- get: function() {
167
- return shareablesScreenPropertySchema;
168
- }
169
- });
170
- Object.defineProperty(exports, "useUserType", {
171
- enumerable: true,
172
- get: function() {
173
- return useUserType;
174
- }
175
- });
176
-
177
- //# sourceMappingURL=ShareablesScreen-HZ0XSOvN.cjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ShareablesScreen-HZ0XSOvN.cjs","names":["useFluidAuth","USER_TYPES","useSdkClient","useCurrentUser","useAppNavigation","createShareablesApiAdapter","ShareablesCoreProvider","ShareablesApiProvider","ShareablesUIProvider","ShareablesApp"],"sources":["../src/hooks/use-user-type.ts","../../../file-picker/api-client/src/client.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 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 {\n ShareablesCoreProvider,\n ShareablesApiProvider,\n type ShareablesApi,\n} from \"@fluid-app/shareables-core\";\nimport { ShareablesUIProvider, ShareablesApp } from \"@fluid-app/shareables-ui\";\nimport { createShareablesApiAdapter } from \"@fluid-app/shareables-api-client\";\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\";\nimport { useUserType } from \"../hooks/use-user-type\";\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 const { isCustomer } = useUserType();\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 shareablesApi = useMemo<ShareablesApi>(\n () => createShareablesApiAdapter(domainClient, { repContext: true }),\n [domainClient],\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: isCustomer\n ? undefined\n : async (playlistId: number) => {\n const { playlists: playlistsApi } =\n await import(\"@fluid-app/shareables-api-client\");\n await playlistsApi.deletePlaylist(domainClient, playlistId);\n },\n readOnly: isCustomer,\n }),\n [userData, navigate, filePickerClient, domainClient, isCustomer],\n );\n\n return (\n <div {...divProps} className={`h-full ${divProps.className ?? \"\"}`}>\n <ShareablesCoreProvider config={coreConfig}>\n <ShareablesApiProvider api={shareablesApi}>\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 </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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"}