cogsbox-state 0.5.107 → 0.5.108
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 +99 -97
- package/dist/CogsState.jsx.map +1 -1
- package/dist/store.d.ts +1 -0
- package/dist/store.js +59 -51
- package/dist/store.js.map +1 -1
- package/package.json +1 -1
package/dist/CogsState.jsx
CHANGED
|
@@ -48,7 +48,7 @@ const zt = (t, i) => {
|
|
|
48
48
|
options: l,
|
|
49
49
|
initialOptionsPart: g
|
|
50
50
|
});
|
|
51
|
-
const e = r.getState().cogsStateStore[v] || y[v], S = l?.modifyState ? l.modifyState(e) : e, [x,
|
|
51
|
+
const e = r.getState().cogsStateStore[v] || y[v], S = l?.modifyState ? l.modifyState(e) : e, [x, A] = Ot(
|
|
52
52
|
S,
|
|
53
53
|
{
|
|
54
54
|
stateKey: v,
|
|
@@ -63,7 +63,7 @@ const zt = (t, i) => {
|
|
|
63
63
|
dependencies: l?.dependencies
|
|
64
64
|
}
|
|
65
65
|
);
|
|
66
|
-
return
|
|
66
|
+
return A;
|
|
67
67
|
};
|
|
68
68
|
function E(v, l) {
|
|
69
69
|
dt({ stateKey: v, options: l, initialOptionsPart: g });
|
|
@@ -75,11 +75,11 @@ const zt = (t, i) => {
|
|
|
75
75
|
getInitialOptions: q,
|
|
76
76
|
getKeyState: gt,
|
|
77
77
|
getValidationErrors: ht,
|
|
78
|
-
setStateLog:
|
|
78
|
+
setStateLog: Ct,
|
|
79
79
|
updateInitialStateGlobal: rt,
|
|
80
|
-
addValidationError:
|
|
81
|
-
removeValidationError:
|
|
82
|
-
setServerSyncActions:
|
|
80
|
+
addValidationError: kt,
|
|
81
|
+
removeValidationError: P,
|
|
82
|
+
setServerSyncActions: pt
|
|
83
83
|
} = r.getState(), ut = (t) => {
|
|
84
84
|
if (!t) return null;
|
|
85
85
|
try {
|
|
@@ -105,7 +105,7 @@ const zt = (t, i) => {
|
|
|
105
105
|
}, E = `${y}-${i}-${g}`;
|
|
106
106
|
window.localStorage.setItem(E, JSON.stringify(w));
|
|
107
107
|
}
|
|
108
|
-
},
|
|
108
|
+
}, Tt = (t, i, m, y, g, w) => {
|
|
109
109
|
const E = {
|
|
110
110
|
initialState: i,
|
|
111
111
|
updaterState: Y(
|
|
@@ -123,7 +123,9 @@ const zt = (t, i) => {
|
|
|
123
123
|
const m = /* @__PURE__ */ new Set();
|
|
124
124
|
i.components.forEach((y) => {
|
|
125
125
|
m.add(() => y.forceUpdate());
|
|
126
|
-
}),
|
|
126
|
+
}), queueMicrotask(() => {
|
|
127
|
+
m.forEach((y) => y());
|
|
128
|
+
});
|
|
127
129
|
}, Bt = (t, i) => {
|
|
128
130
|
const m = r.getState().stateComponents.get(t);
|
|
129
131
|
if (m) {
|
|
@@ -131,7 +133,7 @@ const zt = (t, i) => {
|
|
|
131
133
|
g && g.forceUpdate();
|
|
132
134
|
}
|
|
133
135
|
};
|
|
134
|
-
function
|
|
136
|
+
function Ot(t, {
|
|
135
137
|
stateKey: i,
|
|
136
138
|
serverSync: m,
|
|
137
139
|
localStorage: y,
|
|
@@ -144,10 +146,10 @@ function Tt(t, {
|
|
|
144
146
|
syncUpdate: e,
|
|
145
147
|
dependencies: S
|
|
146
148
|
} = {}) {
|
|
147
|
-
const [x,
|
|
148
|
-
let
|
|
149
|
-
const [u] = tt(i ?? nt()), s = r.getState().stateLog[u], G = Z(/* @__PURE__ */ new Set()),
|
|
150
|
-
|
|
149
|
+
const [x, A] = tt({}), { sessionId: T } = At();
|
|
150
|
+
let R = !i;
|
|
151
|
+
const [u] = tt(i ?? nt()), s = r.getState().stateLog[u], G = Z(/* @__PURE__ */ new Set()), b = Z(l ?? nt()), C = Z(null);
|
|
152
|
+
C.current = q(u), et(() => {
|
|
151
153
|
if (e && e.stateKey === u && e.path?.[0]) {
|
|
152
154
|
D(u, (o) => ({
|
|
153
155
|
...o,
|
|
@@ -163,106 +165,106 @@ function Tt(t, {
|
|
|
163
165
|
lt(u, {
|
|
164
166
|
initialState: f
|
|
165
167
|
});
|
|
166
|
-
const c =
|
|
168
|
+
const c = C.current;
|
|
167
169
|
let o = null;
|
|
168
170
|
const d = L(c?.localStorage?.key) ? c?.localStorage?.key(f) : c?.localStorage?.key;
|
|
169
|
-
console.log("newoptions", c), console.log("localkey", d), console.log("initialState", f), d &&
|
|
170
|
-
|
|
171
|
+
console.log("newoptions", c), console.log("localkey", d), console.log("initialState", f), d && T && (o = ut(
|
|
172
|
+
T + "-" + u + "-" + d
|
|
171
173
|
));
|
|
172
|
-
let I = null,
|
|
173
|
-
o && o.lastUpdated > (o.lastSyncedWithServer || 0) && (I = o.state,
|
|
174
|
+
let I = null, k = !1;
|
|
175
|
+
o && o.lastUpdated > (o.lastSyncedWithServer || 0) && (I = o.state, k = !0), f && (I = f), I && (console.log("newState thius is newstate", I), Tt(
|
|
174
176
|
u,
|
|
175
177
|
f,
|
|
176
178
|
I,
|
|
177
179
|
n,
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
),
|
|
180
|
+
b.current,
|
|
181
|
+
T
|
|
182
|
+
), k && c?.localStorage?.onChange && c?.localStorage?.onChange(I), ft(u), A({}));
|
|
181
183
|
}, [f, ...S || []]), vt(() => {
|
|
182
|
-
|
|
184
|
+
R && lt(u, {
|
|
183
185
|
serverSync: m,
|
|
184
186
|
formElements: g,
|
|
185
187
|
initialState: f,
|
|
186
188
|
localStorage: y,
|
|
187
189
|
middleware: w
|
|
188
190
|
});
|
|
189
|
-
const c = `${u}////${
|
|
191
|
+
const c = `${u}////${b.current}`, o = r.getState().stateComponents.get(u) || {
|
|
190
192
|
components: /* @__PURE__ */ new Map()
|
|
191
193
|
};
|
|
192
194
|
return o.components.set(c, {
|
|
193
|
-
forceUpdate: () =>
|
|
195
|
+
forceUpdate: () => A({}),
|
|
194
196
|
paths: /* @__PURE__ */ new Set(),
|
|
195
197
|
deps: [],
|
|
196
198
|
depsFunction: E || void 0,
|
|
197
199
|
reactiveType: v ?? ["component", "deps"]
|
|
198
|
-
}), r.getState().stateComponents.set(u, o),
|
|
199
|
-
const d = `${u}////${
|
|
200
|
+
}), r.getState().stateComponents.set(u, o), A({}), () => {
|
|
201
|
+
const d = `${u}////${b.current}`;
|
|
200
202
|
o && (o.components.delete(d), o.components.size === 0 && r.getState().stateComponents.delete(u));
|
|
201
203
|
};
|
|
202
204
|
}, []);
|
|
203
205
|
const n = (c, o, d, I) => {
|
|
204
206
|
if (Array.isArray(o)) {
|
|
205
|
-
const
|
|
206
|
-
G.current.add(
|
|
207
|
+
const k = `${u}-${o.join(".")}`;
|
|
208
|
+
G.current.add(k);
|
|
207
209
|
}
|
|
208
|
-
D(u, (
|
|
209
|
-
const N = L(c) ? c(
|
|
210
|
+
D(u, (k) => {
|
|
211
|
+
const N = L(c) ? c(k) : c, j = `${u}-${o.join(".")}`;
|
|
210
212
|
if (j) {
|
|
211
|
-
let
|
|
213
|
+
let F = !1, _ = r.getState().signalDomElements.get(j);
|
|
212
214
|
if ((!_ || _.size === 0) && (d.updateType === "insert" || d.updateType === "cut")) {
|
|
213
|
-
const
|
|
215
|
+
const V = o.slice(0, -1), h = U(N, V);
|
|
214
216
|
if (Array.isArray(h)) {
|
|
215
|
-
|
|
216
|
-
const $ = `${u}-${
|
|
217
|
+
F = !0;
|
|
218
|
+
const $ = `${u}-${V.join(".")}`;
|
|
217
219
|
_ = r.getState().signalDomElements.get($);
|
|
218
220
|
}
|
|
219
221
|
}
|
|
220
222
|
if (_) {
|
|
221
|
-
const
|
|
223
|
+
const V = F ? U(N, o.slice(0, -1)) : U(N, o);
|
|
222
224
|
_.forEach(({ parentId: h, position: $, effect: W }) => {
|
|
223
|
-
const
|
|
225
|
+
const O = document.querySelector(
|
|
224
226
|
`[data-parent-id="${h}"]`
|
|
225
227
|
);
|
|
226
|
-
if (
|
|
227
|
-
const it = Array.from(
|
|
228
|
+
if (O) {
|
|
229
|
+
const it = Array.from(O.childNodes);
|
|
228
230
|
if (it[$]) {
|
|
229
|
-
const yt = W ? new Function("state", `return (${W})(state)`)(
|
|
231
|
+
const yt = W ? new Function("state", `return (${W})(state)`)(V) : V;
|
|
230
232
|
it[$].textContent = String(yt);
|
|
231
233
|
}
|
|
232
234
|
}
|
|
233
235
|
});
|
|
234
236
|
}
|
|
235
237
|
}
|
|
236
|
-
d.updateType === "update" && (I ||
|
|
237
|
-
(I ||
|
|
238
|
+
d.updateType === "update" && (I || C.current?.validationKey) && o && P(
|
|
239
|
+
(I || C.current?.validationKey) + "." + o.join(".")
|
|
238
240
|
);
|
|
239
|
-
const
|
|
240
|
-
d.updateType === "cut" &&
|
|
241
|
-
|
|
242
|
-
), d.updateType === "insert" &&
|
|
243
|
-
|
|
244
|
-
).filter(([_,
|
|
241
|
+
const p = o.slice(0, o.length - 1);
|
|
242
|
+
d.updateType === "cut" && C.current?.validationKey && P(
|
|
243
|
+
C.current?.validationKey + "." + p.join(".")
|
|
244
|
+
), d.updateType === "insert" && C.current?.validationKey && ht(
|
|
245
|
+
C.current?.validationKey + "." + p.join(".")
|
|
246
|
+
).filter(([_, V]) => {
|
|
245
247
|
let h = _?.split(".").length;
|
|
246
|
-
if (_ ==
|
|
247
|
-
let $ = _ + "." +
|
|
248
|
-
|
|
248
|
+
if (_ == p.join(".") && h == p.length - 1) {
|
|
249
|
+
let $ = _ + "." + p;
|
|
250
|
+
P(_), kt($, V);
|
|
249
251
|
}
|
|
250
252
|
});
|
|
251
|
-
const z = U(
|
|
253
|
+
const z = U(k, o), St = U(N, o), mt = d.updateType === "update" ? o.join(".") : [...o].slice(0, -1).join("."), ot = r.getState().stateComponents.get(u);
|
|
252
254
|
if (ot)
|
|
253
|
-
for (const [
|
|
254
|
-
let
|
|
255
|
+
for (const [F, _] of ot.components.entries()) {
|
|
256
|
+
let V = !1;
|
|
255
257
|
const h = Array.isArray(_.reactiveType) ? _.reactiveType : [_.reactiveType || "component"];
|
|
256
258
|
if (!h.includes("none")) {
|
|
257
259
|
if (h.includes("all")) {
|
|
258
260
|
_.forceUpdate();
|
|
259
261
|
continue;
|
|
260
262
|
}
|
|
261
|
-
if (h.includes("component") && _.paths && (_.paths.has(mt) || _.paths.has("")) && (
|
|
263
|
+
if (h.includes("component") && _.paths && (_.paths.has(mt) || _.paths.has("")) && (V = !0), !V && h.includes("deps") && _.depsFunction) {
|
|
262
264
|
const $ = _.depsFunction(N);
|
|
263
|
-
typeof $ == "boolean" ? $ && (
|
|
265
|
+
typeof $ == "boolean" ? $ && (V = !0) : M(_.deps, $) || (_.deps = $, V = !0);
|
|
264
266
|
}
|
|
265
|
-
|
|
267
|
+
V && _.forceUpdate();
|
|
266
268
|
}
|
|
267
269
|
}
|
|
268
270
|
const at = {
|
|
@@ -274,25 +276,25 @@ function Tt(t, {
|
|
|
274
276
|
oldValue: z,
|
|
275
277
|
newValue: St
|
|
276
278
|
};
|
|
277
|
-
if (
|
|
278
|
-
const
|
|
279
|
-
const W = `${$.stateKey}:${JSON.stringify($.path)}`,
|
|
280
|
-
return
|
|
279
|
+
if (Ct(u, (F) => {
|
|
280
|
+
const V = [...F ?? [], at].reduce((h, $) => {
|
|
281
|
+
const W = `${$.stateKey}:${JSON.stringify($.path)}`, O = h.get(W);
|
|
282
|
+
return O ? (O.timeStamp = Math.max(O.timeStamp, $.timeStamp), O.newValue = $.newValue, O.oldValue = O.oldValue ?? $.oldValue, O.updateType = $.updateType) : h.set(W, { ...$ }), h;
|
|
281
283
|
}, /* @__PURE__ */ new Map());
|
|
282
|
-
return Array.from(
|
|
284
|
+
return Array.from(V.values());
|
|
283
285
|
}), xt(
|
|
284
286
|
N,
|
|
285
287
|
u,
|
|
286
|
-
|
|
287
|
-
|
|
288
|
+
C.current,
|
|
289
|
+
T
|
|
288
290
|
), w && w({
|
|
289
291
|
updateLog: s,
|
|
290
292
|
update: at
|
|
291
|
-
}),
|
|
292
|
-
const
|
|
293
|
-
|
|
293
|
+
}), C.current?.serverSync) {
|
|
294
|
+
const F = r.getState().serverState[u], _ = C.current?.serverSync;
|
|
295
|
+
pt(u, {
|
|
294
296
|
syncKey: typeof _.syncKey == "string" ? _.syncKey : _.syncKey({ state: N }),
|
|
295
|
-
rollBackState:
|
|
297
|
+
rollBackState: F,
|
|
296
298
|
actionTimeStamp: Date.now() + (_.debounce ?? 3e3),
|
|
297
299
|
status: "waiting"
|
|
298
300
|
});
|
|
@@ -305,15 +307,15 @@ function Tt(t, {
|
|
|
305
307
|
Y(
|
|
306
308
|
u,
|
|
307
309
|
n,
|
|
308
|
-
|
|
309
|
-
|
|
310
|
+
b.current,
|
|
311
|
+
T
|
|
310
312
|
)
|
|
311
313
|
), r.getState().cogsStateStore[u] || D(u, t), r.getState().initialStateGlobal[u] || rt(u, t));
|
|
312
314
|
const a = It(() => Y(
|
|
313
315
|
u,
|
|
314
316
|
n,
|
|
315
|
-
|
|
316
|
-
|
|
317
|
+
b.current,
|
|
318
|
+
T
|
|
317
319
|
), [u]);
|
|
318
320
|
return [gt(u), a];
|
|
319
321
|
}
|
|
@@ -327,15 +329,15 @@ function Y(t, i, m, y) {
|
|
|
327
329
|
w++;
|
|
328
330
|
}, v = {
|
|
329
331
|
removeValidation: (f) => {
|
|
330
|
-
f?.validationKey &&
|
|
332
|
+
f?.validationKey && P(f.validationKey);
|
|
331
333
|
},
|
|
332
334
|
revertToInitialState: (f) => {
|
|
333
335
|
const e = r.getState().getInitialOptions(t)?.validation;
|
|
334
|
-
e?.key &&
|
|
336
|
+
e?.key && P(e?.key), f?.validationKey && P(f.validationKey);
|
|
335
337
|
const S = r.getState().initialStateGlobal[t];
|
|
336
|
-
|
|
337
|
-
const x = l(S, []),
|
|
338
|
-
|
|
338
|
+
r.getState().clearSelectedIndexesForState(t), g.clear(), w++;
|
|
339
|
+
const x = l(S, []), A = q(t), T = L(A?.localStorage?.key) ? A?.localStorage?.key(S) : A?.localStorage?.key, R = `${y}-${t}-${T}`;
|
|
340
|
+
R && localStorage.removeItem(R), H(t, x), D(t, S);
|
|
339
341
|
const u = r.getState().stateComponents.get(t);
|
|
340
342
|
return u && u.components.forEach((s) => {
|
|
341
343
|
s.forceUpdate();
|
|
@@ -370,13 +372,13 @@ function Y(t, i, m, y) {
|
|
|
370
372
|
function l(f, e = [], S) {
|
|
371
373
|
const x = e.map(String).join(".");
|
|
372
374
|
g.get(x);
|
|
373
|
-
const
|
|
375
|
+
const A = function() {
|
|
374
376
|
return r().getNestedState(t, e);
|
|
375
377
|
};
|
|
376
378
|
Object.keys(v).forEach((u) => {
|
|
377
|
-
|
|
379
|
+
A[u] = v[u];
|
|
378
380
|
});
|
|
379
|
-
const
|
|
381
|
+
const T = {
|
|
380
382
|
apply(u, s, G) {
|
|
381
383
|
return console.log(
|
|
382
384
|
`PROXY APPLY TRAP HIT: stateKey=${t}, path=${e.join(".")}`
|
|
@@ -446,14 +448,14 @@ function Y(t, i, m, y) {
|
|
|
446
448
|
(o) => o.join(".") === e.join(".")
|
|
447
449
|
), c = a ? f : r.getState().getNestedState(t, e);
|
|
448
450
|
return s !== "stateMapNoRender" && (g.clear(), w++), c.map((o, d) => {
|
|
449
|
-
const I = a && o.__origIndex ? o.__origIndex : d,
|
|
451
|
+
const I = a && o.__origIndex ? o.__origIndex : d, k = l(
|
|
450
452
|
o,
|
|
451
453
|
[...e, I.toString()],
|
|
452
454
|
S
|
|
453
455
|
);
|
|
454
456
|
return n(
|
|
455
457
|
o,
|
|
456
|
-
|
|
458
|
+
k,
|
|
457
459
|
d,
|
|
458
460
|
f,
|
|
459
461
|
l(f, e, S)
|
|
@@ -510,10 +512,10 @@ function Y(t, i, m, y) {
|
|
|
510
512
|
let I = null;
|
|
511
513
|
if (!o.some((N) => {
|
|
512
514
|
if (a) {
|
|
513
|
-
const
|
|
515
|
+
const p = a.every(
|
|
514
516
|
(z) => M(N[z], d[z])
|
|
515
517
|
);
|
|
516
|
-
return
|
|
518
|
+
return p && (I = N), p;
|
|
517
519
|
}
|
|
518
520
|
const j = M(N, d);
|
|
519
521
|
return j && (I = N), j;
|
|
@@ -521,7 +523,7 @@ function Y(t, i, m, y) {
|
|
|
521
523
|
E(e), Q(i, d, e, t);
|
|
522
524
|
else if (c && I) {
|
|
523
525
|
const N = c(I), j = o.map(
|
|
524
|
-
(
|
|
526
|
+
(p) => M(p, I) ? N : p
|
|
525
527
|
);
|
|
526
528
|
E(e), B(i, j, e);
|
|
527
529
|
}
|
|
@@ -610,17 +612,17 @@ function Y(t, i, m, y) {
|
|
|
610
612
|
throw new Error("Zod schema not found");
|
|
611
613
|
if (!n?.key)
|
|
612
614
|
throw new Error("Validation key not found");
|
|
613
|
-
|
|
615
|
+
P(n.key);
|
|
614
616
|
const c = r.getState().cogsStateStore[t];
|
|
615
617
|
try {
|
|
616
618
|
const o = r.getState().getValidationErrors(n.key);
|
|
617
619
|
o && o.length > 0 && o.forEach(([I]) => {
|
|
618
|
-
I && I.startsWith(n.key) &&
|
|
620
|
+
I && I.startsWith(n.key) && P(I);
|
|
619
621
|
});
|
|
620
622
|
const d = n.zodSchema.safeParse(c);
|
|
621
|
-
return d.success ? !0 : (d.error.errors.forEach((
|
|
622
|
-
const N =
|
|
623
|
-
a(
|
|
623
|
+
return d.success ? !0 : (d.error.errors.forEach((k) => {
|
|
624
|
+
const N = k.path, j = k.message, p = [n.key, ...N].join(".");
|
|
625
|
+
a(p, j);
|
|
624
626
|
}), ft(t), !1);
|
|
625
627
|
} catch (o) {
|
|
626
628
|
return console.error("Zod schema validation failed", o), !1;
|
|
@@ -688,14 +690,14 @@ function Y(t, i, m, y) {
|
|
|
688
690
|
formOpts: a
|
|
689
691
|
}
|
|
690
692
|
);
|
|
691
|
-
const
|
|
692
|
-
return l(
|
|
693
|
+
const b = [...e, s], C = r.getState().getNestedState(t, b);
|
|
694
|
+
return l(C, b, S);
|
|
693
695
|
}
|
|
694
|
-
},
|
|
696
|
+
}, R = new Proxy(A, T);
|
|
695
697
|
return g.set(x, {
|
|
696
|
-
proxy:
|
|
698
|
+
proxy: R,
|
|
697
699
|
stateVersion: w
|
|
698
|
-
}),
|
|
700
|
+
}), R;
|
|
699
701
|
}
|
|
700
702
|
return l(
|
|
701
703
|
r.getState().getNestedState(t, [])
|
|
@@ -741,8 +743,8 @@ function bt({
|
|
|
741
743
|
"state",
|
|
742
744
|
`return (${t._effect})(state)`
|
|
743
745
|
)(e);
|
|
744
|
-
} catch (
|
|
745
|
-
console.error("Error evaluating effect function during mount:",
|
|
746
|
+
} catch (A) {
|
|
747
|
+
console.error("Error evaluating effect function during mount:", A), S = e;
|
|
746
748
|
}
|
|
747
749
|
else
|
|
748
750
|
S = e;
|
|
@@ -776,6 +778,6 @@ export {
|
|
|
776
778
|
qt as addStateOptions,
|
|
777
779
|
zt as createCogsState,
|
|
778
780
|
Bt as notifyComponent,
|
|
779
|
-
|
|
781
|
+
Ot as useCogsStateFn
|
|
780
782
|
};
|
|
781
783
|
//# sourceMappingURL=CogsState.jsx.map
|
package/dist/CogsState.jsx.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CogsState.jsx","sources":["../src/CogsState.tsx"],"sourcesContent":["\"use client\";\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 type { UseMutationResult } from \"@tanstack/react-query\";\r\nimport { v4 as uuidv4 } from \"uuid\";\r\nimport { ZodArray, ZodObject, type ZodRawShape } from \"zod\";\r\n\r\nimport { formRefStore, getGlobalStore, type ComponentsType } from \"./store.js\";\r\nimport { useCogsConfig } from \"./CogsStateClient.js\";\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> = (\r\n update:\r\n | Prettify<U>\r\n | ((prevState: NonNullable<Prettify<U>>[]) => NonNullable<Prettify<U>>),\r\n opts?: UpdateOpts<U>\r\n) => void;\r\n\r\ntype CutFunctionType = (\r\n index?: number,\r\n options?: { waitForSync?: boolean }\r\n) => void;\r\n\r\nexport type InferArrayElement<T> = T extends (infer U)[] ? U : never;\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>>;\r\n cut: CutFunctionType;\r\n _index: number;\r\n } & EndType<InferArrayElement<TShape>>;\r\n insert: PushArgs<InferArrayElement<TShape>>;\r\n cut: CutFunctionType;\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 stateFilter: (\r\n callbackfn: (value: InferArrayElement<TShape>, index: number) => void\r\n ) => ArrayEndType<TShape>;\r\n getSelected: () => StateObject<InferArrayElement<TShape>> | undefined;\r\n getSelectedIndex: () => number;\r\n} & EndType<TShape> & {\r\n [K in keyof (any[] extends infer T ? T : never)]: never;\r\n };\r\n\r\nexport type UpdateType<T> = (\r\n payload: UpdateArg<Prettify<T>>,\r\n opts?: UpdateOpts<T>\r\n) => void;\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\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 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 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 getFormRef: () => React.RefObject<any> | undefined;\r\n removeStorage: () => 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 [K in keyof (any extends infer T ? T : never)]: never;\r\n };\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 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:\r\n | TStateObject\r\n | ((prevState: TStateObject) => 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?: ZodObject<ZodRawShape> | ZodArray<ZodObject<ZodRawShape>>;\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 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 mutation: UseMutationResult<any, unknown, any, unknown>;\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\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 }\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 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,\r\n dependencies: options?.dependencies,\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\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\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 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\n\r\nconst saveToLocalStorage = <T,>(\r\n state: T,\r\n thisKey: string,\r\n currentInitialOptions: any,\r\n sessionId?: string\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 const key = isFunction(currentInitialOptions?.localStorage?.key)\r\n ? currentInitialOptions.localStorage?.key(state)\r\n : currentInitialOptions?.localStorage?.key;\r\n if (key && sessionId) {\r\n const data: LocalStorageData<T> = {\r\n state,\r\n lastUpdated: Date.now(),\r\n lastSyncedWithServer:\r\n getGlobalStore.getState().serverSyncLog[thisKey]?.[0]?.timeStamp,\r\n baseServerState: getGlobalStore.getState().serverState[thisKey],\r\n };\r\n\r\n const storageKey = `${sessionId}-${thisKey}-${key}`;\r\n\r\n window.localStorage.setItem(storageKey, JSON.stringify(data));\r\n }\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 updates.add(() => component.forceUpdate());\r\n });\r\n\r\n // Schedule updates in the next tick to allow batching\r\n\r\n updates.forEach((update) => update());\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\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\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 middleware,\r\n reactiveDeps,\r\n reactiveType,\r\n componentId,\r\n initialState,\r\n syncUpdate,\r\n dependencies,\r\n }: {\r\n stateKey?: string;\r\n componentId?: string;\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<any>(null);\r\n latestInitialOptionsRef.current = getInitialOptions(thisKey as string);\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\r\n useEffect(() => {\r\n setAndMergeOptions(thisKey as string, {\r\n initialState,\r\n });\r\n const options = latestInitialOptionsRef.current;\r\n let localData = null;\r\n\r\n const localkey = isFunction(options?.localStorage?.key)\r\n ? options?.localStorage?.key(initialState)\r\n : options?.localStorage?.key;\r\n\r\n console.log(\"newoptions\", options);\r\n console.log(\"localkey\", localkey);\r\n console.log(\"initialState\", initialState);\r\n\r\n if (localkey && sessionId) {\r\n localData = loadFromLocalStorage(\r\n sessionId + \"-\" + thisKey + \"-\" + localkey\r\n );\r\n }\r\n\r\n let newState = null;\r\n let loadingLocalData = false;\r\n if (localData) {\r\n if (localData.lastUpdated > (localData.lastSyncedWithServer || 0)) {\r\n newState = localData.state;\r\n loadingLocalData = true;\r\n }\r\n }\r\n if (initialState) {\r\n newState = initialState;\r\n }\r\n\r\n if (newState) {\r\n console.log(\"newState thius is newstate\", newState);\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 if (loadingLocalData && options?.localStorage?.onChange) {\r\n options?.localStorage?.onChange(newState);\r\n }\r\n\r\n notifyComponents(thisKey);\r\n forceUpdate({});\r\n }\r\n }, [initialState, ...(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,\r\n });\r\n }\r\n\r\n const depsKey = `${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(depsKey, {\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 depsKey = `${thisKey}////${componentIdRef.current}`;\r\n\r\n if (stateEntry) {\r\n stateEntry.components.delete(depsKey);\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:\r\n | TStateObject\r\n | ((prevState: TStateObject) => 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?.validationKey) &&\r\n path\r\n ) {\r\n removeValidationError(\r\n (validationKey || latestInitialOptionsRef.current?.validationKey) +\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?.validationKey\r\n ) {\r\n removeValidationError(\r\n latestInitialOptionsRef.current?.validationKey +\r\n \".\" +\r\n arrayWithoutIndex.join(\".\")\r\n );\r\n }\r\n if (\r\n updateObj.updateType === \"insert\" &&\r\n latestInitialOptionsRef.current?.validationKey\r\n ) {\r\n let getValidation = getValidationErrors(\r\n latestInitialOptionsRef.current?.validationKey +\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 oldValue = getNestedValue(prevValue, path);\r\n const newValue = getNestedValue(payload, path);\r\n const pathToCheck =\r\n updateObj.updateType === \"update\"\r\n ? path.join(\".\")\r\n : [...path].slice(0, -1).join(\".\");\r\n const stateEntry = getGlobalStore.getState().stateComponents.get(thisKey);\r\n\r\n if (stateEntry) {\r\n for (const [key, component] 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 // Skip if reactivity is disabled\r\n if (reactiveTypes.includes(\"none\")) {\r\n continue;\r\n }\r\n\r\n // Force update if \"all\" is specified\r\n if (reactiveTypes.includes(\"all\")) {\r\n component.forceUpdate();\r\n\r\n continue;\r\n }\r\n\r\n // Check component-level path reactivity\r\n if (reactiveTypes.includes(\"component\")) {\r\n if (\r\n component.paths &&\r\n (component.paths.has(pathToCheck) || component.paths.has(\"\"))\r\n ) {\r\n shouldUpdate = true;\r\n }\r\n }\r\n\r\n // Check dependency-based reactivity\r\n if (!shouldUpdate && reactiveTypes.includes(\"deps\")) {\r\n if (component.depsFunction) {\r\n const depsResult = component.depsFunction(payload);\r\n\r\n if (typeof depsResult === \"boolean\") {\r\n if (depsResult) {\r\n shouldUpdate = true;\r\n }\r\n } else if (!isDeepEqual(component.deps, depsResult)) {\r\n component.deps = depsResult;\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 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 (middleware) {\r\n 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 console.log(\"revert to initial state\");\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 console.log(\"revert initialState\", initialState);\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 console.log(\"revert storageKey\", storageKey);\r\n console.log(\"revert initalOptionsGet\", initalOptionsGet);\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 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 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 === \"_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 console.log(\"initialStateAtPath\", initialStateAtPath);\r\n console.log(\"thisReactiveState\", thisReactiveState);\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 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 === \"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 currentArray = getGlobalStore\r\n .getState()\r\n .getNestedState(stateKey, path) as any[];\r\n\r\n // Create a shallow copy with original indices\r\n const arrayCopy = currentArray.map((v: any, i: number) => ({\r\n ...v,\r\n __origIndex: i.toString(),\r\n }));\r\n\r\n // Sort the copy using the provided compare function\r\n const sortedArray = [...arrayCopy].sort(compareFn);\r\n\r\n // ADDED: Clear cache for sort operation\r\n shapeCache.clear();\r\n stateVersion++;\r\n\r\n // Return the sorted array with state objects\r\n return rebuildStateShape(sortedArray as any, path, {\r\n filtered: [...(meta?.filtered || []), path],\r\n validIndices: sortedArray.map((item) =>\r\n parseInt(item.__origIndex as string)\r\n ),\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 ) => void\r\n ) => {\r\n const isFiltered = meta?.filtered?.some(\r\n (p) => p.join(\".\") === path.join(\".\")\r\n );\r\n const arrayToMap = isFiltered\r\n ? currentState\r\n : getGlobalStore.getState().getNestedState(stateKey, path);\r\n\r\n if (prop !== \"stateMapNoRender\") {\r\n shapeCache.clear();\r\n stateVersion++;\r\n }\r\n\r\n return arrayToMap.map((val: any, index: number) => {\r\n const thisIndex =\r\n isFiltered && val.__origIndex ? val.__origIndex : index;\r\n const elementProxy = rebuildStateShape(\r\n val,\r\n [...path, thisIndex.toString()],\r\n meta\r\n );\r\n return callbackfn(\r\n val,\r\n elementProxy,\r\n index,\r\n currentState as any,\r\n rebuildStateShape(currentState as any, path, meta)\r\n );\r\n });\r\n };\r\n }\r\n if (prop === \"$stateMap\") {\r\n return (\r\n callbackfn: (\r\n value: InferArrayElement<T>,\r\n setter: StateObject<InferArrayElement<T>>,\r\n index: number,\r\n array: T,\r\n arraySetter: StateObject<T>\r\n ) => void\r\n ) => {\r\n return createElement(SignalMapRenderer, {\r\n proxy: {\r\n _stateKey: stateKey,\r\n _path: path,\r\n _mapFn: callbackfn as any, // Pass the actual function, not string\r\n },\r\n\r\n rebuildStateShape,\r\n });\r\n };\r\n }\r\n if (prop === \"stateFlattenOn\") {\r\n return (fieldName: string) => {\r\n const isFiltered = meta?.filtered?.some(\r\n (p) => p.join(\".\") === path.join(\".\")\r\n );\r\n const arrayToMap = isFiltered\r\n ? currentState\r\n : getGlobalStore.getState().getNestedState(stateKey, path);\r\n\r\n // ADDED: Clear shape cache for flattening operation\r\n shapeCache.clear();\r\n stateVersion++;\r\n\r\n const flattenedResults = arrayToMap.flatMap(\r\n (val: any, index: number) => {\r\n return val[fieldName] ?? [];\r\n }\r\n );\r\n\r\n return rebuildStateShape(\r\n flattenedResults,\r\n [...path, \"[*]\", fieldName],\r\n meta\r\n );\r\n };\r\n }\r\n\r\n if (prop === \"findWith\") {\r\n return (\r\n thisKey: keyof InferArrayElement<T>,\r\n thisValue: InferArrayElement<T>[keyof InferArrayElement<T>]\r\n ) => {\r\n const foundIndex = currentState.findIndex(\r\n (obj: any) => obj[thisKey] === thisValue\r\n );\r\n if (foundIndex === -1) return undefined;\r\n const foundValue = currentState[foundIndex];\r\n const newPath = [...path, foundIndex.toString()];\r\n // console.log(\r\n // \"findWithfindWithfindWithfindWith\",\r\n // stateKey,\r\n // foundValue,\r\n // newPath,\r\n // );\r\n shapeCache.clear();\r\n stateVersion++;\r\n\r\n // ADDED: Clear cache for find operation\r\n shapeCache.clear();\r\n stateVersion++;\r\n // Try returning without spread\r\n return rebuildStateShape(foundValue, newPath);\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\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().cogsStateStore[stateKey],\r\n []\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 };\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\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 newVal = currentState.map((v: any, i: number) => ({\r\n ...v,\r\n __origIndex: i.toString(),\r\n }));\r\n\r\n const validIndices: number[] = [];\r\n const filteredArray: Array<InferArrayElement<T>> = [];\r\n\r\n for (let i = 0; i < newVal.length; i++) {\r\n if (callbackfn(newVal[i], i)) {\r\n validIndices.push(i);\r\n filteredArray.push(newVal[i]);\r\n }\r\n }\r\n\r\n // ADDED: Clear cache for filter operation\r\n shapeCache.clear();\r\n stateVersion++;\r\n\r\n // Always include validIndices, even if it's an empty array\r\n return rebuildStateShape(filteredArray as any, path, {\r\n filtered: [...(meta?.filtered || []), path],\r\n validIndices: validIndices, // Always pass validIndices, even if empty\r\n });\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 (path.length == 0) {\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","addStateOptions","initialState","formElements","validation","createCogsState","opt","newInitialState","statePart","transformStateFunc","useCogsState","componentId","useState","uuidv4","thiState","partialState","state","updater","useCogsStateFn","setCogsOptions","setUpdaterState","setState","getKeyState","getValidationErrors","setStateLog","updateInitialStateGlobal","addValidationError","removeValidationError","setServerSyncActions","loadFromLocalStorage","localStorageKey","storedData","error","saveToLocalStorage","thisKey","currentInitialOptions","sessionId","isFunction","data","storageKey","updateGlobalState","newState","effectiveSetState","updates","createProxyHandler","notifyComponents","stateEntry","component","update","notifyComponent","fullComponentId","stateObject","serverSync","localStorage","middleware","reactiveDeps","reactiveType","syncUpdate","dependencies","reactiveForce","forceUpdate","useCogsConfig","noStateKey","stateLog","componentUpdatesRef","useRef","componentIdRef","latestInitialOptionsRef","useEffect","prevState","syncKey","localData","localkey","loadingLocalData","useLayoutEffect","depsKey","newStateOrFunction","path","updateObj","validationKey","pathKey","prevValue","payload","signalId","isArrayOperation","elements","arrayPath","arrayValue","getNestedValue","arraySignalId","newValue","parentId","position","effect","parent","childNodes","displayValue","arrayWithoutIndex","k","v","length","newKey","oldValue","pathToCheck","shouldUpdate","reactiveTypes","depsResult","isDeepEqual","newUpdate","prevLogs","aggregatedLogs","acc","log","uniqueKey","existing","serverStateStore","updaterFinal","useMemo","shapeCache","stateVersion","invalidateCachePath","baseObj","obj","init","newProxy","rebuildStateShape","initalOptionsGet","localKey","newUpdaterState","startTransition","field","serverState","currentState","meta","cacheKey","baseFunction","handler","target","thisArg","args","prop","currentPath","thisReactiveState","initialStateAtPath","selectedIndex","compareFn","sortedArray","i","item","callbackfn","isFiltered","p","arrayToMap","val","index","thisIndex","elementProxy","createElement","SignalMapRenderer","fieldName","flattenedResults","thisValue","foundIndex","foundValue","newPath","indexValue","pushFunc","fields","onMatch","currentArray","matchedItem","isMatch","updatedItem","updatedArray","updateFn","cutFunc","value","newVal","validIndices","filteredArray","lastPathElement","parentPath","parentValue","fn","$cogsSignal","parentKey","nested","thisObject","existingErrors","errorPath","result","errorMessage","fullErrorPath","formRefStore","children","hideMessage","jsx","ValidationWrapper","opts","debounce","child","formOpts","FormControlComponent","nextPath","nextValue","proxyInstance","proxy","SignalRenderer","setter","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\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 type { UseMutationResult } from \"@tanstack/react-query\";\r\nimport { v4 as uuidv4 } from \"uuid\";\r\nimport { ZodArray, ZodObject, type ZodRawShape } from \"zod\";\r\n\r\nimport { formRefStore, getGlobalStore, type ComponentsType } from \"./store.js\";\r\nimport { useCogsConfig } from \"./CogsStateClient.js\";\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> = (\r\n update:\r\n | Prettify<U>\r\n | ((prevState: NonNullable<Prettify<U>>[]) => NonNullable<Prettify<U>>),\r\n opts?: UpdateOpts<U>\r\n) => void;\r\n\r\ntype CutFunctionType = (\r\n index?: number,\r\n options?: { waitForSync?: boolean }\r\n) => void;\r\n\r\nexport type InferArrayElement<T> = T extends (infer U)[] ? U : never;\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>>;\r\n cut: CutFunctionType;\r\n _index: number;\r\n } & EndType<InferArrayElement<TShape>>;\r\n insert: PushArgs<InferArrayElement<TShape>>;\r\n cut: CutFunctionType;\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 stateFilter: (\r\n callbackfn: (value: InferArrayElement<TShape>, index: number) => void\r\n ) => ArrayEndType<TShape>;\r\n getSelected: () => StateObject<InferArrayElement<TShape>> | undefined;\r\n getSelectedIndex: () => number;\r\n} & EndType<TShape> & {\r\n [K in keyof (any[] extends infer T ? T : never)]: never;\r\n };\r\n\r\nexport type UpdateType<T> = (\r\n payload: UpdateArg<Prettify<T>>,\r\n opts?: UpdateOpts<T>\r\n) => void;\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\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 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 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 getFormRef: () => React.RefObject<any> | undefined;\r\n removeStorage: () => 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 [K in keyof (any extends infer T ? T : never)]: never;\r\n };\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 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:\r\n | TStateObject\r\n | ((prevState: TStateObject) => 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?: ZodObject<ZodRawShape> | ZodArray<ZodObject<ZodRawShape>>;\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 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 mutation: UseMutationResult<any, unknown, any, unknown>;\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\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 }\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 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,\r\n dependencies: options?.dependencies,\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\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\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 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\n\r\nconst saveToLocalStorage = <T,>(\r\n state: T,\r\n thisKey: string,\r\n currentInitialOptions: any,\r\n sessionId?: string\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 const key = isFunction(currentInitialOptions?.localStorage?.key)\r\n ? currentInitialOptions.localStorage?.key(state)\r\n : currentInitialOptions?.localStorage?.key;\r\n if (key && sessionId) {\r\n const data: LocalStorageData<T> = {\r\n state,\r\n lastUpdated: Date.now(),\r\n lastSyncedWithServer:\r\n getGlobalStore.getState().serverSyncLog[thisKey]?.[0]?.timeStamp,\r\n baseServerState: getGlobalStore.getState().serverState[thisKey],\r\n };\r\n\r\n const storageKey = `${sessionId}-${thisKey}-${key}`;\r\n\r\n window.localStorage.setItem(storageKey, JSON.stringify(data));\r\n }\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 updates.add(() => component.forceUpdate());\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\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\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 middleware,\r\n reactiveDeps,\r\n reactiveType,\r\n componentId,\r\n initialState,\r\n syncUpdate,\r\n dependencies,\r\n }: {\r\n stateKey?: string;\r\n componentId?: string;\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<any>(null);\r\n latestInitialOptionsRef.current = getInitialOptions(thisKey as string);\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\r\n useEffect(() => {\r\n setAndMergeOptions(thisKey as string, {\r\n initialState,\r\n });\r\n const options = latestInitialOptionsRef.current;\r\n let localData = null;\r\n\r\n const localkey = isFunction(options?.localStorage?.key)\r\n ? options?.localStorage?.key(initialState)\r\n : options?.localStorage?.key;\r\n\r\n console.log(\"newoptions\", options);\r\n console.log(\"localkey\", localkey);\r\n console.log(\"initialState\", initialState);\r\n\r\n if (localkey && sessionId) {\r\n localData = loadFromLocalStorage(\r\n sessionId + \"-\" + thisKey + \"-\" + localkey\r\n );\r\n }\r\n\r\n let newState = null;\r\n let loadingLocalData = false;\r\n if (localData) {\r\n if (localData.lastUpdated > (localData.lastSyncedWithServer || 0)) {\r\n newState = localData.state;\r\n loadingLocalData = true;\r\n }\r\n }\r\n if (initialState) {\r\n newState = initialState;\r\n }\r\n\r\n if (newState) {\r\n console.log(\"newState thius is newstate\", newState);\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 if (loadingLocalData && options?.localStorage?.onChange) {\r\n options?.localStorage?.onChange(newState);\r\n }\r\n\r\n notifyComponents(thisKey);\r\n forceUpdate({});\r\n }\r\n }, [initialState, ...(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,\r\n });\r\n }\r\n\r\n const depsKey = `${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(depsKey, {\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 depsKey = `${thisKey}////${componentIdRef.current}`;\r\n\r\n if (stateEntry) {\r\n stateEntry.components.delete(depsKey);\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:\r\n | TStateObject\r\n | ((prevState: TStateObject) => 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?.validationKey) &&\r\n path\r\n ) {\r\n removeValidationError(\r\n (validationKey || latestInitialOptionsRef.current?.validationKey) +\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?.validationKey\r\n ) {\r\n removeValidationError(\r\n latestInitialOptionsRef.current?.validationKey +\r\n \".\" +\r\n arrayWithoutIndex.join(\".\")\r\n );\r\n }\r\n if (\r\n updateObj.updateType === \"insert\" &&\r\n latestInitialOptionsRef.current?.validationKey\r\n ) {\r\n let getValidation = getValidationErrors(\r\n latestInitialOptionsRef.current?.validationKey +\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 oldValue = getNestedValue(prevValue, path);\r\n const newValue = getNestedValue(payload, path);\r\n const pathToCheck =\r\n updateObj.updateType === \"update\"\r\n ? path.join(\".\")\r\n : [...path].slice(0, -1).join(\".\");\r\n const stateEntry = getGlobalStore.getState().stateComponents.get(thisKey);\r\n\r\n if (stateEntry) {\r\n for (const [key, component] 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 // Skip if reactivity is disabled\r\n if (reactiveTypes.includes(\"none\")) {\r\n continue;\r\n }\r\n\r\n // Force update if \"all\" is specified\r\n if (reactiveTypes.includes(\"all\")) {\r\n component.forceUpdate();\r\n\r\n continue;\r\n }\r\n\r\n // Check component-level path reactivity\r\n if (reactiveTypes.includes(\"component\")) {\r\n if (\r\n component.paths &&\r\n (component.paths.has(pathToCheck) || component.paths.has(\"\"))\r\n ) {\r\n shouldUpdate = true;\r\n }\r\n }\r\n\r\n // Check dependency-based reactivity\r\n if (!shouldUpdate && reactiveTypes.includes(\"deps\")) {\r\n if (component.depsFunction) {\r\n const depsResult = component.depsFunction(payload);\r\n\r\n if (typeof depsResult === \"boolean\") {\r\n if (depsResult) {\r\n shouldUpdate = true;\r\n }\r\n } else if (!isDeepEqual(component.deps, depsResult)) {\r\n component.deps = depsResult;\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 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 (middleware) {\r\n 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 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 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 === \"_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 console.log(\"initialStateAtPath\", initialStateAtPath);\r\n console.log(\"thisReactiveState\", thisReactiveState);\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 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 === \"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 currentArray = getGlobalStore\r\n .getState()\r\n .getNestedState(stateKey, path) as any[];\r\n\r\n // Create a shallow copy with original indices\r\n const arrayCopy = currentArray.map((v: any, i: number) => ({\r\n ...v,\r\n __origIndex: i.toString(),\r\n }));\r\n\r\n // Sort the copy using the provided compare function\r\n const sortedArray = [...arrayCopy].sort(compareFn);\r\n\r\n // ADDED: Clear cache for sort operation\r\n shapeCache.clear();\r\n stateVersion++;\r\n\r\n // Return the sorted array with state objects\r\n return rebuildStateShape(sortedArray as any, path, {\r\n filtered: [...(meta?.filtered || []), path],\r\n validIndices: sortedArray.map((item) =>\r\n parseInt(item.__origIndex as string)\r\n ),\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 ) => void\r\n ) => {\r\n const isFiltered = meta?.filtered?.some(\r\n (p) => p.join(\".\") === path.join(\".\")\r\n );\r\n const arrayToMap = isFiltered\r\n ? currentState\r\n : getGlobalStore.getState().getNestedState(stateKey, path);\r\n\r\n if (prop !== \"stateMapNoRender\") {\r\n shapeCache.clear();\r\n stateVersion++;\r\n }\r\n\r\n return arrayToMap.map((val: any, index: number) => {\r\n const thisIndex =\r\n isFiltered && val.__origIndex ? val.__origIndex : index;\r\n const elementProxy = rebuildStateShape(\r\n val,\r\n [...path, thisIndex.toString()],\r\n meta\r\n );\r\n return callbackfn(\r\n val,\r\n elementProxy,\r\n index,\r\n currentState as any,\r\n rebuildStateShape(currentState as any, path, meta)\r\n );\r\n });\r\n };\r\n }\r\n if (prop === \"$stateMap\") {\r\n return (\r\n callbackfn: (\r\n value: InferArrayElement<T>,\r\n setter: StateObject<InferArrayElement<T>>,\r\n index: number,\r\n array: T,\r\n arraySetter: StateObject<T>\r\n ) => void\r\n ) => {\r\n return createElement(SignalMapRenderer, {\r\n proxy: {\r\n _stateKey: stateKey,\r\n _path: path,\r\n _mapFn: callbackfn as any, // Pass the actual function, not string\r\n },\r\n\r\n rebuildStateShape,\r\n });\r\n };\r\n }\r\n if (prop === \"stateFlattenOn\") {\r\n return (fieldName: string) => {\r\n const isFiltered = meta?.filtered?.some(\r\n (p) => p.join(\".\") === path.join(\".\")\r\n );\r\n const arrayToMap = isFiltered\r\n ? currentState\r\n : getGlobalStore.getState().getNestedState(stateKey, path);\r\n\r\n // ADDED: Clear shape cache for flattening operation\r\n shapeCache.clear();\r\n stateVersion++;\r\n\r\n const flattenedResults = arrayToMap.flatMap(\r\n (val: any, index: number) => {\r\n return val[fieldName] ?? [];\r\n }\r\n );\r\n\r\n return rebuildStateShape(\r\n flattenedResults,\r\n [...path, \"[*]\", fieldName],\r\n meta\r\n );\r\n };\r\n }\r\n\r\n if (prop === \"findWith\") {\r\n return (\r\n thisKey: keyof InferArrayElement<T>,\r\n thisValue: InferArrayElement<T>[keyof InferArrayElement<T>]\r\n ) => {\r\n const foundIndex = currentState.findIndex(\r\n (obj: any) => obj[thisKey] === thisValue\r\n );\r\n if (foundIndex === -1) return undefined;\r\n const foundValue = currentState[foundIndex];\r\n const newPath = [...path, foundIndex.toString()];\r\n // console.log(\r\n // \"findWithfindWithfindWithfindWith\",\r\n // stateKey,\r\n // foundValue,\r\n // newPath,\r\n // );\r\n shapeCache.clear();\r\n stateVersion++;\r\n\r\n // ADDED: Clear cache for find operation\r\n shapeCache.clear();\r\n stateVersion++;\r\n // Try returning without spread\r\n return rebuildStateShape(foundValue, newPath);\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\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().cogsStateStore[stateKey],\r\n []\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 };\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\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 newVal = currentState.map((v: any, i: number) => ({\r\n ...v,\r\n __origIndex: i.toString(),\r\n }));\r\n\r\n const validIndices: number[] = [];\r\n const filteredArray: Array<InferArrayElement<T>> = [];\r\n\r\n for (let i = 0; i < newVal.length; i++) {\r\n if (callbackfn(newVal[i], i)) {\r\n validIndices.push(i);\r\n filteredArray.push(newVal[i]);\r\n }\r\n }\r\n\r\n // ADDED: Clear cache for filter operation\r\n shapeCache.clear();\r\n stateVersion++;\r\n\r\n // Always include validIndices, even if it's an empty array\r\n return rebuildStateShape(filteredArray as any, path, {\r\n filtered: [...(meta?.filtered || []), path],\r\n validIndices: validIndices, // Always pass validIndices, even if empty\r\n });\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 (path.length == 0) {\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","addStateOptions","initialState","formElements","validation","createCogsState","opt","newInitialState","statePart","transformStateFunc","useCogsState","componentId","useState","uuidv4","thiState","partialState","state","updater","useCogsStateFn","setCogsOptions","setUpdaterState","setState","getKeyState","getValidationErrors","setStateLog","updateInitialStateGlobal","addValidationError","removeValidationError","setServerSyncActions","loadFromLocalStorage","localStorageKey","storedData","error","saveToLocalStorage","thisKey","currentInitialOptions","sessionId","isFunction","data","storageKey","updateGlobalState","newState","effectiveSetState","updates","createProxyHandler","notifyComponents","stateEntry","component","update","notifyComponent","fullComponentId","stateObject","serverSync","localStorage","middleware","reactiveDeps","reactiveType","syncUpdate","dependencies","reactiveForce","forceUpdate","useCogsConfig","noStateKey","stateLog","componentUpdatesRef","useRef","componentIdRef","latestInitialOptionsRef","useEffect","prevState","syncKey","localData","localkey","loadingLocalData","useLayoutEffect","depsKey","newStateOrFunction","path","updateObj","validationKey","pathKey","prevValue","payload","signalId","isArrayOperation","elements","arrayPath","arrayValue","getNestedValue","arraySignalId","newValue","parentId","position","effect","parent","childNodes","displayValue","arrayWithoutIndex","k","v","length","newKey","oldValue","pathToCheck","shouldUpdate","reactiveTypes","depsResult","isDeepEqual","newUpdate","prevLogs","aggregatedLogs","acc","log","uniqueKey","existing","serverStateStore","updaterFinal","useMemo","shapeCache","stateVersion","invalidateCachePath","baseObj","obj","init","newProxy","rebuildStateShape","initalOptionsGet","localKey","newUpdaterState","startTransition","field","serverState","currentState","meta","cacheKey","baseFunction","handler","target","thisArg","args","prop","currentPath","thisReactiveState","initialStateAtPath","selectedIndex","compareFn","sortedArray","i","item","callbackfn","isFiltered","p","arrayToMap","val","index","thisIndex","elementProxy","createElement","SignalMapRenderer","fieldName","flattenedResults","thisValue","foundIndex","foundValue","newPath","indexValue","pushFunc","fields","onMatch","currentArray","matchedItem","isMatch","updatedItem","updatedArray","updateFn","cutFunc","value","newVal","validIndices","filteredArray","lastPathElement","parentPath","parentValue","fn","$cogsSignal","parentKey","nested","thisObject","existingErrors","errorPath","result","errorMessage","fullErrorPath","formRefStore","children","hideMessage","jsx","ValidationWrapper","opts","debounce","child","formOpts","FormControlComponent","nextPath","nextValue","proxyInstance","proxy","SignalRenderer","setter","arraysetter","elementRef","element","parentElement","elementInfo","err","textNode","$cogsSignalStore","useSyncExternalStore","notify"],"mappings":"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"}
|
package/dist/store.d.ts
CHANGED
|
@@ -32,6 +32,7 @@ export type CogsGlobalState = {
|
|
|
32
32
|
selectedIndicesMap: Map<string, Map<string, number>>;
|
|
33
33
|
getSelectedIndex: (stateKey: string, parentPath: string) => number | undefined;
|
|
34
34
|
setSelectedIndex: (stateKey: string, parentPath: string, index: number | undefined) => void;
|
|
35
|
+
clearSelectedIndexesForState: (stateKey: string) => void;
|
|
35
36
|
updaterState: {
|
|
36
37
|
[key: string]: any;
|
|
37
38
|
};
|
package/dist/store.js
CHANGED
|
@@ -13,8 +13,8 @@ const v = u((a, i) => ({
|
|
|
13
13
|
// Get all refs that start with the stateKey prefix
|
|
14
14
|
getFormRefsByStateKey: (e) => {
|
|
15
15
|
const r = i().formRefs, t = e + ".", n = /* @__PURE__ */ new Map();
|
|
16
|
-
return r.forEach((
|
|
17
|
-
(
|
|
16
|
+
return r.forEach((s, o) => {
|
|
17
|
+
(o.startsWith(t) || o === e) && n.set(o, s);
|
|
18
18
|
}), n;
|
|
19
19
|
}
|
|
20
20
|
})), m = u((a, i) => ({
|
|
@@ -27,14 +27,22 @@ const v = u((a, i) => ({
|
|
|
27
27
|
},
|
|
28
28
|
setSelectedIndex: (e, r, t) => {
|
|
29
29
|
a((n) => {
|
|
30
|
-
const
|
|
31
|
-
let
|
|
32
|
-
return
|
|
30
|
+
const s = new Map(n.selectedIndicesMap);
|
|
31
|
+
let o = s.get(e);
|
|
32
|
+
return o || (o = /* @__PURE__ */ new Map(), s.set(e, o)), t === void 0 ? o.delete(r) : o.set(r, t), {
|
|
33
33
|
...n,
|
|
34
|
-
selectedIndicesMap:
|
|
34
|
+
selectedIndicesMap: s
|
|
35
35
|
};
|
|
36
36
|
});
|
|
37
37
|
},
|
|
38
|
+
clearSelectedIndexesForState: (e) => {
|
|
39
|
+
a((r) => {
|
|
40
|
+
const t = new Map(r.selectedIndicesMap);
|
|
41
|
+
return t.delete(e) ? (console.log(
|
|
42
|
+
`Cleared selected indices map entry for stateKey: ${e}`
|
|
43
|
+
), { selectedIndicesMap: t }) : {};
|
|
44
|
+
});
|
|
45
|
+
},
|
|
38
46
|
stateComponents: /* @__PURE__ */ new Map(),
|
|
39
47
|
subscribe: (e) => i().subscribe(e),
|
|
40
48
|
reactiveDeps: {},
|
|
@@ -60,8 +68,8 @@ const v = u((a, i) => ({
|
|
|
60
68
|
},
|
|
61
69
|
removeSignalElement: (e, r) => {
|
|
62
70
|
const t = i().signalDomElements, n = t.get(e);
|
|
63
|
-
n && n.forEach((
|
|
64
|
-
|
|
71
|
+
n && n.forEach((s) => {
|
|
72
|
+
s.instanceId === r && n.delete(s);
|
|
65
73
|
}), a({ signalDomElements: new Map(t) });
|
|
66
74
|
},
|
|
67
75
|
initialStateOptions: {},
|
|
@@ -104,11 +112,11 @@ const v = u((a, i) => ({
|
|
|
104
112
|
},
|
|
105
113
|
setStateLog: (e, r) => {
|
|
106
114
|
a((t) => {
|
|
107
|
-
const n = t.stateLog[e] ?? [],
|
|
115
|
+
const n = t.stateLog[e] ?? [], s = r(n);
|
|
108
116
|
return {
|
|
109
117
|
stateLog: {
|
|
110
118
|
...t.stateLog,
|
|
111
|
-
[e]:
|
|
119
|
+
[e]: s
|
|
112
120
|
}
|
|
113
121
|
};
|
|
114
122
|
});
|
|
@@ -131,78 +139,78 @@ const v = u((a, i) => ({
|
|
|
131
139
|
},
|
|
132
140
|
addValidationError: (e, r) => {
|
|
133
141
|
console.log("addValidationError---"), a((t) => {
|
|
134
|
-
const n = new Map(t.validationErrors),
|
|
135
|
-
return console.log("addValidationError", e, r,
|
|
142
|
+
const n = new Map(t.validationErrors), s = n.get(e) || [];
|
|
143
|
+
return console.log("addValidationError", e, r, s), n.set(e, [...s, r]), { validationErrors: n };
|
|
136
144
|
});
|
|
137
145
|
},
|
|
138
146
|
removeValidationError: (e) => {
|
|
139
147
|
a((r) => {
|
|
140
148
|
const t = new Map(r.validationErrors);
|
|
141
149
|
let n = !1;
|
|
142
|
-
const
|
|
143
|
-
return Array.from(t.keys()).forEach((
|
|
144
|
-
const
|
|
145
|
-
if (
|
|
146
|
-
let
|
|
147
|
-
for (let
|
|
148
|
-
if (c
|
|
149
|
-
|
|
150
|
+
const s = e.split(".");
|
|
151
|
+
return Array.from(t.keys()).forEach((o) => {
|
|
152
|
+
const l = o.split(".");
|
|
153
|
+
if (l.length >= s.length) {
|
|
154
|
+
let d = !0;
|
|
155
|
+
for (let c = 0; c < s.length; c++)
|
|
156
|
+
if (l[c] !== s[c]) {
|
|
157
|
+
d = !1;
|
|
150
158
|
break;
|
|
151
159
|
}
|
|
152
|
-
|
|
160
|
+
d && (n = !0, t.delete(o));
|
|
153
161
|
}
|
|
154
162
|
}), n ? { validationErrors: t } : r;
|
|
155
163
|
});
|
|
156
164
|
},
|
|
157
165
|
getValidationErrors: (e) => {
|
|
158
|
-
const r = [], t = i().validationErrors, n = e.split("."),
|
|
159
|
-
return Array.from(t.keys()).forEach((
|
|
160
|
-
const
|
|
161
|
-
if (
|
|
162
|
-
let
|
|
163
|
-
for (let
|
|
164
|
-
const
|
|
165
|
-
if (
|
|
166
|
-
const
|
|
167
|
-
if (isNaN(
|
|
168
|
-
|
|
166
|
+
const r = [], t = i().validationErrors, n = e.split("."), s = (o, l) => o === "[*]" ? !0 : Array.isArray(o) ? o.includes(parseInt(l)) : o === l;
|
|
167
|
+
return Array.from(t.keys()).forEach((o) => {
|
|
168
|
+
const l = o.split(".");
|
|
169
|
+
if (l.length >= n.length) {
|
|
170
|
+
let d = !0;
|
|
171
|
+
for (let c = 0; c < n.length; c++) {
|
|
172
|
+
const f = n[c], S = l[c];
|
|
173
|
+
if (f === "[*]" || Array.isArray(f)) {
|
|
174
|
+
const p = parseInt(S);
|
|
175
|
+
if (isNaN(p)) {
|
|
176
|
+
d = !1;
|
|
169
177
|
break;
|
|
170
178
|
}
|
|
171
|
-
if (!
|
|
172
|
-
|
|
179
|
+
if (!s(f, S)) {
|
|
180
|
+
d = !1;
|
|
173
181
|
break;
|
|
174
182
|
}
|
|
175
|
-
} else if (
|
|
176
|
-
|
|
183
|
+
} else if (f !== S) {
|
|
184
|
+
d = !1;
|
|
177
185
|
break;
|
|
178
186
|
}
|
|
179
187
|
}
|
|
180
|
-
if (
|
|
181
|
-
const
|
|
182
|
-
|
|
188
|
+
if (d) {
|
|
189
|
+
const c = t.get(o);
|
|
190
|
+
c && r.push(...c);
|
|
183
191
|
}
|
|
184
192
|
}
|
|
185
193
|
}), r;
|
|
186
194
|
},
|
|
187
195
|
getInitialOptions: (e) => i().initialStateOptions[e],
|
|
188
196
|
getNestedState: (e, r) => {
|
|
189
|
-
const t = i().cogsStateStore[e], n = (
|
|
190
|
-
if (
|
|
191
|
-
const
|
|
192
|
-
if (
|
|
193
|
-
if (!Array.isArray(
|
|
197
|
+
const t = i().cogsStateStore[e], n = (s, o) => {
|
|
198
|
+
if (o.length === 0) return s;
|
|
199
|
+
const l = o[0], d = o.slice(1);
|
|
200
|
+
if (l === "[*]") {
|
|
201
|
+
if (!Array.isArray(s)) {
|
|
194
202
|
console.warn("Asterisk notation used on non-array value");
|
|
195
203
|
return;
|
|
196
204
|
}
|
|
197
|
-
if (
|
|
198
|
-
const
|
|
199
|
-
(
|
|
205
|
+
if (d.length === 0) return s;
|
|
206
|
+
const f = s.map(
|
|
207
|
+
(S) => n(S, d)
|
|
200
208
|
);
|
|
201
|
-
return Array.isArray(
|
|
209
|
+
return Array.isArray(f[0]) ? f.flat() : f;
|
|
202
210
|
}
|
|
203
|
-
const
|
|
204
|
-
if (
|
|
205
|
-
return n(
|
|
211
|
+
const c = s[l];
|
|
212
|
+
if (c !== void 0)
|
|
213
|
+
return n(c, d);
|
|
206
214
|
};
|
|
207
215
|
return n(t, r);
|
|
208
216
|
},
|
package/dist/store.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"store.js","sources":["../src/store.ts"],"sourcesContent":["import { create } from \"zustand\";\r\nimport type {\r\n OptionsType,\r\n ReactivityType,\r\n StateKeys,\r\n SyncActionsType,\r\n SyncInfo,\r\n UpdateTypeDetail,\r\n} from \"./CogsState.js\";\r\n\r\ntype StateUpdater<StateValue> =\r\n | StateValue\r\n | ((prevValue: StateValue) => StateValue);\r\n\r\nexport type FreshValuesObject = {\r\n pathsToValues?: string[];\r\n prevValue?: any;\r\n newValue?: any;\r\n timeStamp: number;\r\n};\r\n\r\ntype SyncLogType = {\r\n timeStamp: number;\r\n};\r\ntype StateValue = any;\r\n\r\nexport type ComponentsType = {\r\n components: Map<\r\n string,\r\n {\r\n forceUpdate: () => void;\r\n paths: Set<string>;\r\n deps?: any[];\r\n depsFunction?: (state: any) => any[] | true;\r\n reactiveType: ReactivityType[] | ReactivityType;\r\n }\r\n >;\r\n};\r\nexport type FormRefStoreState = {\r\n formRefs: Map<string, React.RefObject<any>>;\r\n registerFormRef: (id: string, ref: React.RefObject<any>) => void;\r\n getFormRef: (id: string) => React.RefObject<any> | undefined;\r\n removeFormRef: (id: string) => void;\r\n // New method to get all refs for a stateKey\r\n getFormRefsByStateKey: (\r\n stateKey: string\r\n ) => Map<string, React.RefObject<any>>;\r\n};\r\n\r\nexport const formRefStore = create<FormRefStoreState>((set, get) => ({\r\n formRefs: new Map(),\r\n\r\n registerFormRef: (id, ref) =>\r\n set((state) => {\r\n const newRefs = new Map(state.formRefs);\r\n newRefs.set(id, ref);\r\n return { formRefs: newRefs };\r\n }),\r\n\r\n getFormRef: (id) => get().formRefs.get(id),\r\n\r\n removeFormRef: (id) =>\r\n set((state) => {\r\n const newRefs = new Map(state.formRefs);\r\n newRefs.delete(id);\r\n return { formRefs: newRefs };\r\n }),\r\n\r\n // Get all refs that start with the stateKey prefix\r\n getFormRefsByStateKey: (stateKey) => {\r\n const allRefs = get().formRefs;\r\n const stateKeyPrefix = stateKey + \".\";\r\n const filteredRefs = new Map();\r\n\r\n allRefs.forEach((ref, id) => {\r\n if (id.startsWith(stateKeyPrefix) || id === stateKey) {\r\n filteredRefs.set(id, ref);\r\n }\r\n });\r\n\r\n return filteredRefs;\r\n },\r\n}));\r\nexport type CogsGlobalState = {\r\n selectedIndicesMap: Map<string, Map<string, number>>; // stateKey -> (parentPath -> selectedIndex)\r\n\r\n // Add these new methods\r\n getSelectedIndex: (\r\n stateKey: string,\r\n parentPath: string\r\n ) => number | undefined;\r\n setSelectedIndex: (\r\n stateKey: string,\r\n parentPath: string,\r\n index: number | undefined\r\n ) => void;\r\n updaterState: { [key: string]: any };\r\n initialStateOptions: { [key: string]: OptionsType };\r\n cogsStateStore: { [key: string]: StateValue };\r\n isLoadingGlobal: { [key: string]: boolean };\r\n\r\n initialStateGlobal: { [key: string]: StateValue };\r\n validationErrors: Map<string, string[]>;\r\n\r\n serverState: { [key: string]: StateValue };\r\n serverSyncActions: { [key: string]: SyncActionsType<any> };\r\n\r\n serverSyncLog: { [key: string]: SyncLogType[] };\r\n serverSideOrNot: { [key: string]: boolean };\r\n setServerSyncLog: (key: string, newValue: SyncLogType) => void;\r\n\r\n setServerSideOrNot: (key: string, value: boolean) => void;\r\n getServerSideOrNot: (key: string) => boolean | undefined;\r\n setServerState: <StateKey extends StateKeys>(\r\n key: StateKey,\r\n value: StateValue\r\n ) => void;\r\n\r\n getThisLocalUpdate: (key: string) => UpdateTypeDetail[] | undefined;\r\n setServerSyncActions: (key: string, value: SyncActionsType<any>) => void;\r\n addValidationError: (path: string, message: string) => void;\r\n getValidationErrors: (path: string) => string[];\r\n updateInitialStateGlobal: (key: string, newState: StateValue) => void;\r\n getInitialOptions: (key: string) => OptionsType | undefined;\r\n getUpdaterState: (key: string) => StateUpdater<StateValue>;\r\n setUpdaterState: (key: string, newUpdater: any) => void;\r\n getKeyState: <StateKey extends StateKeys>(key: StateKey) => StateValue;\r\n getNestedState: <StateKey extends StateKeys>(\r\n key: StateKey,\r\n path: string[]\r\n ) => StateValue;\r\n setState: <StateKey extends StateKeys>(\r\n key: StateKey,\r\n value: StateUpdater<StateValue>\r\n ) => void;\r\n setInitialStates: (initialState: StateValue) => void;\r\n stateLog: { [key: string]: UpdateTypeDetail[] };\r\n setStateLog: (\r\n key: string,\r\n updater: (prevUpdates: UpdateTypeDetail[]) => UpdateTypeDetail[]\r\n ) => void;\r\n setIsLoadingGlobal: (key: string, value: boolean) => void;\r\n\r\n setInitialStateOptions: (key: string, value: OptionsType) => void;\r\n removeValidationError: (path: string) => void;\r\n signalDomElements: Map<\r\n string,\r\n Set<{\r\n instanceId: string;\r\n parentId: string;\r\n position: number;\r\n effect?: string;\r\n map?: string;\r\n }>\r\n >;\r\n addSignalElement: (\r\n signalId: string,\r\n elementInfo: {\r\n instanceId: string;\r\n parentId: string;\r\n position: number;\r\n effect?: string;\r\n map?: string;\r\n }\r\n ) => void;\r\n removeSignalElement: (signalId: string, instanceId: string) => void;\r\n reRenderTriggerPrevValue: Record<string, any>;\r\n\r\n reactiveDeps: Record<\r\n string,\r\n {\r\n deps: any[];\r\n updaters: Set<() => void>;\r\n depsFunction: ((state: any) => any[] | true) | null;\r\n }\r\n >;\r\n setReactiveDeps: (\r\n key: string,\r\n record: {\r\n deps: any[];\r\n updaters: Set<() => void>;\r\n depsFunction: ((state: any) => any[] | true) | null;\r\n }\r\n ) => void;\r\n deleteReactiveDeps: (key: string) => void;\r\n subscribe: (listener: () => void) => () => void;\r\n\r\n stateComponents: Map<string, ComponentsType>;\r\n syncInfoStore: Map<string, SyncInfo>;\r\n setSyncInfo: (key: string, syncInfo: SyncInfo) => void;\r\n getSyncInfo: (key: string) => SyncInfo | null;\r\n};\r\n\r\nexport const getGlobalStore = create<CogsGlobalState>((set, get) => ({\r\n selectedIndicesMap: new Map<string, Map<string, number>>(),\r\n\r\n // Add the new methods\r\n getSelectedIndex: (stateKey: string, parentPath: string) => {\r\n const stateMap = get().selectedIndicesMap.get(stateKey);\r\n if (!stateMap) return undefined;\r\n return stateMap.get(parentPath);\r\n },\r\n\r\n setSelectedIndex: (\r\n stateKey: string,\r\n parentPath: string,\r\n index: number | undefined\r\n ) => {\r\n set((state) => {\r\n const newMap = new Map(state.selectedIndicesMap);\r\n let stateMap = newMap.get(stateKey);\r\n\r\n if (!stateMap) {\r\n stateMap = new Map<string, number>();\r\n newMap.set(stateKey, stateMap);\r\n }\r\n\r\n if (index === undefined) {\r\n stateMap.delete(parentPath);\r\n } else {\r\n stateMap.set(parentPath, index);\r\n }\r\n\r\n return {\r\n ...state,\r\n selectedIndicesMap: newMap,\r\n };\r\n });\r\n },\r\n stateComponents: new Map(),\r\n subscribe: (listener: () => void) => {\r\n // zustand's subscribe returns an unsubscribe function\r\n return get().subscribe(listener);\r\n },\r\n\r\n reactiveDeps: {},\r\n setReactiveDeps: (key, record) =>\r\n set((state) => ({\r\n ...state,\r\n reactiveDeps: {\r\n ...state.reactiveDeps,\r\n [key]: record,\r\n },\r\n })),\r\n deleteReactiveDeps: (key) =>\r\n set((state) => {\r\n const { [key]: _, ...rest } = state.reactiveDeps;\r\n return {\r\n ...state,\r\n reactiveDeps: rest,\r\n };\r\n }),\r\n\r\n reRenderTriggerPrevValue: {},\r\n signalDomElements: new Map(),\r\n addSignalElement: (\r\n signalId: string,\r\n elementInfo: { instanceId: string; parentId: string; position: number }\r\n ) => {\r\n const current = get().signalDomElements;\r\n if (!current.has(signalId)) {\r\n current.set(signalId, new Set());\r\n }\r\n current.get(signalId)!.add(elementInfo);\r\n\r\n set({ signalDomElements: new Map(current) }); // Create new reference to trigger update\r\n },\r\n removeSignalElement: (signalId: string, instanceId: string) => {\r\n const current = get().signalDomElements;\r\n const elements = current.get(signalId);\r\n if (elements) {\r\n elements.forEach((el) => {\r\n if (el.instanceId === instanceId) {\r\n elements.delete(el);\r\n }\r\n });\r\n }\r\n set({ signalDomElements: new Map(current) });\r\n },\r\n initialStateOptions: {},\r\n updaterState: {},\r\n stateTimeline: {},\r\n cogsStateStore: {},\r\n stateLog: {},\r\n isLoadingGlobal: {},\r\n\r\n initialStateGlobal: {},\r\n validationErrors: new Map(),\r\n\r\n serverState: {},\r\n\r\n serverSyncActions: {},\r\n\r\n serverSyncLog: {},\r\n serverSideOrNot: {},\r\n setServerSyncLog: (key, newValue) => {\r\n set((state) => ({\r\n serverSyncLog: {\r\n ...state.serverSyncLog,\r\n [key]: [...(state.serverSyncLog[key] ?? []), newValue],\r\n },\r\n }));\r\n },\r\n setServerSideOrNot: (key, value) => {\r\n set((state) => ({\r\n serverSideOrNot: {\r\n ...state.serverSideOrNot,\r\n [key]: value,\r\n },\r\n }));\r\n },\r\n getServerSideOrNot: (key) => {\r\n return get().serverSideOrNot[key];\r\n },\r\n\r\n getThisLocalUpdate: (key: string) => {\r\n return get().stateLog[key];\r\n },\r\n setServerState: <StateKey extends StateKeys>(\r\n key: StateKey,\r\n value: StateValue\r\n ) => {\r\n set((prev) => ({\r\n serverState: {\r\n ...prev.serverState,\r\n [key]: value,\r\n },\r\n }));\r\n },\r\n\r\n setStateLog: (\r\n key: string,\r\n updater: (prevUpdates: UpdateTypeDetail[]) => UpdateTypeDetail[]\r\n ) => {\r\n set((prev) => {\r\n const currentUpdates = prev.stateLog[key] ?? [];\r\n const newUpdates = updater(currentUpdates);\r\n return {\r\n stateLog: {\r\n ...prev.stateLog,\r\n [key]: newUpdates,\r\n },\r\n };\r\n });\r\n },\r\n setIsLoadingGlobal: (key: string, value: boolean) => {\r\n set((prev) => ({\r\n isLoadingGlobal: {\r\n ...prev.isLoadingGlobal,\r\n [key]: value,\r\n },\r\n }));\r\n },\r\n setServerSyncActions: (key: string, value: SyncActionsType<any>) => {\r\n set((prev) => ({\r\n serverSyncActions: {\r\n ...prev.serverSyncActions,\r\n [key]: value,\r\n },\r\n }));\r\n },\r\n addValidationError: (path, message) => {\r\n console.log(\"addValidationError---\");\r\n set((prev) => {\r\n const updatedErrors = new Map(prev.validationErrors);\r\n const existingMessages = updatedErrors.get(path) || [];\r\n console.log(\"addValidationError\", path, message, existingMessages);\r\n // Append the new message instead of replacing\r\n updatedErrors.set(path, [...existingMessages, message]);\r\n return { validationErrors: updatedErrors };\r\n });\r\n },\r\n removeValidationError: (path) => {\r\n set((prev) => {\r\n const updatedErrors = new Map(prev.validationErrors);\r\n\r\n let doSomething = false;\r\n const pathArray = path.split(\".\");\r\n Array.from(updatedErrors.keys()).forEach((key) => {\r\n const keyArray = key.split(\".\");\r\n if (keyArray.length >= pathArray.length) {\r\n let match = true;\r\n for (let i = 0; i < pathArray.length; i++) {\r\n if (keyArray[i] !== pathArray[i]) {\r\n match = false;\r\n break;\r\n }\r\n }\r\n\r\n if (match) {\r\n doSomething = true;\r\n updatedErrors.delete(key);\r\n }\r\n }\r\n });\r\n\r\n return doSomething ? { validationErrors: updatedErrors } : prev;\r\n });\r\n },\r\n getValidationErrors: (path: string) => {\r\n const errors: string[] = [];\r\n const valErrors = get().validationErrors;\r\n const pathArray = path.split(\".\");\r\n\r\n // Helper to check if an index matches either a wildcard or is in an array of indices\r\n const isIndexMatch = (pathSegment: string, keySegment: string) => {\r\n if (pathSegment === \"[*]\") return true;\r\n if (Array.isArray(pathSegment)) {\r\n return pathSegment.includes(parseInt(keySegment));\r\n }\r\n return pathSegment === keySegment;\r\n };\r\n\r\n Array.from(valErrors.keys()).forEach((key) => {\r\n const keyArray = key.split(\".\");\r\n if (keyArray.length >= pathArray.length) {\r\n let match = true;\r\n for (let i = 0; i < pathArray.length; i++) {\r\n const pathSegment = pathArray[i];\r\n const keySegment = keyArray[i]!;\r\n\r\n // If current path segment is a number or [*], we need special handling\r\n if (pathSegment === \"[*]\" || Array.isArray(pathSegment)) {\r\n // Key segment should be a number if we're using [*] or array indices\r\n const keyIndex = parseInt(keySegment);\r\n if (isNaN(keyIndex)) {\r\n match = false;\r\n break;\r\n }\r\n\r\n if (!isIndexMatch(pathSegment, keySegment)) {\r\n match = false;\r\n break;\r\n }\r\n } else if (pathSegment !== keySegment) {\r\n match = false;\r\n break;\r\n }\r\n }\r\n\r\n if (match) {\r\n const errorMessages = valErrors.get(key);\r\n if (errorMessages) {\r\n errors.push(...errorMessages);\r\n }\r\n }\r\n }\r\n });\r\n\r\n return errors;\r\n },\r\n getInitialOptions: (key) => {\r\n return get().initialStateOptions[key];\r\n },\r\n getNestedState: (key: string, path: string[]) => {\r\n const rootState = get().cogsStateStore[key];\r\n\r\n const getValueWithAsterisk = (obj: any, pathArray: string[]): any => {\r\n if (pathArray.length === 0) return obj;\r\n\r\n const currentPath = pathArray[0];\r\n const remainingPath = pathArray.slice(1);\r\n\r\n if (currentPath === \"[*]\") {\r\n if (!Array.isArray(obj)) {\r\n console.warn(\"Asterisk notation used on non-array value\");\r\n return undefined;\r\n }\r\n\r\n if (remainingPath.length === 0) return obj;\r\n\r\n // Get result for each array item\r\n const results = obj.map((item) =>\r\n getValueWithAsterisk(item, remainingPath)\r\n );\r\n\r\n // If the next path segment exists and returns arrays, flatten them\r\n if (Array.isArray(results[0])) {\r\n return results.flat();\r\n }\r\n\r\n return results;\r\n }\r\n\r\n const value = obj[currentPath as keyof typeof obj];\r\n if (value === undefined) return undefined;\r\n\r\n return getValueWithAsterisk(value, remainingPath);\r\n };\r\n\r\n // This will still get the value but we need to make it reactive only to specific paths\r\n return getValueWithAsterisk(rootState, path);\r\n },\r\n setInitialStateOptions: (key, value) => {\r\n set((prev) => ({\r\n initialStateOptions: {\r\n ...prev.initialStateOptions,\r\n [key]: value,\r\n },\r\n }));\r\n },\r\n updateInitialStateGlobal: (key, newState) => {\r\n set((prev) => ({\r\n initialStateGlobal: {\r\n ...prev.initialStateGlobal,\r\n [key]: newState,\r\n },\r\n }));\r\n },\r\n getUpdaterState: (key) => {\r\n return get().updaterState[key];\r\n },\r\n setUpdaterState: (key, newUpdater) => {\r\n const current = get().updaterState;\r\n\r\n if (!key || !newUpdater) return;\r\n\r\n set({ updaterState: { ...(current ?? {}), [key]: newUpdater } });\r\n },\r\n getKeyState: <StateKey extends StateKeys>(key: StateKey) => {\r\n return get().cogsStateStore[key];\r\n },\r\n\r\n setState: <StateKey extends StateKeys>(key: StateKey, value: StateValue) => {\r\n set((prev) => {\r\n return {\r\n cogsStateStore: {\r\n ...prev.cogsStateStore,\r\n [key]:\r\n typeof value === \"function\"\r\n ? value(prev.cogsStateStore[key])\r\n : value,\r\n },\r\n };\r\n });\r\n },\r\n setInitialStates: <StateKey extends StateKeys>(initialState: StateValue) => {\r\n set((prev) => ({\r\n cogsStateStore: {\r\n ...prev.cogsStateStore,\r\n ...initialState,\r\n },\r\n }));\r\n },\r\n syncInfoStore: new Map<string, SyncInfo>(),\r\n setSyncInfo: (key: string, syncInfo: SyncInfo) =>\r\n set((state) => {\r\n const newMap = new Map(state.syncInfoStore);\r\n newMap.set(key, syncInfo);\r\n return { ...state, syncInfoStore: newMap };\r\n }),\r\n getSyncInfo: (key: string) => get().syncInfoStore.get(key) || null,\r\n}));\r\n"],"names":["formRefStore","create","set","get","id","ref","state","newRefs","stateKey","allRefs","stateKeyPrefix","filteredRefs","getGlobalStore","parentPath","stateMap","index","newMap","listener","key","record","_","rest","signalId","elementInfo","current","instanceId","elements","el","newValue","value","prev","updater","currentUpdates","newUpdates","path","message","updatedErrors","existingMessages","doSomething","pathArray","keyArray","match","i","errors","valErrors","isIndexMatch","pathSegment","keySegment","keyIndex","errorMessages","rootState","getValueWithAsterisk","obj","currentPath","remainingPath","results","item","newState","newUpdater","initialState","syncInfo"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"store.js","sources":["../src/store.ts"],"sourcesContent":["import { create } from \"zustand\";\r\nimport type {\r\n OptionsType,\r\n ReactivityType,\r\n StateKeys,\r\n SyncActionsType,\r\n SyncInfo,\r\n UpdateTypeDetail,\r\n} from \"./CogsState.js\";\r\n\r\ntype StateUpdater<StateValue> =\r\n | StateValue\r\n | ((prevValue: StateValue) => StateValue);\r\n\r\nexport type FreshValuesObject = {\r\n pathsToValues?: string[];\r\n prevValue?: any;\r\n newValue?: any;\r\n timeStamp: number;\r\n};\r\n\r\ntype SyncLogType = {\r\n timeStamp: number;\r\n};\r\ntype StateValue = any;\r\n\r\nexport type ComponentsType = {\r\n components: Map<\r\n string,\r\n {\r\n forceUpdate: () => void;\r\n paths: Set<string>;\r\n deps?: any[];\r\n depsFunction?: (state: any) => any[] | true;\r\n reactiveType: ReactivityType[] | ReactivityType;\r\n }\r\n >;\r\n};\r\nexport type FormRefStoreState = {\r\n formRefs: Map<string, React.RefObject<any>>;\r\n registerFormRef: (id: string, ref: React.RefObject<any>) => void;\r\n getFormRef: (id: string) => React.RefObject<any> | undefined;\r\n removeFormRef: (id: string) => void;\r\n // New method to get all refs for a stateKey\r\n getFormRefsByStateKey: (\r\n stateKey: string\r\n ) => Map<string, React.RefObject<any>>;\r\n};\r\n\r\nexport const formRefStore = create<FormRefStoreState>((set, get) => ({\r\n formRefs: new Map(),\r\n\r\n registerFormRef: (id, ref) =>\r\n set((state) => {\r\n const newRefs = new Map(state.formRefs);\r\n newRefs.set(id, ref);\r\n return { formRefs: newRefs };\r\n }),\r\n\r\n getFormRef: (id) => get().formRefs.get(id),\r\n\r\n removeFormRef: (id) =>\r\n set((state) => {\r\n const newRefs = new Map(state.formRefs);\r\n newRefs.delete(id);\r\n return { formRefs: newRefs };\r\n }),\r\n\r\n // Get all refs that start with the stateKey prefix\r\n getFormRefsByStateKey: (stateKey) => {\r\n const allRefs = get().formRefs;\r\n const stateKeyPrefix = stateKey + \".\";\r\n const filteredRefs = new Map();\r\n\r\n allRefs.forEach((ref, id) => {\r\n if (id.startsWith(stateKeyPrefix) || id === stateKey) {\r\n filteredRefs.set(id, ref);\r\n }\r\n });\r\n\r\n return filteredRefs;\r\n },\r\n}));\r\nexport type CogsGlobalState = {\r\n selectedIndicesMap: Map<string, Map<string, number>>; // stateKey -> (parentPath -> selectedIndex)\r\n\r\n // Add these new methods\r\n getSelectedIndex: (\r\n stateKey: string,\r\n parentPath: string\r\n ) => number | undefined;\r\n setSelectedIndex: (\r\n stateKey: string,\r\n parentPath: string,\r\n index: number | undefined\r\n ) => void;\r\n clearSelectedIndexesForState: (stateKey: string) => void;\r\n updaterState: { [key: string]: any };\r\n initialStateOptions: { [key: string]: OptionsType };\r\n cogsStateStore: { [key: string]: StateValue };\r\n isLoadingGlobal: { [key: string]: boolean };\r\n\r\n initialStateGlobal: { [key: string]: StateValue };\r\n validationErrors: Map<string, string[]>;\r\n\r\n serverState: { [key: string]: StateValue };\r\n serverSyncActions: { [key: string]: SyncActionsType<any> };\r\n\r\n serverSyncLog: { [key: string]: SyncLogType[] };\r\n serverSideOrNot: { [key: string]: boolean };\r\n setServerSyncLog: (key: string, newValue: SyncLogType) => void;\r\n\r\n setServerSideOrNot: (key: string, value: boolean) => void;\r\n getServerSideOrNot: (key: string) => boolean | undefined;\r\n setServerState: <StateKey extends StateKeys>(\r\n key: StateKey,\r\n value: StateValue\r\n ) => void;\r\n\r\n getThisLocalUpdate: (key: string) => UpdateTypeDetail[] | undefined;\r\n setServerSyncActions: (key: string, value: SyncActionsType<any>) => void;\r\n addValidationError: (path: string, message: string) => void;\r\n getValidationErrors: (path: string) => string[];\r\n updateInitialStateGlobal: (key: string, newState: StateValue) => void;\r\n getInitialOptions: (key: string) => OptionsType | undefined;\r\n getUpdaterState: (key: string) => StateUpdater<StateValue>;\r\n setUpdaterState: (key: string, newUpdater: any) => void;\r\n getKeyState: <StateKey extends StateKeys>(key: StateKey) => StateValue;\r\n getNestedState: <StateKey extends StateKeys>(\r\n key: StateKey,\r\n path: string[]\r\n ) => StateValue;\r\n setState: <StateKey extends StateKeys>(\r\n key: StateKey,\r\n value: StateUpdater<StateValue>\r\n ) => void;\r\n setInitialStates: (initialState: StateValue) => void;\r\n stateLog: { [key: string]: UpdateTypeDetail[] };\r\n setStateLog: (\r\n key: string,\r\n updater: (prevUpdates: UpdateTypeDetail[]) => UpdateTypeDetail[]\r\n ) => void;\r\n setIsLoadingGlobal: (key: string, value: boolean) => void;\r\n\r\n setInitialStateOptions: (key: string, value: OptionsType) => void;\r\n removeValidationError: (path: string) => void;\r\n signalDomElements: Map<\r\n string,\r\n Set<{\r\n instanceId: string;\r\n parentId: string;\r\n position: number;\r\n effect?: string;\r\n map?: string;\r\n }>\r\n >;\r\n addSignalElement: (\r\n signalId: string,\r\n elementInfo: {\r\n instanceId: string;\r\n parentId: string;\r\n position: number;\r\n effect?: string;\r\n map?: string;\r\n }\r\n ) => void;\r\n removeSignalElement: (signalId: string, instanceId: string) => void;\r\n reRenderTriggerPrevValue: Record<string, any>;\r\n\r\n reactiveDeps: Record<\r\n string,\r\n {\r\n deps: any[];\r\n updaters: Set<() => void>;\r\n depsFunction: ((state: any) => any[] | true) | null;\r\n }\r\n >;\r\n setReactiveDeps: (\r\n key: string,\r\n record: {\r\n deps: any[];\r\n updaters: Set<() => void>;\r\n depsFunction: ((state: any) => any[] | true) | null;\r\n }\r\n ) => void;\r\n deleteReactiveDeps: (key: string) => void;\r\n subscribe: (listener: () => void) => () => void;\r\n\r\n stateComponents: Map<string, ComponentsType>;\r\n syncInfoStore: Map<string, SyncInfo>;\r\n setSyncInfo: (key: string, syncInfo: SyncInfo) => void;\r\n getSyncInfo: (key: string) => SyncInfo | null;\r\n};\r\n\r\nexport const getGlobalStore = create<CogsGlobalState>((set, get) => ({\r\n selectedIndicesMap: new Map<string, Map<string, number>>(),\r\n\r\n // Add the new methods\r\n getSelectedIndex: (stateKey: string, parentPath: string) => {\r\n const stateMap = get().selectedIndicesMap.get(stateKey);\r\n if (!stateMap) return undefined;\r\n return stateMap.get(parentPath);\r\n },\r\n\r\n setSelectedIndex: (\r\n stateKey: string,\r\n parentPath: string,\r\n index: number | undefined\r\n ) => {\r\n set((state) => {\r\n const newMap = new Map(state.selectedIndicesMap);\r\n let stateMap = newMap.get(stateKey);\r\n\r\n if (!stateMap) {\r\n stateMap = new Map<string, number>();\r\n newMap.set(stateKey, stateMap);\r\n }\r\n\r\n if (index === undefined) {\r\n stateMap.delete(parentPath);\r\n } else {\r\n stateMap.set(parentPath, index);\r\n }\r\n\r\n return {\r\n ...state,\r\n selectedIndicesMap: newMap,\r\n };\r\n });\r\n },\r\n clearSelectedIndexesForState: (stateKey: string) => {\r\n set((state) => {\r\n const newOuterMap = new Map(state.selectedIndicesMap);\r\n const changed = newOuterMap.delete(stateKey);\r\n if (changed) {\r\n console.log(\r\n `Cleared selected indices map entry for stateKey: ${stateKey}`\r\n );\r\n return { selectedIndicesMap: newOuterMap };\r\n } else {\r\n return {};\r\n }\r\n });\r\n },\r\n stateComponents: new Map(),\r\n subscribe: (listener: () => void) => {\r\n // zustand's subscribe returns an unsubscribe function\r\n return get().subscribe(listener);\r\n },\r\n\r\n reactiveDeps: {},\r\n setReactiveDeps: (key, record) =>\r\n set((state) => ({\r\n ...state,\r\n reactiveDeps: {\r\n ...state.reactiveDeps,\r\n [key]: record,\r\n },\r\n })),\r\n deleteReactiveDeps: (key) =>\r\n set((state) => {\r\n const { [key]: _, ...rest } = state.reactiveDeps;\r\n return {\r\n ...state,\r\n reactiveDeps: rest,\r\n };\r\n }),\r\n\r\n reRenderTriggerPrevValue: {},\r\n signalDomElements: new Map(),\r\n addSignalElement: (\r\n signalId: string,\r\n elementInfo: { instanceId: string; parentId: string; position: number }\r\n ) => {\r\n const current = get().signalDomElements;\r\n if (!current.has(signalId)) {\r\n current.set(signalId, new Set());\r\n }\r\n current.get(signalId)!.add(elementInfo);\r\n\r\n set({ signalDomElements: new Map(current) }); // Create new reference to trigger update\r\n },\r\n removeSignalElement: (signalId: string, instanceId: string) => {\r\n const current = get().signalDomElements;\r\n const elements = current.get(signalId);\r\n if (elements) {\r\n elements.forEach((el) => {\r\n if (el.instanceId === instanceId) {\r\n elements.delete(el);\r\n }\r\n });\r\n }\r\n set({ signalDomElements: new Map(current) });\r\n },\r\n initialStateOptions: {},\r\n updaterState: {},\r\n stateTimeline: {},\r\n cogsStateStore: {},\r\n stateLog: {},\r\n isLoadingGlobal: {},\r\n\r\n initialStateGlobal: {},\r\n validationErrors: new Map(),\r\n\r\n serverState: {},\r\n\r\n serverSyncActions: {},\r\n\r\n serverSyncLog: {},\r\n serverSideOrNot: {},\r\n setServerSyncLog: (key, newValue) => {\r\n set((state) => ({\r\n serverSyncLog: {\r\n ...state.serverSyncLog,\r\n [key]: [...(state.serverSyncLog[key] ?? []), newValue],\r\n },\r\n }));\r\n },\r\n setServerSideOrNot: (key, value) => {\r\n set((state) => ({\r\n serverSideOrNot: {\r\n ...state.serverSideOrNot,\r\n [key]: value,\r\n },\r\n }));\r\n },\r\n getServerSideOrNot: (key) => {\r\n return get().serverSideOrNot[key];\r\n },\r\n\r\n getThisLocalUpdate: (key: string) => {\r\n return get().stateLog[key];\r\n },\r\n setServerState: <StateKey extends StateKeys>(\r\n key: StateKey,\r\n value: StateValue\r\n ) => {\r\n set((prev) => ({\r\n serverState: {\r\n ...prev.serverState,\r\n [key]: value,\r\n },\r\n }));\r\n },\r\n\r\n setStateLog: (\r\n key: string,\r\n updater: (prevUpdates: UpdateTypeDetail[]) => UpdateTypeDetail[]\r\n ) => {\r\n set((prev) => {\r\n const currentUpdates = prev.stateLog[key] ?? [];\r\n const newUpdates = updater(currentUpdates);\r\n return {\r\n stateLog: {\r\n ...prev.stateLog,\r\n [key]: newUpdates,\r\n },\r\n };\r\n });\r\n },\r\n setIsLoadingGlobal: (key: string, value: boolean) => {\r\n set((prev) => ({\r\n isLoadingGlobal: {\r\n ...prev.isLoadingGlobal,\r\n [key]: value,\r\n },\r\n }));\r\n },\r\n setServerSyncActions: (key: string, value: SyncActionsType<any>) => {\r\n set((prev) => ({\r\n serverSyncActions: {\r\n ...prev.serverSyncActions,\r\n [key]: value,\r\n },\r\n }));\r\n },\r\n addValidationError: (path, message) => {\r\n console.log(\"addValidationError---\");\r\n set((prev) => {\r\n const updatedErrors = new Map(prev.validationErrors);\r\n const existingMessages = updatedErrors.get(path) || [];\r\n console.log(\"addValidationError\", path, message, existingMessages);\r\n // Append the new message instead of replacing\r\n updatedErrors.set(path, [...existingMessages, message]);\r\n return { validationErrors: updatedErrors };\r\n });\r\n },\r\n removeValidationError: (path) => {\r\n set((prev) => {\r\n const updatedErrors = new Map(prev.validationErrors);\r\n\r\n let doSomething = false;\r\n const pathArray = path.split(\".\");\r\n Array.from(updatedErrors.keys()).forEach((key) => {\r\n const keyArray = key.split(\".\");\r\n if (keyArray.length >= pathArray.length) {\r\n let match = true;\r\n for (let i = 0; i < pathArray.length; i++) {\r\n if (keyArray[i] !== pathArray[i]) {\r\n match = false;\r\n break;\r\n }\r\n }\r\n\r\n if (match) {\r\n doSomething = true;\r\n updatedErrors.delete(key);\r\n }\r\n }\r\n });\r\n\r\n return doSomething ? { validationErrors: updatedErrors } : prev;\r\n });\r\n },\r\n getValidationErrors: (path: string) => {\r\n const errors: string[] = [];\r\n const valErrors = get().validationErrors;\r\n const pathArray = path.split(\".\");\r\n\r\n // Helper to check if an index matches either a wildcard or is in an array of indices\r\n const isIndexMatch = (pathSegment: string, keySegment: string) => {\r\n if (pathSegment === \"[*]\") return true;\r\n if (Array.isArray(pathSegment)) {\r\n return pathSegment.includes(parseInt(keySegment));\r\n }\r\n return pathSegment === keySegment;\r\n };\r\n\r\n Array.from(valErrors.keys()).forEach((key) => {\r\n const keyArray = key.split(\".\");\r\n if (keyArray.length >= pathArray.length) {\r\n let match = true;\r\n for (let i = 0; i < pathArray.length; i++) {\r\n const pathSegment = pathArray[i];\r\n const keySegment = keyArray[i]!;\r\n\r\n // If current path segment is a number or [*], we need special handling\r\n if (pathSegment === \"[*]\" || Array.isArray(pathSegment)) {\r\n // Key segment should be a number if we're using [*] or array indices\r\n const keyIndex = parseInt(keySegment);\r\n if (isNaN(keyIndex)) {\r\n match = false;\r\n break;\r\n }\r\n\r\n if (!isIndexMatch(pathSegment, keySegment)) {\r\n match = false;\r\n break;\r\n }\r\n } else if (pathSegment !== keySegment) {\r\n match = false;\r\n break;\r\n }\r\n }\r\n\r\n if (match) {\r\n const errorMessages = valErrors.get(key);\r\n if (errorMessages) {\r\n errors.push(...errorMessages);\r\n }\r\n }\r\n }\r\n });\r\n\r\n return errors;\r\n },\r\n getInitialOptions: (key) => {\r\n return get().initialStateOptions[key];\r\n },\r\n getNestedState: (key: string, path: string[]) => {\r\n const rootState = get().cogsStateStore[key];\r\n\r\n const getValueWithAsterisk = (obj: any, pathArray: string[]): any => {\r\n if (pathArray.length === 0) return obj;\r\n\r\n const currentPath = pathArray[0];\r\n const remainingPath = pathArray.slice(1);\r\n\r\n if (currentPath === \"[*]\") {\r\n if (!Array.isArray(obj)) {\r\n console.warn(\"Asterisk notation used on non-array value\");\r\n return undefined;\r\n }\r\n\r\n if (remainingPath.length === 0) return obj;\r\n\r\n // Get result for each array item\r\n const results = obj.map((item) =>\r\n getValueWithAsterisk(item, remainingPath)\r\n );\r\n\r\n // If the next path segment exists and returns arrays, flatten them\r\n if (Array.isArray(results[0])) {\r\n return results.flat();\r\n }\r\n\r\n return results;\r\n }\r\n\r\n const value = obj[currentPath as keyof typeof obj];\r\n if (value === undefined) return undefined;\r\n\r\n return getValueWithAsterisk(value, remainingPath);\r\n };\r\n\r\n // This will still get the value but we need to make it reactive only to specific paths\r\n return getValueWithAsterisk(rootState, path);\r\n },\r\n setInitialStateOptions: (key, value) => {\r\n set((prev) => ({\r\n initialStateOptions: {\r\n ...prev.initialStateOptions,\r\n [key]: value,\r\n },\r\n }));\r\n },\r\n updateInitialStateGlobal: (key, newState) => {\r\n set((prev) => ({\r\n initialStateGlobal: {\r\n ...prev.initialStateGlobal,\r\n [key]: newState,\r\n },\r\n }));\r\n },\r\n getUpdaterState: (key) => {\r\n return get().updaterState[key];\r\n },\r\n setUpdaterState: (key, newUpdater) => {\r\n const current = get().updaterState;\r\n\r\n if (!key || !newUpdater) return;\r\n\r\n set({ updaterState: { ...(current ?? {}), [key]: newUpdater } });\r\n },\r\n getKeyState: <StateKey extends StateKeys>(key: StateKey) => {\r\n return get().cogsStateStore[key];\r\n },\r\n\r\n setState: <StateKey extends StateKeys>(key: StateKey, value: StateValue) => {\r\n set((prev) => {\r\n return {\r\n cogsStateStore: {\r\n ...prev.cogsStateStore,\r\n [key]:\r\n typeof value === \"function\"\r\n ? value(prev.cogsStateStore[key])\r\n : value,\r\n },\r\n };\r\n });\r\n },\r\n setInitialStates: <StateKey extends StateKeys>(initialState: StateValue) => {\r\n set((prev) => ({\r\n cogsStateStore: {\r\n ...prev.cogsStateStore,\r\n ...initialState,\r\n },\r\n }));\r\n },\r\n syncInfoStore: new Map<string, SyncInfo>(),\r\n setSyncInfo: (key: string, syncInfo: SyncInfo) =>\r\n set((state) => {\r\n const newMap = new Map(state.syncInfoStore);\r\n newMap.set(key, syncInfo);\r\n return { ...state, syncInfoStore: newMap };\r\n }),\r\n getSyncInfo: (key: string) => get().syncInfoStore.get(key) || null,\r\n}));\r\n"],"names":["formRefStore","create","set","get","id","ref","state","newRefs","stateKey","allRefs","stateKeyPrefix","filteredRefs","getGlobalStore","parentPath","stateMap","index","newMap","newOuterMap","listener","key","record","_","rest","signalId","elementInfo","current","instanceId","elements","el","newValue","value","prev","updater","currentUpdates","newUpdates","path","message","updatedErrors","existingMessages","doSomething","pathArray","keyArray","match","i","errors","valErrors","isIndexMatch","pathSegment","keySegment","keyIndex","errorMessages","rootState","getValueWithAsterisk","obj","currentPath","remainingPath","results","item","newState","newUpdater","initialState","syncInfo"],"mappings":"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"}
|