cogsbox-state 0.5.197 → 0.5.198
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 +118 -113
- package/dist/CogsState.jsx.map +1 -1
- package/package.json +1 -1
- package/src/CogsState.tsx +4 -1
package/dist/CogsState.jsx
CHANGED
|
@@ -194,7 +194,7 @@ function Me(e, {
|
|
|
194
194
|
} = {}) {
|
|
195
195
|
const [M, _] = le({}), { sessionId: C } = pe();
|
|
196
196
|
let D = !i;
|
|
197
|
-
const [g] = le(i ?? ue()),
|
|
197
|
+
const [g] = le(i ?? ue()), d = t.getState().stateLog[g], X = ee(/* @__PURE__ */ new Set()), J = ee(v ?? ue()), P = ee(
|
|
198
198
|
null
|
|
199
199
|
);
|
|
200
200
|
P.current = H(g) ?? null, de(() => {
|
|
@@ -226,7 +226,7 @@ function Me(e, {
|
|
|
226
226
|
g,
|
|
227
227
|
s,
|
|
228
228
|
A,
|
|
229
|
-
|
|
229
|
+
l,
|
|
230
230
|
J.current,
|
|
231
231
|
C
|
|
232
232
|
), T && $ && C && Ie(A, g, o, C, Date.now()), oe(g), (Array.isArray(h) ? h : [h || "component"]).includes("none") || _({});
|
|
@@ -258,7 +258,7 @@ function Me(e, {
|
|
|
258
258
|
a && (a.components.delete(c), a.components.size === 0 && t.getState().stateComponents.delete(g));
|
|
259
259
|
};
|
|
260
260
|
}, []);
|
|
261
|
-
const
|
|
261
|
+
const l = (o, a, c, p) => {
|
|
262
262
|
if (Array.isArray(a)) {
|
|
263
263
|
const y = `${g}-${a.join(".")}`;
|
|
264
264
|
X.current.add(y);
|
|
@@ -394,7 +394,7 @@ function Me(e, {
|
|
|
394
394
|
P.current,
|
|
395
395
|
C
|
|
396
396
|
), P.current?.middleware && P.current.middleware({
|
|
397
|
-
updateLog:
|
|
397
|
+
updateLog: d,
|
|
398
398
|
update: x
|
|
399
399
|
}), P.current?.serverSync) {
|
|
400
400
|
const G = t.getState().serverState[g], N = P.current?.serverSync;
|
|
@@ -412,14 +412,14 @@ function Me(e, {
|
|
|
412
412
|
g,
|
|
413
413
|
ne(
|
|
414
414
|
g,
|
|
415
|
-
|
|
415
|
+
l,
|
|
416
416
|
J.current,
|
|
417
417
|
C
|
|
418
418
|
)
|
|
419
419
|
), t.getState().cogsStateStore[g] || Y(g, e), t.getState().initialStateGlobal[g] || ge(g, e));
|
|
420
420
|
const r = $e(() => ne(
|
|
421
421
|
g,
|
|
422
|
-
|
|
422
|
+
l,
|
|
423
423
|
J.current,
|
|
424
424
|
C
|
|
425
425
|
), [g]);
|
|
@@ -445,8 +445,8 @@ function ne(e, i, S, u) {
|
|
|
445
445
|
const M = s(I, []), _ = H(e), C = Z(_?.localStorage?.key) ? _?.localStorage?.key(I) : _?.localStorage?.key, D = `${u}-${e}-${C}`;
|
|
446
446
|
D && localStorage.removeItem(D), te(e, M), Y(e, I);
|
|
447
447
|
const g = t.getState().stateComponents.get(e);
|
|
448
|
-
return g && g.components.forEach((
|
|
449
|
-
|
|
448
|
+
return g && g.components.forEach((d) => {
|
|
449
|
+
d.forceUpdate();
|
|
450
450
|
}), I;
|
|
451
451
|
},
|
|
452
452
|
updateInitialState: (m) => {
|
|
@@ -485,30 +485,35 @@ function ne(e, i, S, u) {
|
|
|
485
485
|
_[g] = v[g];
|
|
486
486
|
});
|
|
487
487
|
const C = {
|
|
488
|
-
apply(g,
|
|
488
|
+
apply(g, d, X) {
|
|
489
489
|
return console.log(
|
|
490
490
|
`PROXY APPLY TRAP HIT: stateKey=${e}, path=${n.join(".")}`
|
|
491
491
|
), console.trace("Apply trap stack trace"), t().getNestedState(e, n);
|
|
492
492
|
},
|
|
493
|
-
get(g,
|
|
494
|
-
if (
|
|
495
|
-
const
|
|
493
|
+
get(g, d) {
|
|
494
|
+
if (d !== "then" && !d.startsWith("$") && d !== "stateMapNoRender") {
|
|
495
|
+
const l = n.join("."), r = `${e}////${S}`;
|
|
496
|
+
console.log(
|
|
497
|
+
".........................................................",
|
|
498
|
+
l
|
|
499
|
+
);
|
|
500
|
+
const o = t.getState().stateComponents.get(e);
|
|
496
501
|
if (o) {
|
|
497
502
|
const a = o.components.get(r);
|
|
498
|
-
a && (n.length > 0 ||
|
|
503
|
+
a && (n.length > 0 || d === "get") && a.paths.add(l);
|
|
499
504
|
}
|
|
500
505
|
}
|
|
501
|
-
if (
|
|
506
|
+
if (d === "getDifferences")
|
|
502
507
|
return () => he(
|
|
503
508
|
t.getState().cogsStateStore[e],
|
|
504
509
|
t.getState().initialStateGlobal[e]
|
|
505
510
|
);
|
|
506
|
-
if (
|
|
511
|
+
if (d === "sync" && n.length === 0)
|
|
507
512
|
return async function() {
|
|
508
|
-
const
|
|
513
|
+
const l = t.getState().getInitialOptions(e), r = l?.sync;
|
|
509
514
|
if (!r)
|
|
510
515
|
return console.error(`No mutation defined for state key "${e}"`), { success: !1, error: "No mutation defined" };
|
|
511
|
-
const o = t.getState().getNestedState(e, []), a =
|
|
516
|
+
const o = t.getState().getNestedState(e, []), a = l?.validation?.key;
|
|
512
517
|
try {
|
|
513
518
|
const c = await r.action(o);
|
|
514
519
|
if (c && !c.success && c.errors && a) {
|
|
@@ -526,39 +531,39 @@ function ne(e, i, S, u) {
|
|
|
526
531
|
return r.onError && r.onError(c), { success: !1, error: c };
|
|
527
532
|
}
|
|
528
533
|
};
|
|
529
|
-
if (
|
|
530
|
-
const
|
|
531
|
-
return L(
|
|
534
|
+
if (d === "_status") {
|
|
535
|
+
const l = t.getState().getNestedState(e, n), r = t.getState().initialStateGlobal[e], o = q(r, n);
|
|
536
|
+
return L(l, o) ? "fresh" : "stale";
|
|
532
537
|
}
|
|
533
|
-
if (
|
|
538
|
+
if (d === "getStatus")
|
|
534
539
|
return function() {
|
|
535
|
-
const
|
|
540
|
+
const l = t().getNestedState(
|
|
536
541
|
e,
|
|
537
542
|
n
|
|
538
543
|
), r = t.getState().initialStateGlobal[e], o = q(r, n);
|
|
539
|
-
return L(
|
|
544
|
+
return L(l, o) ? "fresh" : "stale";
|
|
540
545
|
};
|
|
541
|
-
if (
|
|
546
|
+
if (d === "removeStorage")
|
|
542
547
|
return () => {
|
|
543
|
-
const
|
|
548
|
+
const l = t.getState().initialStateGlobal[e], r = H(e), o = Z(r?.localStorage?.key) ? r?.localStorage?.key(l) : r?.localStorage?.key, a = `${u}-${e}-${o}`;
|
|
544
549
|
console.log("removing storage", a), a && localStorage.removeItem(a);
|
|
545
550
|
};
|
|
546
|
-
if (
|
|
551
|
+
if (d === "showValidationErrors")
|
|
547
552
|
return () => {
|
|
548
|
-
const
|
|
549
|
-
if (!
|
|
553
|
+
const l = t.getState().getInitialOptions(e)?.validation;
|
|
554
|
+
if (!l?.key)
|
|
550
555
|
throw new Error("Validation key not found");
|
|
551
|
-
return t.getState().getValidationErrors(
|
|
556
|
+
return t.getState().getValidationErrors(l.key + "." + n.join("."));
|
|
552
557
|
};
|
|
553
558
|
if (Array.isArray(m)) {
|
|
554
|
-
const
|
|
559
|
+
const l = () => I?.validIndices ? m.map((o, a) => ({
|
|
555
560
|
item: o,
|
|
556
561
|
originalIndex: I.validIndices[a]
|
|
557
562
|
})) : t.getState().getNestedState(e, n).map((o, a) => ({
|
|
558
563
|
item: o,
|
|
559
564
|
originalIndex: a
|
|
560
565
|
}));
|
|
561
|
-
if (
|
|
566
|
+
if (d === "getSelected")
|
|
562
567
|
return () => {
|
|
563
568
|
const r = t.getState().getSelectedIndex(e, n.join("."));
|
|
564
569
|
if (r !== void 0)
|
|
@@ -568,15 +573,15 @@ function ne(e, i, S, u) {
|
|
|
568
573
|
I
|
|
569
574
|
);
|
|
570
575
|
};
|
|
571
|
-
if (
|
|
576
|
+
if (d === "clearSelected")
|
|
572
577
|
return () => {
|
|
573
578
|
t.getState().clearSelectedIndex({ stateKey: e, path: n });
|
|
574
579
|
};
|
|
575
|
-
if (
|
|
580
|
+
if (d === "getSelectedIndex")
|
|
576
581
|
return () => t.getState().getSelectedIndex(e, n.join(".")) ?? -1;
|
|
577
|
-
if (
|
|
582
|
+
if (d === "stateSort")
|
|
578
583
|
return (r) => {
|
|
579
|
-
const a = [...
|
|
584
|
+
const a = [...l()].sort(
|
|
580
585
|
(y, w) => r(y.item, w.item)
|
|
581
586
|
), c = a.map(({ item: y }) => y), p = {
|
|
582
587
|
...I,
|
|
@@ -586,9 +591,9 @@ function ne(e, i, S, u) {
|
|
|
586
591
|
};
|
|
587
592
|
return s(c, n, p);
|
|
588
593
|
};
|
|
589
|
-
if (
|
|
594
|
+
if (d === "stateFilter")
|
|
590
595
|
return (r) => {
|
|
591
|
-
const a =
|
|
596
|
+
const a = l().filter(
|
|
592
597
|
({ item: y }, w) => r(y, w)
|
|
593
598
|
), c = a.map(({ item: y }) => y), p = {
|
|
594
599
|
...I,
|
|
@@ -598,7 +603,7 @@ function ne(e, i, S, u) {
|
|
|
598
603
|
};
|
|
599
604
|
return s(c, n, p);
|
|
600
605
|
};
|
|
601
|
-
if (
|
|
606
|
+
if (d === "stateMap" || d === "stateMapNoRender")
|
|
602
607
|
return (r) => m.map((a, c) => {
|
|
603
608
|
let p;
|
|
604
609
|
I?.validIndices && I.validIndices[c] !== void 0 ? p = I.validIndices[c] : p = c;
|
|
@@ -611,7 +616,7 @@ function ne(e, i, S, u) {
|
|
|
611
616
|
s(m, n, I)
|
|
612
617
|
);
|
|
613
618
|
});
|
|
614
|
-
if (
|
|
619
|
+
if (d === "$stateMap")
|
|
615
620
|
return (r) => re(De, {
|
|
616
621
|
proxy: {
|
|
617
622
|
_stateKey: e,
|
|
@@ -621,7 +626,7 @@ function ne(e, i, S, u) {
|
|
|
621
626
|
},
|
|
622
627
|
rebuildStateShape: s
|
|
623
628
|
});
|
|
624
|
-
if (
|
|
629
|
+
if (d === "stateFlattenOn")
|
|
625
630
|
return (r) => {
|
|
626
631
|
const o = m;
|
|
627
632
|
f.clear(), k++;
|
|
@@ -634,24 +639,24 @@ function ne(e, i, S, u) {
|
|
|
634
639
|
I
|
|
635
640
|
);
|
|
636
641
|
};
|
|
637
|
-
if (
|
|
642
|
+
if (d === "index")
|
|
638
643
|
return (r) => {
|
|
639
644
|
const o = m[r];
|
|
640
645
|
return s(o, [...n, r.toString()]);
|
|
641
646
|
};
|
|
642
|
-
if (
|
|
647
|
+
if (d === "last")
|
|
643
648
|
return () => {
|
|
644
649
|
const r = t.getState().getNestedState(e, n);
|
|
645
650
|
if (r.length === 0) return;
|
|
646
651
|
const o = r.length - 1, a = r[o], c = [...n, o.toString()];
|
|
647
652
|
return s(a, c);
|
|
648
653
|
};
|
|
649
|
-
if (
|
|
654
|
+
if (d === "insert")
|
|
650
655
|
return (r) => (h(n), se(i, r, n, e), s(
|
|
651
656
|
t.getState().getNestedState(e, n),
|
|
652
657
|
n
|
|
653
658
|
));
|
|
654
|
-
if (
|
|
659
|
+
if (d === "uniqueInsert")
|
|
655
660
|
return (r, o, a) => {
|
|
656
661
|
const c = t.getState().getNestedState(e, n), p = Z(r) ? r(c) : r;
|
|
657
662
|
let y = null;
|
|
@@ -673,7 +678,7 @@ function ne(e, i, S, u) {
|
|
|
673
678
|
h(n), Q(i, A, n);
|
|
674
679
|
}
|
|
675
680
|
};
|
|
676
|
-
if (
|
|
681
|
+
if (d === "cut")
|
|
677
682
|
return (r, o) => {
|
|
678
683
|
if (!o?.waitForSync)
|
|
679
684
|
return h(n), K(i, n, e, r), s(
|
|
@@ -681,28 +686,28 @@ function ne(e, i, S, u) {
|
|
|
681
686
|
n
|
|
682
687
|
);
|
|
683
688
|
};
|
|
684
|
-
if (
|
|
689
|
+
if (d === "cutByValue")
|
|
685
690
|
return (r) => {
|
|
686
691
|
for (let o = 0; o < m.length; o++)
|
|
687
692
|
m[o] === r && K(i, n, e, o);
|
|
688
693
|
};
|
|
689
|
-
if (
|
|
694
|
+
if (d === "toggleByValue")
|
|
690
695
|
return (r) => {
|
|
691
696
|
const o = m.findIndex((a) => a === r);
|
|
692
697
|
o > -1 ? K(i, n, e, o) : se(i, r, n, e);
|
|
693
698
|
};
|
|
694
|
-
if (
|
|
699
|
+
if (d === "stateFind")
|
|
695
700
|
return (r) => {
|
|
696
|
-
const a =
|
|
701
|
+
const a = l().find(
|
|
697
702
|
({ item: p }, y) => r(p, y)
|
|
698
703
|
);
|
|
699
704
|
if (!a) return;
|
|
700
705
|
const c = [...n, a.originalIndex.toString()];
|
|
701
706
|
return s(a.item, c, I);
|
|
702
707
|
};
|
|
703
|
-
if (
|
|
708
|
+
if (d === "findWith")
|
|
704
709
|
return (r, o) => {
|
|
705
|
-
const c =
|
|
710
|
+
const c = l().find(
|
|
706
711
|
({ item: y }) => y[r] === o
|
|
707
712
|
);
|
|
708
713
|
if (!c) return;
|
|
@@ -712,66 +717,66 @@ function ne(e, i, S, u) {
|
|
|
712
717
|
}
|
|
713
718
|
const X = n[n.length - 1];
|
|
714
719
|
if (!isNaN(Number(X))) {
|
|
715
|
-
const
|
|
716
|
-
if (Array.isArray(r) &&
|
|
720
|
+
const l = n.slice(0, -1), r = t.getState().getNestedState(e, l);
|
|
721
|
+
if (Array.isArray(r) && d === "cut")
|
|
717
722
|
return () => K(
|
|
718
723
|
i,
|
|
719
|
-
|
|
724
|
+
l,
|
|
720
725
|
e,
|
|
721
726
|
Number(X)
|
|
722
727
|
);
|
|
723
728
|
}
|
|
724
|
-
if (
|
|
729
|
+
if (d === "get")
|
|
725
730
|
return () => t.getState().getNestedState(e, n);
|
|
726
|
-
if (
|
|
727
|
-
return (
|
|
731
|
+
if (d === "$derive")
|
|
732
|
+
return (l) => ce({
|
|
728
733
|
_stateKey: e,
|
|
729
734
|
_path: n,
|
|
730
|
-
_effect:
|
|
735
|
+
_effect: l.toString()
|
|
731
736
|
});
|
|
732
|
-
if (
|
|
733
|
-
return (
|
|
737
|
+
if (d === "$derive")
|
|
738
|
+
return (l) => ce({
|
|
734
739
|
_stateKey: e,
|
|
735
740
|
_path: n,
|
|
736
|
-
_effect:
|
|
741
|
+
_effect: l.toString()
|
|
737
742
|
});
|
|
738
|
-
if (
|
|
743
|
+
if (d === "$get")
|
|
739
744
|
return () => ce({
|
|
740
745
|
_stateKey: e,
|
|
741
746
|
_path: n
|
|
742
747
|
});
|
|
743
|
-
if (
|
|
744
|
-
const
|
|
745
|
-
return t.getState().getSyncInfo(
|
|
748
|
+
if (d === "lastSynced") {
|
|
749
|
+
const l = `${e}:${n.join(".")}`;
|
|
750
|
+
return t.getState().getSyncInfo(l);
|
|
746
751
|
}
|
|
747
|
-
if (
|
|
748
|
-
return (
|
|
749
|
-
if (
|
|
750
|
-
const
|
|
752
|
+
if (d == "getLocalStorage")
|
|
753
|
+
return (l) => ae(u + "-" + e + "-" + l);
|
|
754
|
+
if (d === "_selected") {
|
|
755
|
+
const l = n.slice(0, -1), r = l.join("."), o = t.getState().getNestedState(e, l);
|
|
751
756
|
return Array.isArray(o) ? Number(n[n.length - 1]) === t.getState().getSelectedIndex(e, r) : void 0;
|
|
752
757
|
}
|
|
753
|
-
if (
|
|
754
|
-
return (
|
|
758
|
+
if (d === "setSelected")
|
|
759
|
+
return (l) => {
|
|
755
760
|
const r = n.slice(0, -1), o = Number(n[n.length - 1]), a = r.join(".");
|
|
756
|
-
|
|
761
|
+
l ? t.getState().setSelectedIndex(e, a, o) : t.getState().setSelectedIndex(e, a, void 0);
|
|
757
762
|
const c = t.getState().getNestedState(e, [...r]);
|
|
758
763
|
Q(i, c, r), h(r);
|
|
759
764
|
};
|
|
760
|
-
if (
|
|
765
|
+
if (d === "toggleSelected")
|
|
761
766
|
return () => {
|
|
762
|
-
const
|
|
767
|
+
const l = n.slice(0, -1), r = Number(n[n.length - 1]), o = l.join("."), a = t.getState().getSelectedIndex(e, o);
|
|
763
768
|
t.getState().setSelectedIndex(
|
|
764
769
|
e,
|
|
765
770
|
o,
|
|
766
771
|
a === r ? void 0 : r
|
|
767
772
|
);
|
|
768
|
-
const c = t.getState().getNestedState(e, [...
|
|
769
|
-
Q(i, c,
|
|
773
|
+
const c = t.getState().getNestedState(e, [...l]);
|
|
774
|
+
Q(i, c, l), h(l);
|
|
770
775
|
};
|
|
771
776
|
if (n.length == 0) {
|
|
772
|
-
if (
|
|
773
|
-
return (
|
|
774
|
-
const r = t.getState().cogsStateStore[e], a = be(r,
|
|
777
|
+
if (d === "applyJsonPatch")
|
|
778
|
+
return (l) => {
|
|
779
|
+
const r = t.getState().cogsStateStore[e], a = be(r, l).newDocument, c = H(e), p = c?.middleware, y = t.getState().setInitialStateOptions;
|
|
775
780
|
c && p && y(e, {
|
|
776
781
|
...c,
|
|
777
782
|
middleware: void 0
|
|
@@ -789,7 +794,7 @@ function ne(e, i, S, u) {
|
|
|
789
794
|
const w = t.getState().stateComponents.get(e);
|
|
790
795
|
if (console.log("component update logic stateEntry", w), !w) return;
|
|
791
796
|
const $ = /* @__PURE__ */ new Set();
|
|
792
|
-
console.log("component update logic pathsToCheck", $), Array.isArray(r) && Array.isArray(a) && r.length !== a.length && $.add(""), console.log("component update logic pathsToCheck", $),
|
|
797
|
+
console.log("component update logic pathsToCheck", $), Array.isArray(r) && Array.isArray(a) && r.length !== a.length && $.add(""), console.log("component update logic pathsToCheck", $), l.forEach((A) => {
|
|
793
798
|
const V = A.path.slice(1).split("/");
|
|
794
799
|
if (A.op === "add" || A.op === "remove") {
|
|
795
800
|
const b = V[V.length - 1];
|
|
@@ -837,50 +842,50 @@ function ne(e, i, S, u) {
|
|
|
837
842
|
}
|
|
838
843
|
}
|
|
839
844
|
};
|
|
840
|
-
if (
|
|
845
|
+
if (d === "validateZodSchema")
|
|
841
846
|
return () => {
|
|
842
|
-
const
|
|
843
|
-
if (!
|
|
847
|
+
const l = t.getState().getInitialOptions(e)?.validation, r = t.getState().addValidationError;
|
|
848
|
+
if (!l?.zodSchema)
|
|
844
849
|
throw new Error("Zod schema not found");
|
|
845
|
-
if (!
|
|
850
|
+
if (!l?.key)
|
|
846
851
|
throw new Error("Validation key not found");
|
|
847
|
-
B(
|
|
852
|
+
B(l.key);
|
|
848
853
|
const o = t.getState().cogsStateStore[e];
|
|
849
854
|
try {
|
|
850
|
-
const a = t.getState().getValidationErrors(
|
|
855
|
+
const a = t.getState().getValidationErrors(l.key);
|
|
851
856
|
a && a.length > 0 && a.forEach(([p]) => {
|
|
852
|
-
p && p.startsWith(
|
|
857
|
+
p && p.startsWith(l.key) && B(p);
|
|
853
858
|
});
|
|
854
|
-
const c =
|
|
859
|
+
const c = l.zodSchema.safeParse(o);
|
|
855
860
|
return c.success ? !0 : (c.error.errors.forEach((y) => {
|
|
856
|
-
const w = y.path, $ = y.message, A = [
|
|
861
|
+
const w = y.path, $ = y.message, A = [l.key, ...w].join(".");
|
|
857
862
|
r(A, $);
|
|
858
863
|
}), oe(e), !1);
|
|
859
864
|
} catch (a) {
|
|
860
865
|
return console.error("Zod schema validation failed", a), !1;
|
|
861
866
|
}
|
|
862
867
|
};
|
|
863
|
-
if (
|
|
864
|
-
if (
|
|
868
|
+
if (d === "_componentId") return S;
|
|
869
|
+
if (d === "getComponents")
|
|
865
870
|
return () => t().stateComponents.get(e);
|
|
866
|
-
if (
|
|
871
|
+
if (d === "getAllFormRefs")
|
|
867
872
|
return () => me.getState().getFormRefsByStateKey(e);
|
|
868
|
-
if (
|
|
873
|
+
if (d === "_initialState")
|
|
869
874
|
return t.getState().initialStateGlobal[e];
|
|
870
|
-
if (
|
|
875
|
+
if (d === "_serverState")
|
|
871
876
|
return t.getState().serverState[e];
|
|
872
|
-
if (
|
|
877
|
+
if (d === "_isLoading")
|
|
873
878
|
return t.getState().isLoadingGlobal[e];
|
|
874
|
-
if (
|
|
879
|
+
if (d === "revertToInitialState")
|
|
875
880
|
return v.revertToInitialState;
|
|
876
|
-
if (
|
|
877
|
-
if (
|
|
881
|
+
if (d === "updateInitialState") return v.updateInitialState;
|
|
882
|
+
if (d === "removeValidation") return v.removeValidation;
|
|
878
883
|
}
|
|
879
|
-
if (
|
|
884
|
+
if (d === "getFormRef")
|
|
880
885
|
return () => me.getState().getFormRef(e + "." + n.join("."));
|
|
881
|
-
if (
|
|
886
|
+
if (d === "validationWrapper")
|
|
882
887
|
return ({
|
|
883
|
-
children:
|
|
888
|
+
children: l,
|
|
884
889
|
hideMessage: r
|
|
885
890
|
}) => /* @__PURE__ */ Se(
|
|
886
891
|
_e,
|
|
@@ -890,39 +895,39 @@ function ne(e, i, S, u) {
|
|
|
890
895
|
validationKey: t.getState().getInitialOptions(e)?.validation?.key || "",
|
|
891
896
|
stateKey: e,
|
|
892
897
|
validIndices: I?.validIndices,
|
|
893
|
-
children:
|
|
898
|
+
children: l
|
|
894
899
|
}
|
|
895
900
|
);
|
|
896
|
-
if (
|
|
897
|
-
if (
|
|
898
|
-
if (
|
|
899
|
-
if (
|
|
900
|
-
return (
|
|
901
|
+
if (d === "_stateKey") return e;
|
|
902
|
+
if (d === "_path") return n;
|
|
903
|
+
if (d === "_isServerSynced") return v._isServerSynced;
|
|
904
|
+
if (d === "update")
|
|
905
|
+
return (l, r) => {
|
|
901
906
|
if (r?.debounce)
|
|
902
907
|
Ve(() => {
|
|
903
|
-
Q(i,
|
|
908
|
+
Q(i, l, n, "");
|
|
904
909
|
const o = t.getState().getNestedState(e, n);
|
|
905
910
|
r?.afterUpdate && r.afterUpdate(o);
|
|
906
911
|
}, r.debounce);
|
|
907
912
|
else {
|
|
908
|
-
Q(i,
|
|
913
|
+
Q(i, l, n, "");
|
|
909
914
|
const o = t.getState().getNestedState(e, n);
|
|
910
915
|
r?.afterUpdate && r.afterUpdate(o);
|
|
911
916
|
}
|
|
912
917
|
h(n);
|
|
913
918
|
};
|
|
914
|
-
if (
|
|
915
|
-
return (
|
|
919
|
+
if (d === "formElement")
|
|
920
|
+
return (l, r) => /* @__PURE__ */ Se(
|
|
916
921
|
Ce,
|
|
917
922
|
{
|
|
918
923
|
setState: i,
|
|
919
924
|
stateKey: e,
|
|
920
925
|
path: n,
|
|
921
|
-
child:
|
|
926
|
+
child: l,
|
|
922
927
|
formOpts: r
|
|
923
928
|
}
|
|
924
929
|
);
|
|
925
|
-
const J = [...n,
|
|
930
|
+
const J = [...n, d], P = t.getState().getNestedState(e, J);
|
|
926
931
|
return s(P, J, I);
|
|
927
932
|
}
|
|
928
933
|
}, D = new Proxy(_, C);
|
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 useEffect,\r\n useLayoutEffect,\r\n useMemo,\r\n useRef,\r\n useState,\r\n useSyncExternalStore,\r\n type ReactNode,\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\n\r\ntype Prettify<T> = { [K in keyof T]: T[K] } & {};\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\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 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\ntype EffectFunction<T, R> = (state: T) => R;\r\nexport type EndType<T, IsArrayElement = false> = {\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[]; // Just like useEffect dependencies\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\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 const componentKey = `${thisKey}////${componentIdRef.current}`;\r\n\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 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 = getGlobalStore\r\n .getState()\r\n .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 = getGlobalStore\r\n .getState()\r\n .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 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 = getGlobalStore.getState().stateComponents.get(thisKey);\r\n\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\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\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 console.log(\r\n \"mmmmmmmmmmmmmmmmm22222222222222\",\r\n updateObj.updateType,\r\n prevValue,\r\n payload,\r\n path\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 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 = getGlobalStore.getState().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]);\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 console.log(\"removing storage\", storageKey);\r\n if (localStorage.getItem(storageKey)) {\r\n localStorage.removeItem(storageKey);\r\n }\r\n startTransition(() => {\r\n updateInitialStateGlobal(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 // if (cachedEntry?.stateVersion === stateVersion) {\r\n // return cachedEntry.proxy;\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 (\r\n prop !== \"then\" &&\r\n !prop.startsWith(\"$\") &&\r\n prop !== \"stateMapNoRender\"\r\n ) {\r\n const currentPath = path.join(\".\");\r\n const fullComponentId = `${stateKey}////${componentId}`;\r\n\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 // Only add paths for non-root or specifically for get() at root\r\n if (path.length > 0 || prop === \"get\") {\r\n component.paths.add(currentPath);\r\n }\r\n } else {\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 console.log(\"removing storage\", storageKey);\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 === \"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\" || 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 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\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 () => getGlobalStore.getState().getNestedState(stateKey, path);\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 === \"$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 === \"applyJsonPatch\") {\r\n return (patches: any[]) => {\r\n // Apply patches to get new state using fast-json-patch\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 // IMPORTANT: Use updateGlobalState BUT with a flag to prevent middleware\r\n const currentOptions = getInitialOptions(stateKey);\r\n const originalMiddleware = currentOptions?.middleware;\r\n const setInitialStateOptions =\r\n getGlobalStore.getState().setInitialStateOptions;\r\n\r\n // Temporarily remove middleware\r\n if (currentOptions && originalMiddleware) {\r\n setInitialStateOptions(stateKey, {\r\n ...currentOptions,\r\n middleware: undefined,\r\n });\r\n }\r\n\r\n // Update the global state\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 // Restore middleware\r\n if (currentOptions && originalMiddleware) {\r\n setInitialStateOptions(stateKey, {\r\n ...currentOptions,\r\n middleware: originalMiddleware,\r\n });\r\n }\r\n\r\n // COMPONENT UPDATE LOGIC\r\n const stateEntry = getGlobalStore\r\n .getState()\r\n .stateComponents.get(stateKey);\r\n console.log(\"component update logic stateEntry\", stateEntry);\r\n if (!stateEntry) return;\r\n\r\n // Build a set of all paths that should trigger updates\r\n const pathsToCheck = new Set<string>();\r\n console.log(\"component update logic pathsToCheck\", pathsToCheck);\r\n // Add root path if array length changed\r\n if (Array.isArray(currentState) && Array.isArray(newState)) {\r\n if (currentState.length !== newState.length) {\r\n pathsToCheck.add(\"\"); // Root path for array length changes\r\n }\r\n }\r\n console.log(\"component update logic pathsToCheck\", pathsToCheck);\r\n // Process each patch to determine affected paths\r\n patches.forEach((patch) => {\r\n const patchPath = patch.path.slice(1); // Remove leading slash\r\n const segments = patchPath.split(\"/\");\r\n\r\n // For array operations, we need to notify about the array itself\r\n if (patch.op === \"add\" || patch.op === \"remove\") {\r\n // Check if this is an array operation by seeing if the last segment is a number\r\n const lastSegment = segments[segments.length - 1];\r\n if (!isNaN(parseInt(lastSegment))) {\r\n // It's an array operation, add the parent path\r\n const parentPath = segments.slice(0, -1).join(\".\");\r\n pathsToCheck.add(parentPath);\r\n // Also add root if this is a top-level array\r\n if (parentPath === \"\") {\r\n pathsToCheck.add(\"\");\r\n }\r\n }\r\n }\r\n\r\n // Add the specific path and all parent paths\r\n let currentPath = \"\";\r\n segments.forEach((segment: any, index: any) => {\r\n if (index > 0) currentPath += \".\";\r\n currentPath += segment;\r\n pathsToCheck.add(currentPath);\r\n });\r\n\r\n // Always check root path\r\n pathsToCheck.add(\"\");\r\n });\r\n\r\n // Now check each component\r\n for (const [\r\n componentKey,\r\n component,\r\n ] of stateEntry.components.entries()) {\r\n console.log(\"component update logic component\", component);\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\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 // Check if component is watching any of the changed paths\r\n for (const watchedPath of component.paths) {\r\n if (pathsToCheck.has(watchedPath)) {\r\n shouldUpdate = true;\r\n break;\r\n }\r\n\r\n // Also check if a changed path is a child of a watched path\r\n for (const changedPath of pathsToCheck) {\r\n if (\r\n changedPath.startsWith(watchedPath + \".\") ||\r\n (watchedPath === \"\" && changedPath !== \"\")\r\n ) {\r\n shouldUpdate = true;\r\n break;\r\n }\r\n }\r\n\r\n if (shouldUpdate) break;\r\n }\r\n }\r\n\r\n if (!shouldUpdate && reactiveTypes.includes(\"deps\")) {\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\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","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","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","currentPath","sync","response","errorPath","thisReactiveState","initialStateAtPath","getSourceArrayAndIndices","item","index","selectedIndex","compareFn","sortedResult","a","b","newCurrentState","newMeta","originalIndex","callbackfn","filteredResult","finalPath","setter","createElement","SignalMapRenderer","fieldName","arrayToMap","flattenedResults","val","indexValue","currentArray","lastIndex","lastValue","newPath","pushFunc","fields","onMatch","matchedItem","isMatch","updatedItem","updatedArray","updateFn","cutFunc","value","found","thisValue","lastPathElement","parentValue","fn","$cogsSignal","parentKey","thisIndex","nested","patches","applyPatch","currentOptions","originalMiddleware","pathsToCheck","patch","segments","lastSegment","segment","watchedPath","thisObject","existingErrors","result","errorMessage","fullErrorPath","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"],"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 useEffect,\r\n useLayoutEffect,\r\n useMemo,\r\n useRef,\r\n useState,\r\n useSyncExternalStore,\r\n type ReactNode,\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\n\r\ntype Prettify<T> = { [K in keyof T]: T[K] } & {};\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\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 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\ntype EffectFunction<T, R> = (state: T) => R;\r\nexport type EndType<T, IsArrayElement = false> = {\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[]; // Just like useEffect dependencies\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\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 const componentKey = `${thisKey}////${componentIdRef.current}`;\r\n\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 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 = getGlobalStore\r\n .getState()\r\n .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 = getGlobalStore\r\n .getState()\r\n .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 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 = getGlobalStore.getState().stateComponents.get(thisKey);\r\n\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\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\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 console.log(\r\n \"mmmmmmmmmmmmmmmmm22222222222222\",\r\n updateObj.updateType,\r\n prevValue,\r\n payload,\r\n path\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 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 = getGlobalStore.getState().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]);\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 console.log(\"removing storage\", storageKey);\r\n if (localStorage.getItem(storageKey)) {\r\n localStorage.removeItem(storageKey);\r\n }\r\n startTransition(() => {\r\n updateInitialStateGlobal(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 // if (cachedEntry?.stateVersion === stateVersion) {\r\n // return cachedEntry.proxy;\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 (\r\n prop !== \"then\" &&\r\n !prop.startsWith(\"$\") &&\r\n prop !== \"stateMapNoRender\"\r\n ) {\r\n const currentPath = path.join(\".\");\r\n const fullComponentId = `${stateKey}////${componentId}`;\r\n console.log(\r\n \".........................................................\",\r\n currentPath\r\n );\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 // Only add paths for non-root or specifically for get() at root\r\n if (path.length > 0 || prop === \"get\") {\r\n component.paths.add(currentPath);\r\n }\r\n } else {\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 console.log(\"removing storage\", storageKey);\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 === \"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\" || 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 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\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 () => getGlobalStore.getState().getNestedState(stateKey, path);\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 === \"$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 === \"applyJsonPatch\") {\r\n return (patches: any[]) => {\r\n // Apply patches to get new state using fast-json-patch\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 // IMPORTANT: Use updateGlobalState BUT with a flag to prevent middleware\r\n const currentOptions = getInitialOptions(stateKey);\r\n const originalMiddleware = currentOptions?.middleware;\r\n const setInitialStateOptions =\r\n getGlobalStore.getState().setInitialStateOptions;\r\n\r\n // Temporarily remove middleware\r\n if (currentOptions && originalMiddleware) {\r\n setInitialStateOptions(stateKey, {\r\n ...currentOptions,\r\n middleware: undefined,\r\n });\r\n }\r\n\r\n // Update the global state\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 // Restore middleware\r\n if (currentOptions && originalMiddleware) {\r\n setInitialStateOptions(stateKey, {\r\n ...currentOptions,\r\n middleware: originalMiddleware,\r\n });\r\n }\r\n\r\n // COMPONENT UPDATE LOGIC\r\n const stateEntry = getGlobalStore\r\n .getState()\r\n .stateComponents.get(stateKey);\r\n console.log(\"component update logic stateEntry\", stateEntry);\r\n if (!stateEntry) return;\r\n\r\n // Build a set of all paths that should trigger updates\r\n const pathsToCheck = new Set<string>();\r\n console.log(\"component update logic pathsToCheck\", pathsToCheck);\r\n // Add root path if array length changed\r\n if (Array.isArray(currentState) && Array.isArray(newState)) {\r\n if (currentState.length !== newState.length) {\r\n pathsToCheck.add(\"\"); // Root path for array length changes\r\n }\r\n }\r\n console.log(\"component update logic pathsToCheck\", pathsToCheck);\r\n // Process each patch to determine affected paths\r\n patches.forEach((patch) => {\r\n const patchPath = patch.path.slice(1); // Remove leading slash\r\n const segments = patchPath.split(\"/\");\r\n\r\n // For array operations, we need to notify about the array itself\r\n if (patch.op === \"add\" || patch.op === \"remove\") {\r\n // Check if this is an array operation by seeing if the last segment is a number\r\n const lastSegment = segments[segments.length - 1];\r\n if (!isNaN(parseInt(lastSegment))) {\r\n // It's an array operation, add the parent path\r\n const parentPath = segments.slice(0, -1).join(\".\");\r\n pathsToCheck.add(parentPath);\r\n // Also add root if this is a top-level array\r\n if (parentPath === \"\") {\r\n pathsToCheck.add(\"\");\r\n }\r\n }\r\n }\r\n\r\n // Add the specific path and all parent paths\r\n let currentPath = \"\";\r\n segments.forEach((segment: any, index: any) => {\r\n if (index > 0) currentPath += \".\";\r\n currentPath += segment;\r\n pathsToCheck.add(currentPath);\r\n });\r\n\r\n // Always check root path\r\n pathsToCheck.add(\"\");\r\n });\r\n\r\n // Now check each component\r\n for (const [\r\n componentKey,\r\n component,\r\n ] of stateEntry.components.entries()) {\r\n console.log(\"component update logic component\", component);\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\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 // Check if component is watching any of the changed paths\r\n for (const watchedPath of component.paths) {\r\n if (pathsToCheck.has(watchedPath)) {\r\n shouldUpdate = true;\r\n break;\r\n }\r\n\r\n // Also check if a changed path is a child of a watched path\r\n for (const changedPath of pathsToCheck) {\r\n if (\r\n changedPath.startsWith(watchedPath + \".\") ||\r\n (watchedPath === \"\" && changedPath !== \"\")\r\n ) {\r\n shouldUpdate = true;\r\n break;\r\n }\r\n }\r\n\r\n if (shouldUpdate) break;\r\n }\r\n }\r\n\r\n if (!shouldUpdate && reactiveTypes.includes(\"deps\")) {\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\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","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","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","currentPath","sync","response","errorPath","thisReactiveState","initialStateAtPath","getSourceArrayAndIndices","item","index","selectedIndex","compareFn","sortedResult","a","b","newCurrentState","newMeta","originalIndex","callbackfn","filteredResult","finalPath","setter","createElement","SignalMapRenderer","fieldName","arrayToMap","flattenedResults","val","indexValue","currentArray","lastIndex","lastValue","newPath","pushFunc","fields","onMatch","matchedItem","isMatch","updatedItem","updatedArray","updateFn","cutFunc","value","found","thisValue","lastPathElement","parentValue","fn","$cogsSignal","parentKey","thisIndex","nested","patches","applyPatch","currentOptions","originalMiddleware","pathsToCheck","patch","segments","lastSegment","segment","watchedPath","thisObject","existingErrors","result","errorMessage","fullErrorPath","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"],"mappings":"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"}
|
package/package.json
CHANGED
package/src/CogsState.tsx
CHANGED
|
@@ -1487,7 +1487,10 @@ function createProxyHandler<T>(
|
|
|
1487
1487
|
) {
|
|
1488
1488
|
const currentPath = path.join(".");
|
|
1489
1489
|
const fullComponentId = `${stateKey}////${componentId}`;
|
|
1490
|
-
|
|
1490
|
+
console.log(
|
|
1491
|
+
".........................................................",
|
|
1492
|
+
currentPath
|
|
1493
|
+
);
|
|
1491
1494
|
const stateEntry = getGlobalStore
|
|
1492
1495
|
.getState()
|
|
1493
1496
|
.stateComponents.get(stateKey);
|