@fluid-app/rep-core 0.1.0 → 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/chunk-2SIG55BD.cjs +131 -0
- package/dist/chunk-2SIG55BD.cjs.map +1 -0
- package/dist/chunk-2SPTFZRC.js +72 -0
- package/dist/chunk-2SPTFZRC.js.map +1 -0
- package/dist/chunk-3I5Y3PEO.js +23 -0
- package/dist/chunk-3I5Y3PEO.js.map +1 -0
- package/dist/chunk-46PUWB7C.cjs +69 -0
- package/dist/chunk-46PUWB7C.cjs.map +1 -0
- package/dist/chunk-4WFDFEHC.js +134 -0
- package/dist/chunk-4WFDFEHC.js.map +1 -0
- package/dist/chunk-5NYM4UTW.cjs +58 -0
- package/dist/chunk-5NYM4UTW.cjs.map +1 -0
- package/dist/chunk-6YI7VW55.cjs +652 -0
- package/dist/chunk-6YI7VW55.cjs.map +1 -0
- package/dist/chunk-ESYAYVNK.cjs +136 -0
- package/dist/chunk-ESYAYVNK.cjs.map +1 -0
- package/dist/{chunk-6QLUUNJL.cjs → chunk-GDY76JA6.cjs} +2 -2
- package/dist/chunk-GDY76JA6.cjs.map +1 -0
- package/dist/chunk-HGVSPZEL.cjs +119 -0
- package/dist/chunk-HGVSPZEL.cjs.map +1 -0
- package/dist/chunk-HIDJYVKJ.js +54 -0
- package/dist/chunk-HIDJYVKJ.js.map +1 -0
- package/dist/chunk-HUR3MSO4.js +25 -0
- package/dist/chunk-HUR3MSO4.js.map +1 -0
- package/dist/chunk-LVLNO2YQ.cjs +28 -0
- package/dist/chunk-LVLNO2YQ.cjs.map +1 -0
- package/dist/chunk-N2K6W7FX.cjs +169 -0
- package/dist/chunk-N2K6W7FX.cjs.map +1 -0
- package/dist/chunk-NAMNXRI5.js +129 -0
- package/dist/chunk-NAMNXRI5.js.map +1 -0
- package/dist/chunk-OWU7MFJ2.cjs +15 -0
- package/dist/chunk-OWU7MFJ2.cjs.map +1 -0
- package/dist/chunk-PVTQWD4I.js +166 -0
- package/dist/chunk-PVTQWD4I.js.map +1 -0
- package/dist/chunk-S663BA25.cjs +29 -0
- package/dist/chunk-S663BA25.cjs.map +1 -0
- package/dist/chunk-SJQPHJL4.cjs +26 -0
- package/dist/chunk-SJQPHJL4.cjs.map +1 -0
- package/dist/chunk-UQASMDVE.js +27 -0
- package/dist/chunk-UQASMDVE.js.map +1 -0
- package/dist/chunk-V7D3QUE6.cjs +42 -0
- package/dist/chunk-V7D3QUE6.cjs.map +1 -0
- package/dist/chunk-VO4TIGDA.js +607 -0
- package/dist/chunk-VO4TIGDA.js.map +1 -0
- package/dist/chunk-VRF7QEID.js +67 -0
- package/dist/chunk-VRF7QEID.js.map +1 -0
- package/dist/chunk-WASVMCZB.js +13 -0
- package/dist/chunk-WASVMCZB.js.map +1 -0
- package/dist/chunk-WYOHFNNW.js +117 -0
- package/dist/chunk-WYOHFNNW.js.map +1 -0
- package/dist/chunk-XCNBVV4T.js +38 -0
- package/dist/chunk-XCNBVV4T.js.map +1 -0
- package/dist/{chunk-EWR5EIBP.js → chunk-YKF5ZFF5.js} +2 -2
- package/dist/chunk-YKF5ZFF5.js.map +1 -0
- package/dist/chunk-YXJMBVXO.cjs +76 -0
- package/dist/chunk-YXJMBVXO.cjs.map +1 -0
- package/dist/data-sources/DataAwareWidget.cjs +59 -0
- package/dist/data-sources/DataAwareWidget.cjs.map +1 -0
- package/dist/data-sources/DataAwareWidget.d.cts +30 -0
- package/dist/data-sources/DataAwareWidget.d.ts +30 -0
- package/dist/data-sources/DataAwareWidget.js +57 -0
- package/dist/data-sources/DataAwareWidget.js.map +1 -0
- package/dist/data-sources/ErrorState.cjs +12 -0
- package/dist/data-sources/ErrorState.cjs.map +1 -0
- package/dist/data-sources/ErrorState.d.cts +5 -0
- package/dist/data-sources/ErrorState.d.ts +5 -0
- package/dist/data-sources/ErrorState.js +3 -0
- package/dist/data-sources/ErrorState.js.map +1 -0
- package/dist/data-sources/context.cjs +10 -20
- package/dist/data-sources/context.cjs.map +1 -1
- package/dist/data-sources/context.d.cts +2 -2
- package/dist/data-sources/context.d.ts +2 -2
- package/dist/data-sources/context.js +1 -21
- package/dist/data-sources/context.js.map +1 -1
- package/dist/data-sources/fetchers/api.cjs +12 -0
- package/dist/data-sources/fetchers/api.cjs.map +1 -0
- package/dist/data-sources/fetchers/api.d.cts +8 -0
- package/dist/data-sources/fetchers/api.d.ts +8 -0
- package/dist/data-sources/fetchers/api.js +3 -0
- package/dist/data-sources/fetchers/api.js.map +1 -0
- package/dist/data-sources/fetchers/custom.cjs +12 -0
- package/dist/data-sources/fetchers/custom.cjs.map +1 -0
- package/dist/data-sources/fetchers/custom.d.cts +15 -0
- package/dist/data-sources/fetchers/custom.d.ts +15 -0
- package/dist/data-sources/fetchers/custom.js +3 -0
- package/dist/data-sources/fetchers/custom.js.map +1 -0
- package/dist/data-sources/fetchers/static.cjs +16 -0
- package/dist/data-sources/fetchers/static.cjs.map +1 -0
- package/dist/data-sources/fetchers/static.d.cts +38 -0
- package/dist/data-sources/fetchers/static.d.ts +38 -0
- package/dist/data-sources/fetchers/static.js +3 -0
- package/dist/data-sources/fetchers/static.js.map +1 -0
- package/dist/data-sources/registry-context.cjs +26 -0
- package/dist/data-sources/registry-context.cjs.map +1 -0
- package/dist/data-sources/registry-context.d.cts +41 -0
- package/dist/data-sources/registry-context.d.ts +41 -0
- package/dist/data-sources/registry-context.js +9 -0
- package/dist/data-sources/registry-context.js.map +1 -0
- package/dist/data-sources/registry.cjs +20 -0
- package/dist/data-sources/registry.cjs.map +1 -0
- package/dist/data-sources/registry.d.cts +17 -0
- package/dist/data-sources/registry.d.ts +17 -0
- package/dist/data-sources/registry.js +7 -0
- package/dist/data-sources/registry.js.map +1 -0
- package/dist/data-sources/transformers.cjs +12 -0
- package/dist/data-sources/transformers.cjs.map +1 -0
- package/dist/data-sources/transformers.d.cts +23 -0
- package/dist/data-sources/transformers.d.ts +23 -0
- package/dist/data-sources/transformers.js +3 -0
- package/dist/data-sources/transformers.js.map +1 -0
- package/dist/data-sources/types.d.cts +37 -2
- package/dist/data-sources/types.d.ts +37 -2
- package/dist/data-sources/use-widget-data.cjs +19 -0
- package/dist/data-sources/use-widget-data.cjs.map +1 -0
- package/dist/data-sources/use-widget-data.d.cts +16 -0
- package/dist/data-sources/use-widget-data.d.ts +16 -0
- package/dist/data-sources/use-widget-data.js +10 -0
- package/dist/data-sources/use-widget-data.js.map +1 -0
- package/dist/registries/index.cjs +8 -15
- package/dist/registries/index.cjs.map +1 -1
- package/dist/registries/index.d.cts +20 -7
- package/dist/registries/index.d.ts +20 -7
- package/dist/registries/index.js +8 -15
- package/dist/registries/index.js.map +1 -1
- package/dist/shareable-item-DkgWpwoU.d.cts +21 -0
- package/dist/shareable-item-DkgWpwoU.d.ts +21 -0
- package/dist/shell/AppShellLayout.cjs +14 -0
- package/dist/shell/AppShellLayout.cjs.map +1 -0
- package/dist/shell/AppShellLayout.d.cts +26 -0
- package/dist/shell/AppShellLayout.d.ts +26 -0
- package/dist/shell/AppShellLayout.js +5 -0
- package/dist/shell/AppShellLayout.js.map +1 -0
- package/dist/shell/ThemeModeContext.cjs +20 -0
- package/dist/shell/ThemeModeContext.cjs.map +1 -0
- package/dist/shell/ThemeModeContext.d.cts +27 -0
- package/dist/shell/ThemeModeContext.d.ts +27 -0
- package/dist/shell/ThemeModeContext.js +3 -0
- package/dist/shell/ThemeModeContext.js.map +1 -0
- package/dist/shell/index.cjs +135 -0
- package/dist/shell/index.cjs.map +1 -0
- package/dist/shell/index.d.cts +8 -0
- package/dist/shell/index.d.ts +8 -0
- package/dist/shell/index.js +6 -0
- package/dist/shell/index.js.map +1 -0
- package/dist/shell/sidebar.cjs +105 -0
- package/dist/shell/sidebar.cjs.map +1 -0
- package/dist/shell/sidebar.d.cts +71 -0
- package/dist/shell/sidebar.d.ts +71 -0
- package/dist/shell/sidebar.js +4 -0
- package/dist/shell/sidebar.js.map +1 -0
- package/dist/shell/use-mobile.cjs +20 -0
- package/dist/shell/use-mobile.cjs.map +1 -0
- package/dist/shell/use-mobile.d.cts +5 -0
- package/dist/shell/use-mobile.d.ts +5 -0
- package/dist/shell/use-mobile.js +3 -0
- package/dist/shell/use-mobile.js.map +1 -0
- package/dist/theme/index.cjs +599 -970
- package/dist/theme/index.cjs.map +1 -1
- package/dist/theme/index.d.cts +106 -2655
- package/dist/theme/index.d.ts +106 -2655
- package/dist/theme/index.js +570 -917
- package/dist/theme/index.js.map +1 -1
- package/dist/types/index.cjs +17 -17
- package/dist/types/index.d.cts +27 -4
- package/dist/types/index.d.ts +27 -4
- package/dist/types/index.js +1 -1
- package/dist/types-R1kV_DKF.d.cts +80 -0
- package/dist/types-R1kV_DKF.d.ts +80 -0
- package/dist/{shareable-item-DPmNZkE1.d.cts → widget-schema-36uGUTWL.d.cts} +5 -21
- package/dist/{shareable-item-DPmNZkE1.d.ts → widget-schema-DxdlJD8E.d.ts} +5 -21
- package/dist/widget-utils/index.cjs +3 -3
- package/dist/widget-utils/index.d.cts +3 -1
- package/dist/widget-utils/index.d.ts +3 -1
- package/dist/widget-utils/index.js +1 -1
- package/package.json +84 -13
- package/dist/chunk-6QLUUNJL.cjs.map +0 -1
- package/dist/chunk-EWR5EIBP.js.map +0 -1
- package/dist/theme-DrMUYZTO.d.cts +0 -22
- package/dist/theme-DrMUYZTO.d.ts +0 -22
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var react = require('react');
|
|
4
|
+
|
|
5
|
+
// src/data-sources/fetchers/static.ts
|
|
6
|
+
var STATIC_ENDPOINTS = {
|
|
7
|
+
collections: "/company/v1/products",
|
|
8
|
+
categories: "/company/v1/products"
|
|
9
|
+
};
|
|
10
|
+
var STATIC_QUERY_PARAMS = {
|
|
11
|
+
collections: "collection_id",
|
|
12
|
+
categories: "category_id"
|
|
13
|
+
};
|
|
14
|
+
function extractProducts(json) {
|
|
15
|
+
if (Array.isArray(json.products)) {
|
|
16
|
+
return json.products;
|
|
17
|
+
}
|
|
18
|
+
if (Array.isArray(json.data)) {
|
|
19
|
+
return json.data;
|
|
20
|
+
}
|
|
21
|
+
if (Array.isArray(json)) {
|
|
22
|
+
return json;
|
|
23
|
+
}
|
|
24
|
+
console.warn(
|
|
25
|
+
"[extractProducts] Could not find products array. Available keys:",
|
|
26
|
+
Object.keys(json)
|
|
27
|
+
);
|
|
28
|
+
return [];
|
|
29
|
+
}
|
|
30
|
+
async function staticFetcher(source, context) {
|
|
31
|
+
const { staticType, selectedId } = source;
|
|
32
|
+
if (staticType === "tags") {
|
|
33
|
+
throw new Error(
|
|
34
|
+
"Tags data source is not yet supported. Please select Collections or Categories instead."
|
|
35
|
+
);
|
|
36
|
+
}
|
|
37
|
+
const endpoint = STATIC_ENDPOINTS[staticType];
|
|
38
|
+
const queryParam = STATIC_QUERY_PARAMS[staticType];
|
|
39
|
+
if (!endpoint || !queryParam) {
|
|
40
|
+
throw new Error(
|
|
41
|
+
`Invalid data source configuration: "${staticType}" is not a supported static source type.`
|
|
42
|
+
);
|
|
43
|
+
}
|
|
44
|
+
const url = new URL(
|
|
45
|
+
`${context.baseUrl ?? ""}${endpoint}`,
|
|
46
|
+
context.baseUrl ? void 0 : window.location.origin
|
|
47
|
+
);
|
|
48
|
+
url.searchParams.set(queryParam, String(selectedId));
|
|
49
|
+
try {
|
|
50
|
+
const response = await fetch(url.toString(), {
|
|
51
|
+
method: "GET",
|
|
52
|
+
headers: {
|
|
53
|
+
...context.getApiHeaders?.(),
|
|
54
|
+
"Content-Type": "application/json"
|
|
55
|
+
},
|
|
56
|
+
signal: context.signal
|
|
57
|
+
});
|
|
58
|
+
if (!response.ok) {
|
|
59
|
+
throw new Error(
|
|
60
|
+
`Failed to fetch products for ${staticType} ${selectedId}: ${response.status} ${response.statusText}`
|
|
61
|
+
);
|
|
62
|
+
}
|
|
63
|
+
const json = await response.json();
|
|
64
|
+
return extractProducts(json);
|
|
65
|
+
} catch (error) {
|
|
66
|
+
if (error instanceof Error && error.name === "AbortError") {
|
|
67
|
+
return [];
|
|
68
|
+
}
|
|
69
|
+
console.error(
|
|
70
|
+
`[staticFetcher] Error fetching ${staticType} ${selectedId}:`,
|
|
71
|
+
error
|
|
72
|
+
);
|
|
73
|
+
throw error;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
var LIST_ENDPOINTS = {
|
|
77
|
+
collections: {
|
|
78
|
+
endpoint: "/company/v1/collections",
|
|
79
|
+
resultKey: "collections"
|
|
80
|
+
},
|
|
81
|
+
categories: { endpoint: "/company/v1/categories", resultKey: "categories" },
|
|
82
|
+
tags: { endpoint: "/company/v1/tags", resultKey: "tags" }
|
|
83
|
+
};
|
|
84
|
+
function useStaticSourceItems(staticType, context, params) {
|
|
85
|
+
const [items, setItems] = react.useState([]);
|
|
86
|
+
const [isLoading, setIsLoading] = react.useState(false);
|
|
87
|
+
const [error, setError] = react.useState(null);
|
|
88
|
+
const { baseUrl, getApiHeaders } = context;
|
|
89
|
+
const search = params?.search;
|
|
90
|
+
const getApiHeadersRef = react.useRef(getApiHeaders);
|
|
91
|
+
getApiHeadersRef.current = getApiHeaders;
|
|
92
|
+
react.useEffect(() => {
|
|
93
|
+
if (!staticType) {
|
|
94
|
+
setItems([]);
|
|
95
|
+
setError(null);
|
|
96
|
+
return;
|
|
97
|
+
}
|
|
98
|
+
let isCancelled = false;
|
|
99
|
+
const abortController = new AbortController();
|
|
100
|
+
setIsLoading(true);
|
|
101
|
+
setError(null);
|
|
102
|
+
const config = LIST_ENDPOINTS[staticType];
|
|
103
|
+
const url = new URL(
|
|
104
|
+
`${baseUrl ?? ""}${config.endpoint}`,
|
|
105
|
+
baseUrl ? void 0 : window.location.origin
|
|
106
|
+
);
|
|
107
|
+
if (search) {
|
|
108
|
+
url.searchParams.set("search", search);
|
|
109
|
+
}
|
|
110
|
+
fetch(url.toString(), {
|
|
111
|
+
method: "GET",
|
|
112
|
+
headers: {
|
|
113
|
+
...getApiHeadersRef.current?.(),
|
|
114
|
+
"Content-Type": "application/json"
|
|
115
|
+
},
|
|
116
|
+
signal: abortController.signal
|
|
117
|
+
}).then(async (response) => {
|
|
118
|
+
if (!response.ok) {
|
|
119
|
+
throw new Error(`Failed to fetch ${staticType}: ${response.status}`);
|
|
120
|
+
}
|
|
121
|
+
const json = await response.json();
|
|
122
|
+
const responseItems = json[config.resultKey];
|
|
123
|
+
if (!Array.isArray(responseItems)) {
|
|
124
|
+
console.warn(
|
|
125
|
+
`[useStaticSourceItems] Expected array at "${config.resultKey}" but got:`,
|
|
126
|
+
typeof responseItems
|
|
127
|
+
);
|
|
128
|
+
if (!isCancelled) {
|
|
129
|
+
setItems([]);
|
|
130
|
+
}
|
|
131
|
+
return;
|
|
132
|
+
}
|
|
133
|
+
if (!isCancelled) {
|
|
134
|
+
setItems(
|
|
135
|
+
responseItems.map((item) => ({
|
|
136
|
+
id: item.id,
|
|
137
|
+
title: item.title,
|
|
138
|
+
imageUrl: item.image_url
|
|
139
|
+
}))
|
|
140
|
+
);
|
|
141
|
+
}
|
|
142
|
+
}).catch((err) => {
|
|
143
|
+
if (err instanceof Error && err.name === "AbortError") {
|
|
144
|
+
return;
|
|
145
|
+
}
|
|
146
|
+
console.error(
|
|
147
|
+
`[useStaticSourceItems] Failed to fetch ${staticType}:`,
|
|
148
|
+
err
|
|
149
|
+
);
|
|
150
|
+
if (isCancelled) return;
|
|
151
|
+
setError("An unexpected error occurred. Please try again.");
|
|
152
|
+
setItems([]);
|
|
153
|
+
}).finally(() => {
|
|
154
|
+
if (!isCancelled) {
|
|
155
|
+
setIsLoading(false);
|
|
156
|
+
}
|
|
157
|
+
});
|
|
158
|
+
return () => {
|
|
159
|
+
isCancelled = true;
|
|
160
|
+
abortController.abort();
|
|
161
|
+
};
|
|
162
|
+
}, [staticType, search, baseUrl]);
|
|
163
|
+
return { items, isLoading, error };
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
exports.staticFetcher = staticFetcher;
|
|
167
|
+
exports.useStaticSourceItems = useStaticSourceItems;
|
|
168
|
+
//# sourceMappingURL=chunk-N2K6W7FX.cjs.map
|
|
169
|
+
//# sourceMappingURL=chunk-N2K6W7FX.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/data-sources/fetchers/static.ts"],"names":["useState","useRef","useEffect"],"mappings":"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","file":"chunk-N2K6W7FX.cjs","sourcesContent":["import { useState, useEffect, useRef } from \"react\";\nimport type {\n StaticDataSource,\n DataSourceContext,\n StaticSourceType,\n StaticItem,\n} from \"../types\";\n\n/**\n * Endpoint patterns for fetching products by static source type.\n * Tags require backend API support (not yet available).\n */\nconst STATIC_ENDPOINTS: Record<\"collections\" | \"categories\", string> = {\n collections: \"/company/v1/products\",\n categories: \"/company/v1/products\",\n};\n\n/**\n * Query parameter names for each static source type.\n */\nconst STATIC_QUERY_PARAMS: Record<\"collections\" | \"categories\", string> = {\n collections: \"collection_id\",\n categories: \"category_id\",\n};\n\n/**\n * Extract products array from API response.\n * The /company/v1/products endpoint returns { products: [...], meta: {...} }\n */\nfunction extractProducts(json: Record<string, unknown>): unknown[] {\n if (Array.isArray(json.products)) {\n return json.products;\n }\n if (Array.isArray(json.data)) {\n return json.data;\n }\n if (Array.isArray(json)) {\n return json;\n }\n console.warn(\n \"[extractProducts] Could not find products array. Available keys:\",\n Object.keys(json),\n );\n return [];\n}\n\n/**\n * Static data source fetcher.\n *\n * Fetches products filtered by collection or category ID.\n * Tags are not yet supported (requires backend API changes).\n *\n * @param source - The static data source configuration\n * @param context - The data source context with baseUrl and headers\n * @returns Array of products matching the filter criteria\n */\nexport async function staticFetcher(\n source: StaticDataSource,\n context: DataSourceContext,\n): Promise<unknown[]> {\n const { staticType, selectedId } = source;\n\n // Tags require backend API support - not yet implemented\n if (staticType === \"tags\") {\n throw new Error(\n \"Tags data source is not yet supported. Please select Collections or Categories instead.\",\n );\n }\n\n const endpoint = STATIC_ENDPOINTS[staticType];\n const queryParam = STATIC_QUERY_PARAMS[staticType];\n\n if (!endpoint || !queryParam) {\n throw new Error(\n `Invalid data source configuration: \"${staticType}\" is not a supported static source type.`,\n );\n }\n\n const url = new URL(\n `${context.baseUrl ?? \"\"}${endpoint}`,\n context.baseUrl ? undefined : window.location.origin,\n );\n url.searchParams.set(queryParam, String(selectedId));\n\n try {\n const response = await fetch(url.toString(), {\n method: \"GET\",\n headers: {\n ...context.getApiHeaders?.(),\n \"Content-Type\": \"application/json\",\n },\n signal: context.signal,\n });\n\n if (!response.ok) {\n throw new Error(\n `Failed to fetch products for ${staticType} ${selectedId}: ${response.status} ${response.statusText}`,\n );\n }\n\n const json = await response.json();\n return extractProducts(json);\n } catch (error) {\n if (error instanceof Error && error.name === \"AbortError\") {\n // Request was cancelled, don't log as error\n return [];\n }\n console.error(\n `[staticFetcher] Error fetching ${staticType} ${selectedId}:`,\n error,\n );\n throw error;\n }\n}\n\n/**\n * Endpoints for listing static source items (collections, categories, tags).\n */\nconst LIST_ENDPOINTS: Record<\n StaticSourceType,\n { endpoint: string; resultKey: string }\n> = {\n collections: {\n endpoint: \"/company/v1/collections\",\n resultKey: \"collections\",\n },\n categories: { endpoint: \"/company/v1/categories\", resultKey: \"categories\" },\n tags: { endpoint: \"/company/v1/tags\", resultKey: \"tags\" },\n};\n\n/**\n * Result type for useStaticSourceItems hook.\n */\nexport interface UseStaticSourceItemsResult {\n /** The fetched items */\n items: StaticItem[];\n /** True while items are being fetched */\n isLoading: boolean;\n /** Error message if fetch failed */\n error: string | null;\n}\n\n/**\n * React hook for fetching static source items (collections, categories).\n * Handles loading state, error state, abort on cleanup, and search filtering.\n *\n * @param staticType - The type of static source to fetch, or null to reset\n * @param context - Context with baseUrl and getApiHeaders\n * @param params - Optional search parameters\n * @returns Object with items, isLoading, and error state\n */\nexport function useStaticSourceItems(\n staticType: StaticSourceType | null,\n context: Pick<DataSourceContext, \"baseUrl\" | \"getApiHeaders\">,\n params?: { search?: string },\n): UseStaticSourceItemsResult {\n const [items, setItems] = useState<StaticItem[]>([]);\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n // Extract stable references from context to avoid dependency issues\n const { baseUrl, getApiHeaders } = context;\n const search = params?.search;\n\n // Use ref to avoid infinite re-renders when getApiHeaders changes reference\n const getApiHeadersRef = useRef(getApiHeaders);\n getApiHeadersRef.current = getApiHeaders;\n\n useEffect(() => {\n if (!staticType) {\n setItems([]);\n setError(null);\n return;\n }\n\n let isCancelled = false;\n const abortController = new AbortController();\n setIsLoading(true);\n setError(null);\n\n const config = LIST_ENDPOINTS[staticType];\n const url = new URL(\n `${baseUrl ?? \"\"}${config.endpoint}`,\n baseUrl ? undefined : window.location.origin,\n );\n\n if (search) {\n url.searchParams.set(\"search\", search);\n }\n\n fetch(url.toString(), {\n method: \"GET\",\n headers: {\n ...getApiHeadersRef.current?.(),\n \"Content-Type\": \"application/json\",\n },\n signal: abortController.signal,\n })\n .then(async (response) => {\n if (!response.ok) {\n throw new Error(`Failed to fetch ${staticType}: ${response.status}`);\n }\n const json = await response.json();\n const responseItems = json[config.resultKey] as Array<{\n id: string | number;\n title: string;\n image_url?: string;\n }>;\n\n if (!Array.isArray(responseItems)) {\n console.warn(\n `[useStaticSourceItems] Expected array at \"${config.resultKey}\" but got:`,\n typeof responseItems,\n );\n if (!isCancelled) {\n setItems([]);\n }\n return;\n }\n\n if (!isCancelled) {\n setItems(\n responseItems.map((item) => ({\n id: item.id,\n title: item.title,\n imageUrl: item.image_url,\n })),\n );\n }\n })\n .catch((err) => {\n if (err instanceof Error && err.name === \"AbortError\") {\n return;\n }\n\n // Log for debugging\n console.error(\n `[useStaticSourceItems] Failed to fetch ${staticType}:`,\n err,\n );\n\n if (isCancelled) return;\n\n setError(\"An unexpected error occurred. Please try again.\");\n setItems([]);\n })\n .finally(() => {\n if (!isCancelled) {\n setIsLoading(false);\n }\n });\n\n return () => {\n isCancelled = true;\n abortController.abort();\n };\n }, [staticType, search, baseUrl]);\n\n return { items, isLoading, error };\n}\n"]}
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
// src/data-sources/transformers.ts
|
|
2
|
+
function extractImageUrl(d) {
|
|
3
|
+
if (d.image_url) return d.image_url;
|
|
4
|
+
if (d.imageUrl) return d.imageUrl;
|
|
5
|
+
if (d.thumbnail_url) return d.thumbnail_url;
|
|
6
|
+
if (d.src) return d.src;
|
|
7
|
+
const images = d.images;
|
|
8
|
+
if (images && images.length > 0) {
|
|
9
|
+
const firstImage = images[0];
|
|
10
|
+
if (firstImage?.image_url) return firstImage.image_url;
|
|
11
|
+
if (firstImage?.url) return firstImage.url;
|
|
12
|
+
}
|
|
13
|
+
const libraryItems = d.library_items;
|
|
14
|
+
if (libraryItems && libraryItems.length > 0) {
|
|
15
|
+
const firstItem = libraryItems[0];
|
|
16
|
+
const relateable = firstItem?.relateable;
|
|
17
|
+
if (relateable?.image_url) return relateable.image_url;
|
|
18
|
+
if (relateable?.imageUrl) return relateable.imageUrl;
|
|
19
|
+
if (relateable?.thumbnail_url) return relateable.thumbnail_url;
|
|
20
|
+
}
|
|
21
|
+
return "";
|
|
22
|
+
}
|
|
23
|
+
function extractDescription(d) {
|
|
24
|
+
const desc = d.description ?? d.stripped ?? d.stripped_description ?? d.body ?? "";
|
|
25
|
+
if (typeof desc === "object" && desc !== null && "body" in desc) {
|
|
26
|
+
return desc.body ?? "";
|
|
27
|
+
}
|
|
28
|
+
return desc;
|
|
29
|
+
}
|
|
30
|
+
function extractCustomWidgetConfig(d, source) {
|
|
31
|
+
if (source === void 0 || source.type !== "custom") return {};
|
|
32
|
+
const selectedItem = source.selectedItems.find(
|
|
33
|
+
(s) => String(s.id) === String(d.id)
|
|
34
|
+
);
|
|
35
|
+
return selectedItem?.widgetConfig ?? {};
|
|
36
|
+
}
|
|
37
|
+
var toImagePropsFromShareable = (data) => {
|
|
38
|
+
const item = Array.isArray(data) ? data[0] : data;
|
|
39
|
+
if (!item || typeof item !== "object") {
|
|
40
|
+
return { src: "", alt: "Image", objectFit: "cover" };
|
|
41
|
+
}
|
|
42
|
+
const d = item;
|
|
43
|
+
return {
|
|
44
|
+
src: extractImageUrl(d),
|
|
45
|
+
alt: d.title ?? d.name ?? d.alt ?? "Image",
|
|
46
|
+
objectFit: "cover"
|
|
47
|
+
};
|
|
48
|
+
};
|
|
49
|
+
var toVideoPropsFromShareable = (data) => {
|
|
50
|
+
const item = Array.isArray(data) ? data[0] : data;
|
|
51
|
+
if (!item || typeof item !== "object") {
|
|
52
|
+
return { src: "", poster: "", caption: "" };
|
|
53
|
+
}
|
|
54
|
+
const d = item;
|
|
55
|
+
return {
|
|
56
|
+
src: (d.video_url ?? d.videoUrl ?? d.src) || "",
|
|
57
|
+
poster: extractImageUrl(d),
|
|
58
|
+
caption: d.title ?? d.name ?? d.caption ?? ""
|
|
59
|
+
};
|
|
60
|
+
};
|
|
61
|
+
var toShareableProps = (data, source) => {
|
|
62
|
+
if (!Array.isArray(data)) return [];
|
|
63
|
+
return data.map((item) => {
|
|
64
|
+
const d = item;
|
|
65
|
+
const widgetConfig = extractCustomWidgetConfig(d, source);
|
|
66
|
+
return {
|
|
67
|
+
id: d.id,
|
|
68
|
+
title: d.title ?? d.name ?? "",
|
|
69
|
+
description: extractDescription(d),
|
|
70
|
+
imageUrl: extractImageUrl(d),
|
|
71
|
+
videoUrl: (d.video_url ?? d.videoUrl) || null,
|
|
72
|
+
shareableType: d.type ?? d.relateable_type ?? d.shareableType ?? "",
|
|
73
|
+
kind: d.kind ?? "image",
|
|
74
|
+
status: d.status ?? "active",
|
|
75
|
+
price: d.display_price ?? d.price ?? null,
|
|
76
|
+
wholesalePrice: d.display_wholesale_price ?? d.wholesale_price ?? null,
|
|
77
|
+
subscriptionPrice: d.subscription_price ?? null,
|
|
78
|
+
outOfStock: d.out_of_stock ?? false,
|
|
79
|
+
lowInStock: d.low_in_stock ?? false,
|
|
80
|
+
...d,
|
|
81
|
+
...widgetConfig
|
|
82
|
+
};
|
|
83
|
+
});
|
|
84
|
+
};
|
|
85
|
+
var toCarouselSlidesFromShareables = (data, source) => {
|
|
86
|
+
if (!Array.isArray(data)) return [];
|
|
87
|
+
return data.map((item, index) => {
|
|
88
|
+
const d = item;
|
|
89
|
+
const widgetConfig = extractCustomWidgetConfig(d, source);
|
|
90
|
+
const imageUrl = extractImageUrl(d);
|
|
91
|
+
const isVideo = d.kind === "video" || d.videoUrl || d.video_url;
|
|
92
|
+
const title = d.title ?? d.name ?? "";
|
|
93
|
+
const content = isVideo ? {
|
|
94
|
+
type: "VideoWidget",
|
|
95
|
+
props: {
|
|
96
|
+
src: (d.videoUrl ?? d.video_url) || "",
|
|
97
|
+
poster: imageUrl,
|
|
98
|
+
caption: title
|
|
99
|
+
}
|
|
100
|
+
} : {
|
|
101
|
+
type: "ImageWidget",
|
|
102
|
+
props: {
|
|
103
|
+
src: imageUrl,
|
|
104
|
+
alt: title || "Slide image",
|
|
105
|
+
objectFit: "cover"
|
|
106
|
+
}
|
|
107
|
+
};
|
|
108
|
+
const baseSlide = {
|
|
109
|
+
id: String(d.id ?? `slide-${index}`),
|
|
110
|
+
content,
|
|
111
|
+
title,
|
|
112
|
+
description: extractDescription(d)
|
|
113
|
+
};
|
|
114
|
+
return {
|
|
115
|
+
...baseSlide,
|
|
116
|
+
...widgetConfig
|
|
117
|
+
};
|
|
118
|
+
});
|
|
119
|
+
};
|
|
120
|
+
var WIDGET_TRANSFORMERS = {
|
|
121
|
+
toShareableProps,
|
|
122
|
+
toCarouselSlidesFromShareables,
|
|
123
|
+
toImagePropsFromShareable,
|
|
124
|
+
toVideoPropsFromShareable
|
|
125
|
+
};
|
|
126
|
+
|
|
127
|
+
export { WIDGET_TRANSFORMERS };
|
|
128
|
+
//# sourceMappingURL=chunk-NAMNXRI5.js.map
|
|
129
|
+
//# sourceMappingURL=chunk-NAMNXRI5.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/data-sources/transformers.ts"],"names":[],"mappings":";AAwBA,SAAS,gBAAgB,CAAA,EAAoC;AAE3D,EAAA,IAAI,CAAA,CAAE,SAAA,EAAW,OAAO,CAAA,CAAE,SAAA;AAC1B,EAAA,IAAI,CAAA,CAAE,QAAA,EAAU,OAAO,CAAA,CAAE,QAAA;AACzB,EAAA,IAAI,CAAA,CAAE,aAAA,EAAe,OAAO,CAAA,CAAE,aAAA;AAC9B,EAAA,IAAI,CAAA,CAAE,GAAA,EAAK,OAAO,CAAA,CAAE,GAAA;AAGpB,EAAA,MAAM,SAAS,CAAA,CAAE,MAAA;AACjB,EAAA,IAAI,MAAA,IAAU,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG;AAC/B,IAAA,MAAM,UAAA,GAAa,OAAO,CAAC,CAAA;AAC3B,IAAA,IAAI,UAAA,EAAY,SAAA,EAAW,OAAO,UAAA,CAAW,SAAA;AAC7C,IAAA,IAAI,UAAA,EAAY,GAAA,EAAK,OAAO,UAAA,CAAW,GAAA;AAAA,EACzC;AAGA,EAAA,MAAM,eAAe,CAAA,CAAE,aAAA;AAGvB,EAAA,IAAI,YAAA,IAAgB,YAAA,CAAa,MAAA,GAAS,CAAA,EAAG;AAC3C,IAAA,MAAM,SAAA,GAAY,aAAa,CAAC,CAAA;AAChC,IAAA,MAAM,aAAa,SAAA,EAAW,UAAA;AAG9B,IAAA,IAAI,UAAA,EAAY,SAAA,EAAW,OAAO,UAAA,CAAW,SAAA;AAC7C,IAAA,IAAI,UAAA,EAAY,QAAA,EAAU,OAAO,UAAA,CAAW,QAAA;AAC5C,IAAA,IAAI,UAAA,EAAY,aAAA,EAAe,OAAO,UAAA,CAAW,aAAA;AAAA,EACnD;AAEA,EAAA,OAAO,EAAA;AACT;AAMA,SAAS,mBAAmB,CAAA,EAAoC;AAE9D,EAAA,MAAM,IAAA,GACJ,EAAE,WAAA,IAAe,CAAA,CAAE,YAAY,CAAA,CAAE,oBAAA,IAAwB,EAAE,IAAA,IAAQ,EAAA;AAGrE,EAAA,IAAI,OAAO,IAAA,KAAS,QAAA,IAAY,IAAA,KAAS,IAAA,IAAQ,UAAU,IAAA,EAAM;AAC/D,IAAA,OAAS,KAAiC,IAAA,IAAmB,EAAA;AAAA,EAC/D;AAEA,EAAA,OAAO,IAAA;AACT;AAKA,SAAS,yBAAA,CACP,GACA,MAAA,EACyB;AACzB,EAAA,IAAI,WAAW,MAAA,IAAa,MAAA,CAAO,IAAA,KAAS,QAAA,SAAiB,EAAC;AAE9D,EAAA,MAAM,YAAA,GAAe,OAAO,aAAA,CAAc,IAAA;AAAA,IACxC,CAAC,MAAM,MAAA,CAAO,CAAA,CAAE,EAAE,CAAA,KAAM,MAAA,CAAO,EAAE,EAAE;AAAA,GACrC;AACA,EAAA,OAAO,YAAA,EAAc,gBAAgB,EAAC;AACxC;AAKA,IAAM,yBAAA,GAA6C,CAAC,IAAA,KAAS;AAC3D,EAAA,MAAM,OAAO,KAAA,CAAM,OAAA,CAAQ,IAAI,CAAA,GAAI,IAAA,CAAK,CAAC,CAAA,GAAI,IAAA;AAC7C,EAAA,IAAI,CAAC,IAAA,IAAQ,OAAO,IAAA,KAAS,QAAA,EAAU;AACrC,IAAA,OAAO,EAAE,GAAA,EAAK,EAAA,EAAI,GAAA,EAAK,OAAA,EAAS,WAAW,OAAA,EAAQ;AAAA,EACrD;AAEA,EAAA,MAAM,CAAA,GAAI,IAAA;AACV,EAAA,OAAO;AAAA,IACL,GAAA,EAAK,gBAAgB,CAAC,CAAA;AAAA,IACtB,KAAM,CAAA,CAAE,KAAA,IAAS,CAAA,CAAE,IAAA,IAAQ,EAAE,GAAA,IAAO,OAAA;AAAA,IACpC,SAAA,EAAW;AAAA,GACb;AACF,CAAA;AAKA,IAAM,yBAAA,GAA6C,CAAC,IAAA,KAAS;AAC3D,EAAA,MAAM,OAAO,KAAA,CAAM,OAAA,CAAQ,IAAI,CAAA,GAAI,IAAA,CAAK,CAAC,CAAA,GAAI,IAAA;AAC7C,EAAA,IAAI,CAAC,IAAA,IAAQ,OAAO,IAAA,KAAS,QAAA,EAAU;AACrC,IAAA,OAAO,EAAE,GAAA,EAAK,EAAA,EAAI,MAAA,EAAQ,EAAA,EAAI,SAAS,EAAA,EAAG;AAAA,EAC5C;AAEA,EAAA,MAAM,CAAA,GAAI,IAAA;AACV,EAAA,OAAO;AAAA,IACL,MAAO,CAAA,CAAE,SAAA,IAAa,CAAA,CAAE,QAAA,IAAY,EAAE,GAAA,KAAmB,EAAA;AAAA,IACzD,MAAA,EAAQ,gBAAgB,CAAC,CAAA;AAAA,IACzB,SAAU,CAAA,CAAE,KAAA,IAAS,CAAA,CAAE,IAAA,IAAQ,EAAE,OAAA,IAAW;AAAA,GAC9C;AACF,CAAA;AAMA,IAAM,gBAAA,GAAoC,CAAC,IAAA,EAAM,MAAA,KAAW;AAC1D,EAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,IAAI,CAAA,SAAU,EAAC;AAElC,EAAA,OAAO,IAAA,CAAK,GAAA,CAAI,CAAC,IAAA,KAAkB;AACjC,IAAA,MAAM,CAAA,GAAI,IAAA;AAEV,IAAA,MAAM,YAAA,GAAe,yBAAA,CAA0B,CAAA,EAAG,MAAM,CAAA;AAExD,IAAA,OAAO;AAAA,MACL,IAAI,CAAA,CAAE,EAAA;AAAA,MACN,KAAA,EAAQ,CAAA,CAAE,KAAA,IAAS,CAAA,CAAE,IAAA,IAAQ,EAAA;AAAA,MAC7B,WAAA,EAAa,mBAAmB,CAAC,CAAA;AAAA,MACjC,QAAA,EAAU,gBAAgB,CAAC,CAAA;AAAA,MAC3B,QAAA,EAAA,CAAY,CAAA,CAAE,SAAA,IAAa,CAAA,CAAE,QAAA,KAAwB,IAAA;AAAA,MACrD,eAAgB,CAAA,CAAE,IAAA,IAChB,CAAA,CAAE,eAAA,IACF,EAAE,aAAA,IACF,EAAA;AAAA,MACF,IAAA,EAAO,EAAE,IAAA,IAAQ,OAAA;AAAA,MACjB,MAAA,EAAS,EAAE,MAAA,IAAU,QAAA;AAAA,MACrB,KAAA,EAAO,CAAA,CAAE,aAAA,IAAiB,CAAA,CAAE,KAAA,IAAS,IAAA;AAAA,MACrC,cAAA,EAAgB,CAAA,CAAE,uBAAA,IAA2B,CAAA,CAAE,eAAA,IAAmB,IAAA;AAAA,MAClE,iBAAA,EAAmB,EAAE,kBAAA,IAAsB,IAAA;AAAA,MAC3C,UAAA,EAAY,EAAE,YAAA,IAAgB,KAAA;AAAA,MAC9B,UAAA,EAAY,EAAE,YAAA,IAAgB,KAAA;AAAA,MAC9B,GAAG,CAAA;AAAA,MACH,GAAG;AAAA,KACL;AAAA,EACF,CAAC,CAAA;AACH,CAAA;AAKA,IAAM,8BAAA,GAAkD,CAAC,IAAA,EAAM,MAAA,KAAW;AACxE,EAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,IAAI,CAAA,SAAU,EAAC;AAElC,EAAA,OAAO,IAAA,CAAK,GAAA,CAAI,CAAC,IAAA,EAAe,KAAA,KAAkB;AAChD,IAAA,MAAM,CAAA,GAAI,IAAA;AAEV,IAAA,MAAM,YAAA,GAAe,yBAAA,CAA0B,CAAA,EAAG,MAAM,CAAA;AAExD,IAAA,MAAM,QAAA,GAAW,gBAAgB,CAAC,CAAA;AAClC,IAAA,MAAM,UAAU,CAAA,CAAE,IAAA,KAAS,OAAA,IAAW,CAAA,CAAE,YAAY,CAAA,CAAE,SAAA;AACtD,IAAA,MAAM,KAAA,GAAS,CAAA,CAAE,KAAA,IAAS,CAAA,CAAE,IAAA,IAAQ,EAAA;AAEpC,IAAA,MAAM,UAAU,OAAA,GACZ;AAAA,MACE,IAAA,EAAM,aAAA;AAAA,MACN,KAAA,EAAO;AAAA,QACL,GAAA,EAAA,CAAO,CAAA,CAAE,QAAA,IAAY,CAAA,CAAE,SAAA,KAAyB,EAAA;AAAA,QAChD,MAAA,EAAQ,QAAA;AAAA,QACR,OAAA,EAAS;AAAA;AACX,KACF,GACA;AAAA,MACE,IAAA,EAAM,aAAA;AAAA,MACN,KAAA,EAAO;AAAA,QACL,GAAA,EAAK,QAAA;AAAA,QACL,KAAK,KAAA,IAAS,aAAA;AAAA,QACd,SAAA,EAAW;AAAA;AACb,KACF;AAEJ,IAAA,MAAM,SAAA,GAAY;AAAA,MAChB,IAAI,MAAA,CAAO,CAAA,CAAE,EAAA,IAAM,CAAA,MAAA,EAAS,KAAK,CAAA,CAAE,CAAA;AAAA,MACnC,OAAA;AAAA,MACA,KAAA;AAAA,MACA,WAAA,EAAa,mBAAmB,CAAC;AAAA,KACnC;AAEA,IAAA,OAAO;AAAA,MACL,GAAG,SAAA;AAAA,MACH,GAAG;AAAA,KACL;AAAA,EACF,CAAC,CAAA;AACH,CAAA;AAKO,IAAM,mBAAA,GAAuD;AAAA,EAClE,gBAAA;AAAA,EACA,8BAAA;AAAA,EACA,yBAAA;AAAA,EACA;AACF","file":"chunk-NAMNXRI5.js","sourcesContent":["/**\n * Widget Transformers\n *\n * Transform functions that map API response data to widget-specific prop shapes.\n * Each widget has one transformer that handles all data structure variants:\n * - Standard: Direct field name match\n * - Legacy: Different field names that need mapping\n * - Minimal: Bare minimum fields that need defaults\n *\n * Usage:\n * 1. Transformers are registered in the DataSourceRegistry\n * 2. Reference by name in ApiDataSource.transform\n * 3. Applied after resultPath extraction, before targetProps assignment\n */\n\nimport type { DataTransformer, DataSource } from \"./types\";\n\n/**\n * Helper to extract image URL from various API response structures.\n * Handles:\n * - Flat fields (Medium, Page, Product): image_url, imageUrl, thumbnail_url, src\n * - Nested images array (EnrollmentPack): images[0].image_url\n * - Nested library_items (Library): library_items[0].relateable.image_url\n */\nfunction extractImageUrl(d: Record<string, unknown>): string {\n // Try flat fields first (Medium, Page, Product)\n if (d.image_url) return d.image_url as string;\n if (d.imageUrl) return d.imageUrl as string;\n if (d.thumbnail_url) return d.thumbnail_url as string;\n if (d.src) return d.src as string;\n\n // Try nested images array (EnrollmentPack)\n const images = d.images as Array<Record<string, unknown>> | undefined;\n if (images && images.length > 0) {\n const firstImage = images[0];\n if (firstImage?.image_url) return firstImage.image_url as string;\n if (firstImage?.url) return firstImage.url as string;\n }\n\n // Try nested library_items (Library/Playlist)\n const libraryItems = d.library_items as\n | Array<Record<string, unknown>>\n | undefined;\n if (libraryItems && libraryItems.length > 0) {\n const firstItem = libraryItems[0];\n const relateable = firstItem?.relateable as\n | Record<string, unknown>\n | undefined;\n if (relateable?.image_url) return relateable.image_url as string;\n if (relateable?.imageUrl) return relateable.imageUrl as string;\n if (relateable?.thumbnail_url) return relateable.thumbnail_url as string;\n }\n\n return \"\";\n}\n\n/**\n * Helper to extract description from various API response structures.\n * Handles different field names across endpoints.\n */\nfunction extractDescription(d: Record<string, unknown>): string {\n // Try various description field names\n const desc =\n d.description ?? d.stripped ?? d.stripped_description ?? d.body ?? \"\";\n\n // Handle nested description object (some APIs return { body: \"...\" })\n if (typeof desc === \"object\" && desc !== null && \"body\" in desc) {\n return ((desc as Record<string, unknown>).body as string) ?? \"\";\n }\n\n return desc as string;\n}\n\n/**\n * Helper to extract custom widget config from a selected item.\n */\nfunction extractCustomWidgetConfig(\n d: Record<string, unknown>,\n source: DataSource | undefined,\n): Record<string, unknown> {\n if (source === undefined || source.type !== \"custom\") return {};\n\n const selectedItem = source.selectedItems.find(\n (s) => String(s.id) === String(d.id),\n );\n return selectedItem?.widgetConfig ?? {};\n}\n\n/**\n * ImageWidget transformer from shareable data\n */\nconst toImagePropsFromShareable: DataTransformer = (data) => {\n const item = Array.isArray(data) ? data[0] : data;\n if (!item || typeof item !== \"object\") {\n return { src: \"\", alt: \"Image\", objectFit: \"cover\" };\n }\n\n const d = item as Record<string, unknown>;\n return {\n src: extractImageUrl(d),\n alt: (d.title ?? d.name ?? d.alt ?? \"Image\") as string,\n objectFit: \"cover\" as const,\n };\n};\n\n/**\n * VideoWidget transformer from shareable data\n */\nconst toVideoPropsFromShareable: DataTransformer = (data) => {\n const item = Array.isArray(data) ? data[0] : data;\n if (!item || typeof item !== \"object\") {\n return { src: \"\", poster: \"\", caption: \"\" };\n }\n\n const d = item as Record<string, unknown>;\n return {\n src: ((d.video_url ?? d.videoUrl ?? d.src) as string) || \"\",\n poster: extractImageUrl(d),\n caption: (d.title ?? d.name ?? d.caption ?? \"\") as string,\n };\n};\n\n/**\n * Shareable content transformer\n * Normalizes shareable API responses to a consistent format\n */\nconst toShareableProps: DataTransformer = (data, source) => {\n if (!Array.isArray(data)) return [];\n\n return data.map((item: unknown) => {\n const d = item as Record<string, unknown>;\n\n const widgetConfig = extractCustomWidgetConfig(d, source);\n\n return {\n id: d.id,\n title: (d.title ?? d.name ?? \"\") as string,\n description: extractDescription(d),\n imageUrl: extractImageUrl(d),\n videoUrl: ((d.video_url ?? d.videoUrl) as string) || null,\n shareableType: (d.type ??\n d.relateable_type ??\n d.shareableType ??\n \"\") as string,\n kind: (d.kind ?? \"image\") as string,\n status: (d.status ?? \"active\") as string,\n price: d.display_price ?? d.price ?? null,\n wholesalePrice: d.display_wholesale_price ?? d.wholesale_price ?? null,\n subscriptionPrice: d.subscription_price ?? null,\n outOfStock: d.out_of_stock ?? false,\n lowInStock: d.low_in_stock ?? false,\n ...d,\n ...widgetConfig,\n };\n });\n};\n\n/**\n * Carousel slides from shareables transformer\n */\nconst toCarouselSlidesFromShareables: DataTransformer = (data, source) => {\n if (!Array.isArray(data)) return [];\n\n return data.map((item: unknown, index: number) => {\n const d = item as Record<string, unknown>;\n\n const widgetConfig = extractCustomWidgetConfig(d, source);\n\n const imageUrl = extractImageUrl(d);\n const isVideo = d.kind === \"video\" || d.videoUrl || d.video_url;\n const title = (d.title ?? d.name ?? \"\") as string;\n\n const content = isVideo\n ? {\n type: \"VideoWidget\",\n props: {\n src: ((d.videoUrl ?? d.video_url) as string) || \"\",\n poster: imageUrl,\n caption: title,\n },\n }\n : {\n type: \"ImageWidget\",\n props: {\n src: imageUrl,\n alt: title || \"Slide image\",\n objectFit: \"cover\",\n },\n };\n\n const baseSlide = {\n id: String(d.id ?? `slide-${index}`),\n content,\n title,\n description: extractDescription(d),\n };\n\n return {\n ...baseSlide,\n ...widgetConfig,\n };\n });\n};\n\n/**\n * All widget transformers bundled for registration\n */\nexport const WIDGET_TRANSFORMERS: Record<string, DataTransformer> = {\n toShareableProps,\n toCarouselSlidesFromShareables,\n toImagePropsFromShareable,\n toVideoPropsFromShareable,\n};\n"]}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var jsxRuntime = require('react/jsx-runtime');
|
|
4
|
+
|
|
5
|
+
// src/data-sources/ErrorState.tsx
|
|
6
|
+
function ErrorState() {
|
|
7
|
+
return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex min-h-[120px] flex-col items-center justify-center p-6 text-center", children: [
|
|
8
|
+
/* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-lg font-semibold", children: "Something Went Wrong" }),
|
|
9
|
+
/* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-sm text-muted-foreground", children: "Please contact a company admin for help" })
|
|
10
|
+
] });
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
exports.ErrorState = ErrorState;
|
|
14
|
+
//# sourceMappingURL=chunk-OWU7MFJ2.cjs.map
|
|
15
|
+
//# sourceMappingURL=chunk-OWU7MFJ2.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/data-sources/ErrorState.tsx"],"names":["jsxs","jsx"],"mappings":";;;;;AAAO,SAAS,UAAA,GAAa;AAC3B,EAAA,uBACEA,eAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yEAAA,EACb,QAAA,EAAA;AAAA,oBAAAC,cAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,uBAAA,EAAwB,QAAA,EAAA,sBAAA,EAAoB,CAAA;AAAA,oBACzDA,cAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,+BAAA,EAAgC,QAAA,EAAA,yCAAA,EAE7C;AAAA,GAAA,EACF,CAAA;AAEJ","file":"chunk-OWU7MFJ2.cjs","sourcesContent":["export function ErrorState() {\n return (\n <div className=\"flex min-h-[120px] flex-col items-center justify-center p-6 text-center\">\n <p className=\"text-lg font-semibold\">Something Went Wrong</p>\n <p className=\"text-sm text-muted-foreground\">\n Please contact a company admin for help\n </p>\n </div>\n );\n}\n"]}
|
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
import { useState, useRef, useEffect } from 'react';
|
|
2
|
+
|
|
3
|
+
// src/data-sources/fetchers/static.ts
|
|
4
|
+
var STATIC_ENDPOINTS = {
|
|
5
|
+
collections: "/company/v1/products",
|
|
6
|
+
categories: "/company/v1/products"
|
|
7
|
+
};
|
|
8
|
+
var STATIC_QUERY_PARAMS = {
|
|
9
|
+
collections: "collection_id",
|
|
10
|
+
categories: "category_id"
|
|
11
|
+
};
|
|
12
|
+
function extractProducts(json) {
|
|
13
|
+
if (Array.isArray(json.products)) {
|
|
14
|
+
return json.products;
|
|
15
|
+
}
|
|
16
|
+
if (Array.isArray(json.data)) {
|
|
17
|
+
return json.data;
|
|
18
|
+
}
|
|
19
|
+
if (Array.isArray(json)) {
|
|
20
|
+
return json;
|
|
21
|
+
}
|
|
22
|
+
console.warn(
|
|
23
|
+
"[extractProducts] Could not find products array. Available keys:",
|
|
24
|
+
Object.keys(json)
|
|
25
|
+
);
|
|
26
|
+
return [];
|
|
27
|
+
}
|
|
28
|
+
async function staticFetcher(source, context) {
|
|
29
|
+
const { staticType, selectedId } = source;
|
|
30
|
+
if (staticType === "tags") {
|
|
31
|
+
throw new Error(
|
|
32
|
+
"Tags data source is not yet supported. Please select Collections or Categories instead."
|
|
33
|
+
);
|
|
34
|
+
}
|
|
35
|
+
const endpoint = STATIC_ENDPOINTS[staticType];
|
|
36
|
+
const queryParam = STATIC_QUERY_PARAMS[staticType];
|
|
37
|
+
if (!endpoint || !queryParam) {
|
|
38
|
+
throw new Error(
|
|
39
|
+
`Invalid data source configuration: "${staticType}" is not a supported static source type.`
|
|
40
|
+
);
|
|
41
|
+
}
|
|
42
|
+
const url = new URL(
|
|
43
|
+
`${context.baseUrl ?? ""}${endpoint}`,
|
|
44
|
+
context.baseUrl ? void 0 : window.location.origin
|
|
45
|
+
);
|
|
46
|
+
url.searchParams.set(queryParam, String(selectedId));
|
|
47
|
+
try {
|
|
48
|
+
const response = await fetch(url.toString(), {
|
|
49
|
+
method: "GET",
|
|
50
|
+
headers: {
|
|
51
|
+
...context.getApiHeaders?.(),
|
|
52
|
+
"Content-Type": "application/json"
|
|
53
|
+
},
|
|
54
|
+
signal: context.signal
|
|
55
|
+
});
|
|
56
|
+
if (!response.ok) {
|
|
57
|
+
throw new Error(
|
|
58
|
+
`Failed to fetch products for ${staticType} ${selectedId}: ${response.status} ${response.statusText}`
|
|
59
|
+
);
|
|
60
|
+
}
|
|
61
|
+
const json = await response.json();
|
|
62
|
+
return extractProducts(json);
|
|
63
|
+
} catch (error) {
|
|
64
|
+
if (error instanceof Error && error.name === "AbortError") {
|
|
65
|
+
return [];
|
|
66
|
+
}
|
|
67
|
+
console.error(
|
|
68
|
+
`[staticFetcher] Error fetching ${staticType} ${selectedId}:`,
|
|
69
|
+
error
|
|
70
|
+
);
|
|
71
|
+
throw error;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
var LIST_ENDPOINTS = {
|
|
75
|
+
collections: {
|
|
76
|
+
endpoint: "/company/v1/collections",
|
|
77
|
+
resultKey: "collections"
|
|
78
|
+
},
|
|
79
|
+
categories: { endpoint: "/company/v1/categories", resultKey: "categories" },
|
|
80
|
+
tags: { endpoint: "/company/v1/tags", resultKey: "tags" }
|
|
81
|
+
};
|
|
82
|
+
function useStaticSourceItems(staticType, context, params) {
|
|
83
|
+
const [items, setItems] = useState([]);
|
|
84
|
+
const [isLoading, setIsLoading] = useState(false);
|
|
85
|
+
const [error, setError] = useState(null);
|
|
86
|
+
const { baseUrl, getApiHeaders } = context;
|
|
87
|
+
const search = params?.search;
|
|
88
|
+
const getApiHeadersRef = useRef(getApiHeaders);
|
|
89
|
+
getApiHeadersRef.current = getApiHeaders;
|
|
90
|
+
useEffect(() => {
|
|
91
|
+
if (!staticType) {
|
|
92
|
+
setItems([]);
|
|
93
|
+
setError(null);
|
|
94
|
+
return;
|
|
95
|
+
}
|
|
96
|
+
let isCancelled = false;
|
|
97
|
+
const abortController = new AbortController();
|
|
98
|
+
setIsLoading(true);
|
|
99
|
+
setError(null);
|
|
100
|
+
const config = LIST_ENDPOINTS[staticType];
|
|
101
|
+
const url = new URL(
|
|
102
|
+
`${baseUrl ?? ""}${config.endpoint}`,
|
|
103
|
+
baseUrl ? void 0 : window.location.origin
|
|
104
|
+
);
|
|
105
|
+
if (search) {
|
|
106
|
+
url.searchParams.set("search", search);
|
|
107
|
+
}
|
|
108
|
+
fetch(url.toString(), {
|
|
109
|
+
method: "GET",
|
|
110
|
+
headers: {
|
|
111
|
+
...getApiHeadersRef.current?.(),
|
|
112
|
+
"Content-Type": "application/json"
|
|
113
|
+
},
|
|
114
|
+
signal: abortController.signal
|
|
115
|
+
}).then(async (response) => {
|
|
116
|
+
if (!response.ok) {
|
|
117
|
+
throw new Error(`Failed to fetch ${staticType}: ${response.status}`);
|
|
118
|
+
}
|
|
119
|
+
const json = await response.json();
|
|
120
|
+
const responseItems = json[config.resultKey];
|
|
121
|
+
if (!Array.isArray(responseItems)) {
|
|
122
|
+
console.warn(
|
|
123
|
+
`[useStaticSourceItems] Expected array at "${config.resultKey}" but got:`,
|
|
124
|
+
typeof responseItems
|
|
125
|
+
);
|
|
126
|
+
if (!isCancelled) {
|
|
127
|
+
setItems([]);
|
|
128
|
+
}
|
|
129
|
+
return;
|
|
130
|
+
}
|
|
131
|
+
if (!isCancelled) {
|
|
132
|
+
setItems(
|
|
133
|
+
responseItems.map((item) => ({
|
|
134
|
+
id: item.id,
|
|
135
|
+
title: item.title,
|
|
136
|
+
imageUrl: item.image_url
|
|
137
|
+
}))
|
|
138
|
+
);
|
|
139
|
+
}
|
|
140
|
+
}).catch((err) => {
|
|
141
|
+
if (err instanceof Error && err.name === "AbortError") {
|
|
142
|
+
return;
|
|
143
|
+
}
|
|
144
|
+
console.error(
|
|
145
|
+
`[useStaticSourceItems] Failed to fetch ${staticType}:`,
|
|
146
|
+
err
|
|
147
|
+
);
|
|
148
|
+
if (isCancelled) return;
|
|
149
|
+
setError("An unexpected error occurred. Please try again.");
|
|
150
|
+
setItems([]);
|
|
151
|
+
}).finally(() => {
|
|
152
|
+
if (!isCancelled) {
|
|
153
|
+
setIsLoading(false);
|
|
154
|
+
}
|
|
155
|
+
});
|
|
156
|
+
return () => {
|
|
157
|
+
isCancelled = true;
|
|
158
|
+
abortController.abort();
|
|
159
|
+
};
|
|
160
|
+
}, [staticType, search, baseUrl]);
|
|
161
|
+
return { items, isLoading, error };
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
export { staticFetcher, useStaticSourceItems };
|
|
165
|
+
//# sourceMappingURL=chunk-PVTQWD4I.js.map
|
|
166
|
+
//# sourceMappingURL=chunk-PVTQWD4I.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/data-sources/fetchers/static.ts"],"names":[],"mappings":"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","file":"chunk-PVTQWD4I.js","sourcesContent":["import { useState, useEffect, useRef } from \"react\";\nimport type {\n StaticDataSource,\n DataSourceContext,\n StaticSourceType,\n StaticItem,\n} from \"../types\";\n\n/**\n * Endpoint patterns for fetching products by static source type.\n * Tags require backend API support (not yet available).\n */\nconst STATIC_ENDPOINTS: Record<\"collections\" | \"categories\", string> = {\n collections: \"/company/v1/products\",\n categories: \"/company/v1/products\",\n};\n\n/**\n * Query parameter names for each static source type.\n */\nconst STATIC_QUERY_PARAMS: Record<\"collections\" | \"categories\", string> = {\n collections: \"collection_id\",\n categories: \"category_id\",\n};\n\n/**\n * Extract products array from API response.\n * The /company/v1/products endpoint returns { products: [...], meta: {...} }\n */\nfunction extractProducts(json: Record<string, unknown>): unknown[] {\n if (Array.isArray(json.products)) {\n return json.products;\n }\n if (Array.isArray(json.data)) {\n return json.data;\n }\n if (Array.isArray(json)) {\n return json;\n }\n console.warn(\n \"[extractProducts] Could not find products array. Available keys:\",\n Object.keys(json),\n );\n return [];\n}\n\n/**\n * Static data source fetcher.\n *\n * Fetches products filtered by collection or category ID.\n * Tags are not yet supported (requires backend API changes).\n *\n * @param source - The static data source configuration\n * @param context - The data source context with baseUrl and headers\n * @returns Array of products matching the filter criteria\n */\nexport async function staticFetcher(\n source: StaticDataSource,\n context: DataSourceContext,\n): Promise<unknown[]> {\n const { staticType, selectedId } = source;\n\n // Tags require backend API support - not yet implemented\n if (staticType === \"tags\") {\n throw new Error(\n \"Tags data source is not yet supported. Please select Collections or Categories instead.\",\n );\n }\n\n const endpoint = STATIC_ENDPOINTS[staticType];\n const queryParam = STATIC_QUERY_PARAMS[staticType];\n\n if (!endpoint || !queryParam) {\n throw new Error(\n `Invalid data source configuration: \"${staticType}\" is not a supported static source type.`,\n );\n }\n\n const url = new URL(\n `${context.baseUrl ?? \"\"}${endpoint}`,\n context.baseUrl ? undefined : window.location.origin,\n );\n url.searchParams.set(queryParam, String(selectedId));\n\n try {\n const response = await fetch(url.toString(), {\n method: \"GET\",\n headers: {\n ...context.getApiHeaders?.(),\n \"Content-Type\": \"application/json\",\n },\n signal: context.signal,\n });\n\n if (!response.ok) {\n throw new Error(\n `Failed to fetch products for ${staticType} ${selectedId}: ${response.status} ${response.statusText}`,\n );\n }\n\n const json = await response.json();\n return extractProducts(json);\n } catch (error) {\n if (error instanceof Error && error.name === \"AbortError\") {\n // Request was cancelled, don't log as error\n return [];\n }\n console.error(\n `[staticFetcher] Error fetching ${staticType} ${selectedId}:`,\n error,\n );\n throw error;\n }\n}\n\n/**\n * Endpoints for listing static source items (collections, categories, tags).\n */\nconst LIST_ENDPOINTS: Record<\n StaticSourceType,\n { endpoint: string; resultKey: string }\n> = {\n collections: {\n endpoint: \"/company/v1/collections\",\n resultKey: \"collections\",\n },\n categories: { endpoint: \"/company/v1/categories\", resultKey: \"categories\" },\n tags: { endpoint: \"/company/v1/tags\", resultKey: \"tags\" },\n};\n\n/**\n * Result type for useStaticSourceItems hook.\n */\nexport interface UseStaticSourceItemsResult {\n /** The fetched items */\n items: StaticItem[];\n /** True while items are being fetched */\n isLoading: boolean;\n /** Error message if fetch failed */\n error: string | null;\n}\n\n/**\n * React hook for fetching static source items (collections, categories).\n * Handles loading state, error state, abort on cleanup, and search filtering.\n *\n * @param staticType - The type of static source to fetch, or null to reset\n * @param context - Context with baseUrl and getApiHeaders\n * @param params - Optional search parameters\n * @returns Object with items, isLoading, and error state\n */\nexport function useStaticSourceItems(\n staticType: StaticSourceType | null,\n context: Pick<DataSourceContext, \"baseUrl\" | \"getApiHeaders\">,\n params?: { search?: string },\n): UseStaticSourceItemsResult {\n const [items, setItems] = useState<StaticItem[]>([]);\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n // Extract stable references from context to avoid dependency issues\n const { baseUrl, getApiHeaders } = context;\n const search = params?.search;\n\n // Use ref to avoid infinite re-renders when getApiHeaders changes reference\n const getApiHeadersRef = useRef(getApiHeaders);\n getApiHeadersRef.current = getApiHeaders;\n\n useEffect(() => {\n if (!staticType) {\n setItems([]);\n setError(null);\n return;\n }\n\n let isCancelled = false;\n const abortController = new AbortController();\n setIsLoading(true);\n setError(null);\n\n const config = LIST_ENDPOINTS[staticType];\n const url = new URL(\n `${baseUrl ?? \"\"}${config.endpoint}`,\n baseUrl ? undefined : window.location.origin,\n );\n\n if (search) {\n url.searchParams.set(\"search\", search);\n }\n\n fetch(url.toString(), {\n method: \"GET\",\n headers: {\n ...getApiHeadersRef.current?.(),\n \"Content-Type\": \"application/json\",\n },\n signal: abortController.signal,\n })\n .then(async (response) => {\n if (!response.ok) {\n throw new Error(`Failed to fetch ${staticType}: ${response.status}`);\n }\n const json = await response.json();\n const responseItems = json[config.resultKey] as Array<{\n id: string | number;\n title: string;\n image_url?: string;\n }>;\n\n if (!Array.isArray(responseItems)) {\n console.warn(\n `[useStaticSourceItems] Expected array at \"${config.resultKey}\" but got:`,\n typeof responseItems,\n );\n if (!isCancelled) {\n setItems([]);\n }\n return;\n }\n\n if (!isCancelled) {\n setItems(\n responseItems.map((item) => ({\n id: item.id,\n title: item.title,\n imageUrl: item.image_url,\n })),\n );\n }\n })\n .catch((err) => {\n if (err instanceof Error && err.name === \"AbortError\") {\n return;\n }\n\n // Log for debugging\n console.error(\n `[useStaticSourceItems] Failed to fetch ${staticType}:`,\n err,\n );\n\n if (isCancelled) return;\n\n setError(\"An unexpected error occurred. Please try again.\");\n setItems([]);\n })\n .finally(() => {\n if (!isCancelled) {\n setIsLoading(false);\n }\n });\n\n return () => {\n isCancelled = true;\n abortController.abort();\n };\n }, [staticType, search, baseUrl]);\n\n return { items, isLoading, error };\n}\n"]}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var chunk6YI7VW55_cjs = require('./chunk-6YI7VW55.cjs');
|
|
4
|
+
require('react');
|
|
5
|
+
var jsxRuntime = require('react/jsx-runtime');
|
|
6
|
+
|
|
7
|
+
function AppShellLayout({
|
|
8
|
+
sidebarContent,
|
|
9
|
+
headerContent,
|
|
10
|
+
children,
|
|
11
|
+
sidebarHeader,
|
|
12
|
+
sidebarFooter
|
|
13
|
+
}) {
|
|
14
|
+
return /* @__PURE__ */ jsxRuntime.jsx(chunk6YI7VW55_cjs.SidebarProvider, { children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "relative flex max-h-dvh w-full overflow-hidden bg-muted", children: [
|
|
15
|
+
/* @__PURE__ */ jsxRuntime.jsxs(chunk6YI7VW55_cjs.Sidebar, { children: [
|
|
16
|
+
sidebarHeader && /* @__PURE__ */ jsxRuntime.jsx(chunk6YI7VW55_cjs.SidebarHeader, { children: sidebarHeader }),
|
|
17
|
+
/* @__PURE__ */ jsxRuntime.jsx(chunk6YI7VW55_cjs.SidebarContent, { className: "p-4", children: sidebarContent }),
|
|
18
|
+
sidebarFooter && /* @__PURE__ */ jsxRuntime.jsx(chunk6YI7VW55_cjs.SidebarFooter, { children: sidebarFooter })
|
|
19
|
+
] }),
|
|
20
|
+
/* @__PURE__ */ jsxRuntime.jsxs(chunk6YI7VW55_cjs.SidebarInset, { className: "flex flex-1 flex-col overflow-hidden", children: [
|
|
21
|
+
headerContent,
|
|
22
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex-1 overflow-hidden bg-muted md:pr-4 md:pb-4", children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "scrollbar-none h-full overflow-auto rounded-xl bg-background text-foreground shadow-lg", children }) })
|
|
23
|
+
] })
|
|
24
|
+
] }) });
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
exports.AppShellLayout = AppShellLayout;
|
|
28
|
+
//# sourceMappingURL=chunk-S663BA25.cjs.map
|
|
29
|
+
//# sourceMappingURL=chunk-S663BA25.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/shell/AppShellLayout.tsx"],"names":["jsx","SidebarProvider","jsxs","Sidebar","SidebarHeader","SidebarContent","SidebarFooter","SidebarInset"],"mappings":";;;;;;AAiCO,SAAS,cAAA,CAAe;AAAA,EAC7B,cAAA;AAAA,EACA,aAAA;AAAA,EACA,QAAA;AAAA,EACA,aAAA;AAAA,EACA;AACF,CAAA,EAAwB;AACtB,EAAA,uBACEA,cAAA,CAACC,iCAAA,EAAA,EACC,QAAA,kBAAAC,eAAA,CAAC,KAAA,EAAA,EAAI,WAAU,yDAAA,EAEb,QAAA,EAAA;AAAA,oBAAAA,eAAA,CAACC,yBAAA,EAAA,EACE,QAAA,EAAA;AAAA,MAAA,aAAA,oBAAiBH,cAAA,CAACI,mCAAe,QAAA,EAAA,aAAA,EAAc,CAAA;AAAA,sBAChDJ,cAAA,CAACK,gCAAA,EAAA,EAAe,SAAA,EAAU,KAAA,EAAO,QAAA,EAAA,cAAA,EAAe,CAAA;AAAA,MAC/C,aAAA,oBAAiBL,cAAA,CAACM,+BAAA,EAAA,EAAe,QAAA,EAAA,aAAA,EAAc;AAAA,KAAA,EAClD,CAAA;AAAA,oBAGAJ,eAAA,CAACK,8BAAA,EAAA,EAAa,SAAA,EAAU,sCAAA,EAErB,QAAA,EAAA;AAAA,MAAA,aAAA;AAAA,sBAGDP,cAAA,CAAC,SAAI,SAAA,EAAU,iDAAA,EACb,yCAAC,KAAA,EAAA,EAAI,SAAA,EAAU,wFAAA,EACZ,QAAA,EACH,CAAA,EACF;AAAA,KAAA,EACF;AAAA,GAAA,EACF,CAAA,EACF,CAAA;AAEJ","file":"chunk-S663BA25.cjs","sourcesContent":["\"use client\";\n\nimport * as React from \"react\";\nimport {\n Sidebar,\n SidebarContent,\n SidebarFooter,\n SidebarHeader,\n SidebarInset,\n SidebarProvider,\n} from \"./sidebar\";\n\nexport interface AppShellLayoutProps {\n /** Navigation content rendered inside the sidebar's scrollable area */\n sidebarContent: React.ReactNode;\n /** Header content rendered above the main content area */\n headerContent: React.ReactNode;\n /** Main page content */\n children: React.ReactNode;\n /** Optional slot at the top of the sidebar (e.g. logo, search) */\n sidebarHeader?: React.ReactNode;\n /** Optional slot at the bottom of the sidebar (e.g. user info) */\n sidebarFooter?: React.ReactNode;\n}\n\n/**\n * Pure visual frame that replicates the RepApp layout:\n * - 13rem collapsible sidebar\n * - 52px header area\n * - rounded-xl bg-background shadow-lg content area with bg-muted gutters\n *\n * This component handles zero business logic — it simply provides the visual shell.\n */\nexport function AppShellLayout({\n sidebarContent,\n headerContent,\n children,\n sidebarHeader,\n sidebarFooter,\n}: AppShellLayoutProps) {\n return (\n <SidebarProvider>\n <div className=\"relative flex max-h-dvh w-full overflow-hidden bg-muted\">\n {/* Navigation Sidebar */}\n <Sidebar>\n {sidebarHeader && <SidebarHeader>{sidebarHeader}</SidebarHeader>}\n <SidebarContent className=\"p-4\">{sidebarContent}</SidebarContent>\n {sidebarFooter && <SidebarFooter>{sidebarFooter}</SidebarFooter>}\n </Sidebar>\n\n {/* Main Content Area */}\n <SidebarInset className=\"flex flex-1 flex-col overflow-hidden\">\n {/* Header */}\n {headerContent}\n\n {/* Screen Content */}\n <div className=\"flex-1 overflow-hidden bg-muted md:pr-4 md:pb-4\">\n <div className=\"scrollbar-none h-full overflow-auto rounded-xl bg-background text-foreground shadow-lg\">\n {children}\n </div>\n </div>\n </SidebarInset>\n </div>\n </SidebarProvider>\n );\n}\n"]}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var react = require('react');
|
|
4
|
+
var jsxRuntime = require('react/jsx-runtime');
|
|
5
|
+
|
|
6
|
+
// src/data-sources/context.tsx
|
|
7
|
+
var DataSourceContext = react.createContext({});
|
|
8
|
+
function DataSourceProvider({
|
|
9
|
+
baseUrl,
|
|
10
|
+
getApiHeaders,
|
|
11
|
+
children
|
|
12
|
+
}) {
|
|
13
|
+
const value = react.useMemo(
|
|
14
|
+
() => ({ baseUrl, getApiHeaders }),
|
|
15
|
+
[baseUrl, getApiHeaders]
|
|
16
|
+
);
|
|
17
|
+
return /* @__PURE__ */ jsxRuntime.jsx(DataSourceContext.Provider, { value, children });
|
|
18
|
+
}
|
|
19
|
+
function useDataSourceConfig() {
|
|
20
|
+
return react.useContext(DataSourceContext);
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
exports.DataSourceProvider = DataSourceProvider;
|
|
24
|
+
exports.useDataSourceConfig = useDataSourceConfig;
|
|
25
|
+
//# sourceMappingURL=chunk-SJQPHJL4.cjs.map
|
|
26
|
+
//# sourceMappingURL=chunk-SJQPHJL4.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/data-sources/context.tsx"],"names":["createContext","useMemo","jsx","useContext"],"mappings":";;;;;;AAOA,IAAM,iBAAA,GAAoBA,mBAAA,CAAsC,EAAE,CAAA;AAQ3D,SAAS,kBAAA,CAAmB;AAAA,EACjC,OAAA;AAAA,EACA,aAAA;AAAA,EACA;AACF,CAAA,EAA4B;AAC1B,EAAA,MAAM,KAAA,GAAQC,aAAA;AAAA,IACZ,OAAO,EAAE,OAAA,EAAS,aAAA,EAAc,CAAA;AAAA,IAChC,CAAC,SAAS,aAAa;AAAA,GACzB;AAEA,EAAA,uBACEC,cAAA,CAAC,iBAAA,CAAkB,QAAA,EAAlB,EAA2B,OACzB,QAAA,EACH,CAAA;AAEJ;AAEO,SAAS,mBAAA,GAA8C;AAC5D,EAAA,OAAOC,iBAAW,iBAAiB,CAAA;AACrC","file":"chunk-SJQPHJL4.cjs","sourcesContent":["import { createContext, useContext, useMemo, type ReactNode } from \"react\";\n\nexport interface DataSourceContextValue {\n baseUrl?: string | undefined;\n getApiHeaders?: (() => Record<string, string>) | undefined;\n}\n\nconst DataSourceContext = createContext<DataSourceContextValue>({});\n\nexport interface DataSourceProviderProps {\n baseUrl?: string | undefined;\n getApiHeaders?: (() => Record<string, string>) | undefined;\n children: ReactNode;\n}\n\nexport function DataSourceProvider({\n baseUrl,\n getApiHeaders,\n children,\n}: DataSourceProviderProps) {\n const value = useMemo(\n () => ({ baseUrl, getApiHeaders }),\n [baseUrl, getApiHeaders],\n );\n\n return (\n <DataSourceContext.Provider value={value}>\n {children}\n </DataSourceContext.Provider>\n );\n}\n\nexport function useDataSourceConfig(): DataSourceContextValue {\n return useContext(DataSourceContext);\n}\n"]}
|