@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
@@ -0,0 +1,380 @@
1
+ import { mt as USER_TYPES } from "./FluidProvider-CWYquEIF.mjs";
2
+ import { a as useFluidAuth, r as useSdkClient } from "./use-account-clients-Dsqx0mKw.mjs";
3
+ import { n as useCurrentUser } from "./use-current-user-BMI-LR9t.mjs";
4
+ import { n as useAppNavigation } from "./AppNavigationContext-Du3Qq0yc.mjs";
5
+ import { a as ShareablesApiProvider, i as ShareablesUIProvider, n as ShareablesApp, o as ShareablesCoreProvider, r as getFileMimeType } from "./src-BrwLqPPh.mjs";
6
+ import { n as createShareablesApiAdapter } from "./src-DryOJTBW.mjs";
7
+ import { useCallback, useMemo } from "react";
8
+ import { jsx } from "react/jsx-runtime";
9
+ import { z } from "zod";
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 } = useFluidAuth();
16
+ return useMemo(() => {
17
+ const userType = user?.user_type ?? null;
18
+ return {
19
+ userType,
20
+ isCustomer: userType === USER_TYPES.customer,
21
+ isRep: userType === USER_TYPES.rep,
22
+ isAdmin: userType === USER_TYPES.admin || userType === USER_TYPES.root_admin
23
+ };
24
+ }, [user?.user_type]);
25
+ }
26
+ //#endregion
27
+ //#region ../../file-picker/core/src/schemas/dam.ts
28
+ const damVariantSchema = z.object({
29
+ id: z.string(),
30
+ url: z.string().nullable(),
31
+ file_name: z.string(),
32
+ mime_type: z.string(),
33
+ content: z.any().nullable(),
34
+ created_at: z.string(),
35
+ updated_at: z.string(),
36
+ default: z.boolean(),
37
+ is_original: z.boolean(),
38
+ is_text: z.boolean(),
39
+ media_type: z.string(),
40
+ processing_status: z.string(),
41
+ tags: z.array(z.string())
42
+ });
43
+ const damAssetSchema = z.object({
44
+ id: z.number(),
45
+ canonical_path: z.string(),
46
+ category: z.string(),
47
+ code: z.string(),
48
+ company: z.string(),
49
+ created_at: z.string(),
50
+ default_variant_id: z.string(),
51
+ default_variant_url: z.string().optional(),
52
+ description: z.string(),
53
+ name: z.string(),
54
+ updated_at: z.string(),
55
+ variants: z.array(damVariantSchema).optional()
56
+ });
57
+ const damTreeFolderNodeSchema = z.object({
58
+ asset_code: z.union([z.string(), z.record(z.string(), z.unknown())]).optional(),
59
+ name: z.union([z.string(), z.record(z.string(), z.unknown())]).optional(),
60
+ category: z.union([z.string(), z.record(z.string(), z.unknown())]).optional(),
61
+ variants: z.union([z.array(z.unknown()), z.record(z.string(), z.unknown())]).optional()
62
+ }).passthrough();
63
+ const damTreeSchema = z.record(z.string(), z.union([
64
+ z.lazy(() => damTreeSchema),
65
+ damAssetSchema,
66
+ damTreeFolderNodeSchema
67
+ ]));
68
+ const damQueryResponseSchema = z.object({
69
+ path: z.string(),
70
+ tree: damTreeSchema,
71
+ meta: z.object({ next_cursor: z.string().optional() }).optional()
72
+ });
73
+ z.object({ asset: z.object({
74
+ file: z.any(),
75
+ name: z.string(),
76
+ description: z.string().optional(),
77
+ tags: z.string().optional()
78
+ }) });
79
+ const damAssetCreateResponseSchema = z.object({
80
+ asset: damAssetSchema,
81
+ meta: z.object({
82
+ request_id: z.string(),
83
+ timestamp: z.string()
84
+ })
85
+ });
86
+ z.object({
87
+ placeholder_asset: z.object({
88
+ mime_type: z.string(),
89
+ name: z.string().optional(),
90
+ description: z.string().optional()
91
+ }),
92
+ skip_autotagging: z.boolean().optional()
93
+ });
94
+ z.object({
95
+ asset: z.object({
96
+ file: z.any(),
97
+ name: z.string(),
98
+ description: z.string().optional(),
99
+ tags: z.string().optional()
100
+ }).optional(),
101
+ text_asset: z.object({
102
+ file_name: z.string(),
103
+ mime_type: z.string(),
104
+ text: z.string(),
105
+ name: z.string().optional(),
106
+ description: z.string().optional(),
107
+ tags: z.string().optional()
108
+ }).optional(),
109
+ placeholder_asset: z.object({
110
+ mime_type: z.string(),
111
+ name: z.string().optional(),
112
+ description: z.string().optional()
113
+ }).optional(),
114
+ skip_autotagging: z.boolean().optional()
115
+ });
116
+ const damAssetPathCreateResponseSchema = z.object({
117
+ asset: z.object({
118
+ id: z.number(),
119
+ canonical_path: z.string(),
120
+ name: z.string()
121
+ }),
122
+ meta: z.object({
123
+ request_id: z.string(),
124
+ timestamp: z.string()
125
+ })
126
+ });
127
+ //#endregion
128
+ //#region ../../file-picker/api-client/src/client.ts
129
+ function createFilePickerClient(config) {
130
+ return {
131
+ fetchClient: config.fetchClient,
132
+ uploadStrategy: config.uploadStrategy,
133
+ unsplashAccessKey: config.unsplashAccessKey,
134
+ proxyEndpoint: config.proxyEndpoint ?? "/api/proxy-url"
135
+ };
136
+ }
137
+ //#endregion
138
+ //#region ../../file-picker/api-client/src/api/dam-assets.ts
139
+ /**
140
+ * Create a DAM asset. Text files use FormData upload; non-text files
141
+ * delegate to the provided uploadStrategy (e.g. ImageKit).
142
+ * If no uploadStrategy is provided, all files use FormData upload.
143
+ */
144
+ async function createDamAsset(fetchClient, params, uploadStrategy) {
145
+ const mimeType = getFileMimeType(params.file);
146
+ if (mimeType.startsWith("text/") || mimeType === "application/json" || mimeType === "application/xml" || params.file.name.endsWith(".txt") || params.file.name.endsWith(".json") || params.file.name.endsWith(".xml") || params.file.name.endsWith(".csv")) return createDamAssetViaFormData(fetchClient, params);
147
+ if (uploadStrategy) return uploadStrategy.uploadFile(params);
148
+ return createDamAssetViaFormData(fetchClient, params);
149
+ }
150
+ async function createDamAssetViaFormData(fetchClient, params) {
151
+ const formData = new FormData();
152
+ formData.append("asset[file]", params.file);
153
+ formData.append("asset[name]", params.name);
154
+ if (params.description) formData.append("asset[description]", params.description);
155
+ if (params.tags && params.tags.length > 0) formData.append("asset[tags]", params.tags.join(","));
156
+ const response = await fetchClient.requestWithFormData("/dam/assets", formData, { method: "POST" });
157
+ return damAssetCreateResponseSchema.parse(response);
158
+ }
159
+ async function createDamAssetPathForAssets(fetchClient, { asset_paths, code }) {
160
+ const response = await fetchClient.post(`/dam/assets/${code}/asset_paths`, { asset_paths });
161
+ return damAssetPathCreateResponseSchema.parse(response);
162
+ }
163
+ //#endregion
164
+ //#region ../../file-picker/api-client/src/api/dam-query.ts
165
+ async function queryDamAssets(fetchClient, params) {
166
+ const response = await fetchClient.post("/dam/query", params);
167
+ return damQueryResponseSchema.parse(response);
168
+ }
169
+ async function deleteDamAsset(fetchClient, code) {
170
+ return fetchClient.delete(`/dam/assets/${code}`);
171
+ }
172
+ async function discardDamAsset(fetchClient, code) {
173
+ return fetchClient.patch(`/dam/assets/${code}/discard`);
174
+ }
175
+ //#endregion
176
+ //#region ../../file-picker/api-client/src/api/unsplash.ts
177
+ const unsplashImageSchema = z.object({
178
+ id: z.string(),
179
+ urls: z.object({
180
+ raw: z.string(),
181
+ full: z.string(),
182
+ regular: z.string(),
183
+ small: z.string(),
184
+ thumb: z.string()
185
+ }),
186
+ alt_description: z.string().nullable(),
187
+ description: z.string().nullable(),
188
+ user: z.object({
189
+ name: z.string(),
190
+ username: z.string()
191
+ }),
192
+ width: z.number(),
193
+ height: z.number()
194
+ });
195
+ const unsplashSearchResponseSchema = z.object({
196
+ results: z.array(unsplashImageSchema),
197
+ total: z.number(),
198
+ total_pages: z.number()
199
+ });
200
+ /**
201
+ * Search Unsplash for photos matching a query.
202
+ */
203
+ async function searchUnsplash(query, accessKey, page = 1, perPage = 20) {
204
+ const response = await fetch(`https://api.unsplash.com/search/photos?query=${encodeURIComponent(query)}&page=${page}&per_page=${perPage}&client_id=${accessKey}`);
205
+ if (!response.ok) throw new Error("Failed to search Unsplash");
206
+ return unsplashSearchResponseSchema.parse(await response.json());
207
+ }
208
+ //#endregion
209
+ //#region ../../file-picker/api-client/src/api/url-proxy.ts
210
+ const urlProxyResponseSchema = z.object({
211
+ data: z.string(),
212
+ contentType: z.string(),
213
+ size: z.number()
214
+ });
215
+ /**
216
+ * Proxy a URL fetch through the backend to bypass CORS restrictions.
217
+ * The backend fetches the file and returns it as base64-encoded data.
218
+ *
219
+ * @param url - The URL to fetch
220
+ * @param proxyEndpoint - The proxy endpoint (defaults to "/api/proxy-url")
221
+ */
222
+ async function proxyUrlFetch(url, proxyEndpoint = "/api/proxy-url") {
223
+ const response = await fetch(proxyEndpoint, {
224
+ method: "POST",
225
+ headers: { "Content-Type": "application/json" },
226
+ body: JSON.stringify({ url })
227
+ });
228
+ if (!response.ok) {
229
+ const errorData = await response.json().catch(() => ({ error: "Failed to proxy URL fetch" }));
230
+ throw new Error(errorData.error || `HTTP ${response.status}`);
231
+ }
232
+ const data = await response.json();
233
+ return urlProxyResponseSchema.parse(data);
234
+ }
235
+ //#endregion
236
+ //#region ../../file-picker/api-client/src/create-file-picker-api.ts
237
+ /**
238
+ * Creates a FilePickerApi-compatible adapter backed by the real API client
239
+ * functions. The returned object satisfies the FilePickerApi interface
240
+ * from @fluid-app/file-picker-core via structural typing.
241
+ */
242
+ function createFilePickerApi(client) {
243
+ return {
244
+ createDamAsset: (params) => createDamAsset(client.fetchClient, params, client.uploadStrategy),
245
+ queryDamAssets: (params) => queryDamAssets(client.fetchClient, params),
246
+ searchUnsplash: (query, page, perPage) => {
247
+ if (!client.unsplashAccessKey) throw new Error("Unsplash access key not configured");
248
+ return searchUnsplash(query, client.unsplashAccessKey, page, perPage);
249
+ },
250
+ deleteDamAsset: (code) => deleteDamAsset(client.fetchClient, code),
251
+ discardDamAsset: (code) => discardDamAsset(client.fetchClient, code),
252
+ createDamAssetPathForAssets: (params) => createDamAssetPathForAssets(client.fetchClient, params),
253
+ proxyUrlFetch: (url) => proxyUrlFetch(url, client.proxyEndpoint)
254
+ };
255
+ }
256
+ //#endregion
257
+ //#region src/screens/ShareablesScreen.tsx
258
+ /**
259
+ * Parse the current shareables sub-route from the full slug.
260
+ *
261
+ * System nav slugs are "share/products", "share/media", "share/playlists".
262
+ * Detail pages append an ID: "share/products/123", "share/media/456".
263
+ *
264
+ * "share/products" → screen="products", detailId=null
265
+ * "share/products/123" → screen="products", detailId="123"
266
+ * "share/media/456" → screen="media", detailId="456"
267
+ * "share/playlists" → screen="playlists", detailId=null
268
+ * "share/playlists/789" → screen="playlists", detailId="789"
269
+ * "share/files" → screen="files", detailId=null
270
+ * "share" → screen=null (default to products)
271
+ */
272
+ function parseShareablesRoute(currentSlug) {
273
+ const slugWithoutPrefix = currentSlug.replace(/^share\/?/, "");
274
+ if (!slugWithoutPrefix) return {
275
+ screen: null,
276
+ detailId: null,
277
+ action: null
278
+ };
279
+ const parts = slugWithoutPrefix.split("/");
280
+ return {
281
+ screen: parts[0] || null,
282
+ detailId: parts[1] || null,
283
+ action: parts[2] || null
284
+ };
285
+ }
286
+ function ShareablesScreen({ background, textColor, accentColor, padding, borderRadius, ...divProps }) {
287
+ const domainClient = useSdkClient();
288
+ const { data: userData } = useCurrentUser();
289
+ const { currentSlug, navigate } = useAppNavigation();
290
+ const { isCustomer } = useUserType();
291
+ const { screen, detailId, action } = parseShareablesRoute(currentSlug);
292
+ const handleNavigate = useCallback((subScreen, id) => {
293
+ navigate(id ? `share/${subScreen}/${id}` : `share/${subScreen}`);
294
+ }, [navigate]);
295
+ const handleBack = useCallback(() => {
296
+ if (detailId && screen) navigate(`share/${screen}`);
297
+ else navigate("share/products");
298
+ }, [
299
+ navigate,
300
+ detailId,
301
+ screen
302
+ ]);
303
+ const coreConfig = useMemo(() => ({
304
+ client: domainClient,
305
+ user: userData ? { id: userData.id } : null,
306
+ repContext: true
307
+ }), [domainClient, userData]);
308
+ const shareablesApi = useMemo(() => createShareablesApiAdapter(domainClient, { repContext: true }), [domainClient]);
309
+ const filePickerApi = useMemo(() => createFilePickerApi(createFilePickerClient({ fetchClient: domainClient })), [domainClient]);
310
+ const uiConfig = useMemo(() => ({
311
+ user: userData ? {
312
+ id: userData.id,
313
+ company: userData.company ? { logo_url: userData.company.logo_url } : null
314
+ } : void 0,
315
+ affiliateId: userData?.affiliate_id ?? null,
316
+ basePath: "",
317
+ navigate: (path) => {
318
+ const cleanPath = path.replace(/^\//, "");
319
+ navigate(cleanPath.startsWith("share/") ? cleanPath : `share/${cleanPath}`);
320
+ },
321
+ showToast: (opts) => {
322
+ console.warn(`[Shareables] ${opts.type}: ${opts.title}`);
323
+ },
324
+ filePickerApi,
325
+ onToggleFavorite: async (params) => {
326
+ const affiliateId = userData?.affiliate_id;
327
+ if (!affiliateId) throw new Error("No affiliate ID");
328
+ return domainClient.post(`/user_companies/${affiliateId}/favorites/toggle.json`, {
329
+ favoriteable_id: params.favoriteableId,
330
+ favoriteable_type: params.favoriteableType
331
+ });
332
+ },
333
+ onDeletePlaylist: isCustomer ? void 0 : async (playlistId) => {
334
+ const { playlists: playlistsApi } = await import("./src-DryOJTBW.mjs").then((n) => n.t);
335
+ await playlistsApi.deletePlaylist(domainClient, playlistId);
336
+ },
337
+ readOnly: isCustomer
338
+ }), [
339
+ userData,
340
+ navigate,
341
+ filePickerApi,
342
+ domainClient,
343
+ isCustomer
344
+ ]);
345
+ return /* @__PURE__ */ jsx("div", {
346
+ ...divProps,
347
+ className: `h-full ${divProps.className ?? ""}`,
348
+ children: /* @__PURE__ */ jsx(ShareablesCoreProvider, {
349
+ config: coreConfig,
350
+ children: /* @__PURE__ */ jsx(ShareablesApiProvider, {
351
+ api: shareablesApi,
352
+ children: /* @__PURE__ */ jsx(ShareablesUIProvider, {
353
+ config: uiConfig,
354
+ children: /* @__PURE__ */ jsx(ShareablesApp, {
355
+ screen,
356
+ detailId,
357
+ action,
358
+ companyLogoUrl: userData?.company?.logo_url,
359
+ countryCode: userData?.country?.iso,
360
+ onNavigate: handleNavigate,
361
+ onBack: handleBack
362
+ })
363
+ })
364
+ })
365
+ })
366
+ });
367
+ }
368
+ const shareablesScreenPropertySchema = {
369
+ widgetType: "ShareablesScreen",
370
+ displayName: "Shareables Screen",
371
+ tabsConfig: [{
372
+ id: "styling",
373
+ label: "Styling"
374
+ }],
375
+ fields: []
376
+ };
377
+ //#endregion
378
+ export { shareablesScreenPropertySchema as n, useUserType as r, ShareablesScreen as t };
379
+
380
+ //# sourceMappingURL=ShareablesScreen-Cy7w85IH.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ShareablesScreen-Cy7w85IH.mjs","names":[],"sources":["../src/hooks/use-user-type.ts","../../../file-picker/core/src/schemas/dam.ts","../../../file-picker/api-client/src/client.ts","../../../file-picker/api-client/src/api/dam-assets.ts","../../../file-picker/api-client/src/api/dam-query.ts","../../../file-picker/api-client/src/api/unsplash.ts","../../../file-picker/api-client/src/api/url-proxy.ts","../../../file-picker/api-client/src/create-file-picker-api.ts","../src/screens/ShareablesScreen.tsx"],"sourcesContent":["import { useMemo } from \"react\";\nimport { useFluidAuth } from \"./use-fluid-auth\";\nimport { USER_TYPES, type UserType } from \"../auth/types\";\n\nexport interface UseUserTypeResult {\n userType: UserType | null;\n isCustomer: boolean;\n isRep: boolean;\n isAdmin: boolean;\n}\n\n/**\n * Convenience hook for user-type checks in the portal SDK.\n */\nexport function useUserType(): UseUserTypeResult {\n const { user } = useFluidAuth();\n\n return useMemo(() => {\n const userType = user?.user_type ?? null;\n return {\n userType,\n isCustomer: userType === USER_TYPES.customer,\n isRep: userType === USER_TYPES.rep,\n isAdmin:\n userType === USER_TYPES.admin || userType === USER_TYPES.root_admin,\n };\n }, [user?.user_type]);\n}\n","import { z } from \"zod\";\n\ntype DamVariantApi = {\n id: string;\n url: string | null;\n file_name: string;\n mime_type: string;\n content: any;\n created_at: string;\n updated_at: string;\n default: boolean;\n is_original: boolean;\n is_text: boolean;\n media_type: string;\n processing_status: string;\n tags: string[];\n};\n\nexport const damVariantSchema: z.ZodType<DamVariantApi> = z.object({\n id: z.string(),\n url: z.string().nullable(),\n file_name: z.string(),\n mime_type: z.string(),\n content: z.any().nullable(),\n created_at: z.string(),\n updated_at: z.string(),\n default: z.boolean(),\n is_original: z.boolean(),\n is_text: z.boolean(),\n media_type: z.string(),\n processing_status: z.string(),\n tags: z.array(z.string()),\n});\n\ntype DamAssetApi = {\n id: number;\n canonical_path: string;\n category: string;\n code: string;\n company: string;\n created_at: string;\n default_variant_id: string;\n default_variant_url?: string;\n description: string;\n name: string;\n updated_at: string;\n variants?: DamVariantApi[];\n};\n\nexport const damAssetSchema: z.ZodType<DamAssetApi> = z.object({\n id: z.number(),\n canonical_path: z.string(),\n category: z.string(),\n code: z.string(),\n company: z.string(),\n created_at: z.string(),\n default_variant_id: z.string(),\n default_variant_url: z.string().optional(),\n description: z.string(),\n name: z.string(),\n updated_at: z.string(),\n variants: z.array(damVariantSchema).optional(),\n});\n\ntype DamTreeFolderNode = {\n asset_code?: string | Record<string, unknown>;\n name?: string | Record<string, unknown>;\n category?: string | Record<string, unknown>;\n variants?: unknown[] | Record<string, unknown>;\n [key: string]: unknown;\n};\n\nexport const damTreeFolderNodeSchema: z.ZodType<DamTreeFolderNode> = z\n .object({\n asset_code: z\n .union([z.string(), z.record(z.string(), z.unknown())])\n .optional(),\n name: z.union([z.string(), z.record(z.string(), z.unknown())]).optional(),\n category: z\n .union([z.string(), z.record(z.string(), z.unknown())])\n .optional(),\n variants: z\n .union([z.array(z.unknown()), z.record(z.string(), z.unknown())])\n .optional(),\n })\n .passthrough();\n\nexport const damTreeSchema: z.ZodType<Record<string, any>> = z.record(\n z.string(),\n z.union([\n z.lazy(() => damTreeSchema),\n damAssetSchema,\n damTreeFolderNodeSchema,\n ]),\n);\n\ntype DamQueryResponse = {\n path: string;\n tree: Record<string, any>;\n meta?: { next_cursor?: string };\n};\n\nexport const damQueryResponseSchema: z.ZodType<DamQueryResponse> = z.object({\n path: z.string(),\n tree: damTreeSchema,\n meta: z\n .object({\n next_cursor: z.string().optional(),\n })\n .optional(),\n});\n\ntype DamAssetCreateRequest = {\n asset: {\n file: any;\n name: string;\n description?: string;\n tags?: string;\n };\n};\n\nexport const damAssetCreateRequestSchema: z.ZodType<DamAssetCreateRequest> =\n z.object({\n asset: z.object({\n file: z.any(),\n name: z.string(),\n description: z.string().optional(),\n tags: z.string().optional(),\n }),\n });\n\ntype DamAssetCreateResponse = {\n asset: DamAssetApi;\n meta: { request_id: string; timestamp: string };\n};\n\nexport const damAssetCreateResponseSchema: z.ZodType<DamAssetCreateResponse> =\n z.object({\n asset: damAssetSchema,\n meta: z.object({\n request_id: z.string(),\n timestamp: z.string(),\n }),\n });\n\n// Schema for creating asset with placeholder (for ImageKit direct upload)\ntype DamAssetCreateWithPlaceholderRequest = {\n placeholder_asset: {\n mime_type: string;\n name?: string;\n description?: string;\n };\n skip_autotagging?: boolean;\n};\n\nexport const damAssetCreateWithPlaceholderRequestSchema: z.ZodType<DamAssetCreateWithPlaceholderRequest> =\n z.object({\n placeholder_asset: z.object({\n mime_type: z.string(),\n name: z.string().optional(),\n description: z.string().optional(),\n }),\n skip_autotagging: z.boolean().optional(),\n });\n\n// Schema for creating asset path without file upload (legacy)\ntype DamAssetPathCreateRequest = {\n asset?: {\n file: any;\n name: string;\n description?: string;\n tags?: string;\n };\n text_asset?: {\n file_name: string;\n mime_type: string;\n text: string;\n name?: string;\n description?: string;\n tags?: string;\n };\n placeholder_asset?: {\n mime_type: string;\n name?: string;\n description?: string;\n };\n skip_autotagging?: boolean;\n};\n\nexport const damAssetPathCreateRequestSchema: z.ZodType<DamAssetPathCreateRequest> =\n z.object({\n asset: z\n .object({\n file: z.any(),\n name: z.string(),\n description: z.string().optional(),\n tags: z.string().optional(),\n })\n .optional(),\n text_asset: z\n .object({\n file_name: z.string(),\n mime_type: z.string(),\n text: z.string(),\n name: z.string().optional(),\n description: z.string().optional(),\n tags: z.string().optional(),\n })\n .optional(),\n placeholder_asset: z\n .object({\n mime_type: z.string(),\n name: z.string().optional(),\n description: z.string().optional(),\n })\n .optional(),\n skip_autotagging: z.boolean().optional(),\n });\n\ntype DamAssetPathCreateResponse = {\n asset: { id: number; canonical_path: string; name: string };\n meta: { request_id: string; timestamp: string };\n};\n\nexport const damAssetPathCreateResponseSchema: z.ZodType<DamAssetPathCreateResponse> =\n z.object({\n asset: z.object({\n id: z.number(),\n canonical_path: z.string(),\n name: z.string(),\n }),\n meta: z.object({\n request_id: z.string(),\n timestamp: z.string(),\n }),\n });\n\nexport type { DamVariantApi, DamAssetApi };\nexport type DamTreeApi = z.infer<typeof damTreeSchema>;\nexport type { DamQueryResponse };\nexport type { DamAssetCreateRequest };\nexport type { DamAssetCreateResponse };\nexport type { DamAssetCreateWithPlaceholderRequest };\nexport type { DamAssetPathCreateRequest };\nexport type { DamAssetPathCreateResponse };\n","import 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 type { FetchClientInstance } from \"@fluid-app/api-client-core\";\nimport {\n damAssetCreateResponseSchema,\n damAssetPathCreateResponseSchema,\n getFileMimeType,\n type CreateDamAssetParams,\n type CreateDamAssetPathForAssetsParams,\n type DamAssetCreateResponse,\n type DamAssetCreateWithPlaceholderRequest,\n type DamAssetPathCreateRequest,\n type DamAssetPathCreateResponse,\n} from \"@fluid-app/file-picker-core\";\nimport type { DamUploadStrategy } from \"../client\";\n\nexport type { CreateDamAssetParams };\n\nexport interface CreateDamAssetPathParams {\n name: string;\n description?: string;\n tags?: string[];\n companyId?: number;\n mimeType?: string;\n textContent?: string;\n fileName?: string;\n skipAutotagging?: boolean;\n}\n\n/**\n * Create a DAM asset. Text files use FormData upload; non-text files\n * delegate to the provided uploadStrategy (e.g. ImageKit).\n * If no uploadStrategy is provided, all files use FormData upload.\n */\nexport async function createDamAsset(\n fetchClient: FetchClientInstance,\n params: CreateDamAssetParams,\n uploadStrategy?: DamUploadStrategy,\n): Promise<DamAssetCreateResponse> {\n const mimeType = getFileMimeType(params.file);\n const isTextFile =\n mimeType.startsWith(\"text/\") ||\n mimeType === \"application/json\" ||\n mimeType === \"application/xml\" ||\n params.file.name.endsWith(\".txt\") ||\n params.file.name.endsWith(\".json\") ||\n params.file.name.endsWith(\".xml\") ||\n params.file.name.endsWith(\".csv\");\n\n // For text files, use traditional FormData upload\n if (isTextFile) {\n return createDamAssetViaFormData(fetchClient, params);\n }\n\n // For non-text files, use upload strategy if available\n if (uploadStrategy) {\n return uploadStrategy.uploadFile(params);\n }\n\n // Fallback to FormData upload\n return createDamAssetViaFormData(fetchClient, params);\n}\n\nasync function createDamAssetViaFormData(\n fetchClient: FetchClientInstance,\n params: CreateDamAssetParams,\n): Promise<DamAssetCreateResponse> {\n const formData = new FormData();\n formData.append(\"asset[file]\", params.file);\n formData.append(\"asset[name]\", params.name);\n\n if (params.description) {\n formData.append(\"asset[description]\", params.description);\n }\n\n if (params.tags && params.tags.length > 0) {\n formData.append(\"asset[tags]\", params.tags.join(\",\"));\n }\n\n const response = await fetchClient.requestWithFormData<unknown>(\n \"/dam/assets\",\n formData,\n { method: \"POST\" },\n );\n return damAssetCreateResponseSchema.parse(response);\n}\n\n/**\n * Create DAM asset with placeholder for direct upload strategies\n */\nexport async function createDamAssetWithPlaceholder(\n fetchClient: FetchClientInstance,\n params: CreateDamAssetPathParams,\n): Promise<DamAssetPathCreateResponse> {\n if (!params.mimeType) {\n throw new Error(\"mimeType is required for createDamAssetWithPlaceholder\");\n }\n const requestData: DamAssetCreateWithPlaceholderRequest = {\n placeholder_asset: {\n mime_type: params.mimeType,\n name: params.name,\n description: params.description,\n },\n };\n\n if (params.skipAutotagging !== undefined) {\n requestData.skip_autotagging = params.skipAutotagging;\n }\n\n const response = await fetchClient.post<unknown>(\"/dam/assets\", requestData);\n return damAssetPathCreateResponseSchema.parse(response);\n}\n\n/**\n * Create DAM asset path without file upload (legacy)\n */\nexport async function createDamAssetPath(\n fetchClient: FetchClientInstance,\n params: CreateDamAssetPathParams,\n): Promise<DamAssetPathCreateResponse> {\n const requestData: DamAssetPathCreateRequest = {};\n\n if (params.textContent && params.mimeType && params.fileName) {\n requestData.text_asset = {\n file_name: params.fileName,\n mime_type: params.mimeType,\n text: params.textContent,\n name: params.name,\n description: params.description,\n tags: params.tags?.join(\",\"),\n };\n } else if (params.mimeType) {\n requestData.placeholder_asset = {\n mime_type: params.mimeType,\n name: params.name,\n description: params.description,\n };\n } else {\n requestData.asset = {\n file: null,\n name: params.name,\n description: params.description,\n tags: params.tags?.join(\",\"),\n };\n }\n\n if (params.skipAutotagging !== undefined) {\n requestData.skip_autotagging = params.skipAutotagging;\n }\n\n const response = await fetchClient.post<unknown>(\"/dam/assets\", requestData);\n return damAssetPathCreateResponseSchema.parse(response);\n}\n\nexport type { CreateDamAssetPathForAssetsParams } from \"@fluid-app/file-picker-core\";\n\nexport async function createDamAssetPathForAssets(\n fetchClient: FetchClientInstance,\n { asset_paths, code }: CreateDamAssetPathForAssetsParams,\n): Promise<DamAssetPathCreateResponse> {\n const response = await fetchClient.post<unknown>(\n `/dam/assets/${code}/asset_paths`,\n { asset_paths },\n );\n return damAssetPathCreateResponseSchema.parse(response);\n}\n","import type { FetchClientInstance } from \"@fluid-app/api-client-core\";\nimport {\n damQueryResponseSchema,\n type DamQueryParams,\n type DamQueryResponse,\n} from \"@fluid-app/file-picker-core\";\n\nexport async function queryDamAssets(\n fetchClient: FetchClientInstance,\n params: DamQueryParams,\n): Promise<DamQueryResponse> {\n const response = await fetchClient.post<unknown>(\"/dam/query\", params);\n return damQueryResponseSchema.parse(response);\n}\n\nexport async function deleteDamAsset(\n fetchClient: FetchClientInstance,\n code: string,\n): Promise<unknown> {\n return fetchClient.delete(`/dam/assets/${code}`);\n}\n\nexport async function discardDamAsset(\n fetchClient: FetchClientInstance,\n code: string,\n): Promise<unknown> {\n return fetchClient.patch(`/dam/assets/${code}/discard`);\n}\n","import { z } from \"zod\";\nimport type {\n UnsplashImage,\n UnsplashSearchResponse,\n} from \"@fluid-app/file-picker-core\";\n\nexport type { UnsplashImage, UnsplashSearchResponse };\n\nconst unsplashImageSchema: z.ZodType<UnsplashImage> = z.object({\n id: z.string(),\n urls: z.object({\n raw: z.string(),\n full: z.string(),\n regular: z.string(),\n small: z.string(),\n thumb: z.string(),\n }),\n alt_description: z.string().nullable(),\n description: z.string().nullable(),\n user: z.object({ name: z.string(), username: z.string() }),\n width: z.number(),\n height: z.number(),\n});\n\nconst unsplashSearchResponseSchema: z.ZodType<UnsplashSearchResponse> =\n z.object({\n results: z.array(unsplashImageSchema),\n total: z.number(),\n total_pages: z.number(),\n });\n\n/**\n * Search Unsplash for photos matching a query.\n */\nexport async function searchUnsplash(\n query: string,\n accessKey: string,\n page: number = 1,\n perPage: number = 20,\n): Promise<UnsplashSearchResponse> {\n const response = await fetch(\n `https://api.unsplash.com/search/photos?query=${encodeURIComponent(query)}&page=${page}&per_page=${perPage}&client_id=${accessKey}`,\n );\n\n if (!response.ok) {\n throw new Error(\"Failed to search Unsplash\");\n }\n\n return unsplashSearchResponseSchema.parse(await response.json());\n}\n","import { z } from \"zod\";\nimport type { UrlProxyResponse } from \"@fluid-app/file-picker-core\";\n\nexport type { UrlProxyResponse };\n\nconst urlProxyResponseSchema: z.ZodType<UrlProxyResponse> = z.object({\n data: z.string(),\n contentType: z.string(),\n size: z.number(),\n});\n\n/**\n * Proxy a URL fetch through the backend to bypass CORS restrictions.\n * The backend fetches the file and returns it as base64-encoded data.\n *\n * @param url - The URL to fetch\n * @param proxyEndpoint - The proxy endpoint (defaults to \"/api/proxy-url\")\n */\nexport async function proxyUrlFetch(\n url: string,\n proxyEndpoint: string = \"/api/proxy-url\",\n): Promise<UrlProxyResponse> {\n const response = await fetch(proxyEndpoint, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({ url }),\n });\n\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({\n error: \"Failed to proxy URL fetch\",\n }));\n throw new Error(\n (errorData as { error?: string }).error || `HTTP ${response.status}`,\n );\n }\n\n const data: unknown = await response.json();\n return urlProxyResponseSchema.parse(data);\n}\n","import type { FilePickerApi } from \"@fluid-app/file-picker-core\";\nimport type { FilePickerClient } from \"./client\";\nimport { createDamAsset, createDamAssetPathForAssets } from \"./api/dam-assets\";\nimport {\n queryDamAssets,\n deleteDamAsset,\n discardDamAsset,\n} from \"./api/dam-query\";\nimport { searchUnsplash } from \"./api/unsplash\";\nimport { proxyUrlFetch } from \"./api/url-proxy\";\n\n/**\n * Creates a FilePickerApi-compatible adapter backed by the real API client\n * functions. The returned object satisfies the FilePickerApi interface\n * from @fluid-app/file-picker-core via structural typing.\n */\nexport function createFilePickerApi(client: FilePickerClient): FilePickerApi {\n return {\n createDamAsset: (params: Parameters<typeof createDamAsset>[1]) =>\n createDamAsset(client.fetchClient, params, client.uploadStrategy),\n queryDamAssets: (params: Parameters<typeof queryDamAssets>[1]) =>\n queryDamAssets(client.fetchClient, params),\n searchUnsplash: (query: string, page?: number, perPage?: number) => {\n if (!client.unsplashAccessKey) {\n throw new Error(\"Unsplash access key not configured\");\n }\n return searchUnsplash(query, client.unsplashAccessKey, page, perPage);\n },\n deleteDamAsset: (code: string) => deleteDamAsset(client.fetchClient, code),\n discardDamAsset: (code: string) =>\n discardDamAsset(client.fetchClient, code),\n createDamAssetPathForAssets: (\n params: Parameters<typeof createDamAssetPathForAssets>[1],\n ) => createDamAssetPathForAssets(client.fetchClient, params),\n proxyUrlFetch: (url: string) => proxyUrlFetch(url, client.proxyEndpoint),\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 {\n createFilePickerClient,\n createFilePickerApi,\n} 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 filePickerApi = useMemo(\n () =>\n createFilePickerApi(\n createFilePickerClient({ fetchClient: domainClient }),\n ),\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 filePickerApi,\n onToggleFavorite: async (params: {\n favoriteableId: number;\n favoriteableType: string;\n }) => {\n const affiliateId = (userData as { affiliate_id?: number } | undefined)\n ?.affiliate_id;\n if (!affiliateId) throw new Error(\"No affiliate ID\");\n return domainClient.post<{ is_favorited: boolean }>(\n `/user_companies/${affiliateId}/favorites/toggle.json`,\n {\n favoriteable_id: params.favoriteableId,\n favoriteable_type: params.favoriteableType,\n },\n );\n },\n onDeletePlaylist: isCustomer\n ? undefined\n : async (playlistId: number) => {\n 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, filePickerApi, 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,5 +1,5 @@
1
1
  require("./chunk-9hOWP6kD.cjs");
2
- require("./FluidProvider-roApesp3.cjs");
2
+ require("./FluidProvider-CyzA2g75.cjs");
3
3
  require("./PointsWidget-DG0QQHqL.cjs");
4
4
  require("./error-state-Bpq2CYvz.cjs");
5
5
  require("./ScreenRenderer-DFcTR685.cjs");
@@ -16,29 +16,29 @@ require("./CardWidget-BizXFntv.cjs");
16
16
  require("./purify.es-BYKYXCoc.cjs");
17
17
  require("./src-51z4j_HI.cjs");
18
18
  require("./scroll-arrows-CPqmb9kZ.cjs");
19
- require("./MediaRenderer-CSrxxSt4.cjs");
20
- require("./CarouselWidget-D48n9SsA.cjs");
19
+ require("./MediaRenderer-p7hExkdt.cjs");
20
+ require("./CarouselWidget-CAiMfcdg.cjs");
21
21
  require("./CatchUpWidget-BchUal38.cjs");
22
22
  require("./ChartWidget-RHqQCYx_.cjs");
23
23
  require("./ContainerWidget-CtgF1LXW.cjs");
24
- require("./ImageWidget-DSMtD54I.cjs");
24
+ require("./ImageWidget-DKen6mq7.cjs");
25
25
  require("./LinkWidget-DboreMUy.cjs");
26
- require("./ListWidget-CdE-JgyF.cjs");
26
+ require("./ListWidget-KxIwLQtv.cjs");
27
27
  require("./MySiteWidget-D2h4FMGj.cjs");
28
- require("./NestedWidget-Dt-pcMt3.cjs");
28
+ require("./NestedWidget-G17JLI8g.cjs");
29
29
  require("./QuickShareWidget-Bl3wpW-9.cjs");
30
30
  require("./RecentActivityWidget-jxntxDKT.cjs");
31
31
  require("./SeparatorWidget-CzRNaBc5.cjs");
32
32
  require("./SpacerWidget-DHFiuxkx.cjs");
33
- require("./TableWidget-6Mui98HQ.cjs");
33
+ require("./TableWidget-DiqQBV7-.cjs");
34
34
  require("./ToDoWidget-DZUvDwnJ.cjs");
35
- require("./VideoWidget-D-7VTnG1.cjs");
35
+ require("./VideoWidget-BmVIIfvM.cjs");
36
36
  require("./ScreenHeaderContext-DpVOhFzT.cjs");
37
- const require_ShareablesScreen = require("./ShareablesScreen-HZ0XSOvN.cjs");
37
+ const require_ShareablesScreen = require("./ShareablesScreen-CVT7u2hN.cjs");
38
38
  require("./dist-DRVtlgQ1.cjs");
39
39
  require("./es-DlWO6buB.cjs");
40
40
  require("./dist-Ck9MGRmE.cjs");
41
- require("./src-C3R03o4d.cjs");
41
+ require("./src-Dlsw83js.cjs");
42
42
  require("./dist-BSbac3uh.cjs");
43
43
  exports.ShareablesScreen = require_ShareablesScreen.ShareablesScreen;
44
44
  exports.shareablesScreenPropertySchema = require_ShareablesScreen.shareablesScreenPropertySchema;
@@ -1,4 +1,4 @@
1
- import "./FluidProvider-C8sXuPhI.mjs";
1
+ import "./FluidProvider-CWYquEIF.mjs";
2
2
  import "./PointsWidget-DgLGU995.mjs";
3
3
  import "./error-state-BGEvTYIh.mjs";
4
4
  import "./ScreenRenderer-DM-G72GL.mjs";
@@ -15,31 +15,31 @@ import "./CardWidget-zVxobZDH.mjs";
15
15
  import "./purify.es-CfNPLbup.mjs";
16
16
  import "./src-D6DimP34.mjs";
17
17
  import "./scroll-arrows-C4VRsVrO.mjs";
18
- import "./MediaRenderer-C_maibNT.mjs";
19
- import "./CarouselWidget-dqjnsx9d.mjs";
18
+ import "./MediaRenderer-Cfvg51w8.mjs";
19
+ import "./CarouselWidget-Hre6Pz6P.mjs";
20
20
  import "./CatchUpWidget-CSIXsR82.mjs";
21
21
  import "./ChartWidget-C5S_ezcF.mjs";
22
22
  import "./ContainerWidget-DNS7ynby.mjs";
23
- import "./ImageWidget-C8bQdTkz.mjs";
23
+ import "./ImageWidget-DE9Fp_oH.mjs";
24
24
  import "./LinkWidget-DGHXc-x8.mjs";
25
- import "./ListWidget-6rzwiSHu.mjs";
25
+ import "./ListWidget-CBLZ8CjD.mjs";
26
26
  import "./MySiteWidget-BqtLSExC.mjs";
27
- import "./NestedWidget-VLIlkeTO.mjs";
27
+ import "./NestedWidget-DIwW-wM7.mjs";
28
28
  import "./QuickShareWidget-CajKauDa.mjs";
29
29
  import "./RecentActivityWidget-BZYB21eR.mjs";
30
30
  import "./SeparatorWidget-Lsd6juu7.mjs";
31
31
  import "./SpacerWidget-B3zkEePP.mjs";
32
- import "./TableWidget-CniHh-ug.mjs";
32
+ import "./TableWidget-CC4XnRF2.mjs";
33
33
  import "./ToDoWidget-qyFLHU_o.mjs";
34
- import "./VideoWidget-2f5fuWwH.mjs";
35
- import "./use-account-clients-B278xE7A.mjs";
34
+ import "./VideoWidget-CpUPsOI7.mjs";
35
+ import "./use-account-clients-Dsqx0mKw.mjs";
36
36
  import "./ScreenHeaderContext-CrdfLGKk.mjs";
37
- import "./use-current-user-BlZn_jR2.mjs";
38
- import { n as shareablesScreenPropertySchema, t as ShareablesScreen } from "./ShareablesScreen-B1T6QFc4.mjs";
39
- import "./AppNavigationContext-Du3Qq0yc.mjs";
37
+ import "./use-fluid-api-CaSYWFuj.mjs";
38
+ import "./use-current-user-BMI-LR9t.mjs";
39
+ import { n as shareablesScreenPropertySchema, t as ShareablesScreen } from "./ShareablesScreen-Cy7w85IH.mjs";
40
40
  import "./dist-NMbUD0qE.mjs";
41
41
  import "./es-BCKjXBqj.mjs";
42
42
  import "./dist-oYNtEpKP.mjs";
43
- import "./src-D9jWnRlX.mjs";
43
+ import "./src-BrwLqPPh.mjs";
44
44
  import "./sortable.esm-DSrWP4x9.mjs";
45
45
  export { ShareablesScreen, shareablesScreenPropertySchema };
@@ -1,9 +1,9 @@
1
1
  import { n as __exportAll } from "./chunk-ByhMGyNw.mjs";
2
- import { n as useFluidContext } from "./FluidProvider-C8sXuPhI.mjs";
2
+ import { n as useFluidContext } from "./FluidProvider-CWYquEIF.mjs";
3
3
  import { A as SelectContent, F as RadioGroupItem, I as Input, Kt as Breadcrumb, M as SelectTrigger, N as SelectValue, P as RadioGroup, Xt as BreadcrumbPage, Yt as BreadcrumbList, dn as Button, j as SelectItem, k as Select, qt as BreadcrumbItem, x as Skeleton, xt as Card } from "./src-D6DimP34.mjs";
4
- import { a as useFluidAuth, r as useSdkClient } from "./use-account-clients-B278xE7A.mjs";
4
+ import { a as useFluidAuth, r as useSdkClient } from "./use-account-clients-Dsqx0mKw.mjs";
5
5
  import { n as useScreenHeaderActions, r as useScreenHeaderBreadcrumbs } from "./ScreenHeaderContext-CrdfLGKk.mjs";
6
- import { n as useCurrentUser } from "./use-current-user-BlZn_jR2.mjs";
6
+ import { n as useCurrentUser } from "./use-current-user-BMI-LR9t.mjs";
7
7
  import { n as useAppNavigation } from "./AppNavigationContext-Du3Qq0yc.mjs";
8
8
  import { a as getProduct, c as sendProductToTop, i as duplicateProduct, l as unarchiveProduct, n as deleteProduct, o as listProducts, r as draftProduct, s as listProductsV2, t as archiveProduct } from "./products-StJIeia3.mjs";
9
9
  import React, { createContext, useCallback, useContext, useEffect, useMemo, useRef, useState } from "react";
@@ -1795,4 +1795,4 @@ const shopScreenPropertySchema = {
1795
1795
  //#endregion
1796
1796
  export { ShopScreen_exports as n, shopScreenPropertySchema as r, ShopScreen as t };
1797
1797
 
1798
- //# sourceMappingURL=ShopScreen-BMgp7sPi.mjs.map
1798
+ //# sourceMappingURL=ShopScreen-AGvcqUii.mjs.map