cogsbox-state 0.5.400 → 0.5.401
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/CogsState.jsx +63 -58
- package/dist/CogsState.jsx.map +1 -1
- package/package.json +1 -1
- package/src/CogsState.tsx +6 -1
package/dist/CogsState.jsx
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
import { jsx as Ot } from "react/jsx-runtime";
|
|
3
|
-
import { useState as K, useRef as q, useEffect as ot, useLayoutEffect as ct, useMemo as wt, createElement as lt, useSyncExternalStore as
|
|
4
|
-
import { transformStateFunc as Bt, isDeepEqual as J, isFunction as tt, getNestedValue as
|
|
3
|
+
import { useState as K, useRef as q, useEffect as ot, useLayoutEffect as ct, useMemo as wt, createElement as lt, useSyncExternalStore as Ut, startTransition as Ft, useCallback as kt } from "react";
|
|
4
|
+
import { transformStateFunc as Bt, isDeepEqual as J, isFunction as tt, getNestedValue as X, getDifferences as _t, debounce as Wt } from "./utility.js";
|
|
5
5
|
import { pushFunc as Et, updateFn as it, cutFunc as ht, ValidationWrapper as zt, FormControlComponent as qt } from "./Functions.jsx";
|
|
6
6
|
import Jt from "superjson";
|
|
7
7
|
import { v4 as At } from "uuid";
|
|
@@ -52,7 +52,7 @@ const ve = (t, c) => {
|
|
|
52
52
|
options: s,
|
|
53
53
|
initialOptionsPart: I
|
|
54
54
|
});
|
|
55
|
-
const r = o.getState().cogsStateStore[v] || g[v], S = s?.modifyState ? s.modifyState(r) : r, [W,
|
|
55
|
+
const r = o.getState().cogsStateStore[v] || g[v], S = s?.modifyState ? s.modifyState(r) : r, [W, H] = ne(
|
|
56
56
|
S,
|
|
57
57
|
{
|
|
58
58
|
stateKey: v,
|
|
@@ -68,7 +68,7 @@ const ve = (t, c) => {
|
|
|
68
68
|
serverState: s?.serverState
|
|
69
69
|
}
|
|
70
70
|
);
|
|
71
|
-
return
|
|
71
|
+
return H;
|
|
72
72
|
};
|
|
73
73
|
function p(v, s) {
|
|
74
74
|
xt({ stateKey: v, options: s, initialOptionsPart: I }), s.localStorage && te(v, s), dt(v);
|
|
@@ -83,7 +83,7 @@ const ve = (t, c) => {
|
|
|
83
83
|
setStateLog: Qt,
|
|
84
84
|
updateInitialStateGlobal: Nt,
|
|
85
85
|
addValidationError: Rt,
|
|
86
|
-
removeValidationError:
|
|
86
|
+
removeValidationError: Q,
|
|
87
87
|
setServerSyncActions: Kt
|
|
88
88
|
} = o.getState(), Pt = (t, c, m, g, I) => {
|
|
89
89
|
m?.log && console.log(
|
|
@@ -161,18 +161,18 @@ const ve = (t, c) => {
|
|
|
161
161
|
switch (t) {
|
|
162
162
|
case "update":
|
|
163
163
|
return {
|
|
164
|
-
oldValue:
|
|
165
|
-
newValue:
|
|
164
|
+
oldValue: X(c, g),
|
|
165
|
+
newValue: X(m, g)
|
|
166
166
|
};
|
|
167
167
|
case "insert":
|
|
168
168
|
return {
|
|
169
169
|
oldValue: null,
|
|
170
170
|
// or undefined
|
|
171
|
-
newValue:
|
|
171
|
+
newValue: X(m, g)
|
|
172
172
|
};
|
|
173
173
|
case "cut":
|
|
174
174
|
return {
|
|
175
|
-
oldValue:
|
|
175
|
+
oldValue: X(c, g),
|
|
176
176
|
newValue: null
|
|
177
177
|
// or undefined
|
|
178
178
|
};
|
|
@@ -193,7 +193,7 @@ function ne(t, {
|
|
|
193
193
|
dependencies: r,
|
|
194
194
|
serverState: S
|
|
195
195
|
} = {}) {
|
|
196
|
-
const [W,
|
|
196
|
+
const [W, H] = K({}), { sessionId: U } = Gt();
|
|
197
197
|
let z = !c;
|
|
198
198
|
const [h] = K(c ?? At()), l = o.getState().stateLog[h], ut = q(/* @__PURE__ */ new Set()), et = q(v ?? At()), L = q(
|
|
199
199
|
null
|
|
@@ -230,7 +230,7 @@ function ne(t, {
|
|
|
230
230
|
at,
|
|
231
231
|
et.current,
|
|
232
232
|
U
|
|
233
|
-
), w && E && U && Pt(y, h, e, U, Date.now()), dt(h), (Array.isArray(p) ? p : [p || "component"]).includes("none") ||
|
|
233
|
+
), w && E && U && Pt(y, h, e, U, Date.now()), dt(h), (Array.isArray(p) ? p : [p || "component"]).includes("none") || H({});
|
|
234
234
|
}
|
|
235
235
|
}, [
|
|
236
236
|
s,
|
|
@@ -249,12 +249,12 @@ function ne(t, {
|
|
|
249
249
|
components: /* @__PURE__ */ new Map()
|
|
250
250
|
};
|
|
251
251
|
return n.components.set(e, {
|
|
252
|
-
forceUpdate: () =>
|
|
252
|
+
forceUpdate: () => H({}),
|
|
253
253
|
paths: /* @__PURE__ */ new Set(),
|
|
254
254
|
deps: [],
|
|
255
255
|
depsFunction: N || void 0,
|
|
256
256
|
reactiveType: p ?? ["component", "deps"]
|
|
257
|
-
}), o.getState().stateComponents.set(h, n),
|
|
257
|
+
}), o.getState().stateComponents.set(h, n), H({}), () => {
|
|
258
258
|
n && (n.components.delete(e), n.components.size === 0 && o.getState().stateComponents.delete(h));
|
|
259
259
|
};
|
|
260
260
|
}, []);
|
|
@@ -269,7 +269,7 @@ function ne(t, {
|
|
|
269
269
|
if (y) {
|
|
270
270
|
let M = !1, $ = f.signalDomElements.get(y);
|
|
271
271
|
if ((!$ || $.size === 0) && (a.updateType === "insert" || a.updateType === "cut")) {
|
|
272
|
-
const R = n.slice(0, -1), V =
|
|
272
|
+
const R = n.slice(0, -1), V = X(E, R);
|
|
273
273
|
if (Array.isArray(V)) {
|
|
274
274
|
M = !0;
|
|
275
275
|
const O = `${h}-${R.join(".")}`;
|
|
@@ -277,7 +277,7 @@ function ne(t, {
|
|
|
277
277
|
}
|
|
278
278
|
}
|
|
279
279
|
if ($) {
|
|
280
|
-
const R = M ?
|
|
280
|
+
const R = M ? X(E, n.slice(0, -1)) : X(E, n);
|
|
281
281
|
$.forEach(({ parentId: V, position: O, effect: _ }) => {
|
|
282
282
|
const D = document.querySelector(
|
|
283
283
|
`[data-parent-id="${V}"]`
|
|
@@ -292,11 +292,11 @@ function ne(t, {
|
|
|
292
292
|
});
|
|
293
293
|
}
|
|
294
294
|
}
|
|
295
|
-
console.log("shadowState", f.shadowStateStore), a.updateType === "update" && (i || L.current?.validation?.key) && n &&
|
|
295
|
+
console.log("shadowState", f.shadowStateStore), a.updateType === "update" && (i || L.current?.validation?.key) && n && Q(
|
|
296
296
|
(i || L.current?.validation?.key) + "." + n.join(".")
|
|
297
297
|
);
|
|
298
298
|
const w = n.slice(0, n.length - 1);
|
|
299
|
-
a.updateType === "cut" && L.current?.validation?.key &&
|
|
299
|
+
a.updateType === "cut" && L.current?.validation?.key && Q(
|
|
300
300
|
L.current?.validation?.key + "." + w.join(".")
|
|
301
301
|
), a.updateType === "insert" && L.current?.validation?.key && Xt(
|
|
302
302
|
L.current?.validation?.key + "." + w.join(".")
|
|
@@ -304,7 +304,7 @@ function ne(t, {
|
|
|
304
304
|
let V = $?.split(".").length;
|
|
305
305
|
if ($ == w.join(".") && V == w.length - 1) {
|
|
306
306
|
let O = $ + "." + w;
|
|
307
|
-
|
|
307
|
+
Q($), Rt(O, R);
|
|
308
308
|
}
|
|
309
309
|
});
|
|
310
310
|
const C = f.stateComponents.get(h);
|
|
@@ -360,7 +360,7 @@ function ne(t, {
|
|
|
360
360
|
}
|
|
361
361
|
const A = Date.now();
|
|
362
362
|
n = n.map((M, $) => {
|
|
363
|
-
const R = n.slice(0, -1), V =
|
|
363
|
+
const R = n.slice(0, -1), V = X(E, R);
|
|
364
364
|
return $ === n.length - 1 && ["insert", "cut"].includes(a.updateType) ? (V.length - 1).toString() : M;
|
|
365
365
|
});
|
|
366
366
|
const { oldValue: b, newValue: F } = ee(
|
|
@@ -443,14 +443,14 @@ function It(t, c, m, g) {
|
|
|
443
443
|
N++;
|
|
444
444
|
}, v = {
|
|
445
445
|
removeValidation: (T) => {
|
|
446
|
-
T?.validationKey &&
|
|
446
|
+
T?.validationKey && Q(T.validationKey);
|
|
447
447
|
},
|
|
448
448
|
revertToInitialState: (T) => {
|
|
449
449
|
const r = o.getState().getInitialOptions(t)?.validation;
|
|
450
|
-
r?.key &&
|
|
450
|
+
r?.key && Q(r?.key), T?.validationKey && Q(T.validationKey);
|
|
451
451
|
const S = o.getState().initialStateGlobal[t];
|
|
452
452
|
o.getState().clearSelectedIndexesForState(t), I.clear(), N++;
|
|
453
|
-
const W = s(S, []),
|
|
453
|
+
const W = s(S, []), H = rt(t), U = tt(H?.localStorage?.key) ? H?.localStorage?.key(S) : H?.localStorage?.key, z = `${g}-${t}-${U}`;
|
|
454
454
|
z && localStorage.removeItem(z), Tt(t, W), nt(t, S);
|
|
455
455
|
const h = o.getState().stateComponents.get(t);
|
|
456
456
|
return h && h.components.forEach((l) => {
|
|
@@ -464,7 +464,7 @@ function It(t, c, m, g) {
|
|
|
464
464
|
c,
|
|
465
465
|
m,
|
|
466
466
|
g
|
|
467
|
-
), S = o.getState().initialStateGlobal[t], W = rt(t),
|
|
467
|
+
), S = o.getState().initialStateGlobal[t], W = rt(t), H = tt(W?.localStorage?.key) ? W?.localStorage?.key(S) : W?.localStorage?.key, U = `${g}-${t}-${H}`;
|
|
468
468
|
return localStorage.getItem(U) && localStorage.removeItem(U), Ft(() => {
|
|
469
469
|
Nt(t, T), o.getState().initializeShadowState(t, T), Tt(t, r), nt(t, T);
|
|
470
470
|
const z = o.getState().stateComponents.get(t);
|
|
@@ -486,11 +486,11 @@ function It(t, c, m, g) {
|
|
|
486
486
|
function s(T, r = [], S) {
|
|
487
487
|
const W = r.map(String).join(".");
|
|
488
488
|
I.get(W);
|
|
489
|
-
const
|
|
489
|
+
const H = function() {
|
|
490
490
|
return o().getNestedState(t, r);
|
|
491
491
|
};
|
|
492
492
|
Object.keys(v).forEach((h) => {
|
|
493
|
-
|
|
493
|
+
H[h] = v[h];
|
|
494
494
|
});
|
|
495
495
|
const U = {
|
|
496
496
|
apply(h, l, ut) {
|
|
@@ -568,7 +568,7 @@ function It(t, c, m, g) {
|
|
|
568
568
|
}
|
|
569
569
|
};
|
|
570
570
|
if (l === "_status") {
|
|
571
|
-
const d = o.getState().getNestedState(t, r), e = o.getState().initialStateGlobal[t], n =
|
|
571
|
+
const d = o.getState().getNestedState(t, r), e = o.getState().initialStateGlobal[t], n = X(e, r);
|
|
572
572
|
return J(d, n) ? "fresh" : "stale";
|
|
573
573
|
}
|
|
574
574
|
if (l === "getStatus")
|
|
@@ -576,7 +576,7 @@ function It(t, c, m, g) {
|
|
|
576
576
|
const d = o().getNestedState(
|
|
577
577
|
t,
|
|
578
578
|
r
|
|
579
|
-
), e = o.getState().initialStateGlobal[t], n =
|
|
579
|
+
), e = o.getState().initialStateGlobal[t], n = X(e, r);
|
|
580
580
|
return J(d, n) ? "fresh" : "stale";
|
|
581
581
|
};
|
|
582
582
|
if (l === "removeStorage")
|
|
@@ -635,13 +635,13 @@ function It(t, c, m, g) {
|
|
|
635
635
|
), _ = O.length, { totalHeight: D, positions: G } = wt(() => {
|
|
636
636
|
const k = o.getState().getShadowMetadata(t, r) || [];
|
|
637
637
|
let x = 0;
|
|
638
|
-
const
|
|
638
|
+
const j = [];
|
|
639
639
|
for (let P = 0; P < _; P++) {
|
|
640
|
-
|
|
641
|
-
const
|
|
642
|
-
x +=
|
|
640
|
+
j[P] = x;
|
|
641
|
+
const Z = k[P]?.virtualizer?.itemHeight;
|
|
642
|
+
x += Z || n;
|
|
643
643
|
}
|
|
644
|
-
return { totalHeight: x, positions:
|
|
644
|
+
return { totalHeight: x, positions: j };
|
|
645
645
|
}, [
|
|
646
646
|
_,
|
|
647
647
|
t,
|
|
@@ -649,13 +649,13 @@ function It(t, c, m, g) {
|
|
|
649
649
|
n,
|
|
650
650
|
$
|
|
651
651
|
]), B = wt(() => {
|
|
652
|
-
const k = Math.max(0, y.startIndex), x = Math.min(_, y.endIndex),
|
|
652
|
+
const k = Math.max(0, y.startIndex), x = Math.min(_, y.endIndex), j = Array.from(
|
|
653
653
|
{ length: x - k },
|
|
654
|
-
(
|
|
655
|
-
), P =
|
|
654
|
+
(Z, ft) => k + ft
|
|
655
|
+
), P = j.map((Z) => O[Z]);
|
|
656
656
|
return s(P, r, {
|
|
657
657
|
...S,
|
|
658
|
-
validIndices:
|
|
658
|
+
validIndices: j
|
|
659
659
|
});
|
|
660
660
|
}, [y.startIndex, y.endIndex, O, _]);
|
|
661
661
|
ct(() => {
|
|
@@ -663,8 +663,8 @@ function It(t, c, m, g) {
|
|
|
663
663
|
if (!k) return;
|
|
664
664
|
const x = _ > F.current;
|
|
665
665
|
if (x && V.current) {
|
|
666
|
-
const { top:
|
|
667
|
-
b.current = !0, k.scrollTop =
|
|
666
|
+
const { top: j, height: P } = V.current;
|
|
667
|
+
b.current = !0, k.scrollTop = j + (k.scrollHeight - P), console.log(
|
|
668
668
|
`ANCHOR RESTORED to scrollTop: ${k.scrollTop}`
|
|
669
669
|
), setTimeout(() => {
|
|
670
670
|
b.current = !1;
|
|
@@ -697,8 +697,13 @@ function It(t, c, m, g) {
|
|
|
697
697
|
startIndex: Math.max(0, _ - 10 - a),
|
|
698
698
|
endIndex: _
|
|
699
699
|
}), x = setInterval(() => {
|
|
700
|
-
const
|
|
701
|
-
|
|
700
|
+
const j = _ - 1, Z = (o.getState().getShadowMetadata(t, r) || [])[j]?.virtualizer?.itemHeight || 0;
|
|
701
|
+
console.log(
|
|
702
|
+
"ACTION (GETTING_HEIGHTS): lastItemHeight =",
|
|
703
|
+
Z,
|
|
704
|
+
" index =",
|
|
705
|
+
j
|
|
706
|
+
), Z > 0 && (clearInterval(x), u.current || (console.log(
|
|
702
707
|
"ACTION (GETTING_HEIGHTS): Measurement success -> SCROLLING_TO_BOTTOM"
|
|
703
708
|
), A("SCROLLING_TO_BOTTOM")));
|
|
704
709
|
}, 100);
|
|
@@ -706,10 +711,10 @@ function It(t, c, m, g) {
|
|
|
706
711
|
console.log(
|
|
707
712
|
"ACTION (SCROLLING_TO_BOTTOM): Executing scroll."
|
|
708
713
|
), b.current = !0;
|
|
709
|
-
const
|
|
714
|
+
const j = F.current === 0 ? "auto" : "smooth";
|
|
710
715
|
k.scrollTo({
|
|
711
716
|
top: k.scrollHeight,
|
|
712
|
-
behavior:
|
|
717
|
+
behavior: j
|
|
713
718
|
});
|
|
714
719
|
const P = setTimeout(
|
|
715
720
|
() => {
|
|
@@ -717,7 +722,7 @@ function It(t, c, m, g) {
|
|
|
717
722
|
"ACTION (SCROLLING_TO_BOTTOM): Scroll finished -> LOCKED_AT_BOTTOM"
|
|
718
723
|
), b.current = !1, u.current = !1, A("LOCKED_AT_BOTTOM");
|
|
719
724
|
},
|
|
720
|
-
|
|
725
|
+
j === "smooth" ? 500 : 50
|
|
721
726
|
);
|
|
722
727
|
return () => clearTimeout(P);
|
|
723
728
|
}
|
|
@@ -727,13 +732,13 @@ function It(t, c, m, g) {
|
|
|
727
732
|
}, [C, _, G]), ot(() => {
|
|
728
733
|
const k = E.current;
|
|
729
734
|
if (!k) return;
|
|
730
|
-
const x = n,
|
|
735
|
+
const x = n, j = () => {
|
|
731
736
|
if (b.current)
|
|
732
737
|
return;
|
|
733
|
-
const { scrollTop: P, scrollHeight:
|
|
734
|
-
if (
|
|
738
|
+
const { scrollTop: P, scrollHeight: Z, clientHeight: ft } = k;
|
|
739
|
+
if (Z - P - ft < 10 ? (C !== "LOCKED_AT_BOTTOM" && A("LOCKED_AT_BOTTOM"), V.current = null) : (C !== "IDLE_NOT_AT_BOTTOM" && A("IDLE_NOT_AT_BOTTOM"), V.current = {
|
|
735
740
|
top: P,
|
|
736
|
-
height:
|
|
741
|
+
height: Z
|
|
737
742
|
}), Math.abs(P - M.current) < x)
|
|
738
743
|
return;
|
|
739
744
|
console.log(
|
|
@@ -746,17 +751,17 @@ function It(t, c, m, g) {
|
|
|
746
751
|
}
|
|
747
752
|
const $t = Math.max(0, Ct - a);
|
|
748
753
|
let St = $t;
|
|
749
|
-
const
|
|
750
|
-
for (; St < _ && G[St] <
|
|
754
|
+
const Ht = P + ft;
|
|
755
|
+
for (; St < _ && G[St] < Ht; )
|
|
751
756
|
St++;
|
|
752
757
|
w({
|
|
753
758
|
startIndex: $t,
|
|
754
759
|
endIndex: Math.min(_, St + a)
|
|
755
760
|
}), M.current = P;
|
|
756
761
|
};
|
|
757
|
-
return k.addEventListener("scroll",
|
|
762
|
+
return k.addEventListener("scroll", j, {
|
|
758
763
|
passive: !0
|
|
759
|
-
}), () => k.removeEventListener("scroll",
|
|
764
|
+
}), () => k.removeEventListener("scroll", j);
|
|
760
765
|
}, [_, G, n, a, C]);
|
|
761
766
|
const st = kt(() => {
|
|
762
767
|
console.log(
|
|
@@ -1045,7 +1050,7 @@ function It(t, c, m, g) {
|
|
|
1045
1050
|
const e = o.getState().getInitialOptions(t)?.validation;
|
|
1046
1051
|
if (!e?.key)
|
|
1047
1052
|
throw new Error("Validation key not found");
|
|
1048
|
-
|
|
1053
|
+
Q(e.key), console.log("addValidationError", d), d.forEach((n) => {
|
|
1049
1054
|
const a = [e.key, ...n.path].join(".");
|
|
1050
1055
|
console.log("fullErrorPath", a), Rt(a, n.message);
|
|
1051
1056
|
}), dt(t);
|
|
@@ -1125,12 +1130,12 @@ function It(t, c, m, g) {
|
|
|
1125
1130
|
throw new Error("Zod schema not found");
|
|
1126
1131
|
if (!d?.key)
|
|
1127
1132
|
throw new Error("Validation key not found");
|
|
1128
|
-
|
|
1133
|
+
Q(d.key);
|
|
1129
1134
|
const n = o.getState().cogsStateStore[t];
|
|
1130
1135
|
try {
|
|
1131
1136
|
const a = o.getState().getValidationErrors(d.key);
|
|
1132
1137
|
a && a.length > 0 && a.forEach(([f]) => {
|
|
1133
|
-
f && f.startsWith(d.key) &&
|
|
1138
|
+
f && f.startsWith(d.key) && Q(f);
|
|
1134
1139
|
});
|
|
1135
1140
|
const i = d.zodSchema.safeParse(n);
|
|
1136
1141
|
return i.success ? !0 : (i.error.errors.forEach((u) => {
|
|
@@ -1206,7 +1211,7 @@ function It(t, c, m, g) {
|
|
|
1206
1211
|
const L = [...r, l], at = o.getState().getNestedState(t, L);
|
|
1207
1212
|
return s(at, L, S);
|
|
1208
1213
|
}
|
|
1209
|
-
}, z = new Proxy(
|
|
1214
|
+
}, z = new Proxy(H, U);
|
|
1210
1215
|
return I.set(W, {
|
|
1211
1216
|
proxy: z,
|
|
1212
1217
|
stateVersion: N
|
|
@@ -1256,8 +1261,8 @@ function oe({
|
|
|
1256
1261
|
"state",
|
|
1257
1262
|
`return (${t._effect})(state)`
|
|
1258
1263
|
)(r);
|
|
1259
|
-
} catch (
|
|
1260
|
-
console.error("Error evaluating effect function during mount:",
|
|
1264
|
+
} catch (H) {
|
|
1265
|
+
console.error("Error evaluating effect function during mount:", H), S = r;
|
|
1261
1266
|
}
|
|
1262
1267
|
else
|
|
1263
1268
|
S = r;
|
|
@@ -1271,7 +1276,7 @@ function oe({
|
|
|
1271
1276
|
});
|
|
1272
1277
|
}
|
|
1273
1278
|
function pe(t) {
|
|
1274
|
-
const c =
|
|
1279
|
+
const c = Ut(
|
|
1275
1280
|
(m) => {
|
|
1276
1281
|
const g = o.getState().stateComponents.get(t._stateKey) || {
|
|
1277
1282
|
components: /* @__PURE__ */ new Map()
|
package/dist/CogsState.jsx.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CogsState.jsx","sources":["../src/CogsState.tsx"],"sourcesContent":["\"use client\";\r\n\r\nimport {\r\n createElement,\r\n startTransition,\r\n useCallback,\r\n useEffect,\r\n useLayoutEffect,\r\n useMemo,\r\n useRef,\r\n useState,\r\n useSyncExternalStore,\r\n type CSSProperties,\r\n type ReactNode,\r\n type RefObject,\r\n} from \"react\";\r\n\r\nimport {\r\n debounce,\r\n getDifferences,\r\n getNestedValue,\r\n isFunction,\r\n type GenericObject,\r\n} from \"./utility.js\";\r\nimport {\r\n cutFunc,\r\n FormControlComponent,\r\n pushFunc,\r\n updateFn,\r\n ValidationWrapper,\r\n} from \"./Functions.js\";\r\nimport { isDeepEqual, transformStateFunc } from \"./utility.js\";\r\nimport superjson from \"superjson\";\r\nimport { v4 as uuidv4 } from \"uuid\";\r\nimport { z } from \"zod\";\r\n\r\nimport { formRefStore, getGlobalStore, type ComponentsType } from \"./store.js\";\r\nimport { useCogsConfig } from \"./CogsStateClient.js\";\r\nimport { applyPatch } from \"fast-json-patch\";\r\nimport useMeasure from \"react-use-measure\";\r\n\r\ntype Prettify<T> = { [K in keyof T]: T[K] } & {};\r\n\r\nexport type VirtualViewOptions = {\r\n itemHeight?: number;\r\n overscan?: number;\r\n stickToBottom?: boolean;\r\n dependencies?: any[];\r\n};\r\n\r\n// The result now returns a real StateObject\r\nexport type VirtualStateObjectResult<T extends any[]> = {\r\n /**\r\n * A new, fully-functional StateObject that represents the virtualized slice.\r\n * You can use `.get()`, `.stateMap()`, `.insert()`, `.cut()` etc. on this object.\r\n */\r\n virtualState: StateObject<T>;\r\n /**\r\n * Props to be spread onto your DOM elements to enable virtualization.\r\n */\r\n virtualizerProps: {\r\n outer: { ref: RefObject<HTMLDivElement>; style: CSSProperties };\r\n inner: { style: CSSProperties };\r\n list: { style: CSSProperties };\r\n };\r\n scrollToBottom: (behavior?: ScrollBehavior) => void;\r\n scrollToIndex: (index: number, behavior?: ScrollBehavior) => void;\r\n};\r\n\r\nexport type ServerSyncStatus = {\r\n isFresh: boolean;\r\n isFreshTime: number;\r\n isStale: boolean;\r\n isStaleTime: number;\r\n isSyncing: boolean;\r\n isSyncingTime: number;\r\n};\r\n\r\nexport type SyncInfo = {\r\n timeStamp: number;\r\n userId: number;\r\n};\r\n\r\nexport type FormElementParams<T> = {\r\n get: () => T;\r\n\r\n set: UpdateType<T>;\r\n syncStatus: (SyncInfo & { date: Date }) | null;\r\n path: string[];\r\n validationErrors: () => string[];\r\n addValidationError: (message?: string) => void;\r\n\r\n inputProps: {\r\n ref?: React.RefObject<any>;\r\n value?: T extends boolean ? never : T;\r\n onChange?: (\r\n event: React.ChangeEvent<HTMLInputElement | HTMLTextAreaElement>\r\n ) => void;\r\n onBlur?: () => void;\r\n };\r\n};\r\n\r\nexport type StateKeys = string;\r\n\r\ntype findWithFuncType<U> = (\r\n thisKey: keyof U,\r\n thisValue: U[keyof U]\r\n) => EndType<U> & StateObject<U>;\r\nexport type PushArgs<U, T> = (\r\n update:\r\n | Prettify<U>\r\n | ((prevState: NonNullable<Prettify<U>>[]) => NonNullable<Prettify<U>>),\r\n opts?: UpdateOpts<U>\r\n) => StateObject<T>;\r\n\r\ntype CutFunctionType<T> = (\r\n index?: number,\r\n options?: { waitForSync?: boolean }\r\n) => StateObject<T>;\r\n\r\nexport type InferArrayElement<T> = T extends (infer U)[] ? U : never;\r\ntype ArraySpecificPrototypeKeys =\r\n | \"concat\"\r\n | \"copyWithin\"\r\n | \"fill\"\r\n | \"find\"\r\n | \"findIndex\"\r\n | \"flat\"\r\n | \"flatMap\"\r\n | \"includes\"\r\n | \"indexOf\"\r\n | \"join\"\r\n | \"keys\"\r\n | \"lastIndexOf\"\r\n | \"map\"\r\n | \"pop\"\r\n | \"push\"\r\n | \"reduce\"\r\n | \"reduceRight\"\r\n | \"reverse\"\r\n | \"shift\"\r\n | \"slice\"\r\n | \"some\"\r\n | \"sort\"\r\n | \"splice\"\r\n | \"unshift\"\r\n | \"values\"\r\n | \"entries\"\r\n | \"every\"\r\n | \"filter\"\r\n | \"forEach\"\r\n | \"with\";\r\n\r\nexport type ArrayEndType<TShape extends unknown> = {\r\n findWith: findWithFuncType<InferArrayElement<TShape>>;\r\n index: (index: number) => StateObject<InferArrayElement<TShape>> & {\r\n insert: PushArgs<InferArrayElement<TShape>, TShape>;\r\n cut: CutFunctionType<TShape>;\r\n _index: number;\r\n } & EndType<InferArrayElement<TShape>>;\r\n insert: PushArgs<InferArrayElement<TShape>, TShape>;\r\n cut: CutFunctionType<TShape>;\r\n cutByValue: (value: string | number | boolean) => void;\r\n toggleByValue: (value: string | number | boolean) => void;\r\n stateSort: (\r\n compareFn: (\r\n a: InferArrayElement<TShape>,\r\n b: InferArrayElement<TShape>\r\n ) => number\r\n ) => ArrayEndType<TShape>;\r\n useVirtualView: (\r\n options: VirtualViewOptions\r\n ) => VirtualStateObjectResult<InferArrayElement<TShape>[]>;\r\n\r\n stateMapNoRender: (\r\n callbackfn: (\r\n value: InferArrayElement<TShape>,\r\n setter: StateObject<InferArrayElement<TShape>>,\r\n index: number,\r\n array: TShape,\r\n arraySetter: StateObject<TShape>\r\n ) => void\r\n ) => any;\r\n stateList: (\r\n callbackfn: (\r\n value: InferArrayElement<TShape>,\r\n setter: StateObject<InferArrayElement<TShape>>,\r\n index: { localIndex: number; originalIndex: number },\r\n array: TShape,\r\n arraySetter: StateObject<TShape>\r\n ) => void\r\n ) => any;\r\n stateMap: (\r\n callbackfn: (\r\n value: InferArrayElement<TShape>,\r\n setter: StateObject<InferArrayElement<TShape>>,\r\n index: number,\r\n array: TShape,\r\n arraySetter: StateObject<TShape>\r\n ) => void\r\n ) => any;\r\n $stateMap: (\r\n callbackfn: (\r\n value: InferArrayElement<TShape>,\r\n setter: StateObject<InferArrayElement<TShape>>,\r\n index: number,\r\n array: TShape,\r\n arraySetter: StateObject<TShape>\r\n ) => void\r\n ) => any;\r\n stateFlattenOn: <K extends keyof InferArrayElement<TShape>>(\r\n field: K\r\n ) => StateObject<InferArrayElement<InferArrayElement<TShape>[K]>[]>;\r\n uniqueInsert: (\r\n payload: UpdateArg<InferArrayElement<TShape>>,\r\n fields?: (keyof InferArrayElement<TShape>)[],\r\n onMatch?: (existingItem: any) => any\r\n ) => void;\r\n stateFind: (\r\n callbackfn: (value: InferArrayElement<TShape>, index: number) => boolean\r\n ) => StateObject<InferArrayElement<TShape>> | undefined;\r\n stateFilter: (\r\n callbackfn: (value: InferArrayElement<TShape>, index: number) => void\r\n ) => ArrayEndType<TShape>;\r\n getSelected: () => StateObject<InferArrayElement<TShape>> | undefined;\r\n clearSelected: () => void;\r\n getSelectedIndex: () => number;\r\n last: () => StateObject<InferArrayElement<TShape>> | undefined;\r\n} & EndType<TShape>;\r\n\r\nexport type FormOptsType = {\r\n key?: string;\r\n validation?: {\r\n hideMessage?: boolean;\r\n message?: string;\r\n stretch?: boolean;\r\n props?: GenericObject;\r\n disable?: boolean;\r\n };\r\n formElements?: boolean;\r\n debounceTime?: number;\r\n stateServerDifferences?: string[][];\r\n};\r\n\r\nexport type FormControl<T> = (obj: FormElementParams<T>) => JSX.Element;\r\n\r\nexport type UpdateArg<S> = S | ((prevState: S) => S);\r\n\r\nexport type UpdateType<T> = (\r\n payload: UpdateArg<T>,\r\n opts?: UpdateOpts<T>\r\n) => void;\r\n\r\nexport type UpdateOpts<T> = {\r\n afterUpdate?: (state: T) => void;\r\n debounce?: number;\r\n};\r\nexport type ObjectEndType<T> = EndType<T> & {\r\n [K in keyof T]-?: ObjectEndType<T[K]>;\r\n} & {\r\n stateObject: (callbackfn: (value: T, setter: StateObject<T>) => void) => any;\r\n delete: () => void;\r\n};\r\nexport type ValidationError = {\r\n path: (string | number)[];\r\n message: string;\r\n};\r\ntype EffectFunction<T, R> = (state: T) => R;\r\nexport type EndType<T, IsArrayElement = false> = {\r\n addValidation: (errors: ValidationError[]) => void;\r\n applyJsonPatch: (patches: any[]) => void;\r\n update: UpdateType<T>;\r\n _path: string[];\r\n _stateKey: string;\r\n formElement: (control: FormControl<T>, opts?: FormOptsType) => JSX.Element;\r\n get: () => T;\r\n $get: () => T;\r\n $derive: <R>(fn: EffectFunction<T, R>) => R;\r\n _status: \"fresh\" | \"stale\" | \"synced\";\r\n getStatus: () => \"fresh\" | \"stale\";\r\n\r\n showValidationErrors: () => string[];\r\n setValidation: (ctx: string) => void;\r\n removeValidation: (ctx: string) => void;\r\n ignoreFields: (fields: string[]) => StateObject<T>;\r\n _selected: boolean;\r\n setSelected: (value: boolean) => void;\r\n toggleSelected: () => void;\r\n getFormRef: () => React.RefObject<any> | undefined;\r\n removeStorage: () => void;\r\n sync: () => void;\r\n validationWrapper: ({\r\n children,\r\n hideMessage,\r\n }: {\r\n children: React.ReactNode;\r\n hideMessage?: boolean;\r\n }) => JSX.Element;\r\n lastSynced?: SyncInfo;\r\n} & (IsArrayElement extends true ? { cut: () => void } : {});\r\n\r\nexport type StateObject<T> = (T extends any[]\r\n ? ArrayEndType<T>\r\n : T extends Record<string, unknown> | object\r\n ? { [K in keyof T]-?: StateObject<T[K]> } & ObjectEndType<T>\r\n : T extends string | number | boolean | null\r\n ? T\r\n : never) &\r\n EndType<T, true> & {\r\n getAllFormRefs: () => Map<string, React.RefObject<any>>;\r\n _componentId: string | null;\r\n getComponents: () => ComponentsType;\r\n validateZodSchema: () => void;\r\n _initialState: T;\r\n updateInitialState: (newState: T | null) => {\r\n fetchId: (field: keyof T) => string | number;\r\n };\r\n _isLoading: boolean;\r\n _serverState: T;\r\n revertToInitialState: (obj?: { validationKey?: string }) => T;\r\n getDifferences: () => string[];\r\n middleware: (\r\n middles: ({\r\n updateLog,\r\n update,\r\n }: {\r\n updateLog: UpdateTypeDetail[] | undefined;\r\n update: UpdateTypeDetail;\r\n }) => void\r\n ) => void;\r\n _isServerSynced: () => boolean;\r\n getLocalStorage: (key: string) => LocalStorageData<T> | null;\r\n };\r\n\r\nexport type CogsUpdate<T extends unknown> = UpdateType<T>;\r\n\r\nexport type EffectiveSetState<TStateObject> = (\r\n newStateOrFunction: UpdateArg<TStateObject>,\r\n path: string[],\r\n updateObj: { updateType: \"update\" | \"insert\" | \"cut\" },\r\n validationKey?: string,\r\n opts?: UpdateOpts<TStateObject>\r\n) => void;\r\n\r\nexport type UpdateTypeDetail = {\r\n timeStamp: number;\r\n stateKey: string;\r\n updateType: \"update\" | \"insert\" | \"cut\";\r\n path: string[];\r\n status: \"new\" | \"sent\" | \"synced\";\r\n oldValue: any;\r\n newValue: any;\r\n userId?: number;\r\n};\r\n\r\nexport type ActionsType<T> = {\r\n type: \"onChange\";\r\n action: ({ state, actionType }: { state: T; actionType: string }) => void;\r\n debounce?: number;\r\n}[];\r\n\r\ntype ArrayToObject<T extends string[]> = Record<T[number], string>;\r\ntype CookieType<T> = {\r\n timeStamp: number;\r\n value: T;\r\n cookieName: string;\r\n OnUnMountCookie?: Boolean;\r\n};\r\nexport type CogsCookiesType<T extends string[] = string[]> = CookieType<\r\n ArrayToObject<T>\r\n>;\r\nexport type ReactivityType = \"none\" | \"component\" | \"deps\" | \"all\";\r\n\r\ntype ValidationOptionsType = {\r\n key?: string;\r\n zodSchema?: z.ZodTypeAny;\r\n onBlur?: boolean;\r\n};\r\n\r\nexport type OptionsType<T extends unknown = unknown> = {\r\n log?: boolean;\r\n componentId?: string;\r\n serverSync?: ServerSyncType<T>;\r\n validation?: ValidationOptionsType;\r\n enableServerState?: boolean;\r\n serverState?: {\r\n id?: string | number;\r\n data?: T;\r\n status?: \"pending\" | \"error\" | \"success\";\r\n };\r\n sync?: {\r\n action: (state: T) => Promise<{\r\n success: boolean;\r\n data?: any;\r\n error?: any;\r\n errors?: Array<{\r\n path: (string | number)[];\r\n message: string;\r\n }>;\r\n }>;\r\n onSuccess?: (data: any) => void;\r\n onError?: (error: any) => void;\r\n };\r\n middleware?: ({\r\n updateLog,\r\n update,\r\n }: {\r\n updateLog: UpdateTypeDetail[] | undefined;\r\n update: UpdateTypeDetail;\r\n }) => void;\r\n\r\n modifyState?: (state: T) => T;\r\n localStorage?: {\r\n key: string | ((state: T) => string);\r\n onChange?: (state: T) => void;\r\n };\r\n formElements?: FormsElementsType;\r\n enabledSync?: (state: T) => boolean;\r\n reactiveDeps?: (state: T) => any[] | true;\r\n reactiveType?: ReactivityType[] | ReactivityType;\r\n syncUpdate?: Partial<UpdateTypeDetail>;\r\n\r\n initialState?: T;\r\n dependencies?: any[];\r\n};\r\nexport type ServerSyncType<T> = {\r\n testKey?: string;\r\n syncKey: (({ state }: { state: T }) => string) | string;\r\n syncFunction: ({ state }: { state: T }) => void;\r\n debounce?: number;\r\n\r\n snapshot?: {\r\n name: (({ state }: { state: T }) => string) | string;\r\n stateKeys: StateKeys[];\r\n currentUrl: string;\r\n currentParams?: URLSearchParams;\r\n };\r\n};\r\nexport type SyncActionsType<T> = {\r\n syncKey: string;\r\n\r\n rollBackState?: T;\r\n actionTimeStamp: number;\r\n retryCount?: number;\r\n status:\r\n | \"success\"\r\n | \"waiting\"\r\n | \"rolledBack\"\r\n | \"error\"\r\n | \"cancelled\"\r\n | \"failed\";\r\n snapshot?: {\r\n name: string;\r\n stateKeys: StateKeys[];\r\n currentUrl: string;\r\n currentParams?: URLSearchParams;\r\n };\r\n};\r\n\r\nexport type ValidationWrapperOptions<T extends unknown = unknown> = {\r\n children: React.ReactNode;\r\n active: boolean;\r\n stretch?: boolean;\r\n path: string[];\r\n message?: string;\r\n data?: T;\r\n key?: string;\r\n};\r\nexport type SyncRenderOptions<T extends unknown = unknown> = {\r\n children: React.ReactNode;\r\n time: number;\r\n data?: T;\r\n key?: string;\r\n};\r\n\r\ntype FormsElementsType<T extends unknown = unknown> = {\r\n validation?: (options: ValidationWrapperOptions<T>) => React.ReactNode;\r\n syncRender?: (options: SyncRenderOptions<T>) => React.ReactNode;\r\n};\r\n\r\nexport type InitialStateInnerType<T extends unknown = unknown> = {\r\n initialState: T;\r\n} & OptionsType<T>;\r\n\r\nexport type InitialStateType<T> = {\r\n [key: string]: InitialStateInnerType<T>;\r\n};\r\n\r\nexport type AllStateTypes<T extends unknown> = Record<string, T>;\r\n\r\nexport type CogsInitialState<T> = {\r\n initialState: T;\r\n formElements?: FormsElementsType<T>;\r\n};\r\n\r\nexport type TransformedStateType<T> = {\r\n [P in keyof T]: T[P] extends CogsInitialState<infer U> ? U : T[P];\r\n};\r\n\r\nfunction setAndMergeOptions(stateKey: string, newOptions: OptionsType<any>) {\r\n const getInitialOptions = getGlobalStore.getState().getInitialOptions;\r\n const setInitialStateOptions =\r\n getGlobalStore.getState().setInitialStateOptions;\r\n\r\n const initialOptions = getInitialOptions(stateKey as string) || {};\r\n\r\n setInitialStateOptions(stateKey as string, {\r\n ...initialOptions,\r\n ...newOptions,\r\n });\r\n}\r\n\r\n// Fix for the setOptions function\r\nfunction setOptions<StateKey, Opt>({\r\n stateKey,\r\n options,\r\n initialOptionsPart,\r\n}: {\r\n stateKey: StateKey;\r\n options?: OptionsType<any>;\r\n initialOptionsPart: Record<string, any>;\r\n}) {\r\n const initialOptions = getInitialOptions(stateKey as string) || {};\r\n const initialOptionsPartState = initialOptionsPart[stateKey as string] || {};\r\n const setInitialStateOptions =\r\n getGlobalStore.getState().setInitialStateOptions;\r\n const mergedOptions = { ...initialOptionsPartState, ...initialOptions };\r\n\r\n let needToAdd = false;\r\n if (options) {\r\n for (const key in options) {\r\n if (!mergedOptions.hasOwnProperty(key)) {\r\n needToAdd = true;\r\n mergedOptions[key] = options[key as keyof typeof options];\r\n } else {\r\n if (\r\n key == \"localStorage\" &&\r\n options[key] &&\r\n mergedOptions[key].key !== options[key]?.key\r\n ) {\r\n needToAdd = true;\r\n mergedOptions[key] = options[key];\r\n }\r\n if (\r\n key == \"initialState\" &&\r\n options[key] &&\r\n mergedOptions[key] !== options[key] && // Different references\r\n !isDeepEqual(mergedOptions[key], options[key]) // And different values\r\n ) {\r\n needToAdd = true;\r\n mergedOptions[key] = options[key];\r\n }\r\n }\r\n }\r\n }\r\n\r\n if (needToAdd) {\r\n setInitialStateOptions(stateKey as string, mergedOptions);\r\n }\r\n}\r\nexport function addStateOptions<T extends unknown>(\r\n initialState: T,\r\n { formElements, validation }: OptionsType<T>\r\n) {\r\n return { initialState: initialState, formElements, validation } as T;\r\n}\r\n\r\nexport const createCogsState = <State extends Record<string, unknown>>(\r\n initialState: State,\r\n opt?: { formElements?: FormsElementsType; validation?: ValidationOptionsType }\r\n) => {\r\n let newInitialState = initialState;\r\n\r\n // Extract state parts and options using transformStateFunc\r\n const [statePart, initialOptionsPart] =\r\n transformStateFunc<State>(newInitialState);\r\n\r\n // Apply global formElements as defaults to each state key's options\r\n if (\r\n Object.keys(initialOptionsPart).length > 0 ||\r\n (opt && Object.keys(opt).length > 0)\r\n ) {\r\n Object.keys(initialOptionsPart).forEach((key) => {\r\n // Get the existing options for this state key\r\n initialOptionsPart[key] = initialOptionsPart[key] || {};\r\n\r\n initialOptionsPart[key].formElements = {\r\n ...opt?.formElements, // Global defaults first\r\n ...opt?.validation,\r\n ...(initialOptionsPart[key].formElements || {}), // State-specific overrides\r\n };\r\n const existingOptions = getInitialOptions(key);\r\n\r\n if (!existingOptions) {\r\n getGlobalStore\r\n .getState()\r\n .setInitialStateOptions(key, initialOptionsPart[key]);\r\n }\r\n });\r\n }\r\n\r\n getGlobalStore.getState().setInitialStates(statePart);\r\n getGlobalStore.getState().setCreatedState(statePart);\r\n type StateKeys = keyof typeof statePart;\r\n\r\n const useCogsState = <StateKey extends StateKeys>(\r\n stateKey: StateKey,\r\n options?: OptionsType<(typeof statePart)[StateKey]>\r\n ) => {\r\n const [componentId] = useState(options?.componentId ?? uuidv4());\r\n\r\n setOptions({\r\n stateKey,\r\n options,\r\n initialOptionsPart,\r\n });\r\n\r\n const thiState =\r\n getGlobalStore.getState().cogsStateStore[stateKey as string] ||\r\n statePart[stateKey as string];\r\n const partialState = options?.modifyState\r\n ? options.modifyState(thiState)\r\n : thiState;\r\n\r\n const [state, updater] = useCogsStateFn<(typeof statePart)[StateKey]>(\r\n partialState,\r\n {\r\n stateKey: stateKey as string,\r\n syncUpdate: options?.syncUpdate,\r\n componentId,\r\n localStorage: options?.localStorage,\r\n middleware: options?.middleware,\r\n enabledSync: options?.enabledSync,\r\n reactiveType: options?.reactiveType,\r\n reactiveDeps: options?.reactiveDeps,\r\n initialState: options?.initialState as any,\r\n dependencies: options?.dependencies,\r\n serverState: options?.serverState,\r\n }\r\n );\r\n\r\n return updater;\r\n };\r\n\r\n function setCogsOptions<StateKey extends StateKeys>(\r\n stateKey: StateKey,\r\n options: OptionsType<(typeof statePart)[StateKey]>\r\n ) {\r\n setOptions({ stateKey, options, initialOptionsPart });\r\n\r\n if (options.localStorage) {\r\n loadAndApplyLocalStorage(stateKey as string, options);\r\n }\r\n\r\n notifyComponents(stateKey as string);\r\n }\r\n\r\n return { useCogsState, setCogsOptions };\r\n};\r\n\r\nconst {\r\n setUpdaterState,\r\n setState,\r\n getInitialOptions,\r\n getKeyState,\r\n getValidationErrors,\r\n setStateLog,\r\n updateInitialStateGlobal,\r\n addValidationError,\r\n removeValidationError,\r\n setServerSyncActions,\r\n} = getGlobalStore.getState();\r\nconst saveToLocalStorage = <T,>(\r\n state: T,\r\n thisKey: string,\r\n currentInitialOptions: any,\r\n sessionId?: string,\r\n lastSyncedWithServer?: number\r\n) => {\r\n if (currentInitialOptions?.log) {\r\n console.log(\r\n \"saving to localstorage\",\r\n thisKey,\r\n currentInitialOptions.localStorage?.key,\r\n sessionId\r\n );\r\n }\r\n\r\n const key = isFunction(currentInitialOptions?.localStorage?.key)\r\n ? currentInitialOptions.localStorage?.key(state)\r\n : currentInitialOptions?.localStorage?.key;\r\n\r\n if (key && sessionId) {\r\n const storageKey = `${sessionId}-${thisKey}-${key}`;\r\n\r\n // Get existing data to preserve lastSyncedWithServer if not explicitly updating it\r\n let existingLastSynced: number | undefined;\r\n try {\r\n const existing = loadFromLocalStorage(storageKey);\r\n existingLastSynced = existing?.lastSyncedWithServer;\r\n } catch {\r\n // Ignore errors, will use undefined\r\n }\r\n\r\n const data: LocalStorageData<T> = {\r\n state,\r\n lastUpdated: Date.now(),\r\n lastSyncedWithServer: lastSyncedWithServer ?? existingLastSynced,\r\n };\r\n\r\n // Use SuperJSON serialize to get the json part only\r\n const superJsonResult = superjson.serialize(data);\r\n window.localStorage.setItem(\r\n storageKey,\r\n JSON.stringify(superJsonResult.json)\r\n );\r\n }\r\n};\r\n\r\nconst loadFromLocalStorage = (localStorageKey: string) => {\r\n if (!localStorageKey) return null;\r\n\r\n try {\r\n const storedData = window.localStorage.getItem(localStorageKey);\r\n if (!storedData) return null;\r\n\r\n // Parse the json part back normally\r\n const parsedData = JSON.parse(storedData);\r\n\r\n return parsedData;\r\n } catch (error) {\r\n console.error(\"Error loading from localStorage:\", error);\r\n return null;\r\n }\r\n};\r\nconst loadAndApplyLocalStorage = (stateKey: string, options: any) => {\r\n const currentState = getGlobalStore.getState().cogsStateStore[stateKey];\r\n const { sessionId } = useCogsConfig();\r\n const localkey = isFunction(options?.localStorage?.key)\r\n ? options.localStorage.key(currentState)\r\n : options?.localStorage?.key;\r\n\r\n if (localkey && sessionId) {\r\n const localData = loadFromLocalStorage(\r\n `${sessionId}-${stateKey}-${localkey}`\r\n );\r\n\r\n if (\r\n localData &&\r\n localData.lastUpdated > (localData.lastSyncedWithServer || 0)\r\n ) {\r\n setState(stateKey, localData.state);\r\n\r\n notifyComponents(stateKey);\r\n return true;\r\n }\r\n }\r\n return false;\r\n};\r\n\r\ntype LocalStorageData<T> = {\r\n state: T;\r\n lastUpdated: number;\r\n lastSyncedWithServer?: number;\r\n baseServerState?: T; // Add this to track what server state our changes are based on\r\n};\r\n\r\nconst updateGlobalState = (\r\n thisKey: string,\r\n initialState: any,\r\n newState: any,\r\n effectiveSetState: EffectiveSetState<any>,\r\n componentId: string,\r\n sessionId?: string\r\n) => {\r\n // Update all global state at once\r\n const updates = {\r\n initialState: initialState,\r\n updaterState: createProxyHandler(\r\n thisKey,\r\n effectiveSetState,\r\n componentId,\r\n sessionId\r\n ),\r\n state: newState,\r\n };\r\n\r\n updateInitialStateGlobal(thisKey, updates.initialState);\r\n setUpdaterState(thisKey, updates.updaterState);\r\n setState(thisKey, updates.state);\r\n};\r\n\r\nconst notifyComponents = (thisKey: string) => {\r\n const stateEntry = getGlobalStore.getState().stateComponents.get(thisKey);\r\n if (!stateEntry) return;\r\n\r\n // Batch component updates\r\n const updates = new Set<() => void>();\r\n stateEntry.components.forEach((component) => {\r\n const reactiveTypes = component\r\n ? Array.isArray(component.reactiveType)\r\n ? component.reactiveType\r\n : [component.reactiveType || \"component\"]\r\n : null;\r\n if (!reactiveTypes?.includes(\"none\")) {\r\n updates.add(() => component.forceUpdate());\r\n }\r\n });\r\n\r\n // Schedule updates in the next tick to allow batching\r\n queueMicrotask(() => {\r\n updates.forEach((update) => update());\r\n });\r\n};\r\n\r\nexport const notifyComponent = (stateKey: string, componentId: string) => {\r\n const stateEntry = getGlobalStore.getState().stateComponents.get(stateKey);\r\n if (stateEntry) {\r\n const fullComponentId = `${stateKey}////${componentId}`;\r\n const component = stateEntry.components.get(fullComponentId);\r\n const reactiveTypes = component\r\n ? Array.isArray(component.reactiveType)\r\n ? component.reactiveType\r\n : [component.reactiveType || \"component\"]\r\n : null;\r\n\r\n // Skip if reactivity is disabled\r\n if (reactiveTypes?.includes(\"none\")) {\r\n return;\r\n }\r\n\r\n if (component) {\r\n // Force an update to ensure the current value is saved\r\n\r\n component.forceUpdate();\r\n }\r\n }\r\n};\r\nconst getUpdateValues = (\r\n updateType: string,\r\n prevValue: any,\r\n payload: any,\r\n path: string[]\r\n) => {\r\n switch (updateType) {\r\n case \"update\":\r\n return {\r\n oldValue: getNestedValue(prevValue, path),\r\n newValue: getNestedValue(payload, path),\r\n };\r\n case \"insert\":\r\n return {\r\n oldValue: null, // or undefined\r\n newValue: getNestedValue(payload, path),\r\n };\r\n case \"cut\":\r\n return {\r\n oldValue: getNestedValue(prevValue, path),\r\n newValue: null, // or undefined\r\n };\r\n default:\r\n return { oldValue: null, newValue: null };\r\n }\r\n};\r\nexport function useCogsStateFn<TStateObject extends unknown>(\r\n stateObject: TStateObject,\r\n {\r\n stateKey,\r\n serverSync,\r\n localStorage,\r\n formElements,\r\n reactiveDeps,\r\n reactiveType,\r\n componentId,\r\n initialState,\r\n syncUpdate,\r\n dependencies,\r\n serverState,\r\n }: {\r\n stateKey?: string;\r\n componentId?: string;\r\n initialState?: TStateObject;\r\n } & OptionsType<TStateObject> = {}\r\n) {\r\n const [reactiveForce, forceUpdate] = useState({}); //this is the key to reactivity\r\n const { sessionId } = useCogsConfig();\r\n\r\n let noStateKey = stateKey ? false : true;\r\n const [thisKey] = useState(stateKey ?? uuidv4());\r\n const stateLog = getGlobalStore.getState().stateLog[thisKey];\r\n const componentUpdatesRef = useRef(new Set<string>());\r\n const componentIdRef = useRef(componentId ?? uuidv4());\r\n const latestInitialOptionsRef = useRef<OptionsType<TStateObject> | null>(\r\n null\r\n );\r\n latestInitialOptionsRef.current = (getInitialOptions(thisKey as string) ??\r\n null) as OptionsType<TStateObject> | null;\r\n\r\n useEffect(() => {\r\n if (syncUpdate && syncUpdate.stateKey === thisKey && syncUpdate.path?.[0]) {\r\n // Update the actual state value\r\n setState(thisKey, (prevState: any) => ({\r\n ...prevState,\r\n [syncUpdate.path![0]!]: syncUpdate.newValue,\r\n }));\r\n\r\n // Create combined key and update sync info\r\n const syncKey = `${syncUpdate.stateKey}:${syncUpdate.path.join(\".\")}`;\r\n getGlobalStore.getState().setSyncInfo(syncKey, {\r\n timeStamp: syncUpdate.timeStamp!,\r\n userId: syncUpdate.userId!,\r\n });\r\n }\r\n }, [syncUpdate]);\r\n useEffect(() => {\r\n // Only proceed if initialState is provided\r\n if (initialState) {\r\n setAndMergeOptions(thisKey as string, {\r\n initialState,\r\n });\r\n\r\n const options = latestInitialOptionsRef.current;\r\n const hasServerId = options?.serverState?.id !== undefined;\r\n const hasServerData =\r\n hasServerId &&\r\n options?.serverState?.status === \"success\" &&\r\n options?.serverState?.data;\r\n\r\n const currentGloballyStoredInitialState =\r\n getGlobalStore.getState().initialStateGlobal[thisKey];\r\n\r\n const initialStateChanged =\r\n (currentGloballyStoredInitialState &&\r\n !isDeepEqual(currentGloballyStoredInitialState, initialState)) ||\r\n !currentGloballyStoredInitialState;\r\n\r\n if (!initialStateChanged && !hasServerData) {\r\n return;\r\n }\r\n\r\n let localData = null;\r\n const localkey = isFunction(options?.localStorage?.key)\r\n ? options?.localStorage?.key(initialState)\r\n : options?.localStorage?.key;\r\n\r\n if (localkey && sessionId) {\r\n localData = loadFromLocalStorage(`${sessionId}-${thisKey}-${localkey}`);\r\n }\r\n\r\n let newState = initialState;\r\n let isFromServer = false;\r\n\r\n const serverTimestamp = hasServerData ? Date.now() : 0;\r\n const localTimestamp = localData?.lastUpdated || 0;\r\n const lastSyncTimestamp = localData?.lastSyncedWithServer || 0;\r\n\r\n if (hasServerData && serverTimestamp > localTimestamp) {\r\n newState = options.serverState!.data!;\r\n isFromServer = true;\r\n } else if (localData && localTimestamp > lastSyncTimestamp) {\r\n newState = localData.state;\r\n if (options?.localStorage?.onChange) {\r\n options?.localStorage?.onChange(newState);\r\n }\r\n }\r\n getGlobalStore.getState().initializeShadowState(thisKey, initialState);\r\n // Update the global state\r\n updateGlobalState(\r\n thisKey,\r\n initialState,\r\n newState,\r\n effectiveSetState,\r\n componentIdRef.current,\r\n sessionId\r\n );\r\n\r\n // Save to localStorage if we used server data\r\n if (isFromServer && localkey && sessionId) {\r\n saveToLocalStorage(newState, thisKey, options, sessionId, Date.now());\r\n }\r\n\r\n // Notify components of the change\r\n notifyComponents(thisKey);\r\n\r\n const reactiveTypes = Array.isArray(reactiveType)\r\n ? reactiveType\r\n : [reactiveType || \"component\"];\r\n\r\n if (!reactiveTypes.includes(\"none\")) {\r\n forceUpdate({});\r\n }\r\n }\r\n }, [\r\n initialState,\r\n serverState?.status,\r\n serverState?.data,\r\n ...(dependencies || []),\r\n ]);\r\n useLayoutEffect(() => {\r\n if (noStateKey) {\r\n setAndMergeOptions(thisKey as string, {\r\n serverSync,\r\n formElements,\r\n initialState,\r\n localStorage,\r\n middleware: latestInitialOptionsRef.current?.middleware,\r\n });\r\n }\r\n\r\n const componentKey = `${thisKey}////${componentIdRef.current}`;\r\n const stateEntry = getGlobalStore\r\n .getState()\r\n .stateComponents.get(thisKey) || {\r\n components: new Map(),\r\n };\r\n\r\n stateEntry.components.set(componentKey, {\r\n forceUpdate: () => forceUpdate({}),\r\n paths: new Set(),\r\n deps: [],\r\n depsFunction: reactiveDeps || undefined,\r\n reactiveType: reactiveType ?? [\"component\", \"deps\"],\r\n });\r\n\r\n getGlobalStore.getState().stateComponents.set(thisKey, stateEntry);\r\n //need to force update to create the stateUpdates references\r\n forceUpdate({});\r\n return () => {\r\n if (stateEntry) {\r\n stateEntry.components.delete(componentKey);\r\n if (stateEntry.components.size === 0) {\r\n getGlobalStore.getState().stateComponents.delete(thisKey);\r\n }\r\n }\r\n };\r\n }, []);\r\n\r\n const effectiveSetState = (\r\n newStateOrFunction: UpdateArg<TStateObject>,\r\n path: string[],\r\n updateObj: { updateType: \"insert\" | \"cut\" | \"update\" },\r\n validationKey?: string\r\n ) => {\r\n if (Array.isArray(path)) {\r\n const pathKey = `${thisKey}-${path.join(\".\")}`;\r\n componentUpdatesRef.current.add(pathKey);\r\n }\r\n const store = getGlobalStore.getState();\r\n\r\n setState(thisKey, (prevValue: TStateObject) => {\r\n const payload = isFunction<TStateObject>(newStateOrFunction)\r\n ? newStateOrFunction(prevValue as TStateObject)\r\n : newStateOrFunction;\r\n\r\n const signalId = `${thisKey}-${path.join(\".\")}`;\r\n if (signalId) {\r\n let isArrayOperation = false;\r\n let elements = store.signalDomElements.get(signalId);\r\n\r\n if (\r\n (!elements || elements.size === 0) &&\r\n (updateObj.updateType === \"insert\" || updateObj.updateType === \"cut\")\r\n ) {\r\n // Remove last segment (index) from path\r\n const arrayPath = path.slice(0, -1);\r\n const arrayValue = getNestedValue(payload, arrayPath);\r\n // If it's an array, use that path for signal\r\n if (Array.isArray(arrayValue)) {\r\n isArrayOperation = true;\r\n const arraySignalId = `${thisKey}-${arrayPath.join(\".\")}`;\r\n elements = store.signalDomElements.get(arraySignalId);\r\n }\r\n }\r\n\r\n if (elements) {\r\n const newValue = isArrayOperation\r\n ? getNestedValue(payload, path.slice(0, -1))\r\n : getNestedValue(payload, path);\r\n elements.forEach(({ parentId, position, effect }) => {\r\n const parent = document.querySelector(\r\n `[data-parent-id=\"${parentId}\"]`\r\n );\r\n if (parent) {\r\n const childNodes = Array.from(parent.childNodes);\r\n if (childNodes[position]) {\r\n const displayValue = effect\r\n ? new Function(\"state\", `return (${effect})(state)`)(newValue)\r\n : newValue;\r\n childNodes[position].textContent = String(displayValue);\r\n }\r\n }\r\n });\r\n }\r\n }\r\n\r\n console.log(\"shadowState\", store.shadowStateStore);\r\n if (\r\n updateObj.updateType === \"update\" &&\r\n (validationKey || latestInitialOptionsRef.current?.validation?.key) &&\r\n path\r\n ) {\r\n removeValidationError(\r\n (validationKey || latestInitialOptionsRef.current?.validation?.key) +\r\n \".\" +\r\n path.join(\".\")\r\n );\r\n }\r\n const arrayWithoutIndex = path.slice(0, path.length - 1);\r\n if (\r\n updateObj.updateType === \"cut\" &&\r\n latestInitialOptionsRef.current?.validation?.key\r\n ) {\r\n removeValidationError(\r\n latestInitialOptionsRef.current?.validation?.key +\r\n \".\" +\r\n arrayWithoutIndex.join(\".\")\r\n );\r\n }\r\n if (\r\n updateObj.updateType === \"insert\" &&\r\n latestInitialOptionsRef.current?.validation?.key\r\n ) {\r\n let getValidation = getValidationErrors(\r\n latestInitialOptionsRef.current?.validation?.key +\r\n \".\" +\r\n arrayWithoutIndex.join(\".\")\r\n );\r\n\r\n //TODO this is untested its supposed to cahnge teh validation errors alreaady stored when a new entry is push\r\n\r\n getValidation.filter(([k, v]) => {\r\n let length = k?.split(\".\").length;\r\n\r\n if (\r\n k == arrayWithoutIndex.join(\".\") &&\r\n length == arrayWithoutIndex.length - 1\r\n ) {\r\n // console.log(length, pathWithoutIndex.length);\r\n let newKey = k + \".\" + arrayWithoutIndex;\r\n removeValidationError(k!);\r\n addValidationError(newKey, v!);\r\n }\r\n });\r\n }\r\n\r\n const stateEntry = store.stateComponents.get(thisKey);\r\n console.log(\"stateEntry >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>\", stateEntry);\r\n if (stateEntry) {\r\n const changedPaths = getDifferences(prevValue, payload);\r\n const changedPathsSet = new Set(changedPaths);\r\n const primaryPathToCheck =\r\n updateObj.updateType === \"update\"\r\n ? path.join(\".\")\r\n : path.slice(0, -1).join(\".\") || \"\";\r\n\r\n for (const [\r\n componentKey,\r\n component,\r\n ] of stateEntry.components.entries()) {\r\n let shouldUpdate = false;\r\n const reactiveTypes = Array.isArray(component.reactiveType)\r\n ? component.reactiveType\r\n : [component.reactiveType || \"component\"];\r\n console.log(\"component\", component);\r\n if (reactiveTypes.includes(\"none\")) continue;\r\n if (reactiveTypes.includes(\"all\")) {\r\n component.forceUpdate();\r\n continue;\r\n }\r\n\r\n if (reactiveTypes.includes(\"component\")) {\r\n if (\r\n component.paths.has(primaryPathToCheck) ||\r\n component.paths.has(\"\")\r\n ) {\r\n shouldUpdate = true;\r\n }\r\n\r\n if (!shouldUpdate) {\r\n for (const changedPath of changedPathsSet) {\r\n let currentPathToCheck = changedPath;\r\n while (true) {\r\n if (component.paths.has(currentPathToCheck)) {\r\n shouldUpdate = true;\r\n break;\r\n }\r\n const lastDotIndex = currentPathToCheck.lastIndexOf(\".\");\r\n if (lastDotIndex !== -1) {\r\n const parentPath = currentPathToCheck.substring(\r\n 0,\r\n lastDotIndex\r\n );\r\n if (\r\n !isNaN(\r\n Number(currentPathToCheck.substring(lastDotIndex + 1))\r\n )\r\n ) {\r\n if (component.paths.has(parentPath)) {\r\n shouldUpdate = true;\r\n break;\r\n }\r\n }\r\n currentPathToCheck = parentPath;\r\n } else {\r\n currentPathToCheck = \"\";\r\n }\r\n if (currentPathToCheck === \"\") {\r\n break;\r\n }\r\n }\r\n if (shouldUpdate) break;\r\n }\r\n }\r\n }\r\n\r\n if (!shouldUpdate && reactiveTypes.includes(\"deps\")) {\r\n if (component.depsFunction) {\r\n const depsResult = component.depsFunction(payload);\r\n let depsChanged = false;\r\n if (typeof depsResult === \"boolean\") {\r\n if (depsResult) depsChanged = true;\r\n } else if (!isDeepEqual(component.deps, depsResult)) {\r\n component.deps = depsResult;\r\n depsChanged = true;\r\n }\r\n if (depsChanged) {\r\n shouldUpdate = true;\r\n }\r\n }\r\n }\r\n if (shouldUpdate) {\r\n component.forceUpdate();\r\n }\r\n }\r\n }\r\n const timeStamp = Date.now();\r\n\r\n path = path.map((p, i) => {\r\n const arrayPath = path.slice(0, -1);\r\n const arrayValue = getNestedValue(payload, arrayPath);\r\n\r\n return i === path.length - 1 &&\r\n [\"insert\", \"cut\"].includes(updateObj.updateType)\r\n ? (arrayValue.length - 1).toString()\r\n : p;\r\n });\r\n\r\n const { oldValue, newValue } = getUpdateValues(\r\n updateObj.updateType,\r\n prevValue,\r\n payload,\r\n path\r\n );\r\n const newUpdate = {\r\n timeStamp,\r\n stateKey: thisKey,\r\n path,\r\n updateType: updateObj.updateType,\r\n status: \"new\" as const,\r\n oldValue,\r\n newValue,\r\n } satisfies UpdateTypeDetail;\r\n\r\n switch (updateObj.updateType) {\r\n case \"update\":\r\n // For updates, just mirror the structure at the path\r\n store.updateShadowAtPath(thisKey, path, payload);\r\n break;\r\n\r\n case \"insert\":\r\n // For array insert, add empty element to shadow array\r\n\r\n const parentPath = path.slice(0, -1);\r\n store.insertShadowArrayElement(thisKey, parentPath, newValue);\r\n break;\r\n\r\n case \"cut\":\r\n // For array cut, remove element from shadow a\r\n const arrayPath = path.slice(0, -1);\r\n const index = parseInt(path[path.length - 1]!);\r\n store.removeShadowArrayElement(thisKey, arrayPath, index);\r\n break;\r\n }\r\n\r\n setStateLog(thisKey, (prevLogs) => {\r\n const logs = [...(prevLogs ?? []), newUpdate];\r\n\r\n // Aggregate the updates by stateKey and path\r\n const aggregatedLogs = logs.reduce((acc, log) => {\r\n const uniqueKey = `${log.stateKey}:${JSON.stringify(log.path)}`;\r\n const existing = acc.get(uniqueKey);\r\n\r\n if (existing) {\r\n // Update the existing entry with the most recent details\r\n existing.timeStamp = Math.max(existing.timeStamp, log.timeStamp);\r\n existing.newValue = log.newValue; // Overwrite with the latest value\r\n existing.oldValue = existing.oldValue ?? log.oldValue; // Retain the initial oldValue\r\n existing.updateType = log.updateType; // Update to the most recent type\r\n } else {\r\n // Add the log if no existing match is found\r\n acc.set(uniqueKey, { ...(log as any) });\r\n }\r\n\r\n return acc;\r\n }, new Map<string, typeof newUpdate>());\r\n\r\n // Convert the aggregated map back to an array\r\n return Array.from(aggregatedLogs.values());\r\n });\r\n\r\n saveToLocalStorage(\r\n payload,\r\n thisKey,\r\n latestInitialOptionsRef.current,\r\n sessionId\r\n );\r\n\r\n if (latestInitialOptionsRef.current?.middleware) {\r\n latestInitialOptionsRef.current!.middleware({\r\n updateLog: stateLog,\r\n update: newUpdate,\r\n });\r\n }\r\n if (latestInitialOptionsRef.current?.serverSync) {\r\n const serverStateStore = store.serverState[thisKey];\r\n const serverSync = latestInitialOptionsRef.current?.serverSync;\r\n setServerSyncActions(thisKey, {\r\n syncKey:\r\n typeof serverSync.syncKey == \"string\"\r\n ? serverSync.syncKey\r\n : serverSync.syncKey({ state: payload }),\r\n rollBackState: serverStateStore,\r\n actionTimeStamp: Date.now() + (serverSync.debounce ?? 3000),\r\n status: \"waiting\",\r\n });\r\n }\r\n\r\n return payload;\r\n });\r\n };\r\n if (!getGlobalStore.getState().updaterState[thisKey]) {\r\n setUpdaterState(\r\n thisKey,\r\n createProxyHandler(\r\n thisKey,\r\n effectiveSetState,\r\n componentIdRef.current,\r\n sessionId\r\n )\r\n );\r\n if (!getGlobalStore.getState().cogsStateStore[thisKey]) {\r\n setState(thisKey, stateObject);\r\n }\r\n if (!getGlobalStore.getState().initialStateGlobal[thisKey]) {\r\n updateInitialStateGlobal(thisKey, stateObject);\r\n }\r\n }\r\n\r\n const updaterFinal = useMemo(() => {\r\n // Create proxy with baseObject as target\r\n return createProxyHandler<TStateObject>(\r\n thisKey,\r\n effectiveSetState,\r\n componentIdRef.current,\r\n sessionId\r\n );\r\n }, [thisKey, sessionId]);\r\n\r\n return [getKeyState(thisKey), updaterFinal] as [\r\n TStateObject,\r\n StateObject<TStateObject>,\r\n ];\r\n}\r\n\r\nfunction createProxyHandler<T>(\r\n stateKey: string,\r\n effectiveSetState: EffectiveSetState<T>,\r\n componentId: string,\r\n sessionId?: string\r\n): StateObject<T> {\r\n // ADDED: Enhanced cache with versioning\r\n type CacheEntry = {\r\n proxy: any;\r\n stateVersion: number;\r\n };\r\n const shapeCache = new Map<string, CacheEntry>();\r\n let stateVersion = 0;\r\n\r\n // ADDED: Cache invalidation helper\r\n const invalidateCachePath = (path: string[]) => {\r\n const pathKey = path.join(\".\");\r\n for (const [key] of shapeCache) {\r\n if (key === pathKey || key.startsWith(pathKey + \".\")) {\r\n shapeCache.delete(key);\r\n }\r\n }\r\n stateVersion++;\r\n };\r\n\r\n const baseObj = {\r\n removeValidation: (obj?: { validationKey?: string }) => {\r\n if (obj?.validationKey) {\r\n removeValidationError(obj.validationKey);\r\n }\r\n },\r\n\r\n revertToInitialState: (obj?: { validationKey?: string }) => {\r\n const init = getGlobalStore\r\n .getState()\r\n .getInitialOptions(stateKey)?.validation;\r\n if (init?.key) {\r\n removeValidationError(init?.key);\r\n }\r\n\r\n if (obj?.validationKey) {\r\n removeValidationError(obj.validationKey);\r\n }\r\n\r\n const initialState =\r\n getGlobalStore.getState().initialStateGlobal[stateKey];\r\n\r\n getGlobalStore.getState().clearSelectedIndexesForState(stateKey);\r\n // ADDED: Clear cache on revert\r\n shapeCache.clear();\r\n stateVersion++;\r\n\r\n const newProxy = rebuildStateShape(initialState, []);\r\n const initalOptionsGet = getInitialOptions(stateKey as string);\r\n const localKey = isFunction(initalOptionsGet?.localStorage?.key)\r\n ? initalOptionsGet?.localStorage?.key(initialState)\r\n : initalOptionsGet?.localStorage?.key;\r\n\r\n const storageKey = `${sessionId}-${stateKey}-${localKey}`;\r\n\r\n if (storageKey) {\r\n localStorage.removeItem(storageKey);\r\n }\r\n\r\n setUpdaterState(stateKey, newProxy);\r\n setState(stateKey, initialState);\r\n const stateEntry = getGlobalStore\r\n .getState()\r\n .stateComponents.get(stateKey);\r\n if (stateEntry) {\r\n stateEntry.components.forEach((component) => {\r\n component.forceUpdate();\r\n });\r\n }\r\n\r\n return initialState;\r\n },\r\n updateInitialState: (newState: T) => {\r\n // ADDED: Clear cache on initial state update\r\n shapeCache.clear();\r\n stateVersion++;\r\n\r\n const newUpdaterState = createProxyHandler(\r\n stateKey,\r\n effectiveSetState,\r\n componentId,\r\n sessionId\r\n );\r\n const initialState =\r\n getGlobalStore.getState().initialStateGlobal[stateKey];\r\n const initalOptionsGet = getInitialOptions(stateKey as string);\r\n const localKey = isFunction(initalOptionsGet?.localStorage?.key)\r\n ? initalOptionsGet?.localStorage?.key(initialState)\r\n : initalOptionsGet?.localStorage?.key;\r\n\r\n const storageKey = `${sessionId}-${stateKey}-${localKey}`;\r\n\r\n if (localStorage.getItem(storageKey)) {\r\n localStorage.removeItem(storageKey);\r\n }\r\n startTransition(() => {\r\n updateInitialStateGlobal(stateKey, newState);\r\n getGlobalStore.getState().initializeShadowState(stateKey, newState);\r\n setUpdaterState(stateKey, newUpdaterState);\r\n setState(stateKey, newState);\r\n const stateEntry = getGlobalStore\r\n .getState()\r\n .stateComponents.get(stateKey);\r\n\r\n if (stateEntry) {\r\n stateEntry.components.forEach((component) => {\r\n component.forceUpdate();\r\n });\r\n }\r\n });\r\n\r\n return {\r\n fetchId: (field: keyof T) => newUpdaterState.get()[field],\r\n };\r\n },\r\n _initialState: getGlobalStore.getState().initialStateGlobal[stateKey],\r\n _serverState: getGlobalStore.getState().serverState[stateKey],\r\n _isLoading: getGlobalStore.getState().isLoadingGlobal[stateKey],\r\n _isServerSynced: () => {\r\n const serverState = getGlobalStore.getState().serverState[stateKey];\r\n return Boolean(\r\n serverState && isDeepEqual(serverState, getKeyState(stateKey))\r\n );\r\n },\r\n };\r\n\r\n function rebuildStateShape(\r\n currentState: T,\r\n path: string[] = [],\r\n meta?: { filtered?: string[][]; validIndices?: number[] }\r\n ): any {\r\n const cacheKey = path.map(String).join(\".\");\r\n\r\n // MODIFIED: Cache check with version\r\n const cachedEntry = shapeCache.get(cacheKey);\r\n\r\n type CallableStateObject<T> = {\r\n (): T;\r\n } & {\r\n [key: string]: any;\r\n };\r\n\r\n const baseFunction = function () {\r\n return getGlobalStore().getNestedState(stateKey, path);\r\n } as unknown as CallableStateObject<T>;\r\n\r\n // Copy properties from baseObj to the function with type assertion\r\n Object.keys(baseObj).forEach((key) => {\r\n (baseFunction as any)[key] = (baseObj as any)[key];\r\n });\r\n\r\n const handler = {\r\n apply(target: any, thisArg: any, args: any[]) {\r\n console.log(\r\n `PROXY APPLY TRAP HIT: stateKey=${stateKey}, path=${path.join(\".\")}`\r\n ); // <--- ADD LOGGING\r\n console.trace(\"Apply trap stack trace\");\r\n return getGlobalStore().getNestedState(stateKey, path);\r\n },\r\n\r\n get(target: any, prop: string) {\r\n if (meta?.validIndices && !Array.isArray(currentState)) {\r\n meta = { ...meta, validIndices: undefined };\r\n }\r\n const mutationMethods = new Set([\r\n \"insert\",\r\n \"cut\",\r\n \"cutByValue\",\r\n \"toggleByValue\",\r\n \"uniqueInsert\",\r\n \"update\",\r\n \"applyJsonPatch\",\r\n \"setSelected\",\r\n \"toggleSelected\",\r\n \"clearSelected\",\r\n \"sync\",\r\n \"validateZodSchema\",\r\n \"revertToInitialState\",\r\n \"updateInitialState\",\r\n \"removeValidation\",\r\n \"setValidation\",\r\n \"removeStorage\",\r\n \"middleware\",\r\n \"_componentId\",\r\n \"_stateKey\",\r\n \"getComponents\",\r\n ]);\r\n\r\n if (\r\n prop !== \"then\" &&\r\n !prop.startsWith(\"$\") &&\r\n prop !== \"stateMapNoRender\" &&\r\n !mutationMethods.has(prop)\r\n ) {\r\n const fullComponentId = `${stateKey}////${componentId}`;\r\n // console.log(\"adding path\", fullComponentId, path, prop);\r\n const stateEntry = getGlobalStore\r\n .getState()\r\n .stateComponents.get(stateKey);\r\n\r\n if (stateEntry) {\r\n const component = stateEntry.components.get(fullComponentId);\r\n\r\n if (component) {\r\n // Mark as initialized immediately to prevent re-processing\r\n\r\n // Now do the path tracking logic ONCE\r\n if (!component.paths.has(\"\")) {\r\n const currentPath = path.join(\".\");\r\n let needsAdd = true;\r\n for (const existingPath of component.paths) {\r\n if (\r\n currentPath.startsWith(existingPath) &&\r\n (currentPath === existingPath ||\r\n currentPath[existingPath.length] === \".\")\r\n ) {\r\n needsAdd = false;\r\n break;\r\n }\r\n }\r\n\r\n if (needsAdd) {\r\n component.paths.add(currentPath);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n if (prop === \"getDifferences\") {\r\n return () => {\r\n const differences = getDifferences(\r\n getGlobalStore.getState().cogsStateStore[stateKey],\r\n getGlobalStore.getState().initialStateGlobal[stateKey]\r\n );\r\n return differences;\r\n };\r\n }\r\n if (prop === \"sync\" && path.length === 0) {\r\n return async function () {\r\n // Get the options for this state key\r\n const options = getGlobalStore\r\n .getState()\r\n .getInitialOptions(stateKey);\r\n const sync = options?.sync;\r\n\r\n if (!sync) {\r\n console.error(`No mutation defined for state key \"${stateKey}\"`);\r\n return { success: false, error: `No mutation defined` };\r\n }\r\n\r\n // Get the root state\r\n const state = getGlobalStore\r\n .getState()\r\n .getNestedState(stateKey, []);\r\n\r\n // Get validation key\r\n const validationKey = options?.validation?.key;\r\n\r\n try {\r\n // Execute the mutation action\r\n const response = await sync.action(state);\r\n\r\n // Handle validation errors\r\n if (\r\n response &&\r\n !response.success &&\r\n response.errors &&\r\n validationKey\r\n ) {\r\n // Clear existing errors\r\n getGlobalStore.getState().removeValidationError(validationKey);\r\n\r\n // Add new validation errors\r\n response.errors.forEach((error) => {\r\n const errorPath = [validationKey, ...error.path].join(\".\");\r\n\r\n getGlobalStore\r\n .getState()\r\n .addValidationError(errorPath, error.message);\r\n });\r\n\r\n // Notify components to update\r\n const stateEntry = getGlobalStore\r\n .getState()\r\n .stateComponents.get(stateKey);\r\n if (stateEntry) {\r\n stateEntry.components.forEach((component) => {\r\n component.forceUpdate();\r\n });\r\n }\r\n }\r\n\r\n // Call success/error callbacks\r\n if (response?.success && sync.onSuccess) {\r\n sync.onSuccess(response.data);\r\n } else if (!response?.success && sync.onError) {\r\n sync.onError(response.error);\r\n }\r\n\r\n return response;\r\n } catch (error) {\r\n if (sync.onError) {\r\n sync.onError(error);\r\n }\r\n return { success: false, error };\r\n }\r\n };\r\n }\r\n if (prop === \"_status\") {\r\n // Get current state at this path (non-reactive version)\r\n const thisReactiveState = getGlobalStore\r\n .getState()\r\n .getNestedState(stateKey, path);\r\n\r\n // Get initial state at this path\r\n const initialState =\r\n getGlobalStore.getState().initialStateGlobal[stateKey];\r\n const initialStateAtPath = getNestedValue(initialState, path);\r\n\r\n // Simply compare current state with initial state\r\n if (isDeepEqual(thisReactiveState, initialStateAtPath)) {\r\n return \"fresh\"; // Matches initial state\r\n } else {\r\n return \"stale\"; // Different from initial state\r\n }\r\n }\r\n if (prop === \"getStatus\") {\r\n return function () {\r\n // Get current state at this path (reactive version)\r\n const thisReactiveState = getGlobalStore().getNestedState(\r\n stateKey,\r\n path\r\n );\r\n\r\n // Get initial state at this path\r\n const initialState =\r\n getGlobalStore.getState().initialStateGlobal[stateKey];\r\n const initialStateAtPath = getNestedValue(initialState, path);\r\n // Simply compare current state with initial state\r\n if (isDeepEqual(thisReactiveState, initialStateAtPath)) {\r\n return \"fresh\"; // Matches initial state\r\n } else {\r\n return \"stale\"; // Different from initial state\r\n }\r\n };\r\n }\r\n if (prop === \"removeStorage\") {\r\n return () => {\r\n const initialState =\r\n getGlobalStore.getState().initialStateGlobal[stateKey];\r\n const initalOptionsGet = getInitialOptions(stateKey as string);\r\n const localKey = isFunction(initalOptionsGet?.localStorage?.key)\r\n ? initalOptionsGet?.localStorage?.key(initialState)\r\n : initalOptionsGet?.localStorage?.key;\r\n\r\n const storageKey = `${sessionId}-${stateKey}-${localKey}`;\r\n\r\n if (storageKey) {\r\n localStorage.removeItem(storageKey);\r\n }\r\n };\r\n }\r\n if (prop === \"showValidationErrors\") {\r\n return () => {\r\n const init = getGlobalStore\r\n .getState()\r\n .getInitialOptions(stateKey)?.validation;\r\n\r\n if (!init?.key) {\r\n throw new Error(\"Validation key not found\");\r\n }\r\n const errors = getGlobalStore\r\n .getState()\r\n .getValidationErrors(init.key + \".\" + path.join(\".\"));\r\n\r\n return errors;\r\n };\r\n }\r\n if (Array.isArray(currentState)) {\r\n const getSourceArrayAndIndices = (): {\r\n item: any;\r\n originalIndex: number;\r\n }[] => {\r\n // If meta exists, we're in a chain. Use the currentState and map it to its original index.\r\n if (meta?.validIndices) {\r\n return (currentState as any[]).map((item, index) => ({\r\n item,\r\n originalIndex: meta!.validIndices![index]!,\r\n }));\r\n }\r\n // Otherwise, this is the first operation. Use the full array from the global store.\r\n const sourceArray = getGlobalStore\r\n .getState()\r\n .getNestedState(stateKey, path) as any[];\r\n return sourceArray.map((item, index) => ({\r\n item,\r\n originalIndex: index,\r\n }));\r\n };\r\n if (prop === \"getSelected\") {\r\n return () => {\r\n const selectedIndex = getGlobalStore\r\n .getState()\r\n .getSelectedIndex(stateKey, path.join(\".\"));\r\n if (selectedIndex === undefined) return undefined;\r\n return rebuildStateShape(\r\n currentState[selectedIndex],\r\n [...path, selectedIndex.toString()],\r\n meta\r\n );\r\n };\r\n }\r\n if (prop === \"clearSelected\") {\r\n return () => {\r\n getGlobalStore.getState().clearSelectedIndex({ stateKey, path });\r\n };\r\n }\r\n if (prop === \"getSelectedIndex\") {\r\n return () => {\r\n const selectedIndex = getGlobalStore\r\n .getState()\r\n .getSelectedIndex(stateKey, path.join(\".\"));\r\n\r\n return selectedIndex ?? -1;\r\n };\r\n }\r\n if (prop === \"useVirtualView\") {\r\n return (\r\n options: VirtualViewOptions\r\n ): VirtualStateObjectResult<any[]> => {\r\n const {\r\n itemHeight = 50,\r\n overscan = 6,\r\n stickToBottom = false,\r\n dependencies = [],\r\n } = options;\r\n\r\n // YOUR STATE MACHINE STATES\r\n type Status =\r\n | \"IDLE_AT_TOP\"\r\n | \"GETTING_HEIGHTS\"\r\n | \"SCROLLING_TO_BOTTOM\"\r\n | \"LOCKED_AT_BOTTOM\"\r\n | \"IDLE_NOT_AT_BOTTOM\";\r\n\r\n const shouldNotScroll = useRef(false);\r\n const containerRef = useRef<HTMLDivElement | null>(null);\r\n const [range, setRange] = useState({\r\n startIndex: 0,\r\n endIndex: 10,\r\n });\r\n const [status, setStatus] = useState<Status>(\"IDLE_AT_TOP\");\r\n const isProgrammaticScroll = useRef(false);\r\n const prevTotalCountRef = useRef(0);\r\n const prevDepsRef = useRef(dependencies);\r\n const lastUpdateAtScrollTop = useRef(0);\r\n const [shadowUpdateTrigger, setShadowUpdateTrigger] = useState(0);\r\n const scrollAnchorRef = useRef<{\r\n top: number;\r\n height: number;\r\n } | null>(null);\r\n useEffect(() => {\r\n const unsubscribe = getGlobalStore\r\n .getState()\r\n .subscribeToShadowState(stateKey, () => {\r\n setShadowUpdateTrigger((prev) => prev + 1);\r\n });\r\n return unsubscribe;\r\n }, [stateKey]);\r\n\r\n const sourceArray = getGlobalStore().getNestedState(\r\n stateKey,\r\n path\r\n ) as any[];\r\n const totalCount = sourceArray.length;\r\n\r\n const { totalHeight, positions } = useMemo(() => {\r\n const shadowArray =\r\n getGlobalStore.getState().getShadowMetadata(stateKey, path) ||\r\n [];\r\n let height = 0;\r\n const pos: number[] = [];\r\n for (let i = 0; i < totalCount; i++) {\r\n pos[i] = height;\r\n const measuredHeight =\r\n shadowArray[i]?.virtualizer?.itemHeight;\r\n height += measuredHeight || itemHeight;\r\n }\r\n return { totalHeight: height, positions: pos };\r\n }, [\r\n totalCount,\r\n stateKey,\r\n path.join(\".\"),\r\n itemHeight,\r\n shadowUpdateTrigger,\r\n ]);\r\n\r\n // THIS IS THE FULL, NON-PLACEHOLDER FUNCTION\r\n const virtualState = useMemo(() => {\r\n const start = Math.max(0, range.startIndex);\r\n const end = Math.min(totalCount, range.endIndex);\r\n const validIndices = Array.from(\r\n { length: end - start },\r\n (_, i) => start + i\r\n );\r\n const slicedArray = validIndices.map((idx) => sourceArray[idx]);\r\n return rebuildStateShape(slicedArray as any, path, {\r\n ...meta,\r\n validIndices,\r\n });\r\n }, [range.startIndex, range.endIndex, sourceArray, totalCount]);\r\n\r\n // --- 1. STATE CONTROLLER ---\r\n // --- 1. STATE CONTROLLER (CORRECTED) ---\r\n useLayoutEffect(() => {\r\n const container = containerRef.current;\r\n if (!container) return;\r\n\r\n const hasNewItems = totalCount > prevTotalCountRef.current;\r\n\r\n // THIS IS THE NEW, IMPORTANT LOGIC FOR ANCHORING\r\n if (hasNewItems && scrollAnchorRef.current) {\r\n const { top: prevScrollTop, height: prevScrollHeight } =\r\n scrollAnchorRef.current;\r\n\r\n // This is the key: Tell the app we are about to programmatically scroll.\r\n isProgrammaticScroll.current = true;\r\n\r\n // Restore the scroll position.\r\n container.scrollTop =\r\n prevScrollTop + (container.scrollHeight - prevScrollHeight);\r\n console.log(\r\n `ANCHOR RESTORED to scrollTop: ${container.scrollTop}`\r\n );\r\n\r\n // IMPORTANT: After the scroll, allow user scroll events again.\r\n // Use a timeout to ensure this runs after the scroll event has fired and been ignored.\r\n setTimeout(() => {\r\n isProgrammaticScroll.current = false;\r\n }, 100);\r\n\r\n scrollAnchorRef.current = null; // Clear the anchor after using it.\r\n }\r\n // YOUR ORIGINAL LOGIC CONTINUES UNCHANGED IN THE `ELSE` BLOCK\r\n else {\r\n const depsChanged = !isDeepEqual(\r\n dependencies,\r\n prevDepsRef.current\r\n );\r\n\r\n if (depsChanged) {\r\n console.log(\"TRANSITION: Deps changed -> IDLE_AT_TOP\");\r\n setStatus(\"IDLE_AT_TOP\");\r\n return;\r\n }\r\n\r\n if (\r\n hasNewItems &&\r\n status === \"LOCKED_AT_BOTTOM\" &&\r\n stickToBottom\r\n ) {\r\n console.log(\r\n \"TRANSITION: New items arrived while locked -> GETTING_HEIGHTS\"\r\n );\r\n setStatus(\"GETTING_HEIGHTS\");\r\n }\r\n }\r\n\r\n prevTotalCountRef.current = totalCount;\r\n prevDepsRef.current = dependencies;\r\n }, [totalCount, ...dependencies]);\r\n\r\n // --- 2. STATE ACTION HANDLER ---\r\n // This effect performs the ACTION for the current state.\r\n useLayoutEffect(() => {\r\n const container = containerRef.current;\r\n if (!container) return;\r\n\r\n let intervalId: NodeJS.Timeout | undefined;\r\n\r\n if (\r\n status === \"IDLE_AT_TOP\" &&\r\n stickToBottom &&\r\n totalCount > 0\r\n ) {\r\n // If we just loaded a new chat, start the process.\r\n console.log(\r\n \"ACTION (IDLE_AT_TOP): Data has arrived -> GETTING_HEIGHTS\"\r\n );\r\n setStatus(\"GETTING_HEIGHTS\");\r\n } else if (status === \"GETTING_HEIGHTS\") {\r\n console.log(\r\n \"ACTION (GETTING_HEIGHTS): Setting range to end and starting loop.\"\r\n );\r\n setRange({\r\n startIndex: Math.max(0, totalCount - 10 - overscan),\r\n endIndex: totalCount,\r\n });\r\n\r\n intervalId = setInterval(() => {\r\n const lastItemIndex = totalCount - 1;\r\n const shadowArray =\r\n getGlobalStore\r\n .getState()\r\n .getShadowMetadata(stateKey, path) || [];\r\n const lastItemHeight =\r\n shadowArray[lastItemIndex]?.virtualizer?.itemHeight || 0;\r\n\r\n if (lastItemHeight > 0) {\r\n clearInterval(intervalId);\r\n if (!shouldNotScroll.current) {\r\n console.log(\r\n \"ACTION (GETTING_HEIGHTS): Measurement success -> SCROLLING_TO_BOTTOM\"\r\n );\r\n\r\n setStatus(\"SCROLLING_TO_BOTTOM\");\r\n }\r\n }\r\n }, 100);\r\n } else if (status === \"SCROLLING_TO_BOTTOM\") {\r\n console.log(\r\n \"ACTION (SCROLLING_TO_BOTTOM): Executing scroll.\"\r\n );\r\n isProgrammaticScroll.current = true;\r\n // Use 'auto' for initial load, 'smooth' for new messages.\r\n const scrollBehavior =\r\n prevTotalCountRef.current === 0 ? \"auto\" : \"smooth\";\r\n\r\n container.scrollTo({\r\n top: container.scrollHeight,\r\n behavior: scrollBehavior,\r\n });\r\n\r\n const timeoutId = setTimeout(\r\n () => {\r\n console.log(\r\n \"ACTION (SCROLLING_TO_BOTTOM): Scroll finished -> LOCKED_AT_BOTTOM\"\r\n );\r\n isProgrammaticScroll.current = false;\r\n shouldNotScroll.current = false;\r\n setStatus(\"LOCKED_AT_BOTTOM\");\r\n },\r\n scrollBehavior === \"smooth\" ? 500 : 50\r\n );\r\n\r\n return () => clearTimeout(timeoutId);\r\n }\r\n\r\n return () => {\r\n if (intervalId) clearInterval(intervalId);\r\n };\r\n }, [status, totalCount, positions]);\r\n\r\n useEffect(() => {\r\n const container = containerRef.current;\r\n if (!container) return;\r\n\r\n const scrollThreshold = itemHeight;\r\n\r\n const handleUserScroll = () => {\r\n // This guard is now critical. It will ignore our anchor restoration scroll.\r\n if (isProgrammaticScroll.current) {\r\n return;\r\n }\r\n\r\n const { scrollTop, scrollHeight, clientHeight } = container;\r\n\r\n // Part 1: Handle Status and Anchoring\r\n const isAtBottom =\r\n scrollHeight - scrollTop - clientHeight < 10;\r\n\r\n if (isAtBottom) {\r\n if (status !== \"LOCKED_AT_BOTTOM\") {\r\n setStatus(\"LOCKED_AT_BOTTOM\");\r\n }\r\n // If we are at the bottom, there is no anchor needed.\r\n scrollAnchorRef.current = null;\r\n } else {\r\n if (status !== \"IDLE_NOT_AT_BOTTOM\") {\r\n setStatus(\"IDLE_NOT_AT_BOTTOM\");\r\n }\r\n // User is scrolled up. Continuously update the anchor with their latest position.\r\n scrollAnchorRef.current = {\r\n top: scrollTop,\r\n height: scrollHeight,\r\n };\r\n }\r\n\r\n // Part 2: YOUR original, working logic for updating the visible range.\r\n if (\r\n Math.abs(scrollTop - lastUpdateAtScrollTop.current) <\r\n scrollThreshold\r\n ) {\r\n return;\r\n }\r\n\r\n console.log(\r\n `Threshold passed at ${scrollTop}px. Recalculating range...`\r\n );\r\n\r\n // ... your logic to find startIndex and endIndex ...\r\n let high = totalCount - 1;\r\n let low = 0;\r\n let topItemIndex = 0;\r\n while (low <= high) {\r\n const mid = Math.floor((low + high) / 2);\r\n if (positions[mid]! < scrollTop) {\r\n topItemIndex = mid;\r\n low = mid + 1;\r\n } else {\r\n high = mid - 1;\r\n }\r\n }\r\n\r\n const startIndex = Math.max(0, topItemIndex - overscan);\r\n let endIndex = startIndex;\r\n const visibleEnd = scrollTop + clientHeight;\r\n while (\r\n endIndex < totalCount &&\r\n positions[endIndex]! < visibleEnd\r\n ) {\r\n endIndex++;\r\n }\r\n\r\n setRange({\r\n startIndex,\r\n endIndex: Math.min(totalCount, endIndex + overscan),\r\n });\r\n\r\n lastUpdateAtScrollTop.current = scrollTop;\r\n };\r\n\r\n container.addEventListener(\"scroll\", handleUserScroll, {\r\n passive: true,\r\n });\r\n return () =>\r\n container.removeEventListener(\"scroll\", handleUserScroll);\r\n }, [totalCount, positions, itemHeight, overscan, status]);\r\n\r\n const scrollToBottom = useCallback(() => {\r\n console.log(\r\n \"USER ACTION: Clicked scroll button -> SCROLLING_TO_BOTTOM\"\r\n );\r\n setStatus(\"SCROLLING_TO_BOTTOM\");\r\n }, []);\r\n\r\n const scrollToIndex = useCallback(\r\n (index: number, behavior: ScrollBehavior = \"smooth\") => {\r\n if (containerRef.current && positions[index] !== undefined) {\r\n setStatus(\"IDLE_NOT_AT_BOTTOM\");\r\n containerRef.current.scrollTo({\r\n top: positions[index],\r\n behavior,\r\n });\r\n }\r\n },\r\n [positions]\r\n );\r\n\r\n const virtualizerProps = {\r\n outer: {\r\n ref: containerRef,\r\n style: { overflowY: \"auto\" as const, height: \"100%\" },\r\n },\r\n inner: {\r\n style: {\r\n height: `${totalHeight}px`,\r\n position: \"relative\" as const,\r\n },\r\n },\r\n list: {\r\n style: {\r\n transform: `translateY(${positions[range.startIndex] || 0}px)`,\r\n },\r\n },\r\n };\r\n\r\n return {\r\n virtualState,\r\n virtualizerProps,\r\n scrollToBottom,\r\n scrollToIndex,\r\n };\r\n };\r\n }\r\n if (prop === \"stateSort\") {\r\n return (\r\n compareFn: (\r\n a: InferArrayElement<T>,\r\n b: InferArrayElement<T>\r\n ) => number\r\n ) => {\r\n const sourceWithIndices = getSourceArrayAndIndices();\r\n const sortedResult = [...sourceWithIndices].sort((a, b) =>\r\n compareFn(a.item, b.item)\r\n );\r\n const newCurrentState = sortedResult.map(({ item }) => item);\r\n // We construct the meta object with the CORRECT property name: `validIndices`.\r\n const newMeta = {\r\n ...meta,\r\n validIndices: sortedResult.map(\r\n ({ originalIndex }) => originalIndex\r\n ),\r\n };\r\n return rebuildStateShape(newCurrentState as any, path, newMeta);\r\n };\r\n }\r\n\r\n if (prop === \"stateFilter\") {\r\n return (\r\n callbackfn: (\r\n value: InferArrayElement<T>,\r\n index: number\r\n ) => boolean\r\n ) => {\r\n const sourceWithIndices = getSourceArrayAndIndices();\r\n const filteredResult = sourceWithIndices.filter(\r\n ({ item }, index) => callbackfn(item, index)\r\n );\r\n const newCurrentState = filteredResult.map(({ item }) => item);\r\n // We construct the meta object with the CORRECT property name: `validIndices`.\r\n const newMeta = {\r\n ...meta,\r\n validIndices: filteredResult.map(\r\n ({ originalIndex }) => originalIndex\r\n ),\r\n };\r\n return rebuildStateShape(newCurrentState as any, path, newMeta);\r\n };\r\n }\r\n\r\n if (prop === \"stateMap\") {\r\n return (\r\n callbackfn: (\r\n value: InferArrayElement<T>,\r\n setter: StateObject<InferArrayElement<T>>,\r\n info: {\r\n register: () => void;\r\n index: number;\r\n originalIndex: number;\r\n }\r\n ) => any\r\n ) => {\r\n const arrayToMap = getGlobalStore\r\n .getState()\r\n .getNestedState(stateKey, path) as any[];\r\n\r\n // Defensive check to make sure we are mapping over an array\r\n if (!Array.isArray(arrayToMap)) {\r\n console.warn(\r\n `stateMap called on a non-array value at path: ${path.join(\".\")}. The current value is:`,\r\n arrayToMap\r\n );\r\n return null;\r\n }\r\n\r\n // If we have validIndices, only map those items\r\n const indicesToMap =\r\n meta?.validIndices ||\r\n Array.from({ length: arrayToMap.length }, (_, i) => i);\r\n\r\n return indicesToMap.map((originalIndex, localIndex) => {\r\n const item = arrayToMap[originalIndex];\r\n const finalPath = [...path, originalIndex.toString()];\r\n const setter = rebuildStateShape(item, finalPath, meta);\r\n\r\n // Create the register function right here. It closes over the necessary variables.\r\n const register = () => {\r\n const [, forceUpdate] = useState({});\r\n const itemComponentId = `${componentId}-${path.join(\".\")}-${originalIndex}`;\r\n\r\n useLayoutEffect(() => {\r\n const fullComponentId = `${stateKey}////${itemComponentId}`;\r\n const stateEntry = getGlobalStore\r\n .getState()\r\n .stateComponents.get(stateKey) || {\r\n components: new Map(),\r\n };\r\n\r\n stateEntry.components.set(fullComponentId, {\r\n forceUpdate: () => forceUpdate({}),\r\n paths: new Set([finalPath.join(\".\")]),\r\n });\r\n\r\n getGlobalStore\r\n .getState()\r\n .stateComponents.set(stateKey, stateEntry);\r\n\r\n return () => {\r\n const currentEntry = getGlobalStore\r\n .getState()\r\n .stateComponents.get(stateKey);\r\n if (currentEntry) {\r\n currentEntry.components.delete(fullComponentId);\r\n }\r\n };\r\n }, [stateKey, itemComponentId]);\r\n };\r\n\r\n return callbackfn(item, setter, {\r\n register,\r\n index: localIndex,\r\n originalIndex,\r\n });\r\n });\r\n };\r\n }\r\n if (prop === \"stateMapNoRender\") {\r\n return (\r\n callbackfn: (\r\n value: InferArrayElement<T>,\r\n setter: StateObject<InferArrayElement<T>>,\r\n index: number,\r\n array: T,\r\n arraySetter: StateObject<T>\r\n ) => any\r\n ) => {\r\n const arrayToMap = currentState as any[];\r\n return arrayToMap.map((item, index) => {\r\n let originalIndex: number;\r\n // We READ from the meta object using the CORRECT property name: `validIndices`.\r\n if (\r\n meta?.validIndices &&\r\n meta.validIndices[index] !== undefined\r\n ) {\r\n originalIndex = meta.validIndices[index]!;\r\n } else {\r\n originalIndex = index;\r\n }\r\n const finalPath = [...path, originalIndex.toString()];\r\n\r\n const setter = rebuildStateShape(item, finalPath, meta); // Pass meta through\r\n return callbackfn(\r\n item,\r\n setter,\r\n index,\r\n currentState as any,\r\n rebuildStateShape(currentState as any, path, meta)\r\n );\r\n });\r\n };\r\n }\r\n if (prop === \"$stateMap\") {\r\n return (\r\n callbackfn: (\r\n value: InferArrayElement<T>,\r\n setter: StateObject<InferArrayElement<T>>,\r\n index: number,\r\n array: T,\r\n arraySetter: StateObject<T>\r\n ) => void\r\n ) => {\r\n return createElement(SignalMapRenderer, {\r\n proxy: {\r\n _stateKey: stateKey,\r\n _path: path,\r\n _mapFn: callbackfn as any, // Pass the actual function, not string\r\n },\r\n\r\n rebuildStateShape,\r\n });\r\n };\r\n }\r\n if (prop === \"stateList\") {\r\n return (\r\n callbackfn: (\r\n value: InferArrayElement<T>,\r\n setter: StateObject<InferArrayElement<T>>,\r\n index: { localIndex: number; originalIndex: number },\r\n array: T,\r\n arraySetter: StateObject<T>\r\n ) => any\r\n ) => {\r\n const arrayToMap = getGlobalStore\r\n .getState()\r\n .getNestedState(stateKey, path) as any[];\r\n\r\n if (!Array.isArray(arrayToMap)) {\r\n console.warn(\r\n `stateList called on a non-array value at path: ${path.join(\".\")}.`\r\n );\r\n return null;\r\n }\r\n\r\n const indicesToMap =\r\n meta?.validIndices ||\r\n Array.from({ length: arrayToMap.length }, (_, i) => i);\r\n\r\n return indicesToMap.map((originalIndex, localIndex) => {\r\n const item = arrayToMap[originalIndex];\r\n const finalPath = [...path, originalIndex.toString()];\r\n const setter = rebuildStateShape(item, finalPath, meta);\r\n const itemComponentId = `${componentId}-${path.join(\".\")}-${originalIndex}`;\r\n\r\n return createElement(CogsItemWrapper, {\r\n key: originalIndex,\r\n stateKey,\r\n itemComponentId,\r\n itemPath: finalPath,\r\n children: callbackfn(\r\n item,\r\n setter,\r\n { localIndex, originalIndex },\r\n arrayToMap as any,\r\n rebuildStateShape(arrayToMap as any, path, meta)\r\n ),\r\n });\r\n });\r\n };\r\n }\r\n if (prop === \"stateFlattenOn\") {\r\n return (fieldName: string) => {\r\n const arrayToMap = currentState as any[];\r\n shapeCache.clear();\r\n stateVersion++;\r\n const flattenedResults = arrayToMap.flatMap(\r\n (val: any) => val[fieldName] ?? []\r\n );\r\n return rebuildStateShape(\r\n flattenedResults as any,\r\n [...path, \"[*]\", fieldName],\r\n meta\r\n );\r\n };\r\n }\r\n\r\n if (prop === \"index\") {\r\n return (index: number) => {\r\n const indexValue = currentState[index];\r\n return rebuildStateShape(indexValue, [...path, index.toString()]);\r\n };\r\n }\r\n if (prop === \"last\") {\r\n // Added handler for 'last'\r\n return () => {\r\n const currentArray = getGlobalStore\r\n .getState()\r\n .getNestedState(stateKey, path) as any[];\r\n if (currentArray.length === 0) return undefined;\r\n const lastIndex = currentArray.length - 1;\r\n const lastValue = currentArray[lastIndex];\r\n const newPath = [...path, lastIndex.toString()];\r\n // shapeCache.clear(); // Decide if you need cache invalidation for 'last' access\r\n // stateVersion++;\r\n return rebuildStateShape(lastValue, newPath);\r\n };\r\n }\r\n if (prop === \"insert\") {\r\n return (payload: UpdateArg<T>) => {\r\n // ADDED: Invalidate cache on insert\r\n invalidateCachePath(path);\r\n pushFunc(effectiveSetState, payload, path, stateKey);\r\n return rebuildStateShape(\r\n getGlobalStore.getState().getNestedState(stateKey, path),\r\n path\r\n );\r\n };\r\n }\r\n\r\n if (prop === \"uniqueInsert\") {\r\n return (\r\n payload: UpdateArg<T>,\r\n fields?: (keyof InferArrayElement<T>)[],\r\n onMatch?: (existingItem: any) => any\r\n ) => {\r\n const currentArray = getGlobalStore\r\n .getState()\r\n .getNestedState(stateKey, path) as any[];\r\n const newValue = isFunction<T>(payload)\r\n ? payload(currentArray as any)\r\n : (payload as any);\r\n\r\n let matchedItem: any = null;\r\n const isUnique = !currentArray.some((item) => {\r\n if (fields) {\r\n const isMatch = fields.every((field) =>\r\n isDeepEqual(item[field], newValue[field])\r\n );\r\n if (isMatch) {\r\n matchedItem = item;\r\n }\r\n return isMatch;\r\n }\r\n const isMatch = isDeepEqual(item, newValue);\r\n if (isMatch) {\r\n matchedItem = item;\r\n }\r\n return isMatch;\r\n });\r\n\r\n if (isUnique) {\r\n invalidateCachePath(path);\r\n pushFunc(effectiveSetState, newValue, path, stateKey);\r\n } else if (onMatch && matchedItem) {\r\n const updatedItem = onMatch(matchedItem);\r\n const updatedArray = currentArray.map((item) =>\r\n isDeepEqual(item, matchedItem) ? updatedItem : item\r\n );\r\n invalidateCachePath(path);\r\n updateFn(effectiveSetState, updatedArray as any, path);\r\n }\r\n };\r\n }\r\n\r\n if (prop === \"cut\") {\r\n return (index: number, options?: { waitForSync?: boolean }) => {\r\n if (options?.waitForSync) return;\r\n // ADDED: Invalidate cache on cut\r\n invalidateCachePath(path);\r\n cutFunc(effectiveSetState, path, stateKey, index);\r\n return rebuildStateShape(\r\n getGlobalStore.getState().getNestedState(stateKey, path),\r\n path\r\n );\r\n };\r\n }\r\n if (prop === \"cutByValue\") {\r\n return (value: string | number | boolean) => {\r\n for (let index = 0; index < currentState.length; index++) {\r\n if (currentState[index] === value) {\r\n cutFunc(effectiveSetState, path, stateKey, index);\r\n }\r\n }\r\n };\r\n }\r\n if (prop === \"toggleByValue\") {\r\n return (value: string | number | boolean) => {\r\n const index = currentState.findIndex((item) => item === value);\r\n if (index > -1) {\r\n // Value exists, so cut it\r\n cutFunc(effectiveSetState, path, stateKey, index);\r\n } else {\r\n // Value doesn't exist, so insert it\r\n pushFunc(effectiveSetState, value as any, path, stateKey);\r\n }\r\n };\r\n }\r\n if (prop === \"stateFind\") {\r\n return (\r\n callbackfn: (\r\n value: InferArrayElement<T>,\r\n index: number\r\n ) => boolean\r\n ) => {\r\n const sourceWithIndices = getSourceArrayAndIndices();\r\n const found = sourceWithIndices.find(({ item }, index) =>\r\n callbackfn(item, index)\r\n );\r\n if (!found) return undefined;\r\n const finalPath = [...path, found.originalIndex.toString()];\r\n return rebuildStateShape(found.item, finalPath, meta);\r\n };\r\n }\r\n\r\n if (prop === \"findWith\") {\r\n return (thisKey: keyof InferArrayElement<T>, thisValue: any) => {\r\n const sourceWithIndices = getSourceArrayAndIndices();\r\n const found = sourceWithIndices.find(\r\n ({ item }) => item[thisKey] === thisValue\r\n );\r\n if (!found) return undefined;\r\n const finalPath = [...path, found.originalIndex.toString()];\r\n return rebuildStateShape(found.item, finalPath, meta);\r\n };\r\n }\r\n }\r\n const lastPathElement = path[path.length - 1];\r\n if (!isNaN(Number(lastPathElement))) {\r\n const parentPath = path.slice(0, -1);\r\n const parentValue = getGlobalStore\r\n .getState()\r\n .getNestedState(stateKey, parentPath);\r\n\r\n if (Array.isArray(parentValue) && prop === \"cut\") {\r\n return () =>\r\n cutFunc(\r\n effectiveSetState,\r\n parentPath,\r\n stateKey,\r\n Number(lastPathElement)\r\n );\r\n }\r\n }\r\n\r\n if (prop === \"get\") {\r\n return () => {\r\n if (meta?.validIndices && Array.isArray(currentState)) {\r\n // For filtered arrays, return only the items at validIndices\r\n const fullArray = getGlobalStore\r\n .getState()\r\n .getNestedState(stateKey, path) as any[];\r\n return meta.validIndices.map((index) => fullArray[index]);\r\n }\r\n return getGlobalStore.getState().getNestedState(stateKey, path);\r\n };\r\n }\r\n if (prop === \"$derive\") {\r\n return (fn: any) =>\r\n $cogsSignal({\r\n _stateKey: stateKey,\r\n _path: path,\r\n _effect: fn.toString(),\r\n });\r\n }\r\n\r\n if (prop === \"$get\") {\r\n return () =>\r\n $cogsSignal({\r\n _stateKey: stateKey,\r\n _path: path,\r\n });\r\n }\r\n if (prop === \"lastSynced\") {\r\n const syncKey = `${stateKey}:${path.join(\".\")}`;\r\n return getGlobalStore.getState().getSyncInfo(syncKey);\r\n }\r\n\r\n if (prop == \"getLocalStorage\") {\r\n return (key: string) =>\r\n loadFromLocalStorage(sessionId + \"-\" + stateKey + \"-\" + key);\r\n }\r\n if (prop === \"_selected\") {\r\n const parentPath = path.slice(0, -1);\r\n const parentKey = parentPath.join(\".\");\r\n const parent = getGlobalStore\r\n .getState()\r\n .getNestedState(stateKey, parentPath);\r\n if (Array.isArray(parent)) {\r\n const currentIndex = Number(path[path.length - 1]);\r\n return (\r\n currentIndex ===\r\n getGlobalStore.getState().getSelectedIndex(stateKey, parentKey)\r\n );\r\n }\r\n return undefined;\r\n }\r\n if (prop === \"setSelected\") {\r\n return (value: boolean) => {\r\n const parentPath = path.slice(0, -1);\r\n const thisIndex = Number(path[path.length - 1]);\r\n const parentKey = parentPath.join(\".\");\r\n\r\n if (value) {\r\n getGlobalStore\r\n .getState()\r\n .setSelectedIndex(stateKey, parentKey, thisIndex);\r\n } else {\r\n getGlobalStore\r\n .getState()\r\n .setSelectedIndex(stateKey, parentKey, undefined);\r\n }\r\n\r\n const nested = getGlobalStore\r\n .getState()\r\n .getNestedState(stateKey, [...parentPath]);\r\n updateFn(effectiveSetState, nested, parentPath);\r\n\r\n // Invalidate cache for this path\r\n invalidateCachePath(parentPath);\r\n };\r\n }\r\n if (prop === \"toggleSelected\") {\r\n return () => {\r\n const parentPath = path.slice(0, -1);\r\n const thisIndex = Number(path[path.length - 1]);\r\n const parentKey = parentPath.join(\".\");\r\n const selectedIndex = getGlobalStore\r\n .getState()\r\n .getSelectedIndex(stateKey, parentKey);\r\n\r\n getGlobalStore\r\n .getState()\r\n .setSelectedIndex(\r\n stateKey,\r\n parentKey,\r\n selectedIndex === thisIndex ? undefined : thisIndex\r\n );\r\n const nested = getGlobalStore\r\n .getState()\r\n .getNestedState(stateKey, [...parentPath]);\r\n updateFn(effectiveSetState, nested, parentPath);\r\n\r\n invalidateCachePath(parentPath);\r\n };\r\n }\r\n if (path.length == 0) {\r\n if (prop === \"addValidation\") {\r\n return (errors: ValidationError[]) => {\r\n const init = getGlobalStore\r\n .getState()\r\n .getInitialOptions(stateKey)?.validation;\r\n\r\n if (!init?.key) {\r\n throw new Error(\"Validation key not found\");\r\n }\r\n\r\n // Clear existing errors for this validation key\r\n removeValidationError(init.key);\r\n console.log(\"addValidationError\", errors);\r\n // Add each new error\r\n errors.forEach((error) => {\r\n const fullErrorPath = [init.key, ...error.path].join(\".\");\r\n console.log(\"fullErrorPath\", fullErrorPath);\r\n addValidationError(fullErrorPath, error.message);\r\n });\r\n\r\n // Notify components to update\r\n notifyComponents(stateKey);\r\n };\r\n }\r\n if (prop === \"applyJsonPatch\") {\r\n return (patches: any[]) => {\r\n // This part is correct.\r\n const currentState =\r\n getGlobalStore.getState().cogsStateStore[stateKey];\r\n const patchResult = applyPatch(currentState, patches);\r\n const newState = patchResult.newDocument;\r\n\r\n // This is also correct.\r\n updateGlobalState(\r\n stateKey,\r\n getGlobalStore.getState().initialStateGlobal[stateKey],\r\n newState,\r\n effectiveSetState,\r\n componentId,\r\n sessionId\r\n );\r\n\r\n const stateEntry = getGlobalStore\r\n .getState()\r\n .stateComponents.get(stateKey); // Use stateKey here\r\n\r\n if (stateEntry) {\r\n // Use `getDifferences` between the state before and after the patch.\r\n const changedPaths = getDifferences(currentState, newState);\r\n const changedPathsSet = new Set(changedPaths);\r\n\r\n // There is no single `primaryPathToCheck` for a patch, so we just check against the full set.\r\n\r\n for (const [\r\n componentKey,\r\n component,\r\n ] of stateEntry.components.entries()) {\r\n let shouldUpdate = false;\r\n const reactiveTypes = Array.isArray(component.reactiveType)\r\n ? component.reactiveType\r\n : [component.reactiveType || \"component\"];\r\n\r\n if (reactiveTypes.includes(\"none\")) continue;\r\n if (reactiveTypes.includes(\"all\")) {\r\n component.forceUpdate();\r\n continue;\r\n }\r\n\r\n if (reactiveTypes.includes(\"component\")) {\r\n // This is the core logic that needs to be copied.\r\n // Check if any of the component's watched paths are in the set of changed paths.\r\n if (component.paths.has(\"\")) {\r\n // Always update for root listeners\r\n shouldUpdate = true;\r\n }\r\n\r\n if (!shouldUpdate) {\r\n for (const changedPath of changedPathsSet) {\r\n // Direct match first (fastest)\r\n if (component.paths.has(changedPath)) {\r\n shouldUpdate = true;\r\n break;\r\n }\r\n\r\n // Check parent paths more efficiently\r\n let dotIndex = changedPath.lastIndexOf(\".\");\r\n while (dotIndex !== -1) {\r\n const parentPath = changedPath.substring(0, dotIndex);\r\n if (component.paths.has(parentPath)) {\r\n shouldUpdate = true;\r\n break;\r\n }\r\n // Skip numeric segments more efficiently\r\n const lastSegment = changedPath.substring(\r\n dotIndex + 1\r\n );\r\n if (!isNaN(Number(lastSegment))) {\r\n // For array indices, check the parent collection path\r\n const parentDotIndex = parentPath.lastIndexOf(\".\");\r\n if (parentDotIndex !== -1) {\r\n const grandParentPath = parentPath.substring(\r\n 0,\r\n parentDotIndex\r\n );\r\n if (component.paths.has(grandParentPath)) {\r\n shouldUpdate = true;\r\n break;\r\n }\r\n }\r\n }\r\n dotIndex = parentPath.lastIndexOf(\".\");\r\n }\r\n\r\n if (shouldUpdate) break;\r\n }\r\n }\r\n }\r\n\r\n if (!shouldUpdate && reactiveTypes.includes(\"deps\")) {\r\n // Use `newState` (the result of the patch) for dependency checks.\r\n if (component.depsFunction) {\r\n const depsResult = component.depsFunction(newState);\r\n let depsChanged = false;\r\n if (typeof depsResult === \"boolean\") {\r\n if (depsResult) depsChanged = true;\r\n } else if (!isDeepEqual(component.deps, depsResult)) {\r\n component.deps = depsResult;\r\n depsChanged = true;\r\n }\r\n if (depsChanged) {\r\n shouldUpdate = true;\r\n }\r\n }\r\n }\r\n\r\n if (shouldUpdate) {\r\n component.forceUpdate();\r\n }\r\n }\r\n }\r\n };\r\n }\r\n if (prop === \"validateZodSchema\") {\r\n return () => {\r\n const init = getGlobalStore\r\n .getState()\r\n .getInitialOptions(stateKey)?.validation;\r\n const addValidationError =\r\n getGlobalStore.getState().addValidationError;\r\n\r\n if (!init?.zodSchema) {\r\n throw new Error(\"Zod schema not found\");\r\n }\r\n\r\n if (!init?.key) {\r\n throw new Error(\"Validation key not found\");\r\n }\r\n removeValidationError(init.key);\r\n const thisObject =\r\n getGlobalStore.getState().cogsStateStore[stateKey];\r\n\r\n try {\r\n // First clear any existing validation errors for this schema\r\n // This ensures we don't have stale errors\r\n const existingErrors = getGlobalStore\r\n .getState()\r\n .getValidationErrors(init.key);\r\n if (existingErrors && existingErrors.length > 0) {\r\n existingErrors.forEach(([errorPath]) => {\r\n if (errorPath && errorPath.startsWith(init.key!)) {\r\n removeValidationError(errorPath);\r\n }\r\n });\r\n }\r\n\r\n // Attempt to validate with Zod\r\n const result = init.zodSchema.safeParse(thisObject);\r\n\r\n if (!result.success) {\r\n // Process Zod errors and add them to the validation store\r\n const zodErrors = result.error.errors;\r\n\r\n zodErrors.forEach((error) => {\r\n const errorPath = error.path;\r\n const errorMessage = error.message;\r\n\r\n // Build the full path for the validation error\r\n // Format: validationKey.path.to.field\r\n const fullErrorPath = [init.key, ...errorPath].join(\".\");\r\n\r\n // Add the error to the store\r\n addValidationError(fullErrorPath, errorMessage);\r\n });\r\n\r\n notifyComponents(stateKey);\r\n\r\n return false;\r\n }\r\n\r\n return true;\r\n } catch (error) {\r\n console.error(\"Zod schema validation failed\", error);\r\n return false;\r\n }\r\n };\r\n }\r\n if (prop === \"_componentId\") return componentId;\r\n if (prop === \"getComponents\") {\r\n return () => getGlobalStore().stateComponents.get(stateKey);\r\n }\r\n if (prop === \"getAllFormRefs\") {\r\n return () => {\r\n return formRefStore.getState().getFormRefsByStateKey(stateKey);\r\n };\r\n }\r\n\r\n if (prop === \"_initialState\")\r\n return getGlobalStore.getState().initialStateGlobal[stateKey];\r\n if (prop === \"_serverState\")\r\n return getGlobalStore.getState().serverState[stateKey];\r\n if (prop === \"_isLoading\")\r\n return getGlobalStore.getState().isLoadingGlobal[stateKey];\r\n if (prop === \"revertToInitialState\")\r\n return baseObj.revertToInitialState;\r\n if (prop === \"updateInitialState\") return baseObj.updateInitialState;\r\n if (prop === \"removeValidation\") return baseObj.removeValidation;\r\n }\r\n if (prop === \"getFormRef\") {\r\n return () => {\r\n return formRefStore\r\n .getState()\r\n .getFormRef(stateKey + \".\" + path.join(\".\"));\r\n };\r\n }\r\n\r\n if (prop === \"validationWrapper\") {\r\n return ({\r\n children,\r\n hideMessage,\r\n }: {\r\n children: React.ReactNode;\r\n hideMessage?: boolean;\r\n }) => (\r\n <ValidationWrapper\r\n formOpts={\r\n hideMessage ? { validation: { message: \"\" } } : undefined\r\n }\r\n path={path}\r\n validationKey={\r\n getGlobalStore.getState().getInitialOptions(stateKey)\r\n ?.validation?.key || \"\"\r\n }\r\n stateKey={stateKey}\r\n validIndices={meta?.validIndices}\r\n >\r\n {children}\r\n </ValidationWrapper>\r\n );\r\n }\r\n\r\n if (prop === \"_stateKey\") return stateKey;\r\n if (prop === \"_path\") return path;\r\n if (prop === \"_isServerSynced\") return baseObj._isServerSynced;\r\n\r\n if (prop === \"update\") {\r\n return (payload: UpdateArg<T>, opts?: UpdateOpts<T>) => {\r\n // ADDED: Invalidate cache on update\r\n if (opts?.debounce) {\r\n debounce(() => {\r\n updateFn(effectiveSetState, payload, path, \"\");\r\n const newValue = getGlobalStore\r\n .getState()\r\n .getNestedState(stateKey, path);\r\n if (opts?.afterUpdate) opts.afterUpdate(newValue);\r\n }, opts.debounce);\r\n } else {\r\n updateFn(effectiveSetState, payload, path, \"\");\r\n const newValue = getGlobalStore\r\n .getState()\r\n .getNestedState(stateKey, path);\r\n if (opts?.afterUpdate) opts.afterUpdate(newValue);\r\n }\r\n invalidateCachePath(path);\r\n };\r\n }\r\n\r\n if (prop === \"formElement\") {\r\n return (child: FormControl<T>, formOpts?: FormOptsType) => {\r\n return (\r\n <FormControlComponent<T>\r\n setState={effectiveSetState}\r\n stateKey={stateKey}\r\n path={path}\r\n child={child}\r\n formOpts={formOpts}\r\n />\r\n );\r\n };\r\n }\r\n\r\n const nextPath = [...path, prop];\r\n const nextValue = getGlobalStore\r\n .getState()\r\n .getNestedState(stateKey, nextPath);\r\n return rebuildStateShape(nextValue, nextPath, meta);\r\n },\r\n };\r\n\r\n const proxyInstance = new Proxy(baseFunction, handler);\r\n\r\n shapeCache.set(cacheKey, {\r\n proxy: proxyInstance,\r\n stateVersion: stateVersion,\r\n });\r\n\r\n return proxyInstance;\r\n }\r\n\r\n return rebuildStateShape(\r\n getGlobalStore.getState().getNestedState(stateKey, [])\r\n );\r\n}\r\n\r\nexport function $cogsSignal(proxy: {\r\n _path: string[];\r\n _stateKey: string;\r\n _effect?: string;\r\n}) {\r\n return createElement(SignalRenderer, { proxy });\r\n}\r\n\r\nfunction SignalMapRenderer({\r\n proxy,\r\n\r\n rebuildStateShape,\r\n}: {\r\n proxy: {\r\n _stateKey: string;\r\n _path: string[];\r\n _mapFn: (\r\n value: any,\r\n setter: any,\r\n index: number,\r\n array: any[],\r\n arraySetter: any\r\n ) => ReactNode;\r\n };\r\n\r\n rebuildStateShape: (\r\n currentState: any,\r\n path: string[],\r\n meta?: { filtered?: string[][]; validIndices?: number[] }\r\n ) => any;\r\n}) {\r\n const value = getGlobalStore().getNestedState(proxy._stateKey, proxy._path);\r\n\r\n if (!Array.isArray(value)) {\r\n return null;\r\n }\r\n const arraySetter = rebuildStateShape(\r\n value,\r\n proxy._path\r\n ) as ArrayEndType<any>;\r\n // Use existing global state management\r\n return arraySetter.stateMapNoRender(\r\n (item, setter, index, value, arraysetter) => {\r\n // Execute map function in React context with existing state/proxies\r\n return proxy._mapFn(item, setter, index, value, arraysetter);\r\n }\r\n );\r\n}\r\nfunction SignalRenderer({\r\n proxy,\r\n}: {\r\n proxy: {\r\n _path: string[];\r\n _stateKey: string;\r\n _effect?: string;\r\n };\r\n}) {\r\n const elementRef = useRef<HTMLSpanElement>(null);\r\n const signalId = `${proxy._stateKey}-${proxy._path.join(\".\")}`;\r\n\r\n useEffect(() => {\r\n const element = elementRef.current;\r\n if (!element || !element.parentElement) return;\r\n\r\n const parentElement = element.parentElement;\r\n const childNodes = Array.from(parentElement.childNodes);\r\n const position = childNodes.indexOf(element);\r\n\r\n let parentId = parentElement.getAttribute(\"data-parent-id\");\r\n if (!parentId) {\r\n parentId = `parent-${crypto.randomUUID()}`;\r\n parentElement.setAttribute(\"data-parent-id\", parentId);\r\n }\r\n\r\n const instanceId = `instance-${crypto.randomUUID()}`;\r\n const elementInfo = {\r\n instanceId,\r\n parentId,\r\n position,\r\n effect: proxy._effect,\r\n };\r\n\r\n getGlobalStore.getState().addSignalElement(signalId, elementInfo);\r\n\r\n // Get the raw value from the store\r\n const value = getGlobalStore\r\n .getState()\r\n .getNestedState(proxy._stateKey, proxy._path);\r\n\r\n let displayValue;\r\n if (proxy._effect) {\r\n try {\r\n displayValue = new Function(\r\n \"state\",\r\n `return (${proxy._effect})(state)`\r\n )(value);\r\n } catch (err) {\r\n console.error(\"Error evaluating effect function during mount:\", err);\r\n displayValue = value; // Fallback to raw value\r\n }\r\n } else {\r\n displayValue = value;\r\n }\r\n\r\n if (displayValue !== null && typeof displayValue === \"object\") {\r\n displayValue = JSON.stringify(displayValue);\r\n }\r\n\r\n const textNode = document.createTextNode(String(displayValue));\r\n element.replaceWith(textNode);\r\n }, [proxy._stateKey, proxy._path.join(\".\"), proxy._effect]);\r\n\r\n return createElement(\"span\", {\r\n ref: elementRef,\r\n style: { display: \"none\" },\r\n \"data-signal-id\": signalId,\r\n });\r\n}\r\nexport function $cogsSignalStore(proxy: {\r\n _path: string[];\r\n _stateKey: string;\r\n}) {\r\n const value = useSyncExternalStore(\r\n (notify) => {\r\n const stateEntry = getGlobalStore\r\n .getState()\r\n .stateComponents.get(proxy._stateKey) || {\r\n components: new Map(),\r\n };\r\n stateEntry.components.set(proxy._stateKey, {\r\n forceUpdate: notify,\r\n paths: new Set([proxy._path.join(\".\")]),\r\n });\r\n return () => stateEntry.components.delete(proxy._stateKey);\r\n },\r\n () => getGlobalStore.getState().getNestedState(proxy._stateKey, proxy._path)\r\n );\r\n return createElement(\"text\", {}, String(value));\r\n}\r\nfunction CogsItemWrapper({\r\n stateKey,\r\n itemComponentId,\r\n itemPath,\r\n children,\r\n}: {\r\n stateKey: string;\r\n itemComponentId: string;\r\n itemPath: string[];\r\n children: React.ReactNode;\r\n}) {\r\n // This hook handles the re-rendering when the item's own data changes.\r\n const [, forceUpdate] = useState({});\r\n // This hook measures the element.\r\n const [ref, bounds] = useMeasure();\r\n // This ref prevents sending the same height update repeatedly.\r\n const lastReportedHeight = useRef<number | null>(null);\r\n\r\n // This is the primary effect for this component.\r\n useEffect(() => {\r\n // We only report a height if it's a valid number AND it's different\r\n // from the last height we reported. This prevents infinite loops.\r\n if (bounds.height > 0 && bounds.height !== lastReportedHeight.current) {\r\n // Store the new height so we don't report it again.\r\n lastReportedHeight.current = bounds.height;\r\n\r\n // Call the store function to save the height and notify listeners.\r\n getGlobalStore.getState().setShadowMetadata(stateKey, itemPath, {\r\n virtualizer: {\r\n itemHeight: bounds.height,\r\n },\r\n });\r\n }\r\n }, [bounds.height, stateKey, itemPath]); // Reruns whenever the measured height changes.\r\n\r\n // This effect handles subscribing the item to its own data path for updates.\r\n useLayoutEffect(() => {\r\n const fullComponentId = `${stateKey}////${itemComponentId}`;\r\n const stateEntry = getGlobalStore\r\n .getState()\r\n .stateComponents.get(stateKey) || {\r\n components: new Map(),\r\n };\r\n\r\n stateEntry.components.set(fullComponentId, {\r\n forceUpdate: () => forceUpdate({}),\r\n paths: new Set([itemPath.join(\".\")]),\r\n });\r\n\r\n getGlobalStore.getState().stateComponents.set(stateKey, stateEntry);\r\n\r\n return () => {\r\n const currentEntry = getGlobalStore\r\n .getState()\r\n .stateComponents.get(stateKey);\r\n if (currentEntry) {\r\n currentEntry.components.delete(fullComponentId);\r\n }\r\n };\r\n }, [stateKey, itemComponentId, itemPath.join(\".\")]);\r\n\r\n // The rendered output is a simple div that gets measured.\r\n return <div ref={ref}>{children}</div>;\r\n}\r\n"],"names":["setAndMergeOptions","stateKey","newOptions","getInitialOptions","getGlobalStore","setInitialStateOptions","initialOptions","setOptions","options","initialOptionsPart","initialOptionsPartState","mergedOptions","needToAdd","key","isDeepEqual","addStateOptions","initialState","formElements","validation","createCogsState","opt","newInitialState","statePart","transformStateFunc","useCogsState","componentId","useState","uuidv4","thiState","partialState","state","updater","useCogsStateFn","setCogsOptions","loadAndApplyLocalStorage","notifyComponents","setUpdaterState","setState","getKeyState","getValidationErrors","setStateLog","updateInitialStateGlobal","addValidationError","removeValidationError","setServerSyncActions","saveToLocalStorage","thisKey","currentInitialOptions","sessionId","lastSyncedWithServer","isFunction","storageKey","existingLastSynced","loadFromLocalStorage","data","superJsonResult","superjson","localStorageKey","storedData","error","currentState","useCogsConfig","localkey","localData","updateGlobalState","newState","effectiveSetState","updates","createProxyHandler","stateEntry","component","update","notifyComponent","fullComponentId","getUpdateValues","updateType","prevValue","payload","path","getNestedValue","stateObject","serverSync","localStorage","reactiveDeps","reactiveType","syncUpdate","dependencies","serverState","reactiveForce","forceUpdate","noStateKey","stateLog","componentUpdatesRef","useRef","componentIdRef","latestInitialOptionsRef","useEffect","prevState","syncKey","hasServerData","currentGloballyStoredInitialState","isFromServer","serverTimestamp","localTimestamp","lastSyncTimestamp","useLayoutEffect","componentKey","newStateOrFunction","updateObj","validationKey","pathKey","store","signalId","isArrayOperation","elements","arrayPath","arrayValue","arraySignalId","newValue","parentId","position","effect","parent","childNodes","displayValue","arrayWithoutIndex","k","v","length","newKey","changedPaths","getDifferences","changedPathsSet","primaryPathToCheck","shouldUpdate","reactiveTypes","changedPath","currentPathToCheck","lastDotIndex","parentPath","depsResult","depsChanged","timeStamp","p","i","oldValue","newUpdate","index","prevLogs","aggregatedLogs","acc","log","uniqueKey","existing","serverStateStore","updaterFinal","useMemo","shapeCache","stateVersion","invalidateCachePath","baseObj","obj","init","newProxy","rebuildStateShape","initalOptionsGet","localKey","newUpdaterState","startTransition","field","meta","cacheKey","baseFunction","handler","target","thisArg","args","prop","mutationMethods","currentPath","needsAdd","existingPath","sync","response","errorPath","thisReactiveState","initialStateAtPath","getSourceArrayAndIndices","item","selectedIndex","itemHeight","overscan","stickToBottom","shouldNotScroll","containerRef","range","setRange","status","setStatus","isProgrammaticScroll","prevTotalCountRef","prevDepsRef","lastUpdateAtScrollTop","shadowUpdateTrigger","setShadowUpdateTrigger","scrollAnchorRef","prev","sourceArray","totalCount","totalHeight","positions","shadowArray","height","pos","measuredHeight","virtualState","start","end","validIndices","_","slicedArray","idx","container","hasNewItems","prevScrollTop","prevScrollHeight","intervalId","lastItemIndex","scrollBehavior","timeoutId","scrollThreshold","handleUserScroll","scrollTop","scrollHeight","clientHeight","high","low","topItemIndex","mid","startIndex","endIndex","visibleEnd","scrollToBottom","useCallback","scrollToIndex","behavior","virtualizerProps","compareFn","sortedResult","a","b","newCurrentState","newMeta","originalIndex","callbackfn","filteredResult","arrayToMap","localIndex","finalPath","setter","itemComponentId","currentEntry","createElement","SignalMapRenderer","CogsItemWrapper","fieldName","flattenedResults","val","indexValue","currentArray","lastIndex","lastValue","newPath","pushFunc","fields","onMatch","matchedItem","isMatch","updatedItem","updatedArray","updateFn","cutFunc","value","found","thisValue","lastPathElement","parentValue","fullArray","fn","$cogsSignal","parentKey","thisIndex","nested","errors","fullErrorPath","patches","applyPatch","dotIndex","lastSegment","parentDotIndex","grandParentPath","thisObject","existingErrors","result","errorMessage","formRefStore","children","hideMessage","jsx","ValidationWrapper","opts","debounce","child","formOpts","FormControlComponent","nextPath","nextValue","proxyInstance","proxy","SignalRenderer","arraysetter","elementRef","element","parentElement","elementInfo","err","textNode","$cogsSignalStore","useSyncExternalStore","notify","itemPath","ref","bounds","useMeasure","lastReportedHeight"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"CogsState.jsx","sources":["../src/CogsState.tsx"],"sourcesContent":["\"use client\";\r\n\r\nimport {\r\n createElement,\r\n startTransition,\r\n useCallback,\r\n useEffect,\r\n useLayoutEffect,\r\n useMemo,\r\n useRef,\r\n useState,\r\n useSyncExternalStore,\r\n type CSSProperties,\r\n type ReactNode,\r\n type RefObject,\r\n} from \"react\";\r\n\r\nimport {\r\n debounce,\r\n getDifferences,\r\n getNestedValue,\r\n isFunction,\r\n type GenericObject,\r\n} from \"./utility.js\";\r\nimport {\r\n cutFunc,\r\n FormControlComponent,\r\n pushFunc,\r\n updateFn,\r\n ValidationWrapper,\r\n} from \"./Functions.js\";\r\nimport { isDeepEqual, transformStateFunc } from \"./utility.js\";\r\nimport superjson from \"superjson\";\r\nimport { v4 as uuidv4 } from \"uuid\";\r\nimport { z } from \"zod\";\r\n\r\nimport { formRefStore, getGlobalStore, type ComponentsType } from \"./store.js\";\r\nimport { useCogsConfig } from \"./CogsStateClient.js\";\r\nimport { applyPatch } from \"fast-json-patch\";\r\nimport useMeasure from \"react-use-measure\";\r\n\r\ntype Prettify<T> = { [K in keyof T]: T[K] } & {};\r\n\r\nexport type VirtualViewOptions = {\r\n itemHeight?: number;\r\n overscan?: number;\r\n stickToBottom?: boolean;\r\n dependencies?: any[];\r\n};\r\n\r\n// The result now returns a real StateObject\r\nexport type VirtualStateObjectResult<T extends any[]> = {\r\n /**\r\n * A new, fully-functional StateObject that represents the virtualized slice.\r\n * You can use `.get()`, `.stateMap()`, `.insert()`, `.cut()` etc. on this object.\r\n */\r\n virtualState: StateObject<T>;\r\n /**\r\n * Props to be spread onto your DOM elements to enable virtualization.\r\n */\r\n virtualizerProps: {\r\n outer: { ref: RefObject<HTMLDivElement>; style: CSSProperties };\r\n inner: { style: CSSProperties };\r\n list: { style: CSSProperties };\r\n };\r\n scrollToBottom: (behavior?: ScrollBehavior) => void;\r\n scrollToIndex: (index: number, behavior?: ScrollBehavior) => void;\r\n};\r\n\r\nexport type ServerSyncStatus = {\r\n isFresh: boolean;\r\n isFreshTime: number;\r\n isStale: boolean;\r\n isStaleTime: number;\r\n isSyncing: boolean;\r\n isSyncingTime: number;\r\n};\r\n\r\nexport type SyncInfo = {\r\n timeStamp: number;\r\n userId: number;\r\n};\r\n\r\nexport type FormElementParams<T> = {\r\n get: () => T;\r\n\r\n set: UpdateType<T>;\r\n syncStatus: (SyncInfo & { date: Date }) | null;\r\n path: string[];\r\n validationErrors: () => string[];\r\n addValidationError: (message?: string) => void;\r\n\r\n inputProps: {\r\n ref?: React.RefObject<any>;\r\n value?: T extends boolean ? never : T;\r\n onChange?: (\r\n event: React.ChangeEvent<HTMLInputElement | HTMLTextAreaElement>\r\n ) => void;\r\n onBlur?: () => void;\r\n };\r\n};\r\n\r\nexport type StateKeys = string;\r\n\r\ntype findWithFuncType<U> = (\r\n thisKey: keyof U,\r\n thisValue: U[keyof U]\r\n) => EndType<U> & StateObject<U>;\r\nexport type PushArgs<U, T> = (\r\n update:\r\n | Prettify<U>\r\n | ((prevState: NonNullable<Prettify<U>>[]) => NonNullable<Prettify<U>>),\r\n opts?: UpdateOpts<U>\r\n) => StateObject<T>;\r\n\r\ntype CutFunctionType<T> = (\r\n index?: number,\r\n options?: { waitForSync?: boolean }\r\n) => StateObject<T>;\r\n\r\nexport type InferArrayElement<T> = T extends (infer U)[] ? U : never;\r\ntype ArraySpecificPrototypeKeys =\r\n | \"concat\"\r\n | \"copyWithin\"\r\n | \"fill\"\r\n | \"find\"\r\n | \"findIndex\"\r\n | \"flat\"\r\n | \"flatMap\"\r\n | \"includes\"\r\n | \"indexOf\"\r\n | \"join\"\r\n | \"keys\"\r\n | \"lastIndexOf\"\r\n | \"map\"\r\n | \"pop\"\r\n | \"push\"\r\n | \"reduce\"\r\n | \"reduceRight\"\r\n | \"reverse\"\r\n | \"shift\"\r\n | \"slice\"\r\n | \"some\"\r\n | \"sort\"\r\n | \"splice\"\r\n | \"unshift\"\r\n | \"values\"\r\n | \"entries\"\r\n | \"every\"\r\n | \"filter\"\r\n | \"forEach\"\r\n | \"with\";\r\n\r\nexport type ArrayEndType<TShape extends unknown> = {\r\n findWith: findWithFuncType<InferArrayElement<TShape>>;\r\n index: (index: number) => StateObject<InferArrayElement<TShape>> & {\r\n insert: PushArgs<InferArrayElement<TShape>, TShape>;\r\n cut: CutFunctionType<TShape>;\r\n _index: number;\r\n } & EndType<InferArrayElement<TShape>>;\r\n insert: PushArgs<InferArrayElement<TShape>, TShape>;\r\n cut: CutFunctionType<TShape>;\r\n cutByValue: (value: string | number | boolean) => void;\r\n toggleByValue: (value: string | number | boolean) => void;\r\n stateSort: (\r\n compareFn: (\r\n a: InferArrayElement<TShape>,\r\n b: InferArrayElement<TShape>\r\n ) => number\r\n ) => ArrayEndType<TShape>;\r\n useVirtualView: (\r\n options: VirtualViewOptions\r\n ) => VirtualStateObjectResult<InferArrayElement<TShape>[]>;\r\n\r\n stateMapNoRender: (\r\n callbackfn: (\r\n value: InferArrayElement<TShape>,\r\n setter: StateObject<InferArrayElement<TShape>>,\r\n index: number,\r\n array: TShape,\r\n arraySetter: StateObject<TShape>\r\n ) => void\r\n ) => any;\r\n stateList: (\r\n callbackfn: (\r\n value: InferArrayElement<TShape>,\r\n setter: StateObject<InferArrayElement<TShape>>,\r\n index: { localIndex: number; originalIndex: number },\r\n array: TShape,\r\n arraySetter: StateObject<TShape>\r\n ) => void\r\n ) => any;\r\n stateMap: (\r\n callbackfn: (\r\n value: InferArrayElement<TShape>,\r\n setter: StateObject<InferArrayElement<TShape>>,\r\n index: number,\r\n array: TShape,\r\n arraySetter: StateObject<TShape>\r\n ) => void\r\n ) => any;\r\n $stateMap: (\r\n callbackfn: (\r\n value: InferArrayElement<TShape>,\r\n setter: StateObject<InferArrayElement<TShape>>,\r\n index: number,\r\n array: TShape,\r\n arraySetter: StateObject<TShape>\r\n ) => void\r\n ) => any;\r\n stateFlattenOn: <K extends keyof InferArrayElement<TShape>>(\r\n field: K\r\n ) => StateObject<InferArrayElement<InferArrayElement<TShape>[K]>[]>;\r\n uniqueInsert: (\r\n payload: UpdateArg<InferArrayElement<TShape>>,\r\n fields?: (keyof InferArrayElement<TShape>)[],\r\n onMatch?: (existingItem: any) => any\r\n ) => void;\r\n stateFind: (\r\n callbackfn: (value: InferArrayElement<TShape>, index: number) => boolean\r\n ) => StateObject<InferArrayElement<TShape>> | undefined;\r\n stateFilter: (\r\n callbackfn: (value: InferArrayElement<TShape>, index: number) => void\r\n ) => ArrayEndType<TShape>;\r\n getSelected: () => StateObject<InferArrayElement<TShape>> | undefined;\r\n clearSelected: () => void;\r\n getSelectedIndex: () => number;\r\n last: () => StateObject<InferArrayElement<TShape>> | undefined;\r\n} & EndType<TShape>;\r\n\r\nexport type FormOptsType = {\r\n key?: string;\r\n validation?: {\r\n hideMessage?: boolean;\r\n message?: string;\r\n stretch?: boolean;\r\n props?: GenericObject;\r\n disable?: boolean;\r\n };\r\n formElements?: boolean;\r\n debounceTime?: number;\r\n stateServerDifferences?: string[][];\r\n};\r\n\r\nexport type FormControl<T> = (obj: FormElementParams<T>) => JSX.Element;\r\n\r\nexport type UpdateArg<S> = S | ((prevState: S) => S);\r\n\r\nexport type UpdateType<T> = (\r\n payload: UpdateArg<T>,\r\n opts?: UpdateOpts<T>\r\n) => void;\r\n\r\nexport type UpdateOpts<T> = {\r\n afterUpdate?: (state: T) => void;\r\n debounce?: number;\r\n};\r\nexport type ObjectEndType<T> = EndType<T> & {\r\n [K in keyof T]-?: ObjectEndType<T[K]>;\r\n} & {\r\n stateObject: (callbackfn: (value: T, setter: StateObject<T>) => void) => any;\r\n delete: () => void;\r\n};\r\nexport type ValidationError = {\r\n path: (string | number)[];\r\n message: string;\r\n};\r\ntype EffectFunction<T, R> = (state: T) => R;\r\nexport type EndType<T, IsArrayElement = false> = {\r\n addValidation: (errors: ValidationError[]) => void;\r\n applyJsonPatch: (patches: any[]) => void;\r\n update: UpdateType<T>;\r\n _path: string[];\r\n _stateKey: string;\r\n formElement: (control: FormControl<T>, opts?: FormOptsType) => JSX.Element;\r\n get: () => T;\r\n $get: () => T;\r\n $derive: <R>(fn: EffectFunction<T, R>) => R;\r\n _status: \"fresh\" | \"stale\" | \"synced\";\r\n getStatus: () => \"fresh\" | \"stale\";\r\n\r\n showValidationErrors: () => string[];\r\n setValidation: (ctx: string) => void;\r\n removeValidation: (ctx: string) => void;\r\n ignoreFields: (fields: string[]) => StateObject<T>;\r\n _selected: boolean;\r\n setSelected: (value: boolean) => void;\r\n toggleSelected: () => void;\r\n getFormRef: () => React.RefObject<any> | undefined;\r\n removeStorage: () => void;\r\n sync: () => void;\r\n validationWrapper: ({\r\n children,\r\n hideMessage,\r\n }: {\r\n children: React.ReactNode;\r\n hideMessage?: boolean;\r\n }) => JSX.Element;\r\n lastSynced?: SyncInfo;\r\n} & (IsArrayElement extends true ? { cut: () => void } : {});\r\n\r\nexport type StateObject<T> = (T extends any[]\r\n ? ArrayEndType<T>\r\n : T extends Record<string, unknown> | object\r\n ? { [K in keyof T]-?: StateObject<T[K]> } & ObjectEndType<T>\r\n : T extends string | number | boolean | null\r\n ? T\r\n : never) &\r\n EndType<T, true> & {\r\n getAllFormRefs: () => Map<string, React.RefObject<any>>;\r\n _componentId: string | null;\r\n getComponents: () => ComponentsType;\r\n validateZodSchema: () => void;\r\n _initialState: T;\r\n updateInitialState: (newState: T | null) => {\r\n fetchId: (field: keyof T) => string | number;\r\n };\r\n _isLoading: boolean;\r\n _serverState: T;\r\n revertToInitialState: (obj?: { validationKey?: string }) => T;\r\n getDifferences: () => string[];\r\n middleware: (\r\n middles: ({\r\n updateLog,\r\n update,\r\n }: {\r\n updateLog: UpdateTypeDetail[] | undefined;\r\n update: UpdateTypeDetail;\r\n }) => void\r\n ) => void;\r\n _isServerSynced: () => boolean;\r\n getLocalStorage: (key: string) => LocalStorageData<T> | null;\r\n };\r\n\r\nexport type CogsUpdate<T extends unknown> = UpdateType<T>;\r\n\r\nexport type EffectiveSetState<TStateObject> = (\r\n newStateOrFunction: UpdateArg<TStateObject>,\r\n path: string[],\r\n updateObj: { updateType: \"update\" | \"insert\" | \"cut\" },\r\n validationKey?: string,\r\n opts?: UpdateOpts<TStateObject>\r\n) => void;\r\n\r\nexport type UpdateTypeDetail = {\r\n timeStamp: number;\r\n stateKey: string;\r\n updateType: \"update\" | \"insert\" | \"cut\";\r\n path: string[];\r\n status: \"new\" | \"sent\" | \"synced\";\r\n oldValue: any;\r\n newValue: any;\r\n userId?: number;\r\n};\r\n\r\nexport type ActionsType<T> = {\r\n type: \"onChange\";\r\n action: ({ state, actionType }: { state: T; actionType: string }) => void;\r\n debounce?: number;\r\n}[];\r\n\r\ntype ArrayToObject<T extends string[]> = Record<T[number], string>;\r\ntype CookieType<T> = {\r\n timeStamp: number;\r\n value: T;\r\n cookieName: string;\r\n OnUnMountCookie?: Boolean;\r\n};\r\nexport type CogsCookiesType<T extends string[] = string[]> = CookieType<\r\n ArrayToObject<T>\r\n>;\r\nexport type ReactivityType = \"none\" | \"component\" | \"deps\" | \"all\";\r\n\r\ntype ValidationOptionsType = {\r\n key?: string;\r\n zodSchema?: z.ZodTypeAny;\r\n onBlur?: boolean;\r\n};\r\n\r\nexport type OptionsType<T extends unknown = unknown> = {\r\n log?: boolean;\r\n componentId?: string;\r\n serverSync?: ServerSyncType<T>;\r\n validation?: ValidationOptionsType;\r\n enableServerState?: boolean;\r\n serverState?: {\r\n id?: string | number;\r\n data?: T;\r\n status?: \"pending\" | \"error\" | \"success\";\r\n };\r\n sync?: {\r\n action: (state: T) => Promise<{\r\n success: boolean;\r\n data?: any;\r\n error?: any;\r\n errors?: Array<{\r\n path: (string | number)[];\r\n message: string;\r\n }>;\r\n }>;\r\n onSuccess?: (data: any) => void;\r\n onError?: (error: any) => void;\r\n };\r\n middleware?: ({\r\n updateLog,\r\n update,\r\n }: {\r\n updateLog: UpdateTypeDetail[] | undefined;\r\n update: UpdateTypeDetail;\r\n }) => void;\r\n\r\n modifyState?: (state: T) => T;\r\n localStorage?: {\r\n key: string | ((state: T) => string);\r\n onChange?: (state: T) => void;\r\n };\r\n formElements?: FormsElementsType;\r\n enabledSync?: (state: T) => boolean;\r\n reactiveDeps?: (state: T) => any[] | true;\r\n reactiveType?: ReactivityType[] | ReactivityType;\r\n syncUpdate?: Partial<UpdateTypeDetail>;\r\n\r\n initialState?: T;\r\n dependencies?: any[];\r\n};\r\nexport type ServerSyncType<T> = {\r\n testKey?: string;\r\n syncKey: (({ state }: { state: T }) => string) | string;\r\n syncFunction: ({ state }: { state: T }) => void;\r\n debounce?: number;\r\n\r\n snapshot?: {\r\n name: (({ state }: { state: T }) => string) | string;\r\n stateKeys: StateKeys[];\r\n currentUrl: string;\r\n currentParams?: URLSearchParams;\r\n };\r\n};\r\nexport type SyncActionsType<T> = {\r\n syncKey: string;\r\n\r\n rollBackState?: T;\r\n actionTimeStamp: number;\r\n retryCount?: number;\r\n status:\r\n | \"success\"\r\n | \"waiting\"\r\n | \"rolledBack\"\r\n | \"error\"\r\n | \"cancelled\"\r\n | \"failed\";\r\n snapshot?: {\r\n name: string;\r\n stateKeys: StateKeys[];\r\n currentUrl: string;\r\n currentParams?: URLSearchParams;\r\n };\r\n};\r\n\r\nexport type ValidationWrapperOptions<T extends unknown = unknown> = {\r\n children: React.ReactNode;\r\n active: boolean;\r\n stretch?: boolean;\r\n path: string[];\r\n message?: string;\r\n data?: T;\r\n key?: string;\r\n};\r\nexport type SyncRenderOptions<T extends unknown = unknown> = {\r\n children: React.ReactNode;\r\n time: number;\r\n data?: T;\r\n key?: string;\r\n};\r\n\r\ntype FormsElementsType<T extends unknown = unknown> = {\r\n validation?: (options: ValidationWrapperOptions<T>) => React.ReactNode;\r\n syncRender?: (options: SyncRenderOptions<T>) => React.ReactNode;\r\n};\r\n\r\nexport type InitialStateInnerType<T extends unknown = unknown> = {\r\n initialState: T;\r\n} & OptionsType<T>;\r\n\r\nexport type InitialStateType<T> = {\r\n [key: string]: InitialStateInnerType<T>;\r\n};\r\n\r\nexport type AllStateTypes<T extends unknown> = Record<string, T>;\r\n\r\nexport type CogsInitialState<T> = {\r\n initialState: T;\r\n formElements?: FormsElementsType<T>;\r\n};\r\n\r\nexport type TransformedStateType<T> = {\r\n [P in keyof T]: T[P] extends CogsInitialState<infer U> ? U : T[P];\r\n};\r\n\r\nfunction setAndMergeOptions(stateKey: string, newOptions: OptionsType<any>) {\r\n const getInitialOptions = getGlobalStore.getState().getInitialOptions;\r\n const setInitialStateOptions =\r\n getGlobalStore.getState().setInitialStateOptions;\r\n\r\n const initialOptions = getInitialOptions(stateKey as string) || {};\r\n\r\n setInitialStateOptions(stateKey as string, {\r\n ...initialOptions,\r\n ...newOptions,\r\n });\r\n}\r\n\r\n// Fix for the setOptions function\r\nfunction setOptions<StateKey, Opt>({\r\n stateKey,\r\n options,\r\n initialOptionsPart,\r\n}: {\r\n stateKey: StateKey;\r\n options?: OptionsType<any>;\r\n initialOptionsPart: Record<string, any>;\r\n}) {\r\n const initialOptions = getInitialOptions(stateKey as string) || {};\r\n const initialOptionsPartState = initialOptionsPart[stateKey as string] || {};\r\n const setInitialStateOptions =\r\n getGlobalStore.getState().setInitialStateOptions;\r\n const mergedOptions = { ...initialOptionsPartState, ...initialOptions };\r\n\r\n let needToAdd = false;\r\n if (options) {\r\n for (const key in options) {\r\n if (!mergedOptions.hasOwnProperty(key)) {\r\n needToAdd = true;\r\n mergedOptions[key] = options[key as keyof typeof options];\r\n } else {\r\n if (\r\n key == \"localStorage\" &&\r\n options[key] &&\r\n mergedOptions[key].key !== options[key]?.key\r\n ) {\r\n needToAdd = true;\r\n mergedOptions[key] = options[key];\r\n }\r\n if (\r\n key == \"initialState\" &&\r\n options[key] &&\r\n mergedOptions[key] !== options[key] && // Different references\r\n !isDeepEqual(mergedOptions[key], options[key]) // And different values\r\n ) {\r\n needToAdd = true;\r\n mergedOptions[key] = options[key];\r\n }\r\n }\r\n }\r\n }\r\n\r\n if (needToAdd) {\r\n setInitialStateOptions(stateKey as string, mergedOptions);\r\n }\r\n}\r\nexport function addStateOptions<T extends unknown>(\r\n initialState: T,\r\n { formElements, validation }: OptionsType<T>\r\n) {\r\n return { initialState: initialState, formElements, validation } as T;\r\n}\r\n\r\nexport const createCogsState = <State extends Record<string, unknown>>(\r\n initialState: State,\r\n opt?: { formElements?: FormsElementsType; validation?: ValidationOptionsType }\r\n) => {\r\n let newInitialState = initialState;\r\n\r\n // Extract state parts and options using transformStateFunc\r\n const [statePart, initialOptionsPart] =\r\n transformStateFunc<State>(newInitialState);\r\n\r\n // Apply global formElements as defaults to each state key's options\r\n if (\r\n Object.keys(initialOptionsPart).length > 0 ||\r\n (opt && Object.keys(opt).length > 0)\r\n ) {\r\n Object.keys(initialOptionsPart).forEach((key) => {\r\n // Get the existing options for this state key\r\n initialOptionsPart[key] = initialOptionsPart[key] || {};\r\n\r\n initialOptionsPart[key].formElements = {\r\n ...opt?.formElements, // Global defaults first\r\n ...opt?.validation,\r\n ...(initialOptionsPart[key].formElements || {}), // State-specific overrides\r\n };\r\n const existingOptions = getInitialOptions(key);\r\n\r\n if (!existingOptions) {\r\n getGlobalStore\r\n .getState()\r\n .setInitialStateOptions(key, initialOptionsPart[key]);\r\n }\r\n });\r\n }\r\n\r\n getGlobalStore.getState().setInitialStates(statePart);\r\n getGlobalStore.getState().setCreatedState(statePart);\r\n type StateKeys = keyof typeof statePart;\r\n\r\n const useCogsState = <StateKey extends StateKeys>(\r\n stateKey: StateKey,\r\n options?: OptionsType<(typeof statePart)[StateKey]>\r\n ) => {\r\n const [componentId] = useState(options?.componentId ?? uuidv4());\r\n\r\n setOptions({\r\n stateKey,\r\n options,\r\n initialOptionsPart,\r\n });\r\n\r\n const thiState =\r\n getGlobalStore.getState().cogsStateStore[stateKey as string] ||\r\n statePart[stateKey as string];\r\n const partialState = options?.modifyState\r\n ? options.modifyState(thiState)\r\n : thiState;\r\n\r\n const [state, updater] = useCogsStateFn<(typeof statePart)[StateKey]>(\r\n partialState,\r\n {\r\n stateKey: stateKey as string,\r\n syncUpdate: options?.syncUpdate,\r\n componentId,\r\n localStorage: options?.localStorage,\r\n middleware: options?.middleware,\r\n enabledSync: options?.enabledSync,\r\n reactiveType: options?.reactiveType,\r\n reactiveDeps: options?.reactiveDeps,\r\n initialState: options?.initialState as any,\r\n dependencies: options?.dependencies,\r\n serverState: options?.serverState,\r\n }\r\n );\r\n\r\n return updater;\r\n };\r\n\r\n function setCogsOptions<StateKey extends StateKeys>(\r\n stateKey: StateKey,\r\n options: OptionsType<(typeof statePart)[StateKey]>\r\n ) {\r\n setOptions({ stateKey, options, initialOptionsPart });\r\n\r\n if (options.localStorage) {\r\n loadAndApplyLocalStorage(stateKey as string, options);\r\n }\r\n\r\n notifyComponents(stateKey as string);\r\n }\r\n\r\n return { useCogsState, setCogsOptions };\r\n};\r\n\r\nconst {\r\n setUpdaterState,\r\n setState,\r\n getInitialOptions,\r\n getKeyState,\r\n getValidationErrors,\r\n setStateLog,\r\n updateInitialStateGlobal,\r\n addValidationError,\r\n removeValidationError,\r\n setServerSyncActions,\r\n} = getGlobalStore.getState();\r\nconst saveToLocalStorage = <T,>(\r\n state: T,\r\n thisKey: string,\r\n currentInitialOptions: any,\r\n sessionId?: string,\r\n lastSyncedWithServer?: number\r\n) => {\r\n if (currentInitialOptions?.log) {\r\n console.log(\r\n \"saving to localstorage\",\r\n thisKey,\r\n currentInitialOptions.localStorage?.key,\r\n sessionId\r\n );\r\n }\r\n\r\n const key = isFunction(currentInitialOptions?.localStorage?.key)\r\n ? currentInitialOptions.localStorage?.key(state)\r\n : currentInitialOptions?.localStorage?.key;\r\n\r\n if (key && sessionId) {\r\n const storageKey = `${sessionId}-${thisKey}-${key}`;\r\n\r\n // Get existing data to preserve lastSyncedWithServer if not explicitly updating it\r\n let existingLastSynced: number | undefined;\r\n try {\r\n const existing = loadFromLocalStorage(storageKey);\r\n existingLastSynced = existing?.lastSyncedWithServer;\r\n } catch {\r\n // Ignore errors, will use undefined\r\n }\r\n\r\n const data: LocalStorageData<T> = {\r\n state,\r\n lastUpdated: Date.now(),\r\n lastSyncedWithServer: lastSyncedWithServer ?? existingLastSynced,\r\n };\r\n\r\n // Use SuperJSON serialize to get the json part only\r\n const superJsonResult = superjson.serialize(data);\r\n window.localStorage.setItem(\r\n storageKey,\r\n JSON.stringify(superJsonResult.json)\r\n );\r\n }\r\n};\r\n\r\nconst loadFromLocalStorage = (localStorageKey: string) => {\r\n if (!localStorageKey) return null;\r\n\r\n try {\r\n const storedData = window.localStorage.getItem(localStorageKey);\r\n if (!storedData) return null;\r\n\r\n // Parse the json part back normally\r\n const parsedData = JSON.parse(storedData);\r\n\r\n return parsedData;\r\n } catch (error) {\r\n console.error(\"Error loading from localStorage:\", error);\r\n return null;\r\n }\r\n};\r\nconst loadAndApplyLocalStorage = (stateKey: string, options: any) => {\r\n const currentState = getGlobalStore.getState().cogsStateStore[stateKey];\r\n const { sessionId } = useCogsConfig();\r\n const localkey = isFunction(options?.localStorage?.key)\r\n ? options.localStorage.key(currentState)\r\n : options?.localStorage?.key;\r\n\r\n if (localkey && sessionId) {\r\n const localData = loadFromLocalStorage(\r\n `${sessionId}-${stateKey}-${localkey}`\r\n );\r\n\r\n if (\r\n localData &&\r\n localData.lastUpdated > (localData.lastSyncedWithServer || 0)\r\n ) {\r\n setState(stateKey, localData.state);\r\n\r\n notifyComponents(stateKey);\r\n return true;\r\n }\r\n }\r\n return false;\r\n};\r\n\r\ntype LocalStorageData<T> = {\r\n state: T;\r\n lastUpdated: number;\r\n lastSyncedWithServer?: number;\r\n baseServerState?: T; // Add this to track what server state our changes are based on\r\n};\r\n\r\nconst updateGlobalState = (\r\n thisKey: string,\r\n initialState: any,\r\n newState: any,\r\n effectiveSetState: EffectiveSetState<any>,\r\n componentId: string,\r\n sessionId?: string\r\n) => {\r\n // Update all global state at once\r\n const updates = {\r\n initialState: initialState,\r\n updaterState: createProxyHandler(\r\n thisKey,\r\n effectiveSetState,\r\n componentId,\r\n sessionId\r\n ),\r\n state: newState,\r\n };\r\n\r\n updateInitialStateGlobal(thisKey, updates.initialState);\r\n setUpdaterState(thisKey, updates.updaterState);\r\n setState(thisKey, updates.state);\r\n};\r\n\r\nconst notifyComponents = (thisKey: string) => {\r\n const stateEntry = getGlobalStore.getState().stateComponents.get(thisKey);\r\n if (!stateEntry) return;\r\n\r\n // Batch component updates\r\n const updates = new Set<() => void>();\r\n stateEntry.components.forEach((component) => {\r\n const reactiveTypes = component\r\n ? Array.isArray(component.reactiveType)\r\n ? component.reactiveType\r\n : [component.reactiveType || \"component\"]\r\n : null;\r\n if (!reactiveTypes?.includes(\"none\")) {\r\n updates.add(() => component.forceUpdate());\r\n }\r\n });\r\n\r\n // Schedule updates in the next tick to allow batching\r\n queueMicrotask(() => {\r\n updates.forEach((update) => update());\r\n });\r\n};\r\n\r\nexport const notifyComponent = (stateKey: string, componentId: string) => {\r\n const stateEntry = getGlobalStore.getState().stateComponents.get(stateKey);\r\n if (stateEntry) {\r\n const fullComponentId = `${stateKey}////${componentId}`;\r\n const component = stateEntry.components.get(fullComponentId);\r\n const reactiveTypes = component\r\n ? Array.isArray(component.reactiveType)\r\n ? component.reactiveType\r\n : [component.reactiveType || \"component\"]\r\n : null;\r\n\r\n // Skip if reactivity is disabled\r\n if (reactiveTypes?.includes(\"none\")) {\r\n return;\r\n }\r\n\r\n if (component) {\r\n // Force an update to ensure the current value is saved\r\n\r\n component.forceUpdate();\r\n }\r\n }\r\n};\r\nconst getUpdateValues = (\r\n updateType: string,\r\n prevValue: any,\r\n payload: any,\r\n path: string[]\r\n) => {\r\n switch (updateType) {\r\n case \"update\":\r\n return {\r\n oldValue: getNestedValue(prevValue, path),\r\n newValue: getNestedValue(payload, path),\r\n };\r\n case \"insert\":\r\n return {\r\n oldValue: null, // or undefined\r\n newValue: getNestedValue(payload, path),\r\n };\r\n case \"cut\":\r\n return {\r\n oldValue: getNestedValue(prevValue, path),\r\n newValue: null, // or undefined\r\n };\r\n default:\r\n return { oldValue: null, newValue: null };\r\n }\r\n};\r\nexport function useCogsStateFn<TStateObject extends unknown>(\r\n stateObject: TStateObject,\r\n {\r\n stateKey,\r\n serverSync,\r\n localStorage,\r\n formElements,\r\n reactiveDeps,\r\n reactiveType,\r\n componentId,\r\n initialState,\r\n syncUpdate,\r\n dependencies,\r\n serverState,\r\n }: {\r\n stateKey?: string;\r\n componentId?: string;\r\n initialState?: TStateObject;\r\n } & OptionsType<TStateObject> = {}\r\n) {\r\n const [reactiveForce, forceUpdate] = useState({}); //this is the key to reactivity\r\n const { sessionId } = useCogsConfig();\r\n\r\n let noStateKey = stateKey ? false : true;\r\n const [thisKey] = useState(stateKey ?? uuidv4());\r\n const stateLog = getGlobalStore.getState().stateLog[thisKey];\r\n const componentUpdatesRef = useRef(new Set<string>());\r\n const componentIdRef = useRef(componentId ?? uuidv4());\r\n const latestInitialOptionsRef = useRef<OptionsType<TStateObject> | null>(\r\n null\r\n );\r\n latestInitialOptionsRef.current = (getInitialOptions(thisKey as string) ??\r\n null) as OptionsType<TStateObject> | null;\r\n\r\n useEffect(() => {\r\n if (syncUpdate && syncUpdate.stateKey === thisKey && syncUpdate.path?.[0]) {\r\n // Update the actual state value\r\n setState(thisKey, (prevState: any) => ({\r\n ...prevState,\r\n [syncUpdate.path![0]!]: syncUpdate.newValue,\r\n }));\r\n\r\n // Create combined key and update sync info\r\n const syncKey = `${syncUpdate.stateKey}:${syncUpdate.path.join(\".\")}`;\r\n getGlobalStore.getState().setSyncInfo(syncKey, {\r\n timeStamp: syncUpdate.timeStamp!,\r\n userId: syncUpdate.userId!,\r\n });\r\n }\r\n }, [syncUpdate]);\r\n useEffect(() => {\r\n // Only proceed if initialState is provided\r\n if (initialState) {\r\n setAndMergeOptions(thisKey as string, {\r\n initialState,\r\n });\r\n\r\n const options = latestInitialOptionsRef.current;\r\n const hasServerId = options?.serverState?.id !== undefined;\r\n const hasServerData =\r\n hasServerId &&\r\n options?.serverState?.status === \"success\" &&\r\n options?.serverState?.data;\r\n\r\n const currentGloballyStoredInitialState =\r\n getGlobalStore.getState().initialStateGlobal[thisKey];\r\n\r\n const initialStateChanged =\r\n (currentGloballyStoredInitialState &&\r\n !isDeepEqual(currentGloballyStoredInitialState, initialState)) ||\r\n !currentGloballyStoredInitialState;\r\n\r\n if (!initialStateChanged && !hasServerData) {\r\n return;\r\n }\r\n\r\n let localData = null;\r\n const localkey = isFunction(options?.localStorage?.key)\r\n ? options?.localStorage?.key(initialState)\r\n : options?.localStorage?.key;\r\n\r\n if (localkey && sessionId) {\r\n localData = loadFromLocalStorage(`${sessionId}-${thisKey}-${localkey}`);\r\n }\r\n\r\n let newState = initialState;\r\n let isFromServer = false;\r\n\r\n const serverTimestamp = hasServerData ? Date.now() : 0;\r\n const localTimestamp = localData?.lastUpdated || 0;\r\n const lastSyncTimestamp = localData?.lastSyncedWithServer || 0;\r\n\r\n if (hasServerData && serverTimestamp > localTimestamp) {\r\n newState = options.serverState!.data!;\r\n isFromServer = true;\r\n } else if (localData && localTimestamp > lastSyncTimestamp) {\r\n newState = localData.state;\r\n if (options?.localStorage?.onChange) {\r\n options?.localStorage?.onChange(newState);\r\n }\r\n }\r\n getGlobalStore.getState().initializeShadowState(thisKey, initialState);\r\n // Update the global state\r\n updateGlobalState(\r\n thisKey,\r\n initialState,\r\n newState,\r\n effectiveSetState,\r\n componentIdRef.current,\r\n sessionId\r\n );\r\n\r\n // Save to localStorage if we used server data\r\n if (isFromServer && localkey && sessionId) {\r\n saveToLocalStorage(newState, thisKey, options, sessionId, Date.now());\r\n }\r\n\r\n // Notify components of the change\r\n notifyComponents(thisKey);\r\n\r\n const reactiveTypes = Array.isArray(reactiveType)\r\n ? reactiveType\r\n : [reactiveType || \"component\"];\r\n\r\n if (!reactiveTypes.includes(\"none\")) {\r\n forceUpdate({});\r\n }\r\n }\r\n }, [\r\n initialState,\r\n serverState?.status,\r\n serverState?.data,\r\n ...(dependencies || []),\r\n ]);\r\n useLayoutEffect(() => {\r\n if (noStateKey) {\r\n setAndMergeOptions(thisKey as string, {\r\n serverSync,\r\n formElements,\r\n initialState,\r\n localStorage,\r\n middleware: latestInitialOptionsRef.current?.middleware,\r\n });\r\n }\r\n\r\n const componentKey = `${thisKey}////${componentIdRef.current}`;\r\n const stateEntry = getGlobalStore\r\n .getState()\r\n .stateComponents.get(thisKey) || {\r\n components: new Map(),\r\n };\r\n\r\n stateEntry.components.set(componentKey, {\r\n forceUpdate: () => forceUpdate({}),\r\n paths: new Set(),\r\n deps: [],\r\n depsFunction: reactiveDeps || undefined,\r\n reactiveType: reactiveType ?? [\"component\", \"deps\"],\r\n });\r\n\r\n getGlobalStore.getState().stateComponents.set(thisKey, stateEntry);\r\n //need to force update to create the stateUpdates references\r\n forceUpdate({});\r\n return () => {\r\n if (stateEntry) {\r\n stateEntry.components.delete(componentKey);\r\n if (stateEntry.components.size === 0) {\r\n getGlobalStore.getState().stateComponents.delete(thisKey);\r\n }\r\n }\r\n };\r\n }, []);\r\n\r\n const effectiveSetState = (\r\n newStateOrFunction: UpdateArg<TStateObject>,\r\n path: string[],\r\n updateObj: { updateType: \"insert\" | \"cut\" | \"update\" },\r\n validationKey?: string\r\n ) => {\r\n if (Array.isArray(path)) {\r\n const pathKey = `${thisKey}-${path.join(\".\")}`;\r\n componentUpdatesRef.current.add(pathKey);\r\n }\r\n const store = getGlobalStore.getState();\r\n\r\n setState(thisKey, (prevValue: TStateObject) => {\r\n const payload = isFunction<TStateObject>(newStateOrFunction)\r\n ? newStateOrFunction(prevValue as TStateObject)\r\n : newStateOrFunction;\r\n\r\n const signalId = `${thisKey}-${path.join(\".\")}`;\r\n if (signalId) {\r\n let isArrayOperation = false;\r\n let elements = store.signalDomElements.get(signalId);\r\n\r\n if (\r\n (!elements || elements.size === 0) &&\r\n (updateObj.updateType === \"insert\" || updateObj.updateType === \"cut\")\r\n ) {\r\n // Remove last segment (index) from path\r\n const arrayPath = path.slice(0, -1);\r\n const arrayValue = getNestedValue(payload, arrayPath);\r\n // If it's an array, use that path for signal\r\n if (Array.isArray(arrayValue)) {\r\n isArrayOperation = true;\r\n const arraySignalId = `${thisKey}-${arrayPath.join(\".\")}`;\r\n elements = store.signalDomElements.get(arraySignalId);\r\n }\r\n }\r\n\r\n if (elements) {\r\n const newValue = isArrayOperation\r\n ? getNestedValue(payload, path.slice(0, -1))\r\n : getNestedValue(payload, path);\r\n elements.forEach(({ parentId, position, effect }) => {\r\n const parent = document.querySelector(\r\n `[data-parent-id=\"${parentId}\"]`\r\n );\r\n if (parent) {\r\n const childNodes = Array.from(parent.childNodes);\r\n if (childNodes[position]) {\r\n const displayValue = effect\r\n ? new Function(\"state\", `return (${effect})(state)`)(newValue)\r\n : newValue;\r\n childNodes[position].textContent = String(displayValue);\r\n }\r\n }\r\n });\r\n }\r\n }\r\n\r\n console.log(\"shadowState\", store.shadowStateStore);\r\n if (\r\n updateObj.updateType === \"update\" &&\r\n (validationKey || latestInitialOptionsRef.current?.validation?.key) &&\r\n path\r\n ) {\r\n removeValidationError(\r\n (validationKey || latestInitialOptionsRef.current?.validation?.key) +\r\n \".\" +\r\n path.join(\".\")\r\n );\r\n }\r\n const arrayWithoutIndex = path.slice(0, path.length - 1);\r\n if (\r\n updateObj.updateType === \"cut\" &&\r\n latestInitialOptionsRef.current?.validation?.key\r\n ) {\r\n removeValidationError(\r\n latestInitialOptionsRef.current?.validation?.key +\r\n \".\" +\r\n arrayWithoutIndex.join(\".\")\r\n );\r\n }\r\n if (\r\n updateObj.updateType === \"insert\" &&\r\n latestInitialOptionsRef.current?.validation?.key\r\n ) {\r\n let getValidation = getValidationErrors(\r\n latestInitialOptionsRef.current?.validation?.key +\r\n \".\" +\r\n arrayWithoutIndex.join(\".\")\r\n );\r\n\r\n //TODO this is untested its supposed to cahnge teh validation errors alreaady stored when a new entry is push\r\n\r\n getValidation.filter(([k, v]) => {\r\n let length = k?.split(\".\").length;\r\n\r\n if (\r\n k == arrayWithoutIndex.join(\".\") &&\r\n length == arrayWithoutIndex.length - 1\r\n ) {\r\n // console.log(length, pathWithoutIndex.length);\r\n let newKey = k + \".\" + arrayWithoutIndex;\r\n removeValidationError(k!);\r\n addValidationError(newKey, v!);\r\n }\r\n });\r\n }\r\n\r\n const stateEntry = store.stateComponents.get(thisKey);\r\n console.log(\"stateEntry >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>\", stateEntry);\r\n if (stateEntry) {\r\n const changedPaths = getDifferences(prevValue, payload);\r\n const changedPathsSet = new Set(changedPaths);\r\n const primaryPathToCheck =\r\n updateObj.updateType === \"update\"\r\n ? path.join(\".\")\r\n : path.slice(0, -1).join(\".\") || \"\";\r\n\r\n for (const [\r\n componentKey,\r\n component,\r\n ] of stateEntry.components.entries()) {\r\n let shouldUpdate = false;\r\n const reactiveTypes = Array.isArray(component.reactiveType)\r\n ? component.reactiveType\r\n : [component.reactiveType || \"component\"];\r\n console.log(\"component\", component);\r\n if (reactiveTypes.includes(\"none\")) continue;\r\n if (reactiveTypes.includes(\"all\")) {\r\n component.forceUpdate();\r\n continue;\r\n }\r\n\r\n if (reactiveTypes.includes(\"component\")) {\r\n if (\r\n component.paths.has(primaryPathToCheck) ||\r\n component.paths.has(\"\")\r\n ) {\r\n shouldUpdate = true;\r\n }\r\n\r\n if (!shouldUpdate) {\r\n for (const changedPath of changedPathsSet) {\r\n let currentPathToCheck = changedPath;\r\n while (true) {\r\n if (component.paths.has(currentPathToCheck)) {\r\n shouldUpdate = true;\r\n break;\r\n }\r\n const lastDotIndex = currentPathToCheck.lastIndexOf(\".\");\r\n if (lastDotIndex !== -1) {\r\n const parentPath = currentPathToCheck.substring(\r\n 0,\r\n lastDotIndex\r\n );\r\n if (\r\n !isNaN(\r\n Number(currentPathToCheck.substring(lastDotIndex + 1))\r\n )\r\n ) {\r\n if (component.paths.has(parentPath)) {\r\n shouldUpdate = true;\r\n break;\r\n }\r\n }\r\n currentPathToCheck = parentPath;\r\n } else {\r\n currentPathToCheck = \"\";\r\n }\r\n if (currentPathToCheck === \"\") {\r\n break;\r\n }\r\n }\r\n if (shouldUpdate) break;\r\n }\r\n }\r\n }\r\n\r\n if (!shouldUpdate && reactiveTypes.includes(\"deps\")) {\r\n if (component.depsFunction) {\r\n const depsResult = component.depsFunction(payload);\r\n let depsChanged = false;\r\n if (typeof depsResult === \"boolean\") {\r\n if (depsResult) depsChanged = true;\r\n } else if (!isDeepEqual(component.deps, depsResult)) {\r\n component.deps = depsResult;\r\n depsChanged = true;\r\n }\r\n if (depsChanged) {\r\n shouldUpdate = true;\r\n }\r\n }\r\n }\r\n if (shouldUpdate) {\r\n component.forceUpdate();\r\n }\r\n }\r\n }\r\n const timeStamp = Date.now();\r\n\r\n path = path.map((p, i) => {\r\n const arrayPath = path.slice(0, -1);\r\n const arrayValue = getNestedValue(payload, arrayPath);\r\n\r\n return i === path.length - 1 &&\r\n [\"insert\", \"cut\"].includes(updateObj.updateType)\r\n ? (arrayValue.length - 1).toString()\r\n : p;\r\n });\r\n\r\n const { oldValue, newValue } = getUpdateValues(\r\n updateObj.updateType,\r\n prevValue,\r\n payload,\r\n path\r\n );\r\n const newUpdate = {\r\n timeStamp,\r\n stateKey: thisKey,\r\n path,\r\n updateType: updateObj.updateType,\r\n status: \"new\" as const,\r\n oldValue,\r\n newValue,\r\n } satisfies UpdateTypeDetail;\r\n\r\n switch (updateObj.updateType) {\r\n case \"update\":\r\n // For updates, just mirror the structure at the path\r\n store.updateShadowAtPath(thisKey, path, payload);\r\n break;\r\n\r\n case \"insert\":\r\n // For array insert, add empty element to shadow array\r\n\r\n const parentPath = path.slice(0, -1);\r\n store.insertShadowArrayElement(thisKey, parentPath, newValue);\r\n break;\r\n\r\n case \"cut\":\r\n // For array cut, remove element from shadow a\r\n const arrayPath = path.slice(0, -1);\r\n const index = parseInt(path[path.length - 1]!);\r\n store.removeShadowArrayElement(thisKey, arrayPath, index);\r\n break;\r\n }\r\n\r\n setStateLog(thisKey, (prevLogs) => {\r\n const logs = [...(prevLogs ?? []), newUpdate];\r\n\r\n // Aggregate the updates by stateKey and path\r\n const aggregatedLogs = logs.reduce((acc, log) => {\r\n const uniqueKey = `${log.stateKey}:${JSON.stringify(log.path)}`;\r\n const existing = acc.get(uniqueKey);\r\n\r\n if (existing) {\r\n // Update the existing entry with the most recent details\r\n existing.timeStamp = Math.max(existing.timeStamp, log.timeStamp);\r\n existing.newValue = log.newValue; // Overwrite with the latest value\r\n existing.oldValue = existing.oldValue ?? log.oldValue; // Retain the initial oldValue\r\n existing.updateType = log.updateType; // Update to the most recent type\r\n } else {\r\n // Add the log if no existing match is found\r\n acc.set(uniqueKey, { ...(log as any) });\r\n }\r\n\r\n return acc;\r\n }, new Map<string, typeof newUpdate>());\r\n\r\n // Convert the aggregated map back to an array\r\n return Array.from(aggregatedLogs.values());\r\n });\r\n\r\n saveToLocalStorage(\r\n payload,\r\n thisKey,\r\n latestInitialOptionsRef.current,\r\n sessionId\r\n );\r\n\r\n if (latestInitialOptionsRef.current?.middleware) {\r\n latestInitialOptionsRef.current!.middleware({\r\n updateLog: stateLog,\r\n update: newUpdate,\r\n });\r\n }\r\n if (latestInitialOptionsRef.current?.serverSync) {\r\n const serverStateStore = store.serverState[thisKey];\r\n const serverSync = latestInitialOptionsRef.current?.serverSync;\r\n setServerSyncActions(thisKey, {\r\n syncKey:\r\n typeof serverSync.syncKey == \"string\"\r\n ? serverSync.syncKey\r\n : serverSync.syncKey({ state: payload }),\r\n rollBackState: serverStateStore,\r\n actionTimeStamp: Date.now() + (serverSync.debounce ?? 3000),\r\n status: \"waiting\",\r\n });\r\n }\r\n\r\n return payload;\r\n });\r\n };\r\n if (!getGlobalStore.getState().updaterState[thisKey]) {\r\n setUpdaterState(\r\n thisKey,\r\n createProxyHandler(\r\n thisKey,\r\n effectiveSetState,\r\n componentIdRef.current,\r\n sessionId\r\n )\r\n );\r\n if (!getGlobalStore.getState().cogsStateStore[thisKey]) {\r\n setState(thisKey, stateObject);\r\n }\r\n if (!getGlobalStore.getState().initialStateGlobal[thisKey]) {\r\n updateInitialStateGlobal(thisKey, stateObject);\r\n }\r\n }\r\n\r\n const updaterFinal = useMemo(() => {\r\n // Create proxy with baseObject as target\r\n return createProxyHandler<TStateObject>(\r\n thisKey,\r\n effectiveSetState,\r\n componentIdRef.current,\r\n sessionId\r\n );\r\n }, [thisKey, sessionId]);\r\n\r\n return [getKeyState(thisKey), updaterFinal] as [\r\n TStateObject,\r\n StateObject<TStateObject>,\r\n ];\r\n}\r\n\r\nfunction createProxyHandler<T>(\r\n stateKey: string,\r\n effectiveSetState: EffectiveSetState<T>,\r\n componentId: string,\r\n sessionId?: string\r\n): StateObject<T> {\r\n // ADDED: Enhanced cache with versioning\r\n type CacheEntry = {\r\n proxy: any;\r\n stateVersion: number;\r\n };\r\n const shapeCache = new Map<string, CacheEntry>();\r\n let stateVersion = 0;\r\n\r\n // ADDED: Cache invalidation helper\r\n const invalidateCachePath = (path: string[]) => {\r\n const pathKey = path.join(\".\");\r\n for (const [key] of shapeCache) {\r\n if (key === pathKey || key.startsWith(pathKey + \".\")) {\r\n shapeCache.delete(key);\r\n }\r\n }\r\n stateVersion++;\r\n };\r\n\r\n const baseObj = {\r\n removeValidation: (obj?: { validationKey?: string }) => {\r\n if (obj?.validationKey) {\r\n removeValidationError(obj.validationKey);\r\n }\r\n },\r\n\r\n revertToInitialState: (obj?: { validationKey?: string }) => {\r\n const init = getGlobalStore\r\n .getState()\r\n .getInitialOptions(stateKey)?.validation;\r\n if (init?.key) {\r\n removeValidationError(init?.key);\r\n }\r\n\r\n if (obj?.validationKey) {\r\n removeValidationError(obj.validationKey);\r\n }\r\n\r\n const initialState =\r\n getGlobalStore.getState().initialStateGlobal[stateKey];\r\n\r\n getGlobalStore.getState().clearSelectedIndexesForState(stateKey);\r\n // ADDED: Clear cache on revert\r\n shapeCache.clear();\r\n stateVersion++;\r\n\r\n const newProxy = rebuildStateShape(initialState, []);\r\n const initalOptionsGet = getInitialOptions(stateKey as string);\r\n const localKey = isFunction(initalOptionsGet?.localStorage?.key)\r\n ? initalOptionsGet?.localStorage?.key(initialState)\r\n : initalOptionsGet?.localStorage?.key;\r\n\r\n const storageKey = `${sessionId}-${stateKey}-${localKey}`;\r\n\r\n if (storageKey) {\r\n localStorage.removeItem(storageKey);\r\n }\r\n\r\n setUpdaterState(stateKey, newProxy);\r\n setState(stateKey, initialState);\r\n const stateEntry = getGlobalStore\r\n .getState()\r\n .stateComponents.get(stateKey);\r\n if (stateEntry) {\r\n stateEntry.components.forEach((component) => {\r\n component.forceUpdate();\r\n });\r\n }\r\n\r\n return initialState;\r\n },\r\n updateInitialState: (newState: T) => {\r\n // ADDED: Clear cache on initial state update\r\n shapeCache.clear();\r\n stateVersion++;\r\n\r\n const newUpdaterState = createProxyHandler(\r\n stateKey,\r\n effectiveSetState,\r\n componentId,\r\n sessionId\r\n );\r\n const initialState =\r\n getGlobalStore.getState().initialStateGlobal[stateKey];\r\n const initalOptionsGet = getInitialOptions(stateKey as string);\r\n const localKey = isFunction(initalOptionsGet?.localStorage?.key)\r\n ? initalOptionsGet?.localStorage?.key(initialState)\r\n : initalOptionsGet?.localStorage?.key;\r\n\r\n const storageKey = `${sessionId}-${stateKey}-${localKey}`;\r\n\r\n if (localStorage.getItem(storageKey)) {\r\n localStorage.removeItem(storageKey);\r\n }\r\n startTransition(() => {\r\n updateInitialStateGlobal(stateKey, newState);\r\n getGlobalStore.getState().initializeShadowState(stateKey, newState);\r\n setUpdaterState(stateKey, newUpdaterState);\r\n setState(stateKey, newState);\r\n const stateEntry = getGlobalStore\r\n .getState()\r\n .stateComponents.get(stateKey);\r\n\r\n if (stateEntry) {\r\n stateEntry.components.forEach((component) => {\r\n component.forceUpdate();\r\n });\r\n }\r\n });\r\n\r\n return {\r\n fetchId: (field: keyof T) => newUpdaterState.get()[field],\r\n };\r\n },\r\n _initialState: getGlobalStore.getState().initialStateGlobal[stateKey],\r\n _serverState: getGlobalStore.getState().serverState[stateKey],\r\n _isLoading: getGlobalStore.getState().isLoadingGlobal[stateKey],\r\n _isServerSynced: () => {\r\n const serverState = getGlobalStore.getState().serverState[stateKey];\r\n return Boolean(\r\n serverState && isDeepEqual(serverState, getKeyState(stateKey))\r\n );\r\n },\r\n };\r\n\r\n function rebuildStateShape(\r\n currentState: T,\r\n path: string[] = [],\r\n meta?: { filtered?: string[][]; validIndices?: number[] }\r\n ): any {\r\n const cacheKey = path.map(String).join(\".\");\r\n\r\n // MODIFIED: Cache check with version\r\n const cachedEntry = shapeCache.get(cacheKey);\r\n\r\n type CallableStateObject<T> = {\r\n (): T;\r\n } & {\r\n [key: string]: any;\r\n };\r\n\r\n const baseFunction = function () {\r\n return getGlobalStore().getNestedState(stateKey, path);\r\n } as unknown as CallableStateObject<T>;\r\n\r\n // Copy properties from baseObj to the function with type assertion\r\n Object.keys(baseObj).forEach((key) => {\r\n (baseFunction as any)[key] = (baseObj as any)[key];\r\n });\r\n\r\n const handler = {\r\n apply(target: any, thisArg: any, args: any[]) {\r\n console.log(\r\n `PROXY APPLY TRAP HIT: stateKey=${stateKey}, path=${path.join(\".\")}`\r\n ); // <--- ADD LOGGING\r\n console.trace(\"Apply trap stack trace\");\r\n return getGlobalStore().getNestedState(stateKey, path);\r\n },\r\n\r\n get(target: any, prop: string) {\r\n if (meta?.validIndices && !Array.isArray(currentState)) {\r\n meta = { ...meta, validIndices: undefined };\r\n }\r\n const mutationMethods = new Set([\r\n \"insert\",\r\n \"cut\",\r\n \"cutByValue\",\r\n \"toggleByValue\",\r\n \"uniqueInsert\",\r\n \"update\",\r\n \"applyJsonPatch\",\r\n \"setSelected\",\r\n \"toggleSelected\",\r\n \"clearSelected\",\r\n \"sync\",\r\n \"validateZodSchema\",\r\n \"revertToInitialState\",\r\n \"updateInitialState\",\r\n \"removeValidation\",\r\n \"setValidation\",\r\n \"removeStorage\",\r\n \"middleware\",\r\n \"_componentId\",\r\n \"_stateKey\",\r\n \"getComponents\",\r\n ]);\r\n\r\n if (\r\n prop !== \"then\" &&\r\n !prop.startsWith(\"$\") &&\r\n prop !== \"stateMapNoRender\" &&\r\n !mutationMethods.has(prop)\r\n ) {\r\n const fullComponentId = `${stateKey}////${componentId}`;\r\n // console.log(\"adding path\", fullComponentId, path, prop);\r\n const stateEntry = getGlobalStore\r\n .getState()\r\n .stateComponents.get(stateKey);\r\n\r\n if (stateEntry) {\r\n const component = stateEntry.components.get(fullComponentId);\r\n\r\n if (component) {\r\n // Mark as initialized immediately to prevent re-processing\r\n\r\n // Now do the path tracking logic ONCE\r\n if (!component.paths.has(\"\")) {\r\n const currentPath = path.join(\".\");\r\n let needsAdd = true;\r\n for (const existingPath of component.paths) {\r\n if (\r\n currentPath.startsWith(existingPath) &&\r\n (currentPath === existingPath ||\r\n currentPath[existingPath.length] === \".\")\r\n ) {\r\n needsAdd = false;\r\n break;\r\n }\r\n }\r\n\r\n if (needsAdd) {\r\n component.paths.add(currentPath);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n if (prop === \"getDifferences\") {\r\n return () => {\r\n const differences = getDifferences(\r\n getGlobalStore.getState().cogsStateStore[stateKey],\r\n getGlobalStore.getState().initialStateGlobal[stateKey]\r\n );\r\n return differences;\r\n };\r\n }\r\n if (prop === \"sync\" && path.length === 0) {\r\n return async function () {\r\n // Get the options for this state key\r\n const options = getGlobalStore\r\n .getState()\r\n .getInitialOptions(stateKey);\r\n const sync = options?.sync;\r\n\r\n if (!sync) {\r\n console.error(`No mutation defined for state key \"${stateKey}\"`);\r\n return { success: false, error: `No mutation defined` };\r\n }\r\n\r\n // Get the root state\r\n const state = getGlobalStore\r\n .getState()\r\n .getNestedState(stateKey, []);\r\n\r\n // Get validation key\r\n const validationKey = options?.validation?.key;\r\n\r\n try {\r\n // Execute the mutation action\r\n const response = await sync.action(state);\r\n\r\n // Handle validation errors\r\n if (\r\n response &&\r\n !response.success &&\r\n response.errors &&\r\n validationKey\r\n ) {\r\n // Clear existing errors\r\n getGlobalStore.getState().removeValidationError(validationKey);\r\n\r\n // Add new validation errors\r\n response.errors.forEach((error) => {\r\n const errorPath = [validationKey, ...error.path].join(\".\");\r\n\r\n getGlobalStore\r\n .getState()\r\n .addValidationError(errorPath, error.message);\r\n });\r\n\r\n // Notify components to update\r\n const stateEntry = getGlobalStore\r\n .getState()\r\n .stateComponents.get(stateKey);\r\n if (stateEntry) {\r\n stateEntry.components.forEach((component) => {\r\n component.forceUpdate();\r\n });\r\n }\r\n }\r\n\r\n // Call success/error callbacks\r\n if (response?.success && sync.onSuccess) {\r\n sync.onSuccess(response.data);\r\n } else if (!response?.success && sync.onError) {\r\n sync.onError(response.error);\r\n }\r\n\r\n return response;\r\n } catch (error) {\r\n if (sync.onError) {\r\n sync.onError(error);\r\n }\r\n return { success: false, error };\r\n }\r\n };\r\n }\r\n if (prop === \"_status\") {\r\n // Get current state at this path (non-reactive version)\r\n const thisReactiveState = getGlobalStore\r\n .getState()\r\n .getNestedState(stateKey, path);\r\n\r\n // Get initial state at this path\r\n const initialState =\r\n getGlobalStore.getState().initialStateGlobal[stateKey];\r\n const initialStateAtPath = getNestedValue(initialState, path);\r\n\r\n // Simply compare current state with initial state\r\n if (isDeepEqual(thisReactiveState, initialStateAtPath)) {\r\n return \"fresh\"; // Matches initial state\r\n } else {\r\n return \"stale\"; // Different from initial state\r\n }\r\n }\r\n if (prop === \"getStatus\") {\r\n return function () {\r\n // Get current state at this path (reactive version)\r\n const thisReactiveState = getGlobalStore().getNestedState(\r\n stateKey,\r\n path\r\n );\r\n\r\n // Get initial state at this path\r\n const initialState =\r\n getGlobalStore.getState().initialStateGlobal[stateKey];\r\n const initialStateAtPath = getNestedValue(initialState, path);\r\n // Simply compare current state with initial state\r\n if (isDeepEqual(thisReactiveState, initialStateAtPath)) {\r\n return \"fresh\"; // Matches initial state\r\n } else {\r\n return \"stale\"; // Different from initial state\r\n }\r\n };\r\n }\r\n if (prop === \"removeStorage\") {\r\n return () => {\r\n const initialState =\r\n getGlobalStore.getState().initialStateGlobal[stateKey];\r\n const initalOptionsGet = getInitialOptions(stateKey as string);\r\n const localKey = isFunction(initalOptionsGet?.localStorage?.key)\r\n ? initalOptionsGet?.localStorage?.key(initialState)\r\n : initalOptionsGet?.localStorage?.key;\r\n\r\n const storageKey = `${sessionId}-${stateKey}-${localKey}`;\r\n\r\n if (storageKey) {\r\n localStorage.removeItem(storageKey);\r\n }\r\n };\r\n }\r\n if (prop === \"showValidationErrors\") {\r\n return () => {\r\n const init = getGlobalStore\r\n .getState()\r\n .getInitialOptions(stateKey)?.validation;\r\n\r\n if (!init?.key) {\r\n throw new Error(\"Validation key not found\");\r\n }\r\n const errors = getGlobalStore\r\n .getState()\r\n .getValidationErrors(init.key + \".\" + path.join(\".\"));\r\n\r\n return errors;\r\n };\r\n }\r\n if (Array.isArray(currentState)) {\r\n const getSourceArrayAndIndices = (): {\r\n item: any;\r\n originalIndex: number;\r\n }[] => {\r\n // If meta exists, we're in a chain. Use the currentState and map it to its original index.\r\n if (meta?.validIndices) {\r\n return (currentState as any[]).map((item, index) => ({\r\n item,\r\n originalIndex: meta!.validIndices![index]!,\r\n }));\r\n }\r\n // Otherwise, this is the first operation. Use the full array from the global store.\r\n const sourceArray = getGlobalStore\r\n .getState()\r\n .getNestedState(stateKey, path) as any[];\r\n return sourceArray.map((item, index) => ({\r\n item,\r\n originalIndex: index,\r\n }));\r\n };\r\n if (prop === \"getSelected\") {\r\n return () => {\r\n const selectedIndex = getGlobalStore\r\n .getState()\r\n .getSelectedIndex(stateKey, path.join(\".\"));\r\n if (selectedIndex === undefined) return undefined;\r\n return rebuildStateShape(\r\n currentState[selectedIndex],\r\n [...path, selectedIndex.toString()],\r\n meta\r\n );\r\n };\r\n }\r\n if (prop === \"clearSelected\") {\r\n return () => {\r\n getGlobalStore.getState().clearSelectedIndex({ stateKey, path });\r\n };\r\n }\r\n if (prop === \"getSelectedIndex\") {\r\n return () => {\r\n const selectedIndex = getGlobalStore\r\n .getState()\r\n .getSelectedIndex(stateKey, path.join(\".\"));\r\n\r\n return selectedIndex ?? -1;\r\n };\r\n }\r\n if (prop === \"useVirtualView\") {\r\n return (\r\n options: VirtualViewOptions\r\n ): VirtualStateObjectResult<any[]> => {\r\n const {\r\n itemHeight = 50,\r\n overscan = 6,\r\n stickToBottom = false,\r\n dependencies = [],\r\n } = options;\r\n\r\n // YOUR STATE MACHINE STATES\r\n type Status =\r\n | \"IDLE_AT_TOP\"\r\n | \"GETTING_HEIGHTS\"\r\n | \"SCROLLING_TO_BOTTOM\"\r\n | \"LOCKED_AT_BOTTOM\"\r\n | \"IDLE_NOT_AT_BOTTOM\";\r\n\r\n const shouldNotScroll = useRef(false);\r\n const containerRef = useRef<HTMLDivElement | null>(null);\r\n const [range, setRange] = useState({\r\n startIndex: 0,\r\n endIndex: 10,\r\n });\r\n const [status, setStatus] = useState<Status>(\"IDLE_AT_TOP\");\r\n const isProgrammaticScroll = useRef(false);\r\n const prevTotalCountRef = useRef(0);\r\n const prevDepsRef = useRef(dependencies);\r\n const lastUpdateAtScrollTop = useRef(0);\r\n const [shadowUpdateTrigger, setShadowUpdateTrigger] = useState(0);\r\n const scrollAnchorRef = useRef<{\r\n top: number;\r\n height: number;\r\n } | null>(null);\r\n useEffect(() => {\r\n const unsubscribe = getGlobalStore\r\n .getState()\r\n .subscribeToShadowState(stateKey, () => {\r\n setShadowUpdateTrigger((prev) => prev + 1);\r\n });\r\n return unsubscribe;\r\n }, [stateKey]);\r\n\r\n const sourceArray = getGlobalStore().getNestedState(\r\n stateKey,\r\n path\r\n ) as any[];\r\n const totalCount = sourceArray.length;\r\n\r\n const { totalHeight, positions } = useMemo(() => {\r\n const shadowArray =\r\n getGlobalStore.getState().getShadowMetadata(stateKey, path) ||\r\n [];\r\n let height = 0;\r\n const pos: number[] = [];\r\n for (let i = 0; i < totalCount; i++) {\r\n pos[i] = height;\r\n const measuredHeight =\r\n shadowArray[i]?.virtualizer?.itemHeight;\r\n height += measuredHeight || itemHeight;\r\n }\r\n return { totalHeight: height, positions: pos };\r\n }, [\r\n totalCount,\r\n stateKey,\r\n path.join(\".\"),\r\n itemHeight,\r\n shadowUpdateTrigger,\r\n ]);\r\n\r\n // THIS IS THE FULL, NON-PLACEHOLDER FUNCTION\r\n const virtualState = useMemo(() => {\r\n const start = Math.max(0, range.startIndex);\r\n const end = Math.min(totalCount, range.endIndex);\r\n const validIndices = Array.from(\r\n { length: end - start },\r\n (_, i) => start + i\r\n );\r\n const slicedArray = validIndices.map((idx) => sourceArray[idx]);\r\n return rebuildStateShape(slicedArray as any, path, {\r\n ...meta,\r\n validIndices,\r\n });\r\n }, [range.startIndex, range.endIndex, sourceArray, totalCount]);\r\n\r\n // --- 1. STATE CONTROLLER ---\r\n // --- 1. STATE CONTROLLER (CORRECTED) ---\r\n useLayoutEffect(() => {\r\n const container = containerRef.current;\r\n if (!container) return;\r\n\r\n const hasNewItems = totalCount > prevTotalCountRef.current;\r\n\r\n // THIS IS THE NEW, IMPORTANT LOGIC FOR ANCHORING\r\n if (hasNewItems && scrollAnchorRef.current) {\r\n const { top: prevScrollTop, height: prevScrollHeight } =\r\n scrollAnchorRef.current;\r\n\r\n // This is the key: Tell the app we are about to programmatically scroll.\r\n isProgrammaticScroll.current = true;\r\n\r\n // Restore the scroll position.\r\n container.scrollTop =\r\n prevScrollTop + (container.scrollHeight - prevScrollHeight);\r\n console.log(\r\n `ANCHOR RESTORED to scrollTop: ${container.scrollTop}`\r\n );\r\n\r\n // IMPORTANT: After the scroll, allow user scroll events again.\r\n // Use a timeout to ensure this runs after the scroll event has fired and been ignored.\r\n setTimeout(() => {\r\n isProgrammaticScroll.current = false;\r\n }, 100);\r\n\r\n scrollAnchorRef.current = null; // Clear the anchor after using it.\r\n }\r\n // YOUR ORIGINAL LOGIC CONTINUES UNCHANGED IN THE `ELSE` BLOCK\r\n else {\r\n const depsChanged = !isDeepEqual(\r\n dependencies,\r\n prevDepsRef.current\r\n );\r\n\r\n if (depsChanged) {\r\n console.log(\"TRANSITION: Deps changed -> IDLE_AT_TOP\");\r\n setStatus(\"IDLE_AT_TOP\");\r\n return;\r\n }\r\n\r\n if (\r\n hasNewItems &&\r\n status === \"LOCKED_AT_BOTTOM\" &&\r\n stickToBottom\r\n ) {\r\n console.log(\r\n \"TRANSITION: New items arrived while locked -> GETTING_HEIGHTS\"\r\n );\r\n setStatus(\"GETTING_HEIGHTS\");\r\n }\r\n }\r\n\r\n prevTotalCountRef.current = totalCount;\r\n prevDepsRef.current = dependencies;\r\n }, [totalCount, ...dependencies]);\r\n\r\n // --- 2. STATE ACTION HANDLER ---\r\n // This effect performs the ACTION for the current state.\r\n useLayoutEffect(() => {\r\n const container = containerRef.current;\r\n if (!container) return;\r\n\r\n let intervalId: NodeJS.Timeout | undefined;\r\n\r\n if (\r\n status === \"IDLE_AT_TOP\" &&\r\n stickToBottom &&\r\n totalCount > 0\r\n ) {\r\n // If we just loaded a new chat, start the process.\r\n console.log(\r\n \"ACTION (IDLE_AT_TOP): Data has arrived -> GETTING_HEIGHTS\"\r\n );\r\n setStatus(\"GETTING_HEIGHTS\");\r\n } else if (status === \"GETTING_HEIGHTS\") {\r\n console.log(\r\n \"ACTION (GETTING_HEIGHTS): Setting range to end and starting loop.\"\r\n );\r\n setRange({\r\n startIndex: Math.max(0, totalCount - 10 - overscan),\r\n endIndex: totalCount,\r\n });\r\n\r\n intervalId = setInterval(() => {\r\n const lastItemIndex = totalCount - 1;\r\n const shadowArray =\r\n getGlobalStore\r\n .getState()\r\n .getShadowMetadata(stateKey, path) || [];\r\n const lastItemHeight =\r\n shadowArray[lastItemIndex]?.virtualizer?.itemHeight || 0;\r\n console.log(\r\n \"ACTION (GETTING_HEIGHTS): lastItemHeight =\",\r\n lastItemHeight,\r\n \" index =\",\r\n lastItemIndex\r\n );\r\n if (lastItemHeight > 0) {\r\n clearInterval(intervalId);\r\n if (!shouldNotScroll.current) {\r\n console.log(\r\n \"ACTION (GETTING_HEIGHTS): Measurement success -> SCROLLING_TO_BOTTOM\"\r\n );\r\n\r\n setStatus(\"SCROLLING_TO_BOTTOM\");\r\n }\r\n }\r\n }, 100);\r\n } else if (status === \"SCROLLING_TO_BOTTOM\") {\r\n console.log(\r\n \"ACTION (SCROLLING_TO_BOTTOM): Executing scroll.\"\r\n );\r\n isProgrammaticScroll.current = true;\r\n // Use 'auto' for initial load, 'smooth' for new messages.\r\n const scrollBehavior =\r\n prevTotalCountRef.current === 0 ? \"auto\" : \"smooth\";\r\n\r\n container.scrollTo({\r\n top: container.scrollHeight,\r\n behavior: scrollBehavior,\r\n });\r\n\r\n const timeoutId = setTimeout(\r\n () => {\r\n console.log(\r\n \"ACTION (SCROLLING_TO_BOTTOM): Scroll finished -> LOCKED_AT_BOTTOM\"\r\n );\r\n isProgrammaticScroll.current = false;\r\n shouldNotScroll.current = false;\r\n setStatus(\"LOCKED_AT_BOTTOM\");\r\n },\r\n scrollBehavior === \"smooth\" ? 500 : 50\r\n );\r\n\r\n return () => clearTimeout(timeoutId);\r\n }\r\n\r\n return () => {\r\n if (intervalId) clearInterval(intervalId);\r\n };\r\n }, [status, totalCount, positions]);\r\n\r\n useEffect(() => {\r\n const container = containerRef.current;\r\n if (!container) return;\r\n\r\n const scrollThreshold = itemHeight;\r\n\r\n const handleUserScroll = () => {\r\n // This guard is now critical. It will ignore our anchor restoration scroll.\r\n if (isProgrammaticScroll.current) {\r\n return;\r\n }\r\n\r\n const { scrollTop, scrollHeight, clientHeight } = container;\r\n\r\n // Part 1: Handle Status and Anchoring\r\n const isAtBottom =\r\n scrollHeight - scrollTop - clientHeight < 10;\r\n\r\n if (isAtBottom) {\r\n if (status !== \"LOCKED_AT_BOTTOM\") {\r\n setStatus(\"LOCKED_AT_BOTTOM\");\r\n }\r\n // If we are at the bottom, there is no anchor needed.\r\n scrollAnchorRef.current = null;\r\n } else {\r\n if (status !== \"IDLE_NOT_AT_BOTTOM\") {\r\n setStatus(\"IDLE_NOT_AT_BOTTOM\");\r\n }\r\n // User is scrolled up. Continuously update the anchor with their latest position.\r\n scrollAnchorRef.current = {\r\n top: scrollTop,\r\n height: scrollHeight,\r\n };\r\n }\r\n\r\n // Part 2: YOUR original, working logic for updating the visible range.\r\n if (\r\n Math.abs(scrollTop - lastUpdateAtScrollTop.current) <\r\n scrollThreshold\r\n ) {\r\n return;\r\n }\r\n\r\n console.log(\r\n `Threshold passed at ${scrollTop}px. Recalculating range...`\r\n );\r\n\r\n // ... your logic to find startIndex and endIndex ...\r\n let high = totalCount - 1;\r\n let low = 0;\r\n let topItemIndex = 0;\r\n while (low <= high) {\r\n const mid = Math.floor((low + high) / 2);\r\n if (positions[mid]! < scrollTop) {\r\n topItemIndex = mid;\r\n low = mid + 1;\r\n } else {\r\n high = mid - 1;\r\n }\r\n }\r\n\r\n const startIndex = Math.max(0, topItemIndex - overscan);\r\n let endIndex = startIndex;\r\n const visibleEnd = scrollTop + clientHeight;\r\n while (\r\n endIndex < totalCount &&\r\n positions[endIndex]! < visibleEnd\r\n ) {\r\n endIndex++;\r\n }\r\n\r\n setRange({\r\n startIndex,\r\n endIndex: Math.min(totalCount, endIndex + overscan),\r\n });\r\n\r\n lastUpdateAtScrollTop.current = scrollTop;\r\n };\r\n\r\n container.addEventListener(\"scroll\", handleUserScroll, {\r\n passive: true,\r\n });\r\n return () =>\r\n container.removeEventListener(\"scroll\", handleUserScroll);\r\n }, [totalCount, positions, itemHeight, overscan, status]);\r\n\r\n const scrollToBottom = useCallback(() => {\r\n console.log(\r\n \"USER ACTION: Clicked scroll button -> SCROLLING_TO_BOTTOM\"\r\n );\r\n setStatus(\"SCROLLING_TO_BOTTOM\");\r\n }, []);\r\n\r\n const scrollToIndex = useCallback(\r\n (index: number, behavior: ScrollBehavior = \"smooth\") => {\r\n if (containerRef.current && positions[index] !== undefined) {\r\n setStatus(\"IDLE_NOT_AT_BOTTOM\");\r\n containerRef.current.scrollTo({\r\n top: positions[index],\r\n behavior,\r\n });\r\n }\r\n },\r\n [positions]\r\n );\r\n\r\n const virtualizerProps = {\r\n outer: {\r\n ref: containerRef,\r\n style: { overflowY: \"auto\" as const, height: \"100%\" },\r\n },\r\n inner: {\r\n style: {\r\n height: `${totalHeight}px`,\r\n position: \"relative\" as const,\r\n },\r\n },\r\n list: {\r\n style: {\r\n transform: `translateY(${positions[range.startIndex] || 0}px)`,\r\n },\r\n },\r\n };\r\n\r\n return {\r\n virtualState,\r\n virtualizerProps,\r\n scrollToBottom,\r\n scrollToIndex,\r\n };\r\n };\r\n }\r\n if (prop === \"stateSort\") {\r\n return (\r\n compareFn: (\r\n a: InferArrayElement<T>,\r\n b: InferArrayElement<T>\r\n ) => number\r\n ) => {\r\n const sourceWithIndices = getSourceArrayAndIndices();\r\n const sortedResult = [...sourceWithIndices].sort((a, b) =>\r\n compareFn(a.item, b.item)\r\n );\r\n const newCurrentState = sortedResult.map(({ item }) => item);\r\n // We construct the meta object with the CORRECT property name: `validIndices`.\r\n const newMeta = {\r\n ...meta,\r\n validIndices: sortedResult.map(\r\n ({ originalIndex }) => originalIndex\r\n ),\r\n };\r\n return rebuildStateShape(newCurrentState as any, path, newMeta);\r\n };\r\n }\r\n\r\n if (prop === \"stateFilter\") {\r\n return (\r\n callbackfn: (\r\n value: InferArrayElement<T>,\r\n index: number\r\n ) => boolean\r\n ) => {\r\n const sourceWithIndices = getSourceArrayAndIndices();\r\n const filteredResult = sourceWithIndices.filter(\r\n ({ item }, index) => callbackfn(item, index)\r\n );\r\n const newCurrentState = filteredResult.map(({ item }) => item);\r\n // We construct the meta object with the CORRECT property name: `validIndices`.\r\n const newMeta = {\r\n ...meta,\r\n validIndices: filteredResult.map(\r\n ({ originalIndex }) => originalIndex\r\n ),\r\n };\r\n return rebuildStateShape(newCurrentState as any, path, newMeta);\r\n };\r\n }\r\n\r\n if (prop === \"stateMap\") {\r\n return (\r\n callbackfn: (\r\n value: InferArrayElement<T>,\r\n setter: StateObject<InferArrayElement<T>>,\r\n info: {\r\n register: () => void;\r\n index: number;\r\n originalIndex: number;\r\n }\r\n ) => any\r\n ) => {\r\n const arrayToMap = getGlobalStore\r\n .getState()\r\n .getNestedState(stateKey, path) as any[];\r\n\r\n // Defensive check to make sure we are mapping over an array\r\n if (!Array.isArray(arrayToMap)) {\r\n console.warn(\r\n `stateMap called on a non-array value at path: ${path.join(\".\")}. The current value is:`,\r\n arrayToMap\r\n );\r\n return null;\r\n }\r\n\r\n // If we have validIndices, only map those items\r\n const indicesToMap =\r\n meta?.validIndices ||\r\n Array.from({ length: arrayToMap.length }, (_, i) => i);\r\n\r\n return indicesToMap.map((originalIndex, localIndex) => {\r\n const item = arrayToMap[originalIndex];\r\n const finalPath = [...path, originalIndex.toString()];\r\n const setter = rebuildStateShape(item, finalPath, meta);\r\n\r\n // Create the register function right here. It closes over the necessary variables.\r\n const register = () => {\r\n const [, forceUpdate] = useState({});\r\n const itemComponentId = `${componentId}-${path.join(\".\")}-${originalIndex}`;\r\n\r\n useLayoutEffect(() => {\r\n const fullComponentId = `${stateKey}////${itemComponentId}`;\r\n const stateEntry = getGlobalStore\r\n .getState()\r\n .stateComponents.get(stateKey) || {\r\n components: new Map(),\r\n };\r\n\r\n stateEntry.components.set(fullComponentId, {\r\n forceUpdate: () => forceUpdate({}),\r\n paths: new Set([finalPath.join(\".\")]),\r\n });\r\n\r\n getGlobalStore\r\n .getState()\r\n .stateComponents.set(stateKey, stateEntry);\r\n\r\n return () => {\r\n const currentEntry = getGlobalStore\r\n .getState()\r\n .stateComponents.get(stateKey);\r\n if (currentEntry) {\r\n currentEntry.components.delete(fullComponentId);\r\n }\r\n };\r\n }, [stateKey, itemComponentId]);\r\n };\r\n\r\n return callbackfn(item, setter, {\r\n register,\r\n index: localIndex,\r\n originalIndex,\r\n });\r\n });\r\n };\r\n }\r\n if (prop === \"stateMapNoRender\") {\r\n return (\r\n callbackfn: (\r\n value: InferArrayElement<T>,\r\n setter: StateObject<InferArrayElement<T>>,\r\n index: number,\r\n array: T,\r\n arraySetter: StateObject<T>\r\n ) => any\r\n ) => {\r\n const arrayToMap = currentState as any[];\r\n return arrayToMap.map((item, index) => {\r\n let originalIndex: number;\r\n // We READ from the meta object using the CORRECT property name: `validIndices`.\r\n if (\r\n meta?.validIndices &&\r\n meta.validIndices[index] !== undefined\r\n ) {\r\n originalIndex = meta.validIndices[index]!;\r\n } else {\r\n originalIndex = index;\r\n }\r\n const finalPath = [...path, originalIndex.toString()];\r\n\r\n const setter = rebuildStateShape(item, finalPath, meta); // Pass meta through\r\n return callbackfn(\r\n item,\r\n setter,\r\n index,\r\n currentState as any,\r\n rebuildStateShape(currentState as any, path, meta)\r\n );\r\n });\r\n };\r\n }\r\n if (prop === \"$stateMap\") {\r\n return (\r\n callbackfn: (\r\n value: InferArrayElement<T>,\r\n setter: StateObject<InferArrayElement<T>>,\r\n index: number,\r\n array: T,\r\n arraySetter: StateObject<T>\r\n ) => void\r\n ) => {\r\n return createElement(SignalMapRenderer, {\r\n proxy: {\r\n _stateKey: stateKey,\r\n _path: path,\r\n _mapFn: callbackfn as any, // Pass the actual function, not string\r\n },\r\n\r\n rebuildStateShape,\r\n });\r\n };\r\n }\r\n if (prop === \"stateList\") {\r\n return (\r\n callbackfn: (\r\n value: InferArrayElement<T>,\r\n setter: StateObject<InferArrayElement<T>>,\r\n index: { localIndex: number; originalIndex: number },\r\n array: T,\r\n arraySetter: StateObject<T>\r\n ) => any\r\n ) => {\r\n const arrayToMap = getGlobalStore\r\n .getState()\r\n .getNestedState(stateKey, path) as any[];\r\n\r\n if (!Array.isArray(arrayToMap)) {\r\n console.warn(\r\n `stateList called on a non-array value at path: ${path.join(\".\")}.`\r\n );\r\n return null;\r\n }\r\n\r\n const indicesToMap =\r\n meta?.validIndices ||\r\n Array.from({ length: arrayToMap.length }, (_, i) => i);\r\n\r\n return indicesToMap.map((originalIndex, localIndex) => {\r\n const item = arrayToMap[originalIndex];\r\n const finalPath = [...path, originalIndex.toString()];\r\n const setter = rebuildStateShape(item, finalPath, meta);\r\n const itemComponentId = `${componentId}-${path.join(\".\")}-${originalIndex}`;\r\n\r\n return createElement(CogsItemWrapper, {\r\n key: originalIndex,\r\n stateKey,\r\n itemComponentId,\r\n itemPath: finalPath,\r\n children: callbackfn(\r\n item,\r\n setter,\r\n { localIndex, originalIndex },\r\n arrayToMap as any,\r\n rebuildStateShape(arrayToMap as any, path, meta)\r\n ),\r\n });\r\n });\r\n };\r\n }\r\n if (prop === \"stateFlattenOn\") {\r\n return (fieldName: string) => {\r\n const arrayToMap = currentState as any[];\r\n shapeCache.clear();\r\n stateVersion++;\r\n const flattenedResults = arrayToMap.flatMap(\r\n (val: any) => val[fieldName] ?? []\r\n );\r\n return rebuildStateShape(\r\n flattenedResults as any,\r\n [...path, \"[*]\", fieldName],\r\n meta\r\n );\r\n };\r\n }\r\n\r\n if (prop === \"index\") {\r\n return (index: number) => {\r\n const indexValue = currentState[index];\r\n return rebuildStateShape(indexValue, [...path, index.toString()]);\r\n };\r\n }\r\n if (prop === \"last\") {\r\n // Added handler for 'last'\r\n return () => {\r\n const currentArray = getGlobalStore\r\n .getState()\r\n .getNestedState(stateKey, path) as any[];\r\n if (currentArray.length === 0) return undefined;\r\n const lastIndex = currentArray.length - 1;\r\n const lastValue = currentArray[lastIndex];\r\n const newPath = [...path, lastIndex.toString()];\r\n // shapeCache.clear(); // Decide if you need cache invalidation for 'last' access\r\n // stateVersion++;\r\n return rebuildStateShape(lastValue, newPath);\r\n };\r\n }\r\n if (prop === \"insert\") {\r\n return (payload: UpdateArg<T>) => {\r\n // ADDED: Invalidate cache on insert\r\n invalidateCachePath(path);\r\n pushFunc(effectiveSetState, payload, path, stateKey);\r\n return rebuildStateShape(\r\n getGlobalStore.getState().getNestedState(stateKey, path),\r\n path\r\n );\r\n };\r\n }\r\n\r\n if (prop === \"uniqueInsert\") {\r\n return (\r\n payload: UpdateArg<T>,\r\n fields?: (keyof InferArrayElement<T>)[],\r\n onMatch?: (existingItem: any) => any\r\n ) => {\r\n const currentArray = getGlobalStore\r\n .getState()\r\n .getNestedState(stateKey, path) as any[];\r\n const newValue = isFunction<T>(payload)\r\n ? payload(currentArray as any)\r\n : (payload as any);\r\n\r\n let matchedItem: any = null;\r\n const isUnique = !currentArray.some((item) => {\r\n if (fields) {\r\n const isMatch = fields.every((field) =>\r\n isDeepEqual(item[field], newValue[field])\r\n );\r\n if (isMatch) {\r\n matchedItem = item;\r\n }\r\n return isMatch;\r\n }\r\n const isMatch = isDeepEqual(item, newValue);\r\n if (isMatch) {\r\n matchedItem = item;\r\n }\r\n return isMatch;\r\n });\r\n\r\n if (isUnique) {\r\n invalidateCachePath(path);\r\n pushFunc(effectiveSetState, newValue, path, stateKey);\r\n } else if (onMatch && matchedItem) {\r\n const updatedItem = onMatch(matchedItem);\r\n const updatedArray = currentArray.map((item) =>\r\n isDeepEqual(item, matchedItem) ? updatedItem : item\r\n );\r\n invalidateCachePath(path);\r\n updateFn(effectiveSetState, updatedArray as any, path);\r\n }\r\n };\r\n }\r\n\r\n if (prop === \"cut\") {\r\n return (index: number, options?: { waitForSync?: boolean }) => {\r\n if (options?.waitForSync) return;\r\n // ADDED: Invalidate cache on cut\r\n invalidateCachePath(path);\r\n cutFunc(effectiveSetState, path, stateKey, index);\r\n return rebuildStateShape(\r\n getGlobalStore.getState().getNestedState(stateKey, path),\r\n path\r\n );\r\n };\r\n }\r\n if (prop === \"cutByValue\") {\r\n return (value: string | number | boolean) => {\r\n for (let index = 0; index < currentState.length; index++) {\r\n if (currentState[index] === value) {\r\n cutFunc(effectiveSetState, path, stateKey, index);\r\n }\r\n }\r\n };\r\n }\r\n if (prop === \"toggleByValue\") {\r\n return (value: string | number | boolean) => {\r\n const index = currentState.findIndex((item) => item === value);\r\n if (index > -1) {\r\n // Value exists, so cut it\r\n cutFunc(effectiveSetState, path, stateKey, index);\r\n } else {\r\n // Value doesn't exist, so insert it\r\n pushFunc(effectiveSetState, value as any, path, stateKey);\r\n }\r\n };\r\n }\r\n if (prop === \"stateFind\") {\r\n return (\r\n callbackfn: (\r\n value: InferArrayElement<T>,\r\n index: number\r\n ) => boolean\r\n ) => {\r\n const sourceWithIndices = getSourceArrayAndIndices();\r\n const found = sourceWithIndices.find(({ item }, index) =>\r\n callbackfn(item, index)\r\n );\r\n if (!found) return undefined;\r\n const finalPath = [...path, found.originalIndex.toString()];\r\n return rebuildStateShape(found.item, finalPath, meta);\r\n };\r\n }\r\n\r\n if (prop === \"findWith\") {\r\n return (thisKey: keyof InferArrayElement<T>, thisValue: any) => {\r\n const sourceWithIndices = getSourceArrayAndIndices();\r\n const found = sourceWithIndices.find(\r\n ({ item }) => item[thisKey] === thisValue\r\n );\r\n if (!found) return undefined;\r\n const finalPath = [...path, found.originalIndex.toString()];\r\n return rebuildStateShape(found.item, finalPath, meta);\r\n };\r\n }\r\n }\r\n const lastPathElement = path[path.length - 1];\r\n if (!isNaN(Number(lastPathElement))) {\r\n const parentPath = path.slice(0, -1);\r\n const parentValue = getGlobalStore\r\n .getState()\r\n .getNestedState(stateKey, parentPath);\r\n\r\n if (Array.isArray(parentValue) && prop === \"cut\") {\r\n return () =>\r\n cutFunc(\r\n effectiveSetState,\r\n parentPath,\r\n stateKey,\r\n Number(lastPathElement)\r\n );\r\n }\r\n }\r\n\r\n if (prop === \"get\") {\r\n return () => {\r\n if (meta?.validIndices && Array.isArray(currentState)) {\r\n // For filtered arrays, return only the items at validIndices\r\n const fullArray = getGlobalStore\r\n .getState()\r\n .getNestedState(stateKey, path) as any[];\r\n return meta.validIndices.map((index) => fullArray[index]);\r\n }\r\n return getGlobalStore.getState().getNestedState(stateKey, path);\r\n };\r\n }\r\n if (prop === \"$derive\") {\r\n return (fn: any) =>\r\n $cogsSignal({\r\n _stateKey: stateKey,\r\n _path: path,\r\n _effect: fn.toString(),\r\n });\r\n }\r\n\r\n if (prop === \"$get\") {\r\n return () =>\r\n $cogsSignal({\r\n _stateKey: stateKey,\r\n _path: path,\r\n });\r\n }\r\n if (prop === \"lastSynced\") {\r\n const syncKey = `${stateKey}:${path.join(\".\")}`;\r\n return getGlobalStore.getState().getSyncInfo(syncKey);\r\n }\r\n\r\n if (prop == \"getLocalStorage\") {\r\n return (key: string) =>\r\n loadFromLocalStorage(sessionId + \"-\" + stateKey + \"-\" + key);\r\n }\r\n if (prop === \"_selected\") {\r\n const parentPath = path.slice(0, -1);\r\n const parentKey = parentPath.join(\".\");\r\n const parent = getGlobalStore\r\n .getState()\r\n .getNestedState(stateKey, parentPath);\r\n if (Array.isArray(parent)) {\r\n const currentIndex = Number(path[path.length - 1]);\r\n return (\r\n currentIndex ===\r\n getGlobalStore.getState().getSelectedIndex(stateKey, parentKey)\r\n );\r\n }\r\n return undefined;\r\n }\r\n if (prop === \"setSelected\") {\r\n return (value: boolean) => {\r\n const parentPath = path.slice(0, -1);\r\n const thisIndex = Number(path[path.length - 1]);\r\n const parentKey = parentPath.join(\".\");\r\n\r\n if (value) {\r\n getGlobalStore\r\n .getState()\r\n .setSelectedIndex(stateKey, parentKey, thisIndex);\r\n } else {\r\n getGlobalStore\r\n .getState()\r\n .setSelectedIndex(stateKey, parentKey, undefined);\r\n }\r\n\r\n const nested = getGlobalStore\r\n .getState()\r\n .getNestedState(stateKey, [...parentPath]);\r\n updateFn(effectiveSetState, nested, parentPath);\r\n\r\n // Invalidate cache for this path\r\n invalidateCachePath(parentPath);\r\n };\r\n }\r\n if (prop === \"toggleSelected\") {\r\n return () => {\r\n const parentPath = path.slice(0, -1);\r\n const thisIndex = Number(path[path.length - 1]);\r\n const parentKey = parentPath.join(\".\");\r\n const selectedIndex = getGlobalStore\r\n .getState()\r\n .getSelectedIndex(stateKey, parentKey);\r\n\r\n getGlobalStore\r\n .getState()\r\n .setSelectedIndex(\r\n stateKey,\r\n parentKey,\r\n selectedIndex === thisIndex ? undefined : thisIndex\r\n );\r\n const nested = getGlobalStore\r\n .getState()\r\n .getNestedState(stateKey, [...parentPath]);\r\n updateFn(effectiveSetState, nested, parentPath);\r\n\r\n invalidateCachePath(parentPath);\r\n };\r\n }\r\n if (path.length == 0) {\r\n if (prop === \"addValidation\") {\r\n return (errors: ValidationError[]) => {\r\n const init = getGlobalStore\r\n .getState()\r\n .getInitialOptions(stateKey)?.validation;\r\n\r\n if (!init?.key) {\r\n throw new Error(\"Validation key not found\");\r\n }\r\n\r\n // Clear existing errors for this validation key\r\n removeValidationError(init.key);\r\n console.log(\"addValidationError\", errors);\r\n // Add each new error\r\n errors.forEach((error) => {\r\n const fullErrorPath = [init.key, ...error.path].join(\".\");\r\n console.log(\"fullErrorPath\", fullErrorPath);\r\n addValidationError(fullErrorPath, error.message);\r\n });\r\n\r\n // Notify components to update\r\n notifyComponents(stateKey);\r\n };\r\n }\r\n if (prop === \"applyJsonPatch\") {\r\n return (patches: any[]) => {\r\n // This part is correct.\r\n const currentState =\r\n getGlobalStore.getState().cogsStateStore[stateKey];\r\n const patchResult = applyPatch(currentState, patches);\r\n const newState = patchResult.newDocument;\r\n\r\n // This is also correct.\r\n updateGlobalState(\r\n stateKey,\r\n getGlobalStore.getState().initialStateGlobal[stateKey],\r\n newState,\r\n effectiveSetState,\r\n componentId,\r\n sessionId\r\n );\r\n\r\n const stateEntry = getGlobalStore\r\n .getState()\r\n .stateComponents.get(stateKey); // Use stateKey here\r\n\r\n if (stateEntry) {\r\n // Use `getDifferences` between the state before and after the patch.\r\n const changedPaths = getDifferences(currentState, newState);\r\n const changedPathsSet = new Set(changedPaths);\r\n\r\n // There is no single `primaryPathToCheck` for a patch, so we just check against the full set.\r\n\r\n for (const [\r\n componentKey,\r\n component,\r\n ] of stateEntry.components.entries()) {\r\n let shouldUpdate = false;\r\n const reactiveTypes = Array.isArray(component.reactiveType)\r\n ? component.reactiveType\r\n : [component.reactiveType || \"component\"];\r\n\r\n if (reactiveTypes.includes(\"none\")) continue;\r\n if (reactiveTypes.includes(\"all\")) {\r\n component.forceUpdate();\r\n continue;\r\n }\r\n\r\n if (reactiveTypes.includes(\"component\")) {\r\n // This is the core logic that needs to be copied.\r\n // Check if any of the component's watched paths are in the set of changed paths.\r\n if (component.paths.has(\"\")) {\r\n // Always update for root listeners\r\n shouldUpdate = true;\r\n }\r\n\r\n if (!shouldUpdate) {\r\n for (const changedPath of changedPathsSet) {\r\n // Direct match first (fastest)\r\n if (component.paths.has(changedPath)) {\r\n shouldUpdate = true;\r\n break;\r\n }\r\n\r\n // Check parent paths more efficiently\r\n let dotIndex = changedPath.lastIndexOf(\".\");\r\n while (dotIndex !== -1) {\r\n const parentPath = changedPath.substring(0, dotIndex);\r\n if (component.paths.has(parentPath)) {\r\n shouldUpdate = true;\r\n break;\r\n }\r\n // Skip numeric segments more efficiently\r\n const lastSegment = changedPath.substring(\r\n dotIndex + 1\r\n );\r\n if (!isNaN(Number(lastSegment))) {\r\n // For array indices, check the parent collection path\r\n const parentDotIndex = parentPath.lastIndexOf(\".\");\r\n if (parentDotIndex !== -1) {\r\n const grandParentPath = parentPath.substring(\r\n 0,\r\n parentDotIndex\r\n );\r\n if (component.paths.has(grandParentPath)) {\r\n shouldUpdate = true;\r\n break;\r\n }\r\n }\r\n }\r\n dotIndex = parentPath.lastIndexOf(\".\");\r\n }\r\n\r\n if (shouldUpdate) break;\r\n }\r\n }\r\n }\r\n\r\n if (!shouldUpdate && reactiveTypes.includes(\"deps\")) {\r\n // Use `newState` (the result of the patch) for dependency checks.\r\n if (component.depsFunction) {\r\n const depsResult = component.depsFunction(newState);\r\n let depsChanged = false;\r\n if (typeof depsResult === \"boolean\") {\r\n if (depsResult) depsChanged = true;\r\n } else if (!isDeepEqual(component.deps, depsResult)) {\r\n component.deps = depsResult;\r\n depsChanged = true;\r\n }\r\n if (depsChanged) {\r\n shouldUpdate = true;\r\n }\r\n }\r\n }\r\n\r\n if (shouldUpdate) {\r\n component.forceUpdate();\r\n }\r\n }\r\n }\r\n };\r\n }\r\n if (prop === \"validateZodSchema\") {\r\n return () => {\r\n const init = getGlobalStore\r\n .getState()\r\n .getInitialOptions(stateKey)?.validation;\r\n const addValidationError =\r\n getGlobalStore.getState().addValidationError;\r\n\r\n if (!init?.zodSchema) {\r\n throw new Error(\"Zod schema not found\");\r\n }\r\n\r\n if (!init?.key) {\r\n throw new Error(\"Validation key not found\");\r\n }\r\n removeValidationError(init.key);\r\n const thisObject =\r\n getGlobalStore.getState().cogsStateStore[stateKey];\r\n\r\n try {\r\n // First clear any existing validation errors for this schema\r\n // This ensures we don't have stale errors\r\n const existingErrors = getGlobalStore\r\n .getState()\r\n .getValidationErrors(init.key);\r\n if (existingErrors && existingErrors.length > 0) {\r\n existingErrors.forEach(([errorPath]) => {\r\n if (errorPath && errorPath.startsWith(init.key!)) {\r\n removeValidationError(errorPath);\r\n }\r\n });\r\n }\r\n\r\n // Attempt to validate with Zod\r\n const result = init.zodSchema.safeParse(thisObject);\r\n\r\n if (!result.success) {\r\n // Process Zod errors and add them to the validation store\r\n const zodErrors = result.error.errors;\r\n\r\n zodErrors.forEach((error) => {\r\n const errorPath = error.path;\r\n const errorMessage = error.message;\r\n\r\n // Build the full path for the validation error\r\n // Format: validationKey.path.to.field\r\n const fullErrorPath = [init.key, ...errorPath].join(\".\");\r\n\r\n // Add the error to the store\r\n addValidationError(fullErrorPath, errorMessage);\r\n });\r\n\r\n notifyComponents(stateKey);\r\n\r\n return false;\r\n }\r\n\r\n return true;\r\n } catch (error) {\r\n console.error(\"Zod schema validation failed\", error);\r\n return false;\r\n }\r\n };\r\n }\r\n if (prop === \"_componentId\") return componentId;\r\n if (prop === \"getComponents\") {\r\n return () => getGlobalStore().stateComponents.get(stateKey);\r\n }\r\n if (prop === \"getAllFormRefs\") {\r\n return () => {\r\n return formRefStore.getState().getFormRefsByStateKey(stateKey);\r\n };\r\n }\r\n\r\n if (prop === \"_initialState\")\r\n return getGlobalStore.getState().initialStateGlobal[stateKey];\r\n if (prop === \"_serverState\")\r\n return getGlobalStore.getState().serverState[stateKey];\r\n if (prop === \"_isLoading\")\r\n return getGlobalStore.getState().isLoadingGlobal[stateKey];\r\n if (prop === \"revertToInitialState\")\r\n return baseObj.revertToInitialState;\r\n if (prop === \"updateInitialState\") return baseObj.updateInitialState;\r\n if (prop === \"removeValidation\") return baseObj.removeValidation;\r\n }\r\n if (prop === \"getFormRef\") {\r\n return () => {\r\n return formRefStore\r\n .getState()\r\n .getFormRef(stateKey + \".\" + path.join(\".\"));\r\n };\r\n }\r\n\r\n if (prop === \"validationWrapper\") {\r\n return ({\r\n children,\r\n hideMessage,\r\n }: {\r\n children: React.ReactNode;\r\n hideMessage?: boolean;\r\n }) => (\r\n <ValidationWrapper\r\n formOpts={\r\n hideMessage ? { validation: { message: \"\" } } : undefined\r\n }\r\n path={path}\r\n validationKey={\r\n getGlobalStore.getState().getInitialOptions(stateKey)\r\n ?.validation?.key || \"\"\r\n }\r\n stateKey={stateKey}\r\n validIndices={meta?.validIndices}\r\n >\r\n {children}\r\n </ValidationWrapper>\r\n );\r\n }\r\n\r\n if (prop === \"_stateKey\") return stateKey;\r\n if (prop === \"_path\") return path;\r\n if (prop === \"_isServerSynced\") return baseObj._isServerSynced;\r\n\r\n if (prop === \"update\") {\r\n return (payload: UpdateArg<T>, opts?: UpdateOpts<T>) => {\r\n // ADDED: Invalidate cache on update\r\n if (opts?.debounce) {\r\n debounce(() => {\r\n updateFn(effectiveSetState, payload, path, \"\");\r\n const newValue = getGlobalStore\r\n .getState()\r\n .getNestedState(stateKey, path);\r\n if (opts?.afterUpdate) opts.afterUpdate(newValue);\r\n }, opts.debounce);\r\n } else {\r\n updateFn(effectiveSetState, payload, path, \"\");\r\n const newValue = getGlobalStore\r\n .getState()\r\n .getNestedState(stateKey, path);\r\n if (opts?.afterUpdate) opts.afterUpdate(newValue);\r\n }\r\n invalidateCachePath(path);\r\n };\r\n }\r\n\r\n if (prop === \"formElement\") {\r\n return (child: FormControl<T>, formOpts?: FormOptsType) => {\r\n return (\r\n <FormControlComponent<T>\r\n setState={effectiveSetState}\r\n stateKey={stateKey}\r\n path={path}\r\n child={child}\r\n formOpts={formOpts}\r\n />\r\n );\r\n };\r\n }\r\n\r\n const nextPath = [...path, prop];\r\n const nextValue = getGlobalStore\r\n .getState()\r\n .getNestedState(stateKey, nextPath);\r\n return rebuildStateShape(nextValue, nextPath, meta);\r\n },\r\n };\r\n\r\n const proxyInstance = new Proxy(baseFunction, handler);\r\n\r\n shapeCache.set(cacheKey, {\r\n proxy: proxyInstance,\r\n stateVersion: stateVersion,\r\n });\r\n\r\n return proxyInstance;\r\n }\r\n\r\n return rebuildStateShape(\r\n getGlobalStore.getState().getNestedState(stateKey, [])\r\n );\r\n}\r\n\r\nexport function $cogsSignal(proxy: {\r\n _path: string[];\r\n _stateKey: string;\r\n _effect?: string;\r\n}) {\r\n return createElement(SignalRenderer, { proxy });\r\n}\r\n\r\nfunction SignalMapRenderer({\r\n proxy,\r\n\r\n rebuildStateShape,\r\n}: {\r\n proxy: {\r\n _stateKey: string;\r\n _path: string[];\r\n _mapFn: (\r\n value: any,\r\n setter: any,\r\n index: number,\r\n array: any[],\r\n arraySetter: any\r\n ) => ReactNode;\r\n };\r\n\r\n rebuildStateShape: (\r\n currentState: any,\r\n path: string[],\r\n meta?: { filtered?: string[][]; validIndices?: number[] }\r\n ) => any;\r\n}) {\r\n const value = getGlobalStore().getNestedState(proxy._stateKey, proxy._path);\r\n\r\n if (!Array.isArray(value)) {\r\n return null;\r\n }\r\n const arraySetter = rebuildStateShape(\r\n value,\r\n proxy._path\r\n ) as ArrayEndType<any>;\r\n // Use existing global state management\r\n return arraySetter.stateMapNoRender(\r\n (item, setter, index, value, arraysetter) => {\r\n // Execute map function in React context with existing state/proxies\r\n return proxy._mapFn(item, setter, index, value, arraysetter);\r\n }\r\n );\r\n}\r\nfunction SignalRenderer({\r\n proxy,\r\n}: {\r\n proxy: {\r\n _path: string[];\r\n _stateKey: string;\r\n _effect?: string;\r\n };\r\n}) {\r\n const elementRef = useRef<HTMLSpanElement>(null);\r\n const signalId = `${proxy._stateKey}-${proxy._path.join(\".\")}`;\r\n\r\n useEffect(() => {\r\n const element = elementRef.current;\r\n if (!element || !element.parentElement) return;\r\n\r\n const parentElement = element.parentElement;\r\n const childNodes = Array.from(parentElement.childNodes);\r\n const position = childNodes.indexOf(element);\r\n\r\n let parentId = parentElement.getAttribute(\"data-parent-id\");\r\n if (!parentId) {\r\n parentId = `parent-${crypto.randomUUID()}`;\r\n parentElement.setAttribute(\"data-parent-id\", parentId);\r\n }\r\n\r\n const instanceId = `instance-${crypto.randomUUID()}`;\r\n const elementInfo = {\r\n instanceId,\r\n parentId,\r\n position,\r\n effect: proxy._effect,\r\n };\r\n\r\n getGlobalStore.getState().addSignalElement(signalId, elementInfo);\r\n\r\n // Get the raw value from the store\r\n const value = getGlobalStore\r\n .getState()\r\n .getNestedState(proxy._stateKey, proxy._path);\r\n\r\n let displayValue;\r\n if (proxy._effect) {\r\n try {\r\n displayValue = new Function(\r\n \"state\",\r\n `return (${proxy._effect})(state)`\r\n )(value);\r\n } catch (err) {\r\n console.error(\"Error evaluating effect function during mount:\", err);\r\n displayValue = value; // Fallback to raw value\r\n }\r\n } else {\r\n displayValue = value;\r\n }\r\n\r\n if (displayValue !== null && typeof displayValue === \"object\") {\r\n displayValue = JSON.stringify(displayValue);\r\n }\r\n\r\n const textNode = document.createTextNode(String(displayValue));\r\n element.replaceWith(textNode);\r\n }, [proxy._stateKey, proxy._path.join(\".\"), proxy._effect]);\r\n\r\n return createElement(\"span\", {\r\n ref: elementRef,\r\n style: { display: \"none\" },\r\n \"data-signal-id\": signalId,\r\n });\r\n}\r\nexport function $cogsSignalStore(proxy: {\r\n _path: string[];\r\n _stateKey: string;\r\n}) {\r\n const value = useSyncExternalStore(\r\n (notify) => {\r\n const stateEntry = getGlobalStore\r\n .getState()\r\n .stateComponents.get(proxy._stateKey) || {\r\n components: new Map(),\r\n };\r\n stateEntry.components.set(proxy._stateKey, {\r\n forceUpdate: notify,\r\n paths: new Set([proxy._path.join(\".\")]),\r\n });\r\n return () => stateEntry.components.delete(proxy._stateKey);\r\n },\r\n () => getGlobalStore.getState().getNestedState(proxy._stateKey, proxy._path)\r\n );\r\n return createElement(\"text\", {}, String(value));\r\n}\r\nfunction CogsItemWrapper({\r\n stateKey,\r\n itemComponentId,\r\n itemPath,\r\n children,\r\n}: {\r\n stateKey: string;\r\n itemComponentId: string;\r\n itemPath: string[];\r\n children: React.ReactNode;\r\n}) {\r\n // This hook handles the re-rendering when the item's own data changes.\r\n const [, forceUpdate] = useState({});\r\n // This hook measures the element.\r\n const [ref, bounds] = useMeasure();\r\n // This ref prevents sending the same height update repeatedly.\r\n const lastReportedHeight = useRef<number | null>(null);\r\n\r\n // This is the primary effect for this component.\r\n useEffect(() => {\r\n // We only report a height if it's a valid number AND it's different\r\n // from the last height we reported. This prevents infinite loops.\r\n if (bounds.height > 0 && bounds.height !== lastReportedHeight.current) {\r\n // Store the new height so we don't report it again.\r\n lastReportedHeight.current = bounds.height;\r\n\r\n // Call the store function to save the height and notify listeners.\r\n getGlobalStore.getState().setShadowMetadata(stateKey, itemPath, {\r\n virtualizer: {\r\n itemHeight: bounds.height,\r\n },\r\n });\r\n }\r\n }, [bounds.height, stateKey, itemPath]); // Reruns whenever the measured height changes.\r\n\r\n // This effect handles subscribing the item to its own data path for updates.\r\n useLayoutEffect(() => {\r\n const fullComponentId = `${stateKey}////${itemComponentId}`;\r\n const stateEntry = getGlobalStore\r\n .getState()\r\n .stateComponents.get(stateKey) || {\r\n components: new Map(),\r\n };\r\n\r\n stateEntry.components.set(fullComponentId, {\r\n forceUpdate: () => forceUpdate({}),\r\n paths: new Set([itemPath.join(\".\")]),\r\n });\r\n\r\n getGlobalStore.getState().stateComponents.set(stateKey, stateEntry);\r\n\r\n return () => {\r\n const currentEntry = getGlobalStore\r\n .getState()\r\n .stateComponents.get(stateKey);\r\n if (currentEntry) {\r\n currentEntry.components.delete(fullComponentId);\r\n }\r\n };\r\n }, [stateKey, itemComponentId, itemPath.join(\".\")]);\r\n\r\n // The rendered output is a simple div that gets measured.\r\n return <div ref={ref}>{children}</div>;\r\n}\r\n"],"names":["setAndMergeOptions","stateKey","newOptions","getInitialOptions","getGlobalStore","setInitialStateOptions","initialOptions","setOptions","options","initialOptionsPart","initialOptionsPartState","mergedOptions","needToAdd","key","isDeepEqual","addStateOptions","initialState","formElements","validation","createCogsState","opt","newInitialState","statePart","transformStateFunc","useCogsState","componentId","useState","uuidv4","thiState","partialState","state","updater","useCogsStateFn","setCogsOptions","loadAndApplyLocalStorage","notifyComponents","setUpdaterState","setState","getKeyState","getValidationErrors","setStateLog","updateInitialStateGlobal","addValidationError","removeValidationError","setServerSyncActions","saveToLocalStorage","thisKey","currentInitialOptions","sessionId","lastSyncedWithServer","isFunction","storageKey","existingLastSynced","loadFromLocalStorage","data","superJsonResult","superjson","localStorageKey","storedData","error","currentState","useCogsConfig","localkey","localData","updateGlobalState","newState","effectiveSetState","updates","createProxyHandler","stateEntry","component","update","notifyComponent","fullComponentId","getUpdateValues","updateType","prevValue","payload","path","getNestedValue","stateObject","serverSync","localStorage","reactiveDeps","reactiveType","syncUpdate","dependencies","serverState","reactiveForce","forceUpdate","noStateKey","stateLog","componentUpdatesRef","useRef","componentIdRef","latestInitialOptionsRef","useEffect","prevState","syncKey","hasServerData","currentGloballyStoredInitialState","isFromServer","serverTimestamp","localTimestamp","lastSyncTimestamp","useLayoutEffect","componentKey","newStateOrFunction","updateObj","validationKey","pathKey","store","signalId","isArrayOperation","elements","arrayPath","arrayValue","arraySignalId","newValue","parentId","position","effect","parent","childNodes","displayValue","arrayWithoutIndex","k","v","length","newKey","changedPaths","getDifferences","changedPathsSet","primaryPathToCheck","shouldUpdate","reactiveTypes","changedPath","currentPathToCheck","lastDotIndex","parentPath","depsResult","depsChanged","timeStamp","p","i","oldValue","newUpdate","index","prevLogs","aggregatedLogs","acc","log","uniqueKey","existing","serverStateStore","updaterFinal","useMemo","shapeCache","stateVersion","invalidateCachePath","baseObj","obj","init","newProxy","rebuildStateShape","initalOptionsGet","localKey","newUpdaterState","startTransition","field","meta","cacheKey","baseFunction","handler","target","thisArg","args","prop","mutationMethods","currentPath","needsAdd","existingPath","sync","response","errorPath","thisReactiveState","initialStateAtPath","getSourceArrayAndIndices","item","selectedIndex","itemHeight","overscan","stickToBottom","shouldNotScroll","containerRef","range","setRange","status","setStatus","isProgrammaticScroll","prevTotalCountRef","prevDepsRef","lastUpdateAtScrollTop","shadowUpdateTrigger","setShadowUpdateTrigger","scrollAnchorRef","prev","sourceArray","totalCount","totalHeight","positions","shadowArray","height","pos","measuredHeight","virtualState","start","end","validIndices","_","slicedArray","idx","container","hasNewItems","prevScrollTop","prevScrollHeight","intervalId","lastItemIndex","lastItemHeight","scrollBehavior","timeoutId","scrollThreshold","handleUserScroll","scrollTop","scrollHeight","clientHeight","high","low","topItemIndex","mid","startIndex","endIndex","visibleEnd","scrollToBottom","useCallback","scrollToIndex","behavior","virtualizerProps","compareFn","sortedResult","a","b","newCurrentState","newMeta","originalIndex","callbackfn","filteredResult","arrayToMap","localIndex","finalPath","setter","itemComponentId","currentEntry","createElement","SignalMapRenderer","CogsItemWrapper","fieldName","flattenedResults","val","indexValue","currentArray","lastIndex","lastValue","newPath","pushFunc","fields","onMatch","matchedItem","isMatch","updatedItem","updatedArray","updateFn","cutFunc","value","found","thisValue","lastPathElement","parentValue","fullArray","fn","$cogsSignal","parentKey","thisIndex","nested","errors","fullErrorPath","patches","applyPatch","dotIndex","lastSegment","parentDotIndex","grandParentPath","thisObject","existingErrors","result","errorMessage","formRefStore","children","hideMessage","jsx","ValidationWrapper","opts","debounce","child","formOpts","FormControlComponent","nextPath","nextValue","proxyInstance","proxy","SignalRenderer","arraysetter","elementRef","element","parentElement","elementInfo","err","textNode","$cogsSignalStore","useSyncExternalStore","notify","itemPath","ref","bounds","useMeasure","lastReportedHeight"],"mappings":"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"}
|
package/package.json
CHANGED
package/src/CogsState.tsx
CHANGED
|
@@ -1984,7 +1984,12 @@ function createProxyHandler<T>(
|
|
|
1984
1984
|
.getShadowMetadata(stateKey, path) || [];
|
|
1985
1985
|
const lastItemHeight =
|
|
1986
1986
|
shadowArray[lastItemIndex]?.virtualizer?.itemHeight || 0;
|
|
1987
|
-
|
|
1987
|
+
console.log(
|
|
1988
|
+
"ACTION (GETTING_HEIGHTS): lastItemHeight =",
|
|
1989
|
+
lastItemHeight,
|
|
1990
|
+
" index =",
|
|
1991
|
+
lastItemIndex
|
|
1992
|
+
);
|
|
1988
1993
|
if (lastItemHeight > 0) {
|
|
1989
1994
|
clearInterval(intervalId);
|
|
1990
1995
|
if (!shouldNotScroll.current) {
|