@bravostudioai/react 0.1.17 โ 0.1.21
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/_virtual/index.js +6 -0
- package/dist/_virtual/index.js.map +1 -0
- package/dist/_virtual/index2.js +5 -0
- package/dist/_virtual/index2.js.map +1 -0
- package/dist/_virtual/use-sync-external-store-shim.development.js +5 -0
- package/dist/_virtual/use-sync-external-store-shim.development.js.map +1 -0
- package/dist/_virtual/use-sync-external-store-shim.production.js +5 -0
- package/dist/_virtual/use-sync-external-store-shim.production.js.map +1 -0
- package/dist/cli/commands/generate.js +144 -129
- package/dist/cli/commands/generate.js.map +1 -1
- package/dist/components/DynamicComponent.js.map +1 -1
- package/dist/components/EncoreApp.js +42 -39
- package/dist/components/EncoreApp.js.map +1 -1
- package/dist/components/EncoreErrorBoundary.js.map +1 -1
- package/dist/components/EncoreLoadingFallback.js.map +1 -1
- package/dist/components.js +343 -336
- package/dist/components.js.map +1 -1
- package/dist/contexts/EncoreActionContext.js +3 -3
- package/dist/contexts/EncoreActionContext.js.map +1 -1
- package/dist/contexts/EncoreAppContext.js +2 -2
- package/dist/contexts/EncoreAppContext.js.map +1 -1
- package/dist/contexts/EncoreBindingContext.js +2 -2
- package/dist/contexts/EncoreBindingContext.js.map +1 -1
- package/dist/contexts/EncoreComponentIdContext.js +3 -5
- package/dist/contexts/EncoreComponentIdContext.js.map +1 -1
- package/dist/contexts/EncoreRepeatingContainerContext.js +2 -2
- package/dist/contexts/EncoreRepeatingContainerContext.js.map +1 -1
- package/dist/contexts/EncoreRouterContext.js +2 -2
- package/dist/contexts/EncoreRouterContext.js.map +1 -1
- package/dist/hooks/usePusherUpdates.js +1 -1
- package/dist/hooks/usePusherUpdates.js.map +1 -1
- package/dist/index.js +21 -19
- package/dist/index.js.map +1 -1
- package/dist/lib/fetcher.js +22 -17
- package/dist/lib/fetcher.js.map +1 -1
- package/dist/node_modules/dequal/lite/index.js +25 -0
- package/dist/node_modules/dequal/lite/index.js.map +1 -0
- package/dist/node_modules/swr/dist/_internal/config-context-12s-Dh3trQsc.js +289 -0
- package/dist/node_modules/swr/dist/_internal/config-context-12s-Dh3trQsc.js.map +1 -0
- package/dist/node_modules/swr/dist/_internal/constants.js +5 -0
- package/dist/node_modules/swr/dist/_internal/constants.js.map +1 -0
- package/dist/node_modules/swr/dist/_internal/events.js +8 -0
- package/dist/node_modules/swr/dist/_internal/events.js.map +1 -0
- package/dist/node_modules/swr/dist/_internal/index.js +78 -0
- package/dist/node_modules/swr/dist/_internal/index.js.map +1 -0
- package/dist/node_modules/swr/dist/index/index.js +216 -0
- package/dist/node_modules/swr/dist/index/index.js.map +1 -0
- package/dist/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim.development.js +59 -0
- package/dist/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim.development.js.map +1 -0
- package/dist/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim.production.js +47 -0
- package/dist/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim.production.js.map +1 -0
- package/dist/node_modules/use-sync-external-store/shim/index.js +11 -0
- package/dist/node_modules/use-sync-external-store/shim/index.js.map +1 -0
- package/dist/src/cli/commands/generate.d.ts.map +1 -1
- package/dist/src/components/DynamicComponent.d.ts.map +1 -1
- package/dist/src/components/EncoreApp.d.ts.map +1 -1
- package/dist/src/components/EncoreErrorBoundary.d.ts.map +1 -1
- package/dist/src/components/EncoreLoadingFallback.d.ts.map +1 -1
- package/dist/src/components.d.ts.map +1 -1
- package/dist/src/contexts/EncoreActionContext.d.ts +1 -2
- package/dist/src/contexts/EncoreActionContext.d.ts.map +1 -1
- package/dist/src/contexts/EncoreAppContext.d.ts +1 -2
- package/dist/src/contexts/EncoreAppContext.d.ts.map +1 -1
- package/dist/src/contexts/EncoreBindingContext.d.ts +1 -2
- package/dist/src/contexts/EncoreBindingContext.d.ts.map +1 -1
- package/dist/src/contexts/EncoreComponentIdContext.d.ts +1 -2
- package/dist/src/contexts/EncoreComponentIdContext.d.ts.map +1 -1
- package/dist/src/contexts/EncoreRepeatingContainerContext.d.ts +1 -2
- package/dist/src/contexts/EncoreRepeatingContainerContext.d.ts.map +1 -1
- package/dist/src/contexts/EncoreRouterContext.d.ts +1 -2
- package/dist/src/contexts/EncoreRouterContext.d.ts.map +1 -1
- package/dist/src/hooks/useAuthRedirect.d.ts.map +1 -1
- package/dist/src/hooks/usePusherUpdates.d.ts.map +1 -1
- package/dist/src/index.d.ts +2 -1
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/lib/fetcher.d.ts.map +1 -1
- package/dist/src/stores/useEncoreState.d.ts.map +1 -1
- package/dist/src/version.d.ts +2 -0
- package/dist/src/version.d.ts.map +1 -0
- package/dist/stores/useEncoreState.js.map +1 -1
- package/dist/version.js +5 -0
- package/dist/version.js.map +1 -0
- package/package.json +3 -2
- package/src/components/DynamicComponent.tsx +1 -0
- package/src/components/EncoreApp.tsx +3 -1
- package/src/components/EncoreErrorBoundary.tsx +36 -35
- package/src/components/EncoreLoadingFallback.tsx +19 -18
- package/src/components.tsx +35 -34
- package/src/contexts/EncoreActionContext.ts +4 -2
- package/src/contexts/EncoreAppContext.ts +4 -2
- package/src/contexts/EncoreBindingContext.ts +4 -2
- package/src/contexts/EncoreComponentIdContext.ts +4 -4
- package/src/contexts/EncoreRepeatingContainerContext.ts +4 -3
- package/src/contexts/EncoreRouterContext.ts +4 -2
- package/src/hooks/useAuthRedirect.ts +2 -0
- package/src/hooks/usePusherUpdates.ts +2 -0
- package/src/index.ts +2 -0
- package/src/stores/useEncoreState.ts +2 -0
- package/src/version.ts +1 -0
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { jsx as a } from "react/jsx-runtime";
|
|
2
|
-
import Z from "swr";
|
|
2
|
+
import Z from "../node_modules/swr/dist/index/index.js";
|
|
3
3
|
import z from "../lib/fetcher.js";
|
|
4
4
|
import p from "../stores/useEncoreState.js";
|
|
5
|
-
import le, { useRef as Y, useEffect as i, useState as
|
|
6
|
-
import { setLocalModeOverride as
|
|
5
|
+
import le, { useRef as Y, useEffect as i, useState as O, useCallback as m, useMemo as ie, Suspense as pe } from "react";
|
|
6
|
+
import { setLocalModeOverride as P, isLocalMode as U } from "../lib/localMode.js";
|
|
7
7
|
import de from "../contexts/EncoreBindingContext.js";
|
|
8
8
|
import fe from "../contexts/EncoreComponentIdContext.js";
|
|
9
9
|
import ue from "../contexts/EncoreActionContext.js";
|
|
@@ -25,7 +25,7 @@ const Ee = ({ to: r, children: l, style: v, ...A }) => {
|
|
|
25
25
|
children: l
|
|
26
26
|
}
|
|
27
27
|
);
|
|
28
|
-
}, Ae = (r) => r.setApp, $e = (r) => r.setAppId, we = (r) => r.setPageId, Re = (r) => r.assetsById,
|
|
28
|
+
}, Ae = (r) => r.setApp, $e = (r) => r.setAppId, we = (r) => r.setPageId, Re = (r) => r.assetsById, Me = ({
|
|
29
29
|
appId: r,
|
|
30
30
|
pageId: l,
|
|
31
31
|
componentId: v,
|
|
@@ -36,19 +36,19 @@ const Ee = ({ to: r, children: l, style: v, ...A }) => {
|
|
|
36
36
|
data: $,
|
|
37
37
|
source: f,
|
|
38
38
|
repeatingContainerControls: g,
|
|
39
|
-
inputGroups:
|
|
40
|
-
baseURL:
|
|
39
|
+
inputGroups: D,
|
|
40
|
+
baseURL: b,
|
|
41
41
|
appDefinition: w,
|
|
42
|
-
pageDefinition:
|
|
42
|
+
pageDefinition: x,
|
|
43
43
|
componentCode: Q
|
|
44
44
|
}) => {
|
|
45
45
|
console.log("Render: EncoreApp"), console.log("๐ฅ ENCORE-LIB SOURCE CODE IS ACTIVE ๐ฅ"), console.log("โจ ENCORE-LIB UPDATED - TEST MESSAGE โจ"), console.log(
|
|
46
46
|
`[AG_DEBUG] [EncoreApp] Render Start. appId: ${r}, pageId: ${l}`
|
|
47
|
-
),
|
|
48
|
-
const X = !1, k = p(Ae),
|
|
47
|
+
), b && p.getState().baseURL !== b && p.getState().setBaseURL(b), f && P(f === "local" ? "local" : "remote");
|
|
48
|
+
const X = !1, k = p(Ae), N = p($e), I = p(we), E = p(Re), M = Y(null), F = Y(null);
|
|
49
49
|
i(() => {
|
|
50
50
|
if (!y) return;
|
|
51
|
-
const t =
|
|
51
|
+
const t = F.current;
|
|
52
52
|
if (!t) return;
|
|
53
53
|
const o = () => {
|
|
54
54
|
y({
|
|
@@ -60,16 +60,16 @@ const Ee = ({ to: r, children: l, style: v, ...A }) => {
|
|
|
60
60
|
});
|
|
61
61
|
return o(), e.observe(t), () => e.disconnect();
|
|
62
62
|
}, [y]);
|
|
63
|
-
const [ee, te] =
|
|
63
|
+
const [ee, te] = O(0), oe = m(() => {
|
|
64
64
|
te((t) => typeof t == "number" ? t + 1 : Date.now());
|
|
65
65
|
}, []);
|
|
66
66
|
ge({
|
|
67
67
|
appId: r,
|
|
68
68
|
pageId: l || void 0,
|
|
69
|
-
enabled: !
|
|
69
|
+
enabled: !U() && !w,
|
|
70
70
|
onUpdate: oe
|
|
71
71
|
});
|
|
72
|
-
const
|
|
72
|
+
const C = f === "local" || U(), L = w ? null : r && `/devices/apps/${r}${C ? "?useLocal=1" : ""}`, ne = Z(L, z, {
|
|
73
73
|
suspense: !!L
|
|
74
74
|
// Only use suspense if we are fetching
|
|
75
75
|
}), u = w ? { data: w } : ne;
|
|
@@ -88,9 +88,12 @@ const Ee = ({ to: r, children: l, style: v, ...A }) => {
|
|
|
88
88
|
try {
|
|
89
89
|
const e = o?.fontName?.family, n = o?.url, s = o?.fontName?.postScriptName;
|
|
90
90
|
if (!e || !n) return;
|
|
91
|
-
o.broken
|
|
92
|
-
|
|
93
|
-
|
|
91
|
+
if (o.broken) {
|
|
92
|
+
console.warn(
|
|
93
|
+
`[EncoreApp] Font "${s || e}" is marked as broken in the database. URL: ${n} - SKIPPING DOWNLOAD`
|
|
94
|
+
);
|
|
95
|
+
return;
|
|
96
|
+
}
|
|
94
97
|
const c = s || e;
|
|
95
98
|
new FontFace(c, `url(${n})`, {
|
|
96
99
|
weight: "100 900",
|
|
@@ -116,10 +119,10 @@ const Ee = ({ to: r, children: l, style: v, ...A }) => {
|
|
|
116
119
|
}
|
|
117
120
|
}));
|
|
118
121
|
}, [u?.data]), i(() => {
|
|
119
|
-
|
|
120
|
-
}, [r,
|
|
121
|
-
l &&
|
|
122
|
-
}, [l,
|
|
122
|
+
N(r);
|
|
123
|
+
}, [r, N]), i(() => {
|
|
124
|
+
l && I(l);
|
|
125
|
+
}, [l, I]), i(() => {
|
|
123
126
|
Object.keys(E).length !== 0 && (async () => await Promise.allSettled(
|
|
124
127
|
Object.keys(E).map((t) => E[t].url ? new Promise((o) => {
|
|
125
128
|
const e = new Image();
|
|
@@ -127,9 +130,9 @@ const Ee = ({ to: r, children: l, style: v, ...A }) => {
|
|
|
127
130
|
}) : Promise.resolve())
|
|
128
131
|
))();
|
|
129
132
|
}, [E]);
|
|
130
|
-
const
|
|
131
|
-
console.log(`[AG_DEBUG] [EncoreApp] pageUrl: ${
|
|
132
|
-
const re = Z(
|
|
133
|
+
const B = x ? null : r && l && `/devices/apps/${r}/node/${l}${C ? "?useLocal=1" : ""}`;
|
|
134
|
+
console.log(`[AG_DEBUG] [EncoreApp] pageUrl: ${B}`);
|
|
135
|
+
const re = Z(B, z, { suspense: !!B }), h = x ? { data: x } : re;
|
|
133
136
|
console.log(
|
|
134
137
|
`[AG_DEBUG] [EncoreApp] pageData.data type: ${typeof h?.data}, hasData: ${!!h?.data}`
|
|
135
138
|
), h?.data && console.log(
|
|
@@ -170,7 +173,7 @@ const Ee = ({ to: r, children: l, style: v, ...A }) => {
|
|
|
170
173
|
// Support for standalone component data binding (encore:data tags at root level)
|
|
171
174
|
rootData: $
|
|
172
175
|
};
|
|
173
|
-
}, [h.data?.clientData, $]), [_, W] =
|
|
176
|
+
}, [h.data?.clientData, $]), [_, W] = O(/* @__PURE__ */ new Map()), [R, j] = O(/* @__PURE__ */ new Map());
|
|
174
177
|
i(() => {
|
|
175
178
|
g && j((t) => {
|
|
176
179
|
let o = !1;
|
|
@@ -197,13 +200,13 @@ const Ee = ({ to: r, children: l, style: v, ...A }) => {
|
|
|
197
200
|
}), e;
|
|
198
201
|
});
|
|
199
202
|
}, [g]), i(() => {
|
|
200
|
-
if (
|
|
203
|
+
if (D) {
|
|
201
204
|
const t = p.getState().setInputGroupValue;
|
|
202
|
-
Object.entries(
|
|
205
|
+
Object.entries(D).forEach(([o, e]) => {
|
|
203
206
|
t(o, e);
|
|
204
207
|
});
|
|
205
208
|
}
|
|
206
|
-
}, [
|
|
209
|
+
}, [D]);
|
|
207
210
|
const T = m(
|
|
208
211
|
(t, o) => {
|
|
209
212
|
W((e) => {
|
|
@@ -220,7 +223,7 @@ const Ee = ({ to: r, children: l, style: v, ...A }) => {
|
|
|
220
223
|
}, []), H = m(
|
|
221
224
|
(t) => _.get(t),
|
|
222
225
|
[_]
|
|
223
|
-
),
|
|
226
|
+
), K = m(
|
|
224
227
|
(t, o) => {
|
|
225
228
|
j((e) => {
|
|
226
229
|
const n = new Map(e), s = n.get(t) || {}, c = typeof o == "function" ? o(s) : o;
|
|
@@ -228,7 +231,7 @@ const Ee = ({ to: r, children: l, style: v, ...A }) => {
|
|
|
228
231
|
});
|
|
229
232
|
},
|
|
230
233
|
[]
|
|
231
|
-
),
|
|
234
|
+
), J = m(
|
|
232
235
|
(t) => R.get(t),
|
|
233
236
|
[R]
|
|
234
237
|
), ce = le.useMemo(
|
|
@@ -236,8 +239,8 @@ const Ee = ({ to: r, children: l, style: v, ...A }) => {
|
|
|
236
239
|
registerContainer: T,
|
|
237
240
|
unregisterContainer: V,
|
|
238
241
|
getControl: H,
|
|
239
|
-
setControlProps:
|
|
240
|
-
getControlProps:
|
|
242
|
+
setControlProps: K,
|
|
243
|
+
getControlProps: J,
|
|
241
244
|
// Include controlPropsMap size in the value to trigger re-renders when it changes
|
|
242
245
|
_propsVersion: R.size
|
|
243
246
|
}),
|
|
@@ -245,14 +248,14 @@ const Ee = ({ to: r, children: l, style: v, ...A }) => {
|
|
|
245
248
|
T,
|
|
246
249
|
V,
|
|
247
250
|
H,
|
|
248
|
-
J,
|
|
249
251
|
K,
|
|
252
|
+
J,
|
|
250
253
|
R.size
|
|
251
254
|
]
|
|
252
255
|
);
|
|
253
256
|
return i(() => {
|
|
254
257
|
if (!d) return;
|
|
255
|
-
const t =
|
|
258
|
+
const t = M.current;
|
|
256
259
|
if (!t) return;
|
|
257
260
|
const o = (s) => {
|
|
258
261
|
const c = s.contentRect;
|
|
@@ -266,13 +269,13 @@ const Ee = ({ to: r, children: l, style: v, ...A }) => {
|
|
|
266
269
|
};
|
|
267
270
|
}, [d]), i(() => {
|
|
268
271
|
if (f)
|
|
269
|
-
return
|
|
270
|
-
|
|
272
|
+
return P(f === "local" ? "local" : "remote"), () => {
|
|
273
|
+
P(null);
|
|
271
274
|
};
|
|
272
275
|
}, [f]), l ? /* @__PURE__ */ a(
|
|
273
276
|
"div",
|
|
274
277
|
{
|
|
275
|
-
ref:
|
|
278
|
+
ref: M,
|
|
276
279
|
style: {
|
|
277
280
|
width: "100%",
|
|
278
281
|
height: "100%",
|
|
@@ -282,7 +285,7 @@ const Ee = ({ to: r, children: l, style: v, ...A }) => {
|
|
|
282
285
|
children: /* @__PURE__ */ a(
|
|
283
286
|
"div",
|
|
284
287
|
{
|
|
285
|
-
ref:
|
|
288
|
+
ref: F,
|
|
286
289
|
style: {
|
|
287
290
|
width: "100%",
|
|
288
291
|
height: "100%",
|
|
@@ -308,7 +311,7 @@ const Ee = ({ to: r, children: l, style: v, ...A }) => {
|
|
|
308
311
|
}
|
|
309
312
|
)
|
|
310
313
|
}
|
|
311
|
-
) : /* @__PURE__ */ a("div", { style: { padding: "30px" }, children: /* @__PURE__ */ a("div", { style: { overflowY: "auto" }, children: (
|
|
314
|
+
) : /* @__PURE__ */ a("div", { style: { padding: "30px" }, children: /* @__PURE__ */ a("div", { style: { overflowY: "auto" }, children: (U() ? (
|
|
312
315
|
// Local mode: app.json provides pages under app.data.pages
|
|
313
316
|
(u?.data?.app?.data?.pages || []).map(
|
|
314
317
|
(t) => t?.id
|
|
@@ -328,6 +331,6 @@ const Ee = ({ to: r, children: l, style: v, ...A }) => {
|
|
|
328
331
|
)) }) });
|
|
329
332
|
};
|
|
330
333
|
export {
|
|
331
|
-
|
|
334
|
+
Me as default
|
|
332
335
|
};
|
|
333
336
|
//# sourceMappingURL=EncoreApp.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"EncoreApp.js","sources":["../../src/components/EncoreApp.tsx"],"sourcesContent":["import useSWR from \"swr\";\nimport fetcher from \"../lib/fetcher\";\nimport useEncoreState from \"../stores/useEncoreState\";\nimport React, {\n Suspense,\n useEffect,\n useRef,\n useState,\n useCallback,\n useMemo,\n} from \"react\";\nimport { isLocalMode, setLocalModeOverride } from \"../lib/localMode\";\nimport EncoreBindingContext from \"../contexts/EncoreBindingContext\";\nimport EncoreComponentIdContext from \"../contexts/EncoreComponentIdContext\";\nimport EncoreActionContext, {\n type EncoreActionPayload,\n} from \"../contexts/EncoreActionContext\";\nimport EncoreRepeatingContainerContext, {\n type RepeatingContainerControl,\n} from \"../contexts/EncoreRepeatingContainerContext\";\nimport DynamicComponent from \"./DynamicComponent\";\n// import { Link } from \"react-router-dom\"; // Removed dependency\nimport { useEncoreRouter } from \"../contexts/EncoreRouterContext\";\nimport { usePusherUpdates } from \"../hooks/usePusherUpdates\";\n\n// Simple internal Link component that uses our router context\nconst Link = ({ to, children, style, ...props }: any) => {\n const { navigate } = useEncoreRouter();\n return (\n <a\n href={to}\n onClick={(e) => {\n e.preventDefault();\n navigate(to);\n }}\n style={{ cursor: \"pointer\", ...style }}\n {...props}\n >\n {children}\n </a>\n );\n};\n\ntype Props = {\n appId: string;\n pageId?: string;\n componentId?: string;\n fallback?: React.ReactNode;\n onSizeChange?: (size: { width: number; height: number }) => void;\n onContentSizeChange?: (size: { width: number; height: number }) => void;\n onAction?: (payload: EncoreActionPayload) => void | Promise<void>;\n data?: Record<string, string | number | any[]>;\n // When provided, force the runtime to load from either remote or local sources\n source?: \"remote\" | \"local\";\n // Control repeating containers (sliders, lists, etc.) by container ID\n repeatingContainerControls?: Record<\n string,\n { currentIndex?: number; onIndexChange?: (index: number) => void }\n >;\n // Control input groups - maps group name to active element name\n inputGroups?: Record<string, string>;\n // Base URL for the Encore service API (e.g., \"https://api.example.com\")\n baseURL?: string;\n appDefinition?: any;\n pageDefinition?: any;\n componentCode?: string;\n};\n\ntype EncoreAssetsById = Record<string, { url?: string }>;\ntype EncoreState = {\n setApp: (app: unknown) => void;\n setAppId: (id: string) => void;\n setPageId: (id: string) => void;\n assetsById: EncoreAssetsById;\n};\n\nconst setAppSelector = (state: EncoreState) => state.setApp;\nconst setAppIdSelector = (state: EncoreState) => state.setAppId;\nconst setPageIdSelector = (state: EncoreState) => state.setPageId;\nconst assetsByIdSelector = (state: EncoreState) => state.assetsById;\n\nconst EncoreApp = ({\n appId,\n pageId,\n componentId,\n fallback,\n onSizeChange,\n onContentSizeChange,\n onAction,\n data,\n source,\n repeatingContainerControls,\n inputGroups,\n baseURL,\n appDefinition,\n pageDefinition,\n componentCode,\n}: Props) => {\n console.log(\"Render: EncoreApp\");\n console.log(\"๐ฅ ENCORE-LIB SOURCE CODE IS ACTIVE ๐ฅ\");\n console.log(\"โจ ENCORE-LIB UPDATED - TEST MESSAGE โจ\");\n console.log(\n `[AG_DEBUG] [EncoreApp] Render Start. appId: ${appId}, pageId: ${pageId}`\n );\n\n // CRITICAL: Set baseURL BEFORE any hooks that might trigger fetches\n // This must happen synchronously, not in useEffect, because useSWR will fetch immediately\n if (baseURL) {\n const currentBaseURL = useEncoreState.getState().baseURL;\n if (currentBaseURL !== baseURL) {\n useEncoreState.getState().setBaseURL(baseURL);\n }\n }\n\n // Apply source override immediately so hooks below observe correct mode\n if (source) {\n setLocalModeOverride(source === \"local\" ? \"local\" : \"remote\");\n }\n // const [searchParams] = useSearchParams();\n // const noRedirect = searchParams.get(\"noRedirect\");\n const noRedirect = false;\n\n const setApp = useEncoreState(setAppSelector);\n const setAppId = useEncoreState(setAppIdSelector);\n const setPageId = useEncoreState(setPageIdSelector);\n const assetsById = useEncoreState(assetsByIdSelector);\n const containerRef = useRef<HTMLDivElement | null>(null);\n const contentWrapperRef = useRef<HTMLDivElement | null>(null);\n\n // Monitor content size changes\n useEffect(() => {\n if (!onContentSizeChange) return;\n const element = contentWrapperRef.current;\n if (!element) return;\n\n const notify = () => {\n // Use scroll dimensions to get full size including overflow\n onContentSizeChange({\n width: element.scrollWidth,\n height: element.scrollHeight,\n });\n };\n\n const observer = new ResizeObserver(() => {\n notify();\n });\n\n // Emit initial size\n notify();\n observer.observe(element);\n return () => observer.disconnect();\n }, [onContentSizeChange]);\n\n // State to force DynamicComponent reload when updates are received\n const [reloadKey, setReloadKey] = useState<string | number>(0);\n // Set up Pusher to listen for component updates\n const handleUpdate = useCallback(() => {\n // Increment reloadKey to force DynamicComponent to reload\n setReloadKey((prev) => (typeof prev === \"number\" ? prev + 1 : Date.now()));\n }, []);\n\n // Only enable Pusher in remote mode - it doesn't make sense in local mode\n usePusherUpdates({\n appId,\n pageId: pageId || undefined,\n enabled: !isLocalMode() && !appDefinition,\n onUpdate: handleUpdate,\n });\n\n // usePusherUpdates({\n // appId,\n // pageId: pageId || undefined,\n // enabled: false, // DISABLED FOR DEBUGGING\n // onUpdate: handleUpdate,\n // });\n\n const useLocalFlag = source === \"local\" || isLocalMode();\n // If appDefinition is provided, disable SWR fetch by setting url to null\n const appUrl = appDefinition\n ? null\n : appId && `/devices/apps/${appId}${useLocalFlag ? \"?useLocal=1\" : \"\"}`;\n\n const appSWR = useSWR(appUrl, fetcher, {\n suspense: !!appUrl, // Only use suspense if we are fetching\n });\n\n const app = appDefinition ? { data: appDefinition } : appSWR;\n\n useEffect(() => {\n setApp(app.data);\n }, [app.data, setApp]);\n\n // Load fonts declared in app.json using the FontFace API\n useEffect(() => {\n type EncoreFont = {\n id?: string;\n url?: string;\n broken?: boolean;\n fontName?: { family?: string; postScriptName?: string };\n };\n type AppDataWithFonts = { app?: { fonts?: EncoreFont[] } };\n const fonts: EncoreFont[] =\n (app?.data as AppDataWithFonts | undefined)?.app?.fonts ?? [];\n\n console.log(\n `[AG_DEBUG] [EncoreApp] ๐ Font check initiated. Found ${\n fonts?.length || 0\n } fonts in app definition.`\n );\n if (fonts && fonts.length > 0) {\n console.log(\n \"[AG_DEBUG] [EncoreApp] Font list:\",\n fonts.map(\n (f) =>\n `${f.fontName?.family} (${f.fontName?.postScriptName}) - Broken: ${f.broken} - URL: ${f.url}`\n )\n );\n }\n\n if (!fonts || fonts.length === 0) return;\n if (typeof window === \"undefined\" || !(\"FontFace\" in window)) return;\n fonts.forEach((f) => {\n try {\n const family = f?.fontName?.family;\n const url = f?.url;\n const postScriptName = f?.fontName?.postScriptName;\n if (!family || !url) return;\n\n if (f.broken) {\n console.warn(\n `[EncoreApp] Font \"${\n postScriptName || family\n }\" is marked as broken in the database. URL: ${url}`\n );\n }\n\n const familyName = postScriptName || family;\n const fontFace = new FontFace(familyName, `url(${url})`, {\n weight: \"100 900\",\n style: \"normal\",\n });\n\n fontFace\n .load()\n .then((ff) => {\n document.fonts.add(ff);\n console.log(\n `[AG_DEBUG] [EncoreApp] โ
Font loaded successfully: \"${familyName}\" - Source: ${url}`\n );\n // Check if it's usable - check for any weight since we registered 100-900\n const isCheckPassed = document.fonts.check(\n `400 12px \"${familyName}\"`\n );\n console.log(\n `[AG_DEBUG] [EncoreApp] ๐งช document.fonts.check result for \"${familyName}\": ${isCheckPassed}`\n );\n })\n .catch((err) => {\n console.warn(\n `[AG_DEBUG] [EncoreApp] โ Failed to load font \"${\n postScriptName || family\n }\" from ${url}`,\n err\n );\n });\n } catch (err) {\n console.warn(`[EncoreApp] Error processing font:`, err);\n }\n });\n }, [app?.data]);\n\n useEffect(() => {\n setAppId(appId);\n }, [appId, setAppId]);\n\n useEffect(() => {\n if (!pageId) return;\n setPageId(pageId);\n }, [pageId, setPageId]);\n\n // FIXME: Asset data should be embedded into & preloaded by component, not looked up like this\n useEffect(() => {\n if (Object.keys(assetsById).length === 0) return;\n (async () => {\n // Preload images in the browser\n await Promise.allSettled(\n Object.keys(assetsById).map((id) => {\n if (assetsById[id].url) {\n return new Promise((resolve) => {\n const img = new Image();\n img.onload = resolve;\n img.onerror = resolve; // tolerate failures to avoid unhandled rejections\n img.src = assetsById[id].url!;\n });\n }\n return Promise.resolve();\n })\n );\n })();\n }, [assetsById]);\n\n const pageUrl = pageDefinition\n ? null\n : appId &&\n pageId &&\n `/devices/apps/${appId}/node/${pageId}${\n useLocalFlag ? \"?useLocal=1\" : \"\"\n }`;\n\n console.log(`[AG_DEBUG] [EncoreApp] pageUrl: ${pageUrl}`);\n\n const pageSWR = useSWR(pageUrl, fetcher, { suspense: !!pageUrl });\n const pageData = pageDefinition ? { data: pageDefinition } : pageSWR;\n\n console.log(\n `[AG_DEBUG] [EncoreApp] pageData.data type: ${typeof pageData?.data}, hasData: ${!!pageData?.data}`\n );\n if (pageData?.data) {\n console.log(\n `[AG_DEBUG] [EncoreApp] pageData.data JSON: ${JSON.stringify(\n pageData.data\n ).substring(0, 1000)}`\n );\n }\n\n // Debug logging commented out to prevent console flooding\n /*\n useEffect(() => {\n if (pageData.data) {\n console.log(\"=== PAGE DATA STRUCTURE ===\");\n console.log(\"Full pageData.data:\", pageData.data);\n console.log(\"pageData.data keys:\", Object.keys(pageData.data));\n console.log(\"Client data:\", pageData.data.clientData);\n console.log(\"Client data type:\", typeof pageData.data.clientData);\n console.log(\n \"Client data keys:\",\n pageData.data.clientData ? Object.keys(pageData.data.clientData) : \"N/A\"\n );\n\n // Try to find the actual node data structure\n const allKeys = Object.keys(pageData.data);\n console.log(\"All top-level keys in pageData.data:\", allKeys);\n\n // Log the full structure more deeply\n console.log(\n \"Full pageData.data structure:\",\n JSON.stringify(pageData.data, null, 2)\n );\n\n const clientData = pageData.data.clientData || pageData.data;\n\n // Helper to recursively search for sliders in tree structure\n const findSlidersInTree = (nodeData: any, path = \"\"): any[] => {\n const sliders: any[] = [];\n if (!nodeData || typeof nodeData !== \"object\") return sliders;\n\n // Check if this node is a slider\n const isSlider =\n nodeData.type === \"container:slider\" ||\n nodeData.type === \"component:slider\" ||\n nodeData.name?.toLowerCase().includes(\"slider\") ||\n (Array.isArray(nodeData.tags) &&\n nodeData.tags.some((tag: string) =>\n tag.toLowerCase().includes(\"slider\")\n ));\n\n if (isSlider) {\n sliders.push({\n path,\n id: nodeData.id,\n name: nodeData.name,\n type: nodeData.type,\n tags: nodeData.tags,\n data: nodeData.data,\n style: nodeData.style,\n fullNodeData: nodeData,\n });\n }\n\n // Recursively search children\n if (nodeData.children) {\n const children = Array.isArray(nodeData.children)\n ? nodeData.children\n : [nodeData.children];\n children.forEach((child: any, index: number) => {\n if (child && typeof child === \"object\") {\n sliders.push(...findSlidersInTree(child, `${path}/${index}`));\n }\n });\n }\n\n return sliders;\n };\n\n // Check if clientData is a flat object keyed by ID (most likely)\n let sliders: any[] = [];\n if (\n clientData &&\n typeof clientData === \"object\" &&\n !Array.isArray(clientData)\n ) {\n // Check if it's a flat structure (keyed by IDs)\n const entries = Object.entries(clientData);\n console.log(`Client data has ${entries.length} entries`);\n\n // Search all entries for sliders\n entries.forEach(([key, value]: [string, any]) => {\n if (value && typeof value === \"object\") {\n // Check if this entry itself is a slider\n const isSlider =\n value.type === \"container:slider\" ||\n value.type === \"component:slider\" ||\n value.name?.toLowerCase().includes(\"slider\") ||\n (Array.isArray(value.tags) &&\n value.tags.some((tag: string) =>\n tag.toLowerCase().includes(\"slider\")\n ));\n\n if (isSlider) {\n sliders.push({\n id: key,\n name: value.name,\n type: value.type,\n tags: value.tags,\n data: value.data,\n style: value.style,\n fullNodeData: value,\n });\n }\n\n // Also search recursively in case it's nested\n sliders.push(...findSlidersInTree(value, key));\n }\n });\n\n // If no sliders found in flat structure, try treating it as a tree\n if (sliders.length === 0) {\n sliders = findSlidersInTree(clientData, \"root\");\n }\n } else {\n // Treat as tree structure\n sliders = findSlidersInTree(clientData, \"root\");\n }\n\n console.log(\"=== SLIDER COMPONENTS FOUND ===\");\n console.log(`Found ${sliders.length} slider(s):`, sliders);\n\n sliders.forEach((slider, index) => {\n console.log(`\\n--- Slider ${index + 1} ---`);\n console.log(\"ID:\", slider.id);\n console.log(\"Name:\", slider.name);\n console.log(\"Type:\", slider.type);\n console.log(\"Tags:\", slider.tags);\n console.log(\"Data:\", slider.data);\n console.log(\"Full node data:\", slider.fullNodeData);\n\n // Look for data binding tags\n if (Array.isArray(slider.tags)) {\n const bindingTags = slider.tags.filter(\n (tag: string) =>\n tag.includes(\"PROP:\") ||\n tag.includes(\"LIST:\") ||\n tag.includes(\"DATA:\")\n );\n if (bindingTags.length > 0) {\n console.log(\"๐ Data binding tags found:\", bindingTags);\n }\n }\n });\n\n // Also log all unique tags found across all components for reference\n const allTags = new Set<string>();\n const allEntries = Object.entries(clientData);\n allEntries.forEach(([_, value]: [string, any]) => {\n if (value?.tags && Array.isArray(value.tags)) {\n value.tags.forEach((tag: string) => allTags.add(tag));\n }\n });\n console.log(\"\\n=== ALL UNIQUE TAGS IN PAGE ===\");\n console.log(Array.from(allTags).sort());\n }\n }, [pageData.data]);\n */\n\n // Memoize the context object to prevent infinite re-renders\n // Only recreate when the actual data changes, not on every render\n const context = useMemo(() => {\n let clientData = pageData.data?.clientData;\n console.log(\n `[AG_DEBUG] [EncoreApp] useMemo: clientData present? ${!!clientData}, Keys: ${Object.keys(\n clientData || {}\n )}`\n );\n\n // --- GENERIC DATA PATCHING START ---\n // Recursively patch the data to fix layout and slider issues based on heuristics\n const patchPageData = (node: any) => {\n if (!node || typeof node !== \"object\") return;\n\n // Log font usage\n if (node.componentId || node.type === \"component:text\") {\n console.log(\n `[AG_DEBUG] [EncoreApp] ๐ฆ Node ${node.id} (${node.type}) Style:`,\n JSON.stringify(node.style)\n );\n }\n\n // 1. Layout Heuristic: If children widths sum to ~100% or ~375px, force HORIZONTAL layout\n // RELAXED: No longer requires layoutSizingHorizontal: \"FIXED\" - width data alone is sufficient\n if (\n node.children &&\n Array.isArray(node.children) &&\n node.children.length > 1\n ) {\n let totalWidth = 0;\n let childrenWithWidth = 0;\n\n node.children.forEach((child: any) => {\n if (child.style?.width) {\n // Width might be a percentage or pixel value.\n // Based on logs, we saw \"width: 52\" and \"width: 48\" which sum to 100.\n // If it's percentage, we check if it sums to 100.\n // If it's pixels, we check if it sums to ~375.\n totalWidth += child.style.width;\n childrenWithWidth++;\n }\n });\n\n // Check for percentage sum ~100 or pixel sum ~375\n // Only apply if we have at least 2 children with width data\n const isFullWidthRow =\n (Math.abs(totalWidth - 100) < 1 || Math.abs(totalWidth - 375) < 5) &&\n childrenWithWidth >= 2;\n\n if (isFullWidthRow) {\n if (!node.style) node.style = {};\n if (!node.style.layout) node.style.layout = {};\n\n // Only apply if mode is missing or undefined\n if (!node.style.layout.mode) {\n console.log(\n `[PATCH] Forcing HORIZONTAL layout for node ${node.id} (${childrenWithWidth} children, widths sum: ${totalWidth})`\n );\n node.style.layout.mode = \"HORIZONTAL\";\n node.style.layout.primaryAxisAlignItems = \"flex-start\";\n node.style.layout.counterAxisAlignItems = \"flex-start\";\n }\n }\n }\n\n // 2. Slider Heuristic: If slider is taller than wide, force VERTICAL animation\n // DISABLED: This is too aggressive and breaks horizontal sliders that happen to be tall (e.g. 50% width columns)\n /*\n const isSlider =\n node.type === \"container:slider\" ||\n node.type === \"component:slider\" ||\n (node.tags &&\n Array.isArray(node.tags) &&\n node.tags.some((t: string) => t.toLowerCase().includes(\"slider\")));\n\n if (isSlider) {\n const width = node.style?.width || 0;\n const height = node.style?.height || 0;\n // Check aspect ratio. If height > width, it's likely vertical.\n // Note: width/height might be percentages or pixels.\n // If both are numbers, we can compare.\n // From logs: width: 52, height: 85.27. This is clearly vertical shape.\n if (height > width) {\n if (!node.data) node.data = {};\n if (!node.data.params) node.data.params = {};\n\n // Only apply if animation is default or missing\n if (\n !node.data.params.animation ||\n node.data.params.animation === \"default\" ||\n node.data.params.animation === \"horizontal\"\n ) {\n console.log(\n `[PATCH] Forcing VERTICAL animation for slider ${node.id} (W:${width}, H:${height})`\n );\n node.data.params.animation = \"vertical\";\n }\n }\n }\n */\n\n // Recurse\n if (node.children) {\n if (Array.isArray(node.children)) {\n node.children.forEach(patchPageData);\n } else {\n patchPageData(node.children);\n }\n }\n };\n\n if (clientData) {\n // Clone to avoid mutating SWR cache directly if possible, though deep clone might be expensive.\n // For now, patching in place as it's a fix.\n patchPageData(clientData);\n }\n // --- GENERIC DATA PATCHING END ---\n\n return {\n nodeData: undefined,\n // Allow overriding specific values by element id.\n // For now, this is used to override TextComponent content when the node has the PROP:TEXT_VAR tag.\n textOverridesById: data,\n // Support for encore:data:array tags - provide array data by component ID\n arrayDataById: data,\n // Support for standalone component data binding (encore:data tags at root level)\n rootData: data,\n };\n }, [pageData.data?.clientData, data]);\n\n // Manage repeating container controls\n const [containerControls, setContainerControls] = useState<\n Map<string, RepeatingContainerControl>\n >(new Map());\n const [controlPropsMap, setControlPropsMap] = useState<\n Map<\n string,\n { currentIndex?: number; onIndexChange?: (index: number) => void }\n >\n >(new Map());\n\n // Update control props from prop\n useEffect(() => {\n if (repeatingContainerControls) {\n setControlPropsMap((prev) => {\n // Check if content actually changed to avoid unnecessary updates\n let changed = false;\n if (prev.size !== Object.keys(repeatingContainerControls).length) {\n changed = true;\n } else {\n for (const [id, props] of Object.entries(\n repeatingContainerControls\n )) {\n const prevProps = prev.get(id);\n if (!prevProps) {\n changed = true;\n break;\n }\n if (\n prevProps.currentIndex !== props.currentIndex ||\n prevProps.onIndexChange !== props.onIndexChange\n ) {\n changed = true;\n break;\n }\n }\n }\n\n if (!changed) return prev;\n\n const newMap = new Map();\n Object.entries(repeatingContainerControls).forEach(([id, props]) => {\n newMap.set(id, props);\n });\n return newMap;\n });\n }\n }, [repeatingContainerControls]);\n\n // Sync input groups from props to store\n useEffect(() => {\n if (inputGroups) {\n const setInputGroupValue = useEncoreState.getState().setInputGroupValue;\n Object.entries(inputGroups).forEach(([groupName, elementName]) => {\n setInputGroupValue(groupName, elementName);\n });\n }\n }, [inputGroups]);\n\n const registerContainer = useCallback(\n (id: string, control: RepeatingContainerControl) => {\n setContainerControls((prev) => {\n const next = new Map(prev);\n next.set(id, control);\n return next;\n });\n },\n []\n );\n\n const unregisterContainer = useCallback((id: string) => {\n setContainerControls((prev) => {\n const next = new Map(prev);\n next.delete(id);\n return next;\n });\n // Do NOT delete from controlPropsMap here.\n // controlPropsMap contains props passed from the parent (repeatingContainerControls).\n // If we delete them, we lose the configuration passed down to us.\n // The props should persist even if the component temporarily unregisters.\n }, []);\n\n const getControl = useCallback(\n (id: string) => {\n return containerControls.get(id);\n },\n [containerControls]\n );\n\n const setControlProps = useCallback(\n (\n id: string,\n props:\n | { currentIndex?: number; onIndexChange?: (index: number) => void }\n | ((prev: {\n currentIndex?: number;\n onIndexChange?: (index: number) => void;\n }) => {\n currentIndex?: number;\n onIndexChange?: (index: number) => void;\n })\n ) => {\n setControlPropsMap((prev) => {\n const next = new Map(prev);\n const current = next.get(id) || {};\n const newProps = typeof props === \"function\" ? props(current) : props;\n next.set(id, newProps);\n return next;\n });\n },\n []\n );\n\n const getControlProps = useCallback(\n (id: string) => {\n return controlPropsMap.get(id);\n },\n [controlPropsMap]\n );\n\n // Control props are automatically passed to registered containers via context\n // Components read props via getControlProps() and update when props change\n\n // Create context value - this object changes when controlPropsMap changes,\n // causing all consumers to re-render and get updated props\n const repeatingContainerContextValue = React.useMemo(\n () => ({\n registerContainer,\n unregisterContainer,\n getControl,\n setControlProps,\n getControlProps,\n // Include controlPropsMap size in the value to trigger re-renders when it changes\n _propsVersion: controlPropsMap.size,\n }),\n [\n registerContainer,\n unregisterContainer,\n getControl,\n setControlProps,\n getControlProps,\n controlPropsMap.size,\n ]\n );\n\n // Observe size changes of the dynamic content container and notify consumer\n useEffect(() => {\n if (!onSizeChange) return;\n const element = containerRef.current;\n if (!element) return;\n const notify = (entry: ResizeObserverEntry) => {\n const cr = entry.contentRect;\n onSizeChange({ width: cr.width, height: cr.height });\n };\n const observer = new ResizeObserver((entries) => {\n for (const entry of entries) {\n notify(entry);\n }\n });\n // Emit initial size as soon as possible\n const rect = element.getBoundingClientRect();\n onSizeChange({ width: rect.width, height: rect.height });\n observer.observe(element);\n return () => {\n observer.disconnect();\n };\n }, [onSizeChange]);\n\n // Per-instance source override\n useEffect(() => {\n if (!source) return;\n setLocalModeOverride(source === \"local\" ? \"local\" : \"remote\");\n return () => {\n // Clear override when this instance unmounts\n setLocalModeOverride(null);\n };\n }, [source]);\n\n if (!pageId) {\n return (\n <div style={{ padding: \"30px\" }}>\n <div style={{ overflowY: \"auto\" }}>\n {(isLocalMode()\n ? // Local mode: app.json provides pages under app.data.pages\n ((app?.data as any)?.app?.data?.pages || []).map(\n (pg: any) => pg?.id\n )\n : app?.data?.app.pageIds || []\n ).map((p: string) => (\n <Link\n key={p}\n to={`/apps/${appId}/pages/${p}?noRedirect=${noRedirect}`}\n style={{\n fontSize: 20,\n display: \"block\",\n marginBottom: \"10px\",\n }}\n >\n {p}\n </Link>\n ))}\n </div>\n </div>\n );\n }\n return (\n <div\n ref={containerRef}\n style={{\n width: \"100%\",\n height: \"100%\",\n position: \"relative\",\n overflow: \"hidden\",\n }}\n >\n <div\n ref={contentWrapperRef}\n style={{\n width: \"100%\",\n height: \"100%\",\n display: \"flex\",\n flexDirection: \"column\",\n }}\n >\n <Suspense fallback={fallback || <div />}>\n <EncoreComponentIdContext.Provider value={{ componentId }}>\n <EncoreActionContext.Provider value={{ onAction }}>\n <EncoreRepeatingContainerContext.Provider\n value={repeatingContainerContextValue}\n >\n <EncoreBindingContext.Provider value={context}>\n <DynamicComponent\n name={`${appId}/draft/components/${pageId}`}\n fallback={fallback}\n reloadKey={reloadKey}\n componentCode={componentCode}\n >\n {\" \"}\n </DynamicComponent>\n </EncoreBindingContext.Provider>\n </EncoreRepeatingContainerContext.Provider>\n </EncoreActionContext.Provider>\n </EncoreComponentIdContext.Provider>\n </Suspense>\n </div>\n </div>\n );\n};\n\nexport default EncoreApp;\n"],"names":["Link","to","children","style","props","navigate","useEncoreRouter","jsx","e","setAppSelector","state","setAppIdSelector","setPageIdSelector","assetsByIdSelector","EncoreApp","appId","pageId","componentId","fallback","onSizeChange","onContentSizeChange","onAction","data","source","repeatingContainerControls","inputGroups","baseURL","appDefinition","pageDefinition","componentCode","useEncoreState","setLocalModeOverride","noRedirect","setApp","setAppId","setPageId","assetsById","containerRef","useRef","contentWrapperRef","useEffect","element","notify","observer","reloadKey","setReloadKey","useState","handleUpdate","useCallback","prev","usePusherUpdates","isLocalMode","useLocalFlag","appUrl","appSWR","useSWR","fetcher","app","fonts","f","family","url","postScriptName","familyName","ff","isCheckPassed","err","id","resolve","img","pageUrl","pageSWR","pageData","context","useMemo","clientData","patchPageData","node","totalWidth","childrenWithWidth","child","containerControls","setContainerControls","controlPropsMap","setControlPropsMap","changed","prevProps","newMap","setInputGroupValue","groupName","elementName","registerContainer","control","next","unregisterContainer","getControl","setControlProps","current","newProps","getControlProps","repeatingContainerContextValue","React","entry","cr","entries","rect","Suspense","EncoreComponentIdContext","EncoreActionContext","EncoreRepeatingContainerContext","EncoreBindingContext","DynamicComponent","pg","p"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"EncoreApp.js","sources":["../../src/components/EncoreApp.tsx"],"sourcesContent":["\"use client\";\nimport useSWR from \"swr\";\nimport fetcher from \"../lib/fetcher\";\nimport useEncoreState from \"../stores/useEncoreState\";\nimport React, {\n Suspense,\n useEffect,\n useRef,\n useState,\n useCallback,\n useMemo,\n} from \"react\";\nimport { isLocalMode, setLocalModeOverride } from \"../lib/localMode\";\nimport EncoreBindingContext from \"../contexts/EncoreBindingContext\";\nimport EncoreComponentIdContext from \"../contexts/EncoreComponentIdContext\";\nimport EncoreActionContext, {\n type EncoreActionPayload,\n} from \"../contexts/EncoreActionContext\";\nimport EncoreRepeatingContainerContext, {\n type RepeatingContainerControl,\n} from \"../contexts/EncoreRepeatingContainerContext\";\nimport DynamicComponent from \"./DynamicComponent\";\n// import { Link } from \"react-router-dom\"; // Removed dependency\nimport { useEncoreRouter } from \"../contexts/EncoreRouterContext\";\nimport { usePusherUpdates } from \"../hooks/usePusherUpdates\";\n\n// Simple internal Link component that uses our router context\nconst Link = ({ to, children, style, ...props }: any) => {\n const { navigate } = useEncoreRouter();\n return (\n <a\n href={to}\n onClick={(e) => {\n e.preventDefault();\n navigate(to);\n }}\n style={{ cursor: \"pointer\", ...style }}\n {...props}\n >\n {children}\n </a>\n );\n};\n\ntype Props = {\n appId: string;\n pageId?: string;\n componentId?: string;\n fallback?: React.ReactNode;\n onSizeChange?: (size: { width: number; height: number }) => void;\n onContentSizeChange?: (size: { width: number; height: number }) => void;\n onAction?: (payload: EncoreActionPayload) => void | Promise<void>;\n data?: Record<string, string | number | any[]>;\n // When provided, force the runtime to load from either remote or local sources\n source?: \"remote\" | \"local\";\n // Control repeating containers (sliders, lists, etc.) by container ID\n repeatingContainerControls?: Record<\n string,\n { currentIndex?: number; onIndexChange?: (index: number) => void }\n >;\n // Control input groups - maps group name to active element name\n inputGroups?: Record<string, string>;\n // Base URL for the Encore service API (e.g., \"https://api.example.com\")\n baseURL?: string;\n appDefinition?: any;\n pageDefinition?: any;\n componentCode?: string;\n};\n\ntype EncoreAssetsById = Record<string, { url?: string }>;\ntype EncoreState = {\n setApp: (app: unknown) => void;\n setAppId: (id: string) => void;\n setPageId: (id: string) => void;\n assetsById: EncoreAssetsById;\n};\n\nconst setAppSelector = (state: EncoreState) => state.setApp;\nconst setAppIdSelector = (state: EncoreState) => state.setAppId;\nconst setPageIdSelector = (state: EncoreState) => state.setPageId;\nconst assetsByIdSelector = (state: EncoreState) => state.assetsById;\n\nconst EncoreApp = ({\n appId,\n pageId,\n componentId,\n fallback,\n onSizeChange,\n onContentSizeChange,\n onAction,\n data,\n source,\n repeatingContainerControls,\n inputGroups,\n baseURL,\n appDefinition,\n pageDefinition,\n componentCode,\n}: Props) => {\n console.log(\"Render: EncoreApp\");\n console.log(\"๐ฅ ENCORE-LIB SOURCE CODE IS ACTIVE ๐ฅ\");\n console.log(\"โจ ENCORE-LIB UPDATED - TEST MESSAGE โจ\");\n console.log(\n `[AG_DEBUG] [EncoreApp] Render Start. appId: ${appId}, pageId: ${pageId}`\n );\n\n // CRITICAL: Set baseURL BEFORE any hooks that might trigger fetches\n // This must happen synchronously, not in useEffect, because useSWR will fetch immediately\n if (baseURL) {\n const currentBaseURL = useEncoreState.getState().baseURL;\n if (currentBaseURL !== baseURL) {\n useEncoreState.getState().setBaseURL(baseURL);\n }\n }\n\n // Apply source override immediately so hooks below observe correct mode\n if (source) {\n setLocalModeOverride(source === \"local\" ? \"local\" : \"remote\");\n }\n // const [searchParams] = useSearchParams();\n // const noRedirect = searchParams.get(\"noRedirect\");\n const noRedirect = false;\n\n const setApp = useEncoreState(setAppSelector);\n const setAppId = useEncoreState(setAppIdSelector);\n const setPageId = useEncoreState(setPageIdSelector);\n const assetsById = useEncoreState(assetsByIdSelector);\n const containerRef = useRef<HTMLDivElement | null>(null);\n const contentWrapperRef = useRef<HTMLDivElement | null>(null);\n\n // Monitor content size changes\n useEffect(() => {\n if (!onContentSizeChange) return;\n const element = contentWrapperRef.current;\n if (!element) return;\n\n const notify = () => {\n // Use scroll dimensions to get full size including overflow\n onContentSizeChange({\n width: element.scrollWidth,\n height: element.scrollHeight,\n });\n };\n\n const observer = new ResizeObserver(() => {\n notify();\n });\n\n // Emit initial size\n notify();\n observer.observe(element);\n return () => observer.disconnect();\n }, [onContentSizeChange]);\n\n // State to force DynamicComponent reload when updates are received\n const [reloadKey, setReloadKey] = useState<string | number>(0);\n // Set up Pusher to listen for component updates\n const handleUpdate = useCallback(() => {\n // Increment reloadKey to force DynamicComponent to reload\n setReloadKey((prev) => (typeof prev === \"number\" ? prev + 1 : Date.now()));\n }, []);\n\n // Only enable Pusher in remote mode - it doesn't make sense in local mode\n usePusherUpdates({\n appId,\n pageId: pageId || undefined,\n enabled: !isLocalMode() && !appDefinition,\n onUpdate: handleUpdate,\n });\n\n // usePusherUpdates({\n // appId,\n // pageId: pageId || undefined,\n // enabled: false, // DISABLED FOR DEBUGGING\n // onUpdate: handleUpdate,\n // });\n\n const useLocalFlag = source === \"local\" || isLocalMode();\n // If appDefinition is provided, disable SWR fetch by setting url to null\n const appUrl = appDefinition\n ? null\n : appId && `/devices/apps/${appId}${useLocalFlag ? \"?useLocal=1\" : \"\"}`;\n\n const appSWR = useSWR(appUrl, fetcher, {\n suspense: !!appUrl, // Only use suspense if we are fetching\n });\n\n const app = appDefinition ? { data: appDefinition } : appSWR;\n\n useEffect(() => {\n setApp(app.data);\n }, [app.data, setApp]);\n\n // Load fonts declared in app.json using the FontFace API\n useEffect(() => {\n type EncoreFont = {\n id?: string;\n url?: string;\n broken?: boolean;\n fontName?: { family?: string; postScriptName?: string };\n };\n type AppDataWithFonts = { app?: { fonts?: EncoreFont[] } };\n const fonts: EncoreFont[] =\n (app?.data as AppDataWithFonts | undefined)?.app?.fonts ?? [];\n\n console.log(\n `[AG_DEBUG] [EncoreApp] ๐ Font check initiated. Found ${\n fonts?.length || 0\n } fonts in app definition.`\n );\n if (fonts && fonts.length > 0) {\n console.log(\n \"[AG_DEBUG] [EncoreApp] Font list:\",\n fonts.map(\n (f) =>\n `${f.fontName?.family} (${f.fontName?.postScriptName}) - Broken: ${f.broken} - URL: ${f.url}`\n )\n );\n }\n\n if (!fonts || fonts.length === 0) return;\n if (typeof window === \"undefined\" || !(\"FontFace\" in window)) return;\n fonts.forEach((f) => {\n try {\n const family = f?.fontName?.family;\n const url = f?.url;\n const postScriptName = f?.fontName?.postScriptName;\n if (!family || !url) return;\n\n if (f.broken) {\n console.warn(\n `[EncoreApp] Font \"${\n postScriptName || family\n }\" is marked as broken in the database. URL: ${url} - SKIPPING DOWNLOAD`\n );\n return;\n }\n\n const familyName = postScriptName || family;\n const fontFace = new FontFace(familyName, `url(${url})`, {\n weight: \"100 900\",\n style: \"normal\",\n });\n\n fontFace\n .load()\n .then((ff) => {\n document.fonts.add(ff);\n console.log(\n `[AG_DEBUG] [EncoreApp] โ
Font loaded successfully: \"${familyName}\" - Source: ${url}`\n );\n // Check if it's usable - check for any weight since we registered 100-900\n const isCheckPassed = document.fonts.check(\n `400 12px \"${familyName}\"`\n );\n console.log(\n `[AG_DEBUG] [EncoreApp] ๐งช document.fonts.check result for \"${familyName}\": ${isCheckPassed}`\n );\n })\n .catch((err) => {\n console.warn(\n `[AG_DEBUG] [EncoreApp] โ Failed to load font \"${\n postScriptName || family\n }\" from ${url}`,\n err\n );\n });\n } catch (err) {\n console.warn(`[EncoreApp] Error processing font:`, err);\n }\n });\n }, [app?.data]);\n\n useEffect(() => {\n setAppId(appId);\n }, [appId, setAppId]);\n\n useEffect(() => {\n if (!pageId) return;\n setPageId(pageId);\n }, [pageId, setPageId]);\n\n // FIXME: Asset data should be embedded into & preloaded by component, not looked up like this\n useEffect(() => {\n if (Object.keys(assetsById).length === 0) return;\n (async () => {\n // Preload images in the browser\n await Promise.allSettled(\n Object.keys(assetsById).map((id) => {\n if (assetsById[id].url) {\n return new Promise((resolve) => {\n const img = new Image();\n img.onload = resolve;\n img.onerror = resolve; // tolerate failures to avoid unhandled rejections\n img.src = assetsById[id].url!;\n });\n }\n return Promise.resolve();\n })\n );\n })();\n }, [assetsById]);\n\n const pageUrl = pageDefinition\n ? null\n : appId &&\n pageId &&\n `/devices/apps/${appId}/node/${pageId}${\n useLocalFlag ? \"?useLocal=1\" : \"\"\n }`;\n\n console.log(`[AG_DEBUG] [EncoreApp] pageUrl: ${pageUrl}`);\n\n const pageSWR = useSWR(pageUrl, fetcher, { suspense: !!pageUrl });\n const pageData = pageDefinition ? { data: pageDefinition } : pageSWR;\n\n console.log(\n `[AG_DEBUG] [EncoreApp] pageData.data type: ${typeof pageData?.data}, hasData: ${!!pageData?.data}`\n );\n if (pageData?.data) {\n console.log(\n `[AG_DEBUG] [EncoreApp] pageData.data JSON: ${JSON.stringify(\n pageData.data\n ).substring(0, 1000)}`\n );\n }\n\n // Debug logging commented out to prevent console flooding\n /*\n useEffect(() => {\n if (pageData.data) {\n console.log(\"=== PAGE DATA STRUCTURE ===\");\n console.log(\"Full pageData.data:\", pageData.data);\n console.log(\"pageData.data keys:\", Object.keys(pageData.data));\n console.log(\"Client data:\", pageData.data.clientData);\n console.log(\"Client data type:\", typeof pageData.data.clientData);\n console.log(\n \"Client data keys:\",\n pageData.data.clientData ? Object.keys(pageData.data.clientData) : \"N/A\"\n );\n\n // Try to find the actual node data structure\n const allKeys = Object.keys(pageData.data);\n console.log(\"All top-level keys in pageData.data:\", allKeys);\n\n // Log the full structure more deeply\n console.log(\n \"Full pageData.data structure:\",\n JSON.stringify(pageData.data, null, 2)\n );\n\n const clientData = pageData.data.clientData || pageData.data;\n\n // Helper to recursively search for sliders in tree structure\n const findSlidersInTree = (nodeData: any, path = \"\"): any[] => {\n const sliders: any[] = [];\n if (!nodeData || typeof nodeData !== \"object\") return sliders;\n\n // Check if this node is a slider\n const isSlider =\n nodeData.type === \"container:slider\" ||\n nodeData.type === \"component:slider\" ||\n nodeData.name?.toLowerCase().includes(\"slider\") ||\n (Array.isArray(nodeData.tags) &&\n nodeData.tags.some((tag: string) =>\n tag.toLowerCase().includes(\"slider\")\n ));\n\n if (isSlider) {\n sliders.push({\n path,\n id: nodeData.id,\n name: nodeData.name,\n type: nodeData.type,\n tags: nodeData.tags,\n data: nodeData.data,\n style: nodeData.style,\n fullNodeData: nodeData,\n });\n }\n\n // Recursively search children\n if (nodeData.children) {\n const children = Array.isArray(nodeData.children)\n ? nodeData.children\n : [nodeData.children];\n children.forEach((child: any, index: number) => {\n if (child && typeof child === \"object\") {\n sliders.push(...findSlidersInTree(child, `${path}/${index}`));\n }\n });\n }\n\n return sliders;\n };\n\n // Check if clientData is a flat object keyed by ID (most likely)\n let sliders: any[] = [];\n if (\n clientData &&\n typeof clientData === \"object\" &&\n !Array.isArray(clientData)\n ) {\n // Check if it's a flat structure (keyed by IDs)\n const entries = Object.entries(clientData);\n console.log(`Client data has ${entries.length} entries`);\n\n // Search all entries for sliders\n entries.forEach(([key, value]: [string, any]) => {\n if (value && typeof value === \"object\") {\n // Check if this entry itself is a slider\n const isSlider =\n value.type === \"container:slider\" ||\n value.type === \"component:slider\" ||\n value.name?.toLowerCase().includes(\"slider\") ||\n (Array.isArray(value.tags) &&\n value.tags.some((tag: string) =>\n tag.toLowerCase().includes(\"slider\")\n ));\n\n if (isSlider) {\n sliders.push({\n id: key,\n name: value.name,\n type: value.type,\n tags: value.tags,\n data: value.data,\n style: value.style,\n fullNodeData: value,\n });\n }\n\n // Also search recursively in case it's nested\n sliders.push(...findSlidersInTree(value, key));\n }\n });\n\n // If no sliders found in flat structure, try treating it as a tree\n if (sliders.length === 0) {\n sliders = findSlidersInTree(clientData, \"root\");\n }\n } else {\n // Treat as tree structure\n sliders = findSlidersInTree(clientData, \"root\");\n }\n\n console.log(\"=== SLIDER COMPONENTS FOUND ===\");\n console.log(`Found ${sliders.length} slider(s):`, sliders);\n\n sliders.forEach((slider, index) => {\n console.log(`\\n--- Slider ${index + 1} ---`);\n console.log(\"ID:\", slider.id);\n console.log(\"Name:\", slider.name);\n console.log(\"Type:\", slider.type);\n console.log(\"Tags:\", slider.tags);\n console.log(\"Data:\", slider.data);\n console.log(\"Full node data:\", slider.fullNodeData);\n\n // Look for data binding tags\n if (Array.isArray(slider.tags)) {\n const bindingTags = slider.tags.filter(\n (tag: string) =>\n tag.includes(\"PROP:\") ||\n tag.includes(\"LIST:\") ||\n tag.includes(\"DATA:\")\n );\n if (bindingTags.length > 0) {\n console.log(\"๐ Data binding tags found:\", bindingTags);\n }\n }\n });\n\n // Also log all unique tags found across all components for reference\n const allTags = new Set<string>();\n const allEntries = Object.entries(clientData);\n allEntries.forEach(([_, value]: [string, any]) => {\n if (value?.tags && Array.isArray(value.tags)) {\n value.tags.forEach((tag: string) => allTags.add(tag));\n }\n });\n console.log(\"\\n=== ALL UNIQUE TAGS IN PAGE ===\");\n console.log(Array.from(allTags).sort());\n }\n }, [pageData.data]);\n */\n\n // Memoize the context object to prevent infinite re-renders\n // Only recreate when the actual data changes, not on every render\n const context = useMemo(() => {\n let clientData = pageData.data?.clientData;\n console.log(\n `[AG_DEBUG] [EncoreApp] useMemo: clientData present? ${!!clientData}, Keys: ${Object.keys(\n clientData || {}\n )}`\n );\n\n // --- GENERIC DATA PATCHING START ---\n // Recursively patch the data to fix layout and slider issues based on heuristics\n const patchPageData = (node: any) => {\n if (!node || typeof node !== \"object\") return;\n\n // Log font usage\n if (node.componentId || node.type === \"component:text\") {\n console.log(\n `[AG_DEBUG] [EncoreApp] ๐ฆ Node ${node.id} (${node.type}) Style:`,\n JSON.stringify(node.style)\n );\n }\n\n // 1. Layout Heuristic: If children widths sum to ~100% or ~375px, force HORIZONTAL layout\n // RELAXED: No longer requires layoutSizingHorizontal: \"FIXED\" - width data alone is sufficient\n if (\n node.children &&\n Array.isArray(node.children) &&\n node.children.length > 1\n ) {\n let totalWidth = 0;\n let childrenWithWidth = 0;\n\n node.children.forEach((child: any) => {\n if (child.style?.width) {\n // Width might be a percentage or pixel value.\n // Based on logs, we saw \"width: 52\" and \"width: 48\" which sum to 100.\n // If it's percentage, we check if it sums to 100.\n // If it's pixels, we check if it sums to ~375.\n totalWidth += child.style.width;\n childrenWithWidth++;\n }\n });\n\n // Check for percentage sum ~100 or pixel sum ~375\n // Only apply if we have at least 2 children with width data\n const isFullWidthRow =\n (Math.abs(totalWidth - 100) < 1 || Math.abs(totalWidth - 375) < 5) &&\n childrenWithWidth >= 2;\n\n if (isFullWidthRow) {\n if (!node.style) node.style = {};\n if (!node.style.layout) node.style.layout = {};\n\n // Only apply if mode is missing or undefined\n if (!node.style.layout.mode) {\n console.log(\n `[PATCH] Forcing HORIZONTAL layout for node ${node.id} (${childrenWithWidth} children, widths sum: ${totalWidth})`\n );\n node.style.layout.mode = \"HORIZONTAL\";\n node.style.layout.primaryAxisAlignItems = \"flex-start\";\n node.style.layout.counterAxisAlignItems = \"flex-start\";\n }\n }\n }\n\n // 2. Slider Heuristic: If slider is taller than wide, force VERTICAL animation\n // DISABLED: This is too aggressive and breaks horizontal sliders that happen to be tall (e.g. 50% width columns)\n /*\n const isSlider =\n node.type === \"container:slider\" ||\n node.type === \"component:slider\" ||\n (node.tags &&\n Array.isArray(node.tags) &&\n node.tags.some((t: string) => t.toLowerCase().includes(\"slider\")));\n\n if (isSlider) {\n const width = node.style?.width || 0;\n const height = node.style?.height || 0;\n // Check aspect ratio. If height > width, it's likely vertical.\n // Note: width/height might be percentages or pixels.\n // If both are numbers, we can compare.\n // From logs: width: 52, height: 85.27. This is clearly vertical shape.\n if (height > width) {\n if (!node.data) node.data = {};\n if (!node.data.params) node.data.params = {};\n\n // Only apply if animation is default or missing\n if (\n !node.data.params.animation ||\n node.data.params.animation === \"default\" ||\n node.data.params.animation === \"horizontal\"\n ) {\n console.log(\n `[PATCH] Forcing VERTICAL animation for slider ${node.id} (W:${width}, H:${height})`\n );\n node.data.params.animation = \"vertical\";\n }\n }\n }\n */\n\n // Recurse\n if (node.children) {\n if (Array.isArray(node.children)) {\n node.children.forEach(patchPageData);\n } else {\n patchPageData(node.children);\n }\n }\n };\n\n if (clientData) {\n // Clone to avoid mutating SWR cache directly if possible, though deep clone might be expensive.\n // For now, patching in place as it's a fix.\n patchPageData(clientData);\n }\n // --- GENERIC DATA PATCHING END ---\n\n return {\n nodeData: undefined,\n // Allow overriding specific values by element id.\n // For now, this is used to override TextComponent content when the node has the PROP:TEXT_VAR tag.\n textOverridesById: data,\n // Support for encore:data:array tags - provide array data by component ID\n arrayDataById: data,\n // Support for standalone component data binding (encore:data tags at root level)\n rootData: data,\n };\n }, [pageData.data?.clientData, data]);\n\n // Manage repeating container controls\n const [containerControls, setContainerControls] = useState<\n Map<string, RepeatingContainerControl>\n >(new Map());\n const [controlPropsMap, setControlPropsMap] = useState<\n Map<\n string,\n { currentIndex?: number; onIndexChange?: (index: number) => void }\n >\n >(new Map());\n\n // Update control props from prop\n useEffect(() => {\n if (repeatingContainerControls) {\n setControlPropsMap((prev) => {\n // Check if content actually changed to avoid unnecessary updates\n let changed = false;\n if (prev.size !== Object.keys(repeatingContainerControls).length) {\n changed = true;\n } else {\n for (const [id, props] of Object.entries(\n repeatingContainerControls\n )) {\n const prevProps = prev.get(id);\n if (!prevProps) {\n changed = true;\n break;\n }\n if (\n prevProps.currentIndex !== props.currentIndex ||\n prevProps.onIndexChange !== props.onIndexChange\n ) {\n changed = true;\n break;\n }\n }\n }\n\n if (!changed) return prev;\n\n const newMap = new Map();\n Object.entries(repeatingContainerControls).forEach(([id, props]) => {\n newMap.set(id, props);\n });\n return newMap;\n });\n }\n }, [repeatingContainerControls]);\n\n // Sync input groups from props to store\n useEffect(() => {\n if (inputGroups) {\n const setInputGroupValue = useEncoreState.getState().setInputGroupValue;\n Object.entries(inputGroups).forEach(([groupName, elementName]) => {\n setInputGroupValue(groupName, elementName);\n });\n }\n }, [inputGroups]);\n\n const registerContainer = useCallback(\n (id: string, control: RepeatingContainerControl) => {\n setContainerControls((prev) => {\n const next = new Map(prev);\n next.set(id, control);\n return next;\n });\n },\n []\n );\n\n const unregisterContainer = useCallback((id: string) => {\n setContainerControls((prev) => {\n const next = new Map(prev);\n next.delete(id);\n return next;\n });\n // Do NOT delete from controlPropsMap here.\n // controlPropsMap contains props passed from the parent (repeatingContainerControls).\n // If we delete them, we lose the configuration passed down to us.\n // The props should persist even if the component temporarily unregisters.\n }, []);\n\n const getControl = useCallback(\n (id: string) => {\n return containerControls.get(id);\n },\n [containerControls]\n );\n\n const setControlProps = useCallback(\n (\n id: string,\n props:\n | { currentIndex?: number; onIndexChange?: (index: number) => void }\n | ((prev: {\n currentIndex?: number;\n onIndexChange?: (index: number) => void;\n }) => {\n currentIndex?: number;\n onIndexChange?: (index: number) => void;\n })\n ) => {\n setControlPropsMap((prev) => {\n const next = new Map(prev);\n const current = next.get(id) || {};\n const newProps = typeof props === \"function\" ? props(current) : props;\n next.set(id, newProps);\n return next;\n });\n },\n []\n );\n\n const getControlProps = useCallback(\n (id: string) => {\n return controlPropsMap.get(id);\n },\n [controlPropsMap]\n );\n\n // Control props are automatically passed to registered containers via context\n // Components read props via getControlProps() and update when props change\n\n // Create context value - this object changes when controlPropsMap changes,\n // causing all consumers to re-render and get updated props\n const repeatingContainerContextValue = React.useMemo(\n () => ({\n registerContainer,\n unregisterContainer,\n getControl,\n setControlProps,\n getControlProps,\n // Include controlPropsMap size in the value to trigger re-renders when it changes\n _propsVersion: controlPropsMap.size,\n }),\n [\n registerContainer,\n unregisterContainer,\n getControl,\n setControlProps,\n getControlProps,\n controlPropsMap.size,\n ]\n );\n\n // Observe size changes of the dynamic content container and notify consumer\n useEffect(() => {\n if (!onSizeChange) return;\n const element = containerRef.current;\n if (!element) return;\n const notify = (entry: ResizeObserverEntry) => {\n const cr = entry.contentRect;\n onSizeChange({ width: cr.width, height: cr.height });\n };\n const observer = new ResizeObserver((entries) => {\n for (const entry of entries) {\n notify(entry);\n }\n });\n // Emit initial size as soon as possible\n const rect = element.getBoundingClientRect();\n onSizeChange({ width: rect.width, height: rect.height });\n observer.observe(element);\n return () => {\n observer.disconnect();\n };\n }, [onSizeChange]);\n\n // Per-instance source override\n useEffect(() => {\n if (!source) return;\n setLocalModeOverride(source === \"local\" ? \"local\" : \"remote\");\n return () => {\n // Clear override when this instance unmounts\n setLocalModeOverride(null);\n };\n }, [source]);\n\n if (!pageId) {\n return (\n <div style={{ padding: \"30px\" }}>\n <div style={{ overflowY: \"auto\" }}>\n {(isLocalMode()\n ? // Local mode: app.json provides pages under app.data.pages\n ((app?.data as any)?.app?.data?.pages || []).map(\n (pg: any) => pg?.id\n )\n : app?.data?.app.pageIds || []\n ).map((p: string) => (\n <Link\n key={p}\n to={`/apps/${appId}/pages/${p}?noRedirect=${noRedirect}`}\n style={{\n fontSize: 20,\n display: \"block\",\n marginBottom: \"10px\",\n }}\n >\n {p}\n </Link>\n ))}\n </div>\n </div>\n );\n }\n return (\n <div\n ref={containerRef}\n style={{\n width: \"100%\",\n height: \"100%\",\n position: \"relative\",\n overflow: \"hidden\",\n }}\n >\n <div\n ref={contentWrapperRef}\n style={{\n width: \"100%\",\n height: \"100%\",\n display: \"flex\",\n flexDirection: \"column\",\n }}\n >\n <Suspense fallback={fallback || <div />}>\n <EncoreComponentIdContext.Provider value={{ componentId }}>\n <EncoreActionContext.Provider value={{ onAction }}>\n <EncoreRepeatingContainerContext.Provider\n value={repeatingContainerContextValue}\n >\n <EncoreBindingContext.Provider value={context}>\n <DynamicComponent\n name={`${appId}/draft/components/${pageId}`}\n fallback={fallback}\n reloadKey={reloadKey}\n componentCode={componentCode}\n >\n {\" \"}\n </DynamicComponent>\n </EncoreBindingContext.Provider>\n </EncoreRepeatingContainerContext.Provider>\n </EncoreActionContext.Provider>\n </EncoreComponentIdContext.Provider>\n </Suspense>\n </div>\n </div>\n );\n};\n\nexport default EncoreApp;\n"],"names":["Link","to","children","style","props","navigate","useEncoreRouter","jsx","e","setAppSelector","state","setAppIdSelector","setPageIdSelector","assetsByIdSelector","EncoreApp","appId","pageId","componentId","fallback","onSizeChange","onContentSizeChange","onAction","data","source","repeatingContainerControls","inputGroups","baseURL","appDefinition","pageDefinition","componentCode","useEncoreState","setLocalModeOverride","noRedirect","setApp","setAppId","setPageId","assetsById","containerRef","useRef","contentWrapperRef","useEffect","element","notify","observer","reloadKey","setReloadKey","useState","handleUpdate","useCallback","prev","usePusherUpdates","isLocalMode","useLocalFlag","appUrl","appSWR","useSWR","fetcher","app","fonts","f","family","url","postScriptName","familyName","ff","isCheckPassed","err","id","resolve","img","pageUrl","pageSWR","pageData","context","useMemo","clientData","patchPageData","node","totalWidth","childrenWithWidth","child","containerControls","setContainerControls","controlPropsMap","setControlPropsMap","changed","prevProps","newMap","setInputGroupValue","groupName","elementName","registerContainer","control","next","unregisterContainer","getControl","setControlProps","current","newProps","getControlProps","repeatingContainerContextValue","React","entry","cr","entries","rect","Suspense","EncoreComponentIdContext","EncoreActionContext","EncoreRepeatingContainerContext","EncoreBindingContext","DynamicComponent","pg","p"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"EncoreErrorBoundary.js","sources":["../../src/components/EncoreErrorBoundary.tsx"],"sourcesContent":["
|
|
1
|
+
{"version":3,"file":"EncoreErrorBoundary.js","sources":["../../src/components/EncoreErrorBoundary.tsx"],"sourcesContent":["\"use client\";\nimport React from \"react\";\n\ntype Props = {\n children: React.ReactNode;\n fallback?: React.ReactNode;\n};\n\ntype State = {\n hasError: boolean;\n error: unknown;\n};\n\nexport default class EncoreErrorBoundary extends React.Component<Props, State> {\n constructor(props: Props) {\n super(props);\n this.state = { hasError: false, error: null };\n }\n\n static getDerivedStateFromError(error: unknown): State {\n return { hasError: true, error };\n }\n\n componentDidCatch(error: unknown) {\n // eslint-disable-next-line no-console\n console.error(\"EncoreErrorBoundary caught:\", error);\n }\n\n render() {\n if (this.state.hasError) {\n return (\n this.props.fallback || (\n <div\n style={{\n padding: 16,\n color: \"#b91c1c\",\n background: \"#fef2f2\",\n border: \"1px solid #fecaca\",\n borderRadius: 8,\n fontFamily: \"ui-sans-serif, system-ui, sans-serif\",\n }}\n >\n Failed to render. Check console for details.\n </div>\n )\n );\n }\n return this.props.children;\n }\n}\n"],"names":["EncoreErrorBoundary","React","props","error","jsx"],"mappings":";;AAaA,MAAqBA,UAA4BC,EAAM,UAAwB;AAAA,EAC7E,YAAYC,GAAc;AACxB,UAAMA,CAAK,GACX,KAAK,QAAQ,EAAE,UAAU,IAAO,OAAO,KAAA;AAAA,EACzC;AAAA,EAEA,OAAO,yBAAyBC,GAAuB;AACrD,WAAO,EAAE,UAAU,IAAM,OAAAA,EAAA;AAAA,EAC3B;AAAA,EAEA,kBAAkBA,GAAgB;AAEhC,YAAQ,MAAM,+BAA+BA,CAAK;AAAA,EACpD;AAAA,EAEA,SAAS;AACP,WAAI,KAAK,MAAM,WAEX,KAAK,MAAM,YACT,gBAAAC;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,OAAO;AAAA,UACL,SAAS;AAAA,UACT,OAAO;AAAA,UACP,YAAY;AAAA,UACZ,QAAQ;AAAA,UACR,cAAc;AAAA,UACd,YAAY;AAAA,QAAA;AAAA,QAEf,UAAA;AAAA,MAAA;AAAA,IAAA,IAMA,KAAK,MAAM;AAAA,EACpB;AACF;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"EncoreLoadingFallback.js","sources":["../../src/components/EncoreLoadingFallback.tsx"],"sourcesContent":["
|
|
1
|
+
{"version":3,"file":"EncoreLoadingFallback.js","sources":["../../src/components/EncoreLoadingFallback.tsx"],"sourcesContent":["\"use client\";\nimport React from \"react\";\n\nconst EncoreLoadingFallback: React.FC = () => {\n return (\n <div className=\"flex flex-col items-center justify-center h-full w-full bg-white\">\n <div className=\"mb-8\">\n <div\n style={{\n fontSize: \"48px\",\n fontWeight: \"bold\",\n color: \"#6366f1\",\n fontFamily: \"ui-sans-serif, system-ui, sans-serif\",\n }}\n >\n Encore\n </div>\n </div>\n <div className=\"text-gray-700 text-lg font-medium\">\n <span className=\"inline-block animate-pulse\">loading...</span>\n </div>\n </div>\n );\n};\n\nexport default EncoreLoadingFallback;\n"],"names":["EncoreLoadingFallback","jsxs","jsx"],"mappings":";AAGA,MAAMA,IAAkC,MAEpC,gBAAAC,EAAC,OAAA,EAAI,WAAU,oEACb,UAAA;AAAA,EAAA,gBAAAC,EAAC,OAAA,EAAI,WAAU,QACb,UAAA,gBAAAA;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,OAAO;AAAA,QACL,UAAU;AAAA,QACV,YAAY;AAAA,QACZ,OAAO;AAAA,QACP,YAAY;AAAA,MAAA;AAAA,MAEf,UAAA;AAAA,IAAA;AAAA,EAAA,GAGH;AAAA,EACA,gBAAAA,EAAC,SAAI,WAAU,qCACb,4BAAC,QAAA,EAAK,WAAU,8BAA6B,UAAA,aAAA,CAAU,EAAA,CACzD;AAAA,GACF;"}
|