cogsbox-state 0.5.282 → 0.5.284
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 +473 -452
- package/dist/CogsState.jsx.map +1 -1
- package/dist/store.d.ts +1 -1
- package/dist/store.js +65 -49
- package/dist/store.js.map +1 -1
- package/package.json +1 -1
- package/src/CogsState.tsx +79 -40
- package/src/store.ts +33 -5
package/dist/store.d.ts
CHANGED
|
@@ -38,7 +38,7 @@ export type CogsGlobalState = {
|
|
|
38
38
|
};
|
|
39
39
|
initializeShadowState: (key: string, initialState: any) => void;
|
|
40
40
|
updateShadowAtPath: (key: string, path: string[], newValue: any) => void;
|
|
41
|
-
insertShadowArrayElement: (key: string, arrayPath: string[]) => void;
|
|
41
|
+
insertShadowArrayElement: (key: string, arrayPath: string[], newItem: any) => void;
|
|
42
42
|
removeShadowArrayElement: (key: string, arrayPath: string[], index: number) => void;
|
|
43
43
|
getShadowMetadata: (key: string, path: string[]) => any;
|
|
44
44
|
setShadowMetadata: (key: string, path: string[], metadata: any) => void;
|
package/dist/store.js
CHANGED
|
@@ -1,26 +1,26 @@
|
|
|
1
1
|
import { create as u } from "zustand";
|
|
2
|
-
const w = u((s,
|
|
2
|
+
const w = u((s, S) => ({
|
|
3
3
|
formRefs: /* @__PURE__ */ new Map(),
|
|
4
4
|
registerFormRef: (e, r) => s((t) => {
|
|
5
5
|
const n = new Map(t.formRefs);
|
|
6
6
|
return n.set(e, r), { formRefs: n };
|
|
7
7
|
}),
|
|
8
|
-
getFormRef: (e) =>
|
|
8
|
+
getFormRef: (e) => S().formRefs.get(e),
|
|
9
9
|
removeFormRef: (e) => s((r) => {
|
|
10
10
|
const t = new Map(r.formRefs);
|
|
11
11
|
return t.delete(e), { formRefs: t };
|
|
12
12
|
}),
|
|
13
13
|
// Get all refs that start with the stateKey prefix
|
|
14
14
|
getFormRefsByStateKey: (e) => {
|
|
15
|
-
const r =
|
|
15
|
+
const r = S().formRefs, t = e + ".", n = /* @__PURE__ */ new Map();
|
|
16
16
|
return r.forEach((o, a) => {
|
|
17
17
|
(a.startsWith(t) || a === e) && n.set(a, o);
|
|
18
18
|
}), n;
|
|
19
19
|
}
|
|
20
|
-
})), h = u((s,
|
|
20
|
+
})), h = u((s, S) => ({
|
|
21
21
|
shadowStateStore: {},
|
|
22
22
|
getShadowMetadata: (e, r) => {
|
|
23
|
-
const t =
|
|
23
|
+
const t = S().shadowStateStore[e];
|
|
24
24
|
if (!t) return null;
|
|
25
25
|
let n = t;
|
|
26
26
|
for (const o of r)
|
|
@@ -64,19 +64,35 @@ const w = u((s, l) => ({
|
|
|
64
64
|
const o = { ...n.shadowStateStore };
|
|
65
65
|
if (!o[e]) return n;
|
|
66
66
|
let a = o[e];
|
|
67
|
-
const i = [...r],
|
|
68
|
-
for (const
|
|
69
|
-
a[
|
|
70
|
-
return
|
|
67
|
+
const i = [...r], c = i.pop();
|
|
68
|
+
for (const l of i)
|
|
69
|
+
a[l] || (a[l] = {}), a = a[l];
|
|
70
|
+
return c !== void 0 && (Array.isArray(t) ? a[c] = new Array(t.length) : typeof t == "object" && t !== null ? a[c] = {} : a[c] = a[c] || {}), { shadowStateStore: o };
|
|
71
71
|
});
|
|
72
72
|
},
|
|
73
|
-
insertShadowArrayElement: (e, r) => {
|
|
74
|
-
s((
|
|
75
|
-
const
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
73
|
+
insertShadowArrayElement: (e, r, t) => {
|
|
74
|
+
s((n) => {
|
|
75
|
+
const o = { ...n.shadowStateStore };
|
|
76
|
+
if (!o[e]) return n;
|
|
77
|
+
o[e] = JSON.parse(JSON.stringify(o[e]));
|
|
78
|
+
let a = o[e];
|
|
79
|
+
for (const i of r)
|
|
80
|
+
if (a = a[i], !a) return n;
|
|
81
|
+
if (Array.isArray(a)) {
|
|
82
|
+
const i = (c) => {
|
|
83
|
+
if (Array.isArray(c))
|
|
84
|
+
return c.map((l) => i(l));
|
|
85
|
+
if (typeof c == "object" && c !== null) {
|
|
86
|
+
const l = {};
|
|
87
|
+
for (const d in c)
|
|
88
|
+
l[d] = i(c[d]);
|
|
89
|
+
return l;
|
|
90
|
+
}
|
|
91
|
+
return {};
|
|
92
|
+
};
|
|
93
|
+
a.push(i(t));
|
|
94
|
+
}
|
|
95
|
+
return { shadowStateStore: o };
|
|
80
96
|
});
|
|
81
97
|
},
|
|
82
98
|
removeShadowArrayElement: (e, r, t) => {
|
|
@@ -91,7 +107,7 @@ const w = u((s, l) => ({
|
|
|
91
107
|
selectedIndicesMap: /* @__PURE__ */ new Map(),
|
|
92
108
|
// Add the new methods
|
|
93
109
|
getSelectedIndex: (e, r) => {
|
|
94
|
-
const t =
|
|
110
|
+
const t = S().selectedIndicesMap.get(e);
|
|
95
111
|
if (t)
|
|
96
112
|
return t.get(r);
|
|
97
113
|
},
|
|
@@ -128,7 +144,7 @@ const w = u((s, l) => ({
|
|
|
128
144
|
});
|
|
129
145
|
},
|
|
130
146
|
stateComponents: /* @__PURE__ */ new Map(),
|
|
131
|
-
subscribe: (e) =>
|
|
147
|
+
subscribe: (e) => S().subscribe(e),
|
|
132
148
|
reactiveDeps: {},
|
|
133
149
|
setReactiveDeps: (e, r) => s((t) => ({
|
|
134
150
|
...t,
|
|
@@ -147,11 +163,11 @@ const w = u((s, l) => ({
|
|
|
147
163
|
reRenderTriggerPrevValue: {},
|
|
148
164
|
signalDomElements: /* @__PURE__ */ new Map(),
|
|
149
165
|
addSignalElement: (e, r) => {
|
|
150
|
-
const t =
|
|
166
|
+
const t = S().signalDomElements;
|
|
151
167
|
t.has(e) || t.set(e, /* @__PURE__ */ new Set()), t.get(e).add(r), s({ signalDomElements: new Map(t) });
|
|
152
168
|
},
|
|
153
169
|
removeSignalElement: (e, r) => {
|
|
154
|
-
const t =
|
|
170
|
+
const t = S().signalDomElements, n = t.get(e);
|
|
155
171
|
n && n.forEach((o) => {
|
|
156
172
|
o.instanceId === r && n.delete(o);
|
|
157
173
|
}), s({ signalDomElements: new Map(t) });
|
|
@@ -193,8 +209,8 @@ const w = u((s, l) => ({
|
|
|
193
209
|
}
|
|
194
210
|
}));
|
|
195
211
|
},
|
|
196
|
-
getServerSideOrNot: (e) =>
|
|
197
|
-
getThisLocalUpdate: (e) =>
|
|
212
|
+
getServerSideOrNot: (e) => S().serverSideOrNot[e],
|
|
213
|
+
getThisLocalUpdate: (e) => S().stateLog[e],
|
|
198
214
|
setServerState: (e, r) => {
|
|
199
215
|
s((t) => ({
|
|
200
216
|
serverState: {
|
|
@@ -244,66 +260,66 @@ const w = u((s, l) => ({
|
|
|
244
260
|
return Array.from(t.keys()).forEach((a) => {
|
|
245
261
|
const i = a.split(".");
|
|
246
262
|
if (i.length >= o.length) {
|
|
247
|
-
let
|
|
248
|
-
for (let
|
|
249
|
-
if (i[
|
|
250
|
-
|
|
263
|
+
let c = !0;
|
|
264
|
+
for (let l = 0; l < o.length; l++)
|
|
265
|
+
if (i[l] !== o[l]) {
|
|
266
|
+
c = !1;
|
|
251
267
|
break;
|
|
252
268
|
}
|
|
253
|
-
|
|
269
|
+
c && (n = !0, t.delete(a));
|
|
254
270
|
}
|
|
255
271
|
}), n ? { validationErrors: t } : r;
|
|
256
272
|
});
|
|
257
273
|
},
|
|
258
274
|
getValidationErrors: (e) => {
|
|
259
|
-
const r = [], t =
|
|
275
|
+
const r = [], t = S().validationErrors, n = e.split("."), o = (a, i) => a === "[*]" ? !0 : Array.isArray(a) ? a.includes(parseInt(i)) : a === i;
|
|
260
276
|
return Array.from(t.keys()).forEach((a) => {
|
|
261
277
|
const i = a.split(".");
|
|
262
278
|
if (i.length >= n.length) {
|
|
263
|
-
let
|
|
264
|
-
for (let
|
|
265
|
-
const d = n[
|
|
279
|
+
let c = !0;
|
|
280
|
+
for (let l = 0; l < n.length; l++) {
|
|
281
|
+
const d = n[l], f = i[l];
|
|
266
282
|
if (d === "[*]" || Array.isArray(d)) {
|
|
267
283
|
const p = parseInt(f);
|
|
268
284
|
if (isNaN(p)) {
|
|
269
|
-
|
|
285
|
+
c = !1;
|
|
270
286
|
break;
|
|
271
287
|
}
|
|
272
288
|
if (!o(d, f)) {
|
|
273
|
-
|
|
289
|
+
c = !1;
|
|
274
290
|
break;
|
|
275
291
|
}
|
|
276
292
|
} else if (d !== f) {
|
|
277
|
-
|
|
293
|
+
c = !1;
|
|
278
294
|
break;
|
|
279
295
|
}
|
|
280
296
|
}
|
|
281
|
-
if (
|
|
282
|
-
const
|
|
283
|
-
|
|
297
|
+
if (c) {
|
|
298
|
+
const l = t.get(a);
|
|
299
|
+
l && r.push(...l);
|
|
284
300
|
}
|
|
285
301
|
}
|
|
286
302
|
}), r;
|
|
287
303
|
},
|
|
288
|
-
getInitialOptions: (e) =>
|
|
304
|
+
getInitialOptions: (e) => S().initialStateOptions[e],
|
|
289
305
|
getNestedState: (e, r) => {
|
|
290
|
-
const t =
|
|
306
|
+
const t = S().cogsStateStore[e], n = (o, a) => {
|
|
291
307
|
if (a.length === 0) return o;
|
|
292
|
-
const i = a[0],
|
|
308
|
+
const i = a[0], c = a.slice(1);
|
|
293
309
|
if (i === "[*]") {
|
|
294
310
|
if (!Array.isArray(o)) {
|
|
295
311
|
console.warn("Asterisk notation used on non-array value");
|
|
296
312
|
return;
|
|
297
313
|
}
|
|
298
|
-
if (
|
|
314
|
+
if (c.length === 0) return o;
|
|
299
315
|
const d = o.map(
|
|
300
|
-
(f) => n(f,
|
|
316
|
+
(f) => n(f, c)
|
|
301
317
|
);
|
|
302
318
|
return Array.isArray(d[0]) ? d.flat() : d;
|
|
303
319
|
}
|
|
304
|
-
const
|
|
305
|
-
if (
|
|
306
|
-
return n(
|
|
320
|
+
const l = o[i];
|
|
321
|
+
if (l !== void 0)
|
|
322
|
+
return n(l, c);
|
|
307
323
|
};
|
|
308
324
|
return n(t, r);
|
|
309
325
|
},
|
|
@@ -323,12 +339,12 @@ const w = u((s, l) => ({
|
|
|
323
339
|
}
|
|
324
340
|
}));
|
|
325
341
|
},
|
|
326
|
-
getUpdaterState: (e) =>
|
|
342
|
+
getUpdaterState: (e) => S().updaterState[e],
|
|
327
343
|
setUpdaterState: (e, r) => {
|
|
328
|
-
const t =
|
|
344
|
+
const t = S().updaterState;
|
|
329
345
|
!e || !r || s({ updaterState: { ...t ?? {}, [e]: r } });
|
|
330
346
|
},
|
|
331
|
-
getKeyState: (e) =>
|
|
347
|
+
getKeyState: (e) => S().cogsStateStore[e],
|
|
332
348
|
setState: (e, r) => {
|
|
333
349
|
s((t) => ({
|
|
334
350
|
cogsStateStore: {
|
|
@@ -358,7 +374,7 @@ const w = u((s, l) => ({
|
|
|
358
374
|
const n = new Map(t.syncInfoStore);
|
|
359
375
|
return n.set(e, r), { ...t, syncInfoStore: n };
|
|
360
376
|
}),
|
|
361
|
-
getSyncInfo: (e) =>
|
|
377
|
+
getSyncInfo: (e) => S().syncInfoStore.get(e) || null
|
|
362
378
|
}));
|
|
363
379
|
export {
|
|
364
380
|
w as formRefStore,
|
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 TrieNode = {\r\n subscribers: Set<string>;\r\n children: Map<string, TrieNode>;\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\n\r\ntype ShadowMetadata = {\r\n virtualisedState?: { listItemHeight: number };\r\n syncInfo?: { status: string };\r\n // Add other metadata fields you need\r\n};\r\n\r\ntype ShadowState<T> =\r\n T extends Array<infer U>\r\n ? Array<ShadowState<U>> & ShadowMetadata\r\n : T extends object\r\n ? { [K in keyof T]: ShadowState<T[K]> } & ShadowMetadata\r\n : ShadowMetadata;\r\nexport type CogsGlobalState = {\r\n shadowStateStore: { [key: string]: any };\r\n initializeShadowState: (key: string, initialState: any) => void;\r\n updateShadowAtPath: (key: string, path: string[], newValue: any) => void;\r\n insertShadowArrayElement: (key: string, arrayPath: string[]) => void;\r\n removeShadowArrayElement: (\r\n key: string,\r\n arrayPath: string[],\r\n index: number\r\n ) => void;\r\n getShadowMetadata: (key: string, path: string[]) => any;\r\n setShadowMetadata: (key: string, path: string[], metadata: any) => void;\r\n\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 clearSelectedIndex: ({\r\n stateKey,\r\n path,\r\n }: {\r\n stateKey: string;\r\n path: string[];\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 iniitialCreatedState: { [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 updateInitialCreatedState: (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 setCreatedState: (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 shadowStateStore: {},\r\n getShadowMetadata: (key: string, path: string[]) => {\r\n const shadow = get().shadowStateStore[key];\r\n if (!shadow) return null;\r\n\r\n let current = shadow;\r\n for (const segment of path) {\r\n current = current?.[segment];\r\n if (!current) return null;\r\n }\r\n\r\n return current;\r\n },\r\n\r\n setShadowMetadata: (key: string, path: string[], metadata: any) => {\r\n set((state) => {\r\n const newShadow = { ...state.shadowStateStore };\r\n if (!newShadow[key]) return state;\r\n\r\n newShadow[key] = JSON.parse(JSON.stringify(newShadow[key]));\r\n\r\n let current: any = newShadow[key];\r\n for (const segment of path) {\r\n if (!current[segment]) current[segment] = {};\r\n current = current[segment];\r\n }\r\n\r\n // Merge the metadata into the existing structure\r\n Object.keys(metadata).forEach((category) => {\r\n if (!current[category]) {\r\n current[category] = {};\r\n }\r\n Object.assign(current[category], metadata[category]);\r\n });\r\n\r\n return { shadowStateStore: newShadow };\r\n });\r\n },\r\n initializeShadowState: (key: string, initialState: any) => {\r\n const createShadowStructure = (obj: any): any => {\r\n if (Array.isArray(obj)) {\r\n return new Array(obj.length)\r\n .fill(null)\r\n .map((_, i) => createShadowStructure(obj[i]));\r\n }\r\n if (typeof obj === \"object\" && obj !== null) {\r\n const shadow: any = {};\r\n for (const k in obj) {\r\n shadow[k] = createShadowStructure(obj[k]);\r\n }\r\n return shadow;\r\n }\r\n return {}; // Leaf node - empty object for metadata\r\n };\r\n\r\n set((state) => ({\r\n shadowStateStore: {\r\n ...state.shadowStateStore,\r\n [key]: createShadowStructure(initialState),\r\n },\r\n }));\r\n },\r\n\r\n updateShadowAtPath: (key: string, path: string[], newValue: any) => {\r\n set((state) => {\r\n const newShadow = { ...state.shadowStateStore };\r\n if (!newShadow[key]) return state;\r\n\r\n let current = newShadow[key];\r\n const pathCopy = [...path];\r\n const lastSegment = pathCopy.pop();\r\n\r\n // Navigate to parent\r\n for (const segment of pathCopy) {\r\n if (!current[segment]) current[segment] = {};\r\n current = current[segment];\r\n }\r\n\r\n // Update shadow structure to match new value structure\r\n if (lastSegment !== undefined) {\r\n if (Array.isArray(newValue)) {\r\n current[lastSegment] = new Array(newValue.length);\r\n } else if (typeof newValue === \"object\" && newValue !== null) {\r\n current[lastSegment] = {};\r\n } else {\r\n current[lastSegment] = current[lastSegment] || {};\r\n }\r\n }\r\n\r\n return { shadowStateStore: newShadow };\r\n });\r\n },\r\n\r\n insertShadowArrayElement: (key: string, arrayPath: string[]) => {\r\n set((state) => {\r\n const newShadow = { ...state.shadowStateStore };\r\n let current = newShadow[key];\r\n\r\n for (const segment of arrayPath) {\r\n current = current?.[segment];\r\n }\r\n\r\n if (Array.isArray(current)) {\r\n current.push({});\r\n }\r\n\r\n return { shadowStateStore: newShadow };\r\n });\r\n },\r\n\r\n removeShadowArrayElement: (\r\n key: string,\r\n arrayPath: string[],\r\n index: number\r\n ) => {\r\n set((state) => {\r\n const newShadow = { ...state.shadowStateStore };\r\n let current = newShadow[key];\r\n\r\n for (const segment of arrayPath) {\r\n current = current?.[segment];\r\n }\r\n\r\n if (Array.isArray(current)) {\r\n current.splice(index, 1);\r\n }\r\n\r\n return { shadowStateStore: newShadow };\r\n });\r\n },\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 clearSelectedIndex: ({\r\n stateKey,\r\n path,\r\n }: {\r\n stateKey: string;\r\n path: string[];\r\n }) => {\r\n set((state) => {\r\n const newMap = new Map(state.selectedIndicesMap);\r\n const stateMap = newMap.get(stateKey);\r\n if (!stateMap) return state;\r\n const parentPath = path.join(\".\");\r\n stateMap.delete(parentPath);\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 iniitialCreatedState: {},\r\n updateInitialCreatedState: (key, newState) => {\r\n set((prev) => ({\r\n iniitialCreatedState: {\r\n ...prev.iniitialCreatedState,\r\n [key]: newState,\r\n },\r\n }));\r\n },\r\n\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 setCreatedState: (initialState: StateValue) => {\r\n set((prev) => ({\r\n iniitialCreatedState: {\r\n ...prev.cogsStateStore,\r\n ...initialState,\r\n },\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","key","path","shadow","current","segment","metadata","newShadow","category","initialState","createShadowStructure","obj","_","i","k","newValue","pathCopy","lastSegment","arrayPath","index","parentPath","stateMap","newMap","newOuterMap","listener","record","rest","signalId","elementInfo","instanceId","elements","el","newState","prev","value","updater","currentUpdates","newUpdates","message","updatedErrors","existingMessages","doSomething","pathArray","keyArray","match","errors","valErrors","isIndexMatch","pathSegment","keySegment","keyIndex","errorMessages","rootState","getValueWithAsterisk","currentPath","remainingPath","results","item","newUpdater","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 TrieNode = {\r\n subscribers: Set<string>;\r\n children: Map<string, TrieNode>;\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\n\r\ntype ShadowMetadata = {\r\n virtualisedState?: { listItemHeight: number };\r\n syncInfo?: { status: string };\r\n // Add other metadata fields you need\r\n};\r\n\r\ntype ShadowState<T> =\r\n T extends Array<infer U>\r\n ? Array<ShadowState<U>> & ShadowMetadata\r\n : T extends object\r\n ? { [K in keyof T]: ShadowState<T[K]> } & ShadowMetadata\r\n : ShadowMetadata;\r\nexport type CogsGlobalState = {\r\n shadowStateStore: { [key: string]: any };\r\n initializeShadowState: (key: string, initialState: any) => void;\r\n updateShadowAtPath: (key: string, path: string[], newValue: any) => void;\r\n insertShadowArrayElement: (\r\n key: string,\r\n arrayPath: string[],\r\n newItem: any\r\n ) => void;\r\n removeShadowArrayElement: (\r\n key: string,\r\n arrayPath: string[],\r\n index: number\r\n ) => void;\r\n getShadowMetadata: (key: string, path: string[]) => any;\r\n setShadowMetadata: (key: string, path: string[], metadata: any) => void;\r\n\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 clearSelectedIndex: ({\r\n stateKey,\r\n path,\r\n }: {\r\n stateKey: string;\r\n path: string[];\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 iniitialCreatedState: { [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 updateInitialCreatedState: (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 setCreatedState: (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 shadowStateStore: {},\r\n getShadowMetadata: (key: string, path: string[]) => {\r\n const shadow = get().shadowStateStore[key];\r\n if (!shadow) return null;\r\n\r\n let current = shadow;\r\n for (const segment of path) {\r\n current = current?.[segment];\r\n if (!current) return null;\r\n }\r\n\r\n return current;\r\n },\r\n\r\n setShadowMetadata: (key: string, path: string[], metadata: any) => {\r\n set((state) => {\r\n const newShadow = { ...state.shadowStateStore };\r\n if (!newShadow[key]) return state;\r\n\r\n newShadow[key] = JSON.parse(JSON.stringify(newShadow[key]));\r\n\r\n let current: any = newShadow[key];\r\n for (const segment of path) {\r\n if (!current[segment]) current[segment] = {};\r\n current = current[segment];\r\n }\r\n\r\n // Merge the metadata into the existing structure\r\n Object.keys(metadata).forEach((category) => {\r\n if (!current[category]) {\r\n current[category] = {};\r\n }\r\n Object.assign(current[category], metadata[category]);\r\n });\r\n\r\n return { shadowStateStore: newShadow };\r\n });\r\n },\r\n initializeShadowState: (key: string, initialState: any) => {\r\n const createShadowStructure = (obj: any): any => {\r\n if (Array.isArray(obj)) {\r\n return new Array(obj.length)\r\n .fill(null)\r\n .map((_, i) => createShadowStructure(obj[i]));\r\n }\r\n if (typeof obj === \"object\" && obj !== null) {\r\n const shadow: any = {};\r\n for (const k in obj) {\r\n shadow[k] = createShadowStructure(obj[k]);\r\n }\r\n return shadow;\r\n }\r\n return {}; // Leaf node - empty object for metadata\r\n };\r\n\r\n set((state) => ({\r\n shadowStateStore: {\r\n ...state.shadowStateStore,\r\n [key]: createShadowStructure(initialState),\r\n },\r\n }));\r\n },\r\n\r\n updateShadowAtPath: (key: string, path: string[], newValue: any) => {\r\n set((state) => {\r\n const newShadow = { ...state.shadowStateStore };\r\n if (!newShadow[key]) return state;\r\n\r\n let current = newShadow[key];\r\n const pathCopy = [...path];\r\n const lastSegment = pathCopy.pop();\r\n\r\n // Navigate to parent\r\n for (const segment of pathCopy) {\r\n if (!current[segment]) current[segment] = {};\r\n current = current[segment];\r\n }\r\n\r\n // Update shadow structure to match new value structure\r\n if (lastSegment !== undefined) {\r\n if (Array.isArray(newValue)) {\r\n current[lastSegment] = new Array(newValue.length);\r\n } else if (typeof newValue === \"object\" && newValue !== null) {\r\n current[lastSegment] = {};\r\n } else {\r\n current[lastSegment] = current[lastSegment] || {};\r\n }\r\n }\r\n\r\n return { shadowStateStore: newShadow };\r\n });\r\n },\r\n\r\n insertShadowArrayElement: (\r\n key: string,\r\n arrayPath: string[],\r\n newItem: any\r\n ) => {\r\n set((state) => {\r\n const newShadow = { ...state.shadowStateStore };\r\n if (!newShadow[key]) return state;\r\n\r\n newShadow[key] = JSON.parse(JSON.stringify(newShadow[key]));\r\n\r\n let current: any = newShadow[key];\r\n\r\n for (const segment of arrayPath) {\r\n current = current[segment];\r\n if (!current) return state;\r\n }\r\n\r\n if (Array.isArray(current)) {\r\n // Create shadow structure based on the actual new item\r\n const createShadowStructure = (obj: any): any => {\r\n if (Array.isArray(obj)) {\r\n return obj.map((item) => createShadowStructure(item));\r\n }\r\n if (typeof obj === \"object\" && obj !== null) {\r\n const shadow: any = {};\r\n for (const k in obj) {\r\n shadow[k] = createShadowStructure(obj[k]);\r\n }\r\n return shadow;\r\n }\r\n return {}; // Leaf nodes get empty object for metadata\r\n };\r\n\r\n current.push(createShadowStructure(newItem));\r\n }\r\n\r\n return { shadowStateStore: newShadow };\r\n });\r\n },\r\n\r\n removeShadowArrayElement: (\r\n key: string,\r\n arrayPath: string[],\r\n index: number\r\n ) => {\r\n set((state) => {\r\n const newShadow = { ...state.shadowStateStore };\r\n let current = newShadow[key];\r\n\r\n for (const segment of arrayPath) {\r\n current = current?.[segment];\r\n }\r\n\r\n if (Array.isArray(current)) {\r\n current.splice(index, 1);\r\n }\r\n\r\n return { shadowStateStore: newShadow };\r\n });\r\n },\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 clearSelectedIndex: ({\r\n stateKey,\r\n path,\r\n }: {\r\n stateKey: string;\r\n path: string[];\r\n }) => {\r\n set((state) => {\r\n const newMap = new Map(state.selectedIndicesMap);\r\n const stateMap = newMap.get(stateKey);\r\n if (!stateMap) return state;\r\n const parentPath = path.join(\".\");\r\n stateMap.delete(parentPath);\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 iniitialCreatedState: {},\r\n updateInitialCreatedState: (key, newState) => {\r\n set((prev) => ({\r\n iniitialCreatedState: {\r\n ...prev.iniitialCreatedState,\r\n [key]: newState,\r\n },\r\n }));\r\n },\r\n\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 setCreatedState: (initialState: StateValue) => {\r\n set((prev) => ({\r\n iniitialCreatedState: {\r\n ...prev.cogsStateStore,\r\n ...initialState,\r\n },\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","key","path","shadow","current","segment","metadata","newShadow","category","initialState","createShadowStructure","obj","_","i","k","newValue","pathCopy","lastSegment","arrayPath","newItem","item","index","parentPath","stateMap","newMap","newOuterMap","listener","record","rest","signalId","elementInfo","instanceId","elements","el","newState","prev","value","updater","currentUpdates","newUpdates","message","updatedErrors","existingMessages","doSomething","pathArray","keyArray","match","errors","valErrors","isIndexMatch","pathSegment","keySegment","keyIndex","errorMessages","rootState","getValueWithAsterisk","currentPath","remainingPath","results","newUpdater","syncInfo"],"mappings":"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"}
|
package/package.json
CHANGED
package/src/CogsState.tsx
CHANGED
|
@@ -1263,8 +1263,9 @@ export function useCogsStateFn<TStateObject extends unknown>(
|
|
|
1263
1263
|
|
|
1264
1264
|
case "insert":
|
|
1265
1265
|
// For array insert, add empty element to shadow array
|
|
1266
|
+
|
|
1266
1267
|
const parentPath = path.slice(0, -1);
|
|
1267
|
-
store.insertShadowArrayElement(thisKey, parentPath);
|
|
1268
|
+
store.insertShadowArrayElement(thisKey, parentPath, newValue);
|
|
1268
1269
|
break;
|
|
1269
1270
|
|
|
1270
1271
|
case "cut":
|
|
@@ -1801,7 +1802,7 @@ function createProxyHandler<T>(
|
|
|
1801
1802
|
options: VirtualViewOptions
|
|
1802
1803
|
): VirtualStateObjectResult<any[]> => {
|
|
1803
1804
|
const {
|
|
1804
|
-
itemHeight,
|
|
1805
|
+
itemHeight = 50, // Now optional with default
|
|
1805
1806
|
overscan = 5,
|
|
1806
1807
|
stickToBottom = false,
|
|
1807
1808
|
} = options;
|
|
@@ -1811,16 +1812,38 @@ function createProxyHandler<T>(
|
|
|
1811
1812
|
startIndex: 0,
|
|
1812
1813
|
endIndex: 10,
|
|
1813
1814
|
});
|
|
1814
|
-
|
|
1815
|
-
|
|
1816
|
-
|
|
1817
|
-
|
|
1818
|
-
|
|
1819
|
-
|
|
1820
|
-
|
|
1815
|
+
|
|
1816
|
+
// Get item height from shadow state or fall back to default
|
|
1817
|
+
const getItemHeight = useCallback(
|
|
1818
|
+
(index: number) => {
|
|
1819
|
+
const metadata = getGlobalStore
|
|
1820
|
+
.getState()
|
|
1821
|
+
.getShadowMetadata(stateKey, [...path, index.toString()]);
|
|
1822
|
+
return metadata?.virtualizer?.itemHeight || itemHeight;
|
|
1823
|
+
},
|
|
1824
|
+
[itemHeight]
|
|
1825
|
+
);
|
|
1826
|
+
|
|
1827
|
+
// Calculate total height and item positions
|
|
1828
|
+
const calculateHeights = useCallback(() => {
|
|
1829
|
+
const sourceArray = getGlobalStore().getNestedState(
|
|
1830
|
+
stateKey,
|
|
1831
|
+
path
|
|
1832
|
+
) as any[];
|
|
1833
|
+
|
|
1834
|
+
let totalHeight = 0;
|
|
1835
|
+
const positions: number[] = [];
|
|
1836
|
+
|
|
1837
|
+
for (let i = 0; i < sourceArray.length; i++) {
|
|
1838
|
+
positions[i] = totalHeight;
|
|
1839
|
+
totalHeight += getItemHeight(i);
|
|
1840
|
+
}
|
|
1841
|
+
|
|
1842
|
+
return { totalHeight, positions };
|
|
1843
|
+
}, [getItemHeight]);
|
|
1844
|
+
|
|
1821
1845
|
const isAtBottomRef = useRef(stickToBottom);
|
|
1822
1846
|
const previousTotalCountRef = useRef(0);
|
|
1823
|
-
// NEW: Ref to explicitly track if this is the component's first render cycle.
|
|
1824
1847
|
const isInitialMountRef = useRef(true);
|
|
1825
1848
|
|
|
1826
1849
|
const sourceArray = getGlobalStore().getNestedState(
|
|
@@ -1851,25 +1874,43 @@ function createProxyHandler<T>(
|
|
|
1851
1874
|
const listGrew = totalCount > previousTotalCountRef.current;
|
|
1852
1875
|
previousTotalCountRef.current = totalCount;
|
|
1853
1876
|
|
|
1877
|
+
const { totalHeight, positions } = calculateHeights();
|
|
1878
|
+
|
|
1854
1879
|
const handleScroll = () => {
|
|
1855
1880
|
const { scrollTop, clientHeight, scrollHeight } = container;
|
|
1856
1881
|
isAtBottomRef.current =
|
|
1857
1882
|
scrollHeight - scrollTop - clientHeight < 10;
|
|
1858
|
-
|
|
1859
|
-
|
|
1860
|
-
|
|
1861
|
-
|
|
1862
|
-
|
|
1863
|
-
|
|
1864
|
-
|
|
1865
|
-
|
|
1866
|
-
|
|
1883
|
+
|
|
1884
|
+
// Find start index using binary search
|
|
1885
|
+
let start = 0;
|
|
1886
|
+
let end = positions.length - 1;
|
|
1887
|
+
while (start < end) {
|
|
1888
|
+
const mid = Math.floor((start + end) / 2);
|
|
1889
|
+
if (positions[mid]! < scrollTop) {
|
|
1890
|
+
start = mid + 1;
|
|
1891
|
+
} else {
|
|
1892
|
+
end = mid;
|
|
1893
|
+
}
|
|
1894
|
+
}
|
|
1895
|
+
start = Math.max(0, start - overscan);
|
|
1896
|
+
|
|
1897
|
+
// Find end index
|
|
1898
|
+
const visibleEnd = scrollTop + clientHeight;
|
|
1899
|
+
let endIndex = start;
|
|
1900
|
+
while (
|
|
1901
|
+
endIndex < positions.length &&
|
|
1902
|
+
positions[endIndex]! < visibleEnd
|
|
1903
|
+
) {
|
|
1904
|
+
endIndex++;
|
|
1905
|
+
}
|
|
1906
|
+
endIndex = Math.min(totalCount, endIndex + overscan);
|
|
1907
|
+
|
|
1867
1908
|
setRange((prevRange) => {
|
|
1868
1909
|
if (
|
|
1869
1910
|
prevRange.startIndex !== start ||
|
|
1870
|
-
prevRange.endIndex !==
|
|
1911
|
+
prevRange.endIndex !== endIndex
|
|
1871
1912
|
) {
|
|
1872
|
-
return { startIndex: start, endIndex:
|
|
1913
|
+
return { startIndex: start, endIndex: endIndex };
|
|
1873
1914
|
}
|
|
1874
1915
|
return prevRange;
|
|
1875
1916
|
});
|
|
@@ -1879,19 +1920,13 @@ function createProxyHandler<T>(
|
|
|
1879
1920
|
passive: true,
|
|
1880
1921
|
});
|
|
1881
1922
|
|
|
1882
|
-
// --- THE CORRECTED DECISION LOGIC ---
|
|
1883
1923
|
if (stickToBottom) {
|
|
1884
1924
|
if (isInitialMountRef.current) {
|
|
1885
|
-
// SCENARIO 1: First render of the component.
|
|
1886
|
-
// Go to the bottom unconditionally. Use `auto` scroll for an instant jump.
|
|
1887
1925
|
container.scrollTo({
|
|
1888
1926
|
top: container.scrollHeight,
|
|
1889
1927
|
behavior: "auto",
|
|
1890
1928
|
});
|
|
1891
1929
|
} else if (wasAtBottom && listGrew) {
|
|
1892
|
-
// SCENARIO 2: Subsequent renders (new messages arrive).
|
|
1893
|
-
// Only scroll if the user was already at the bottom.
|
|
1894
|
-
// Use `smooth` for a nice animated scroll for new messages.
|
|
1895
1930
|
requestAnimationFrame(() => {
|
|
1896
1931
|
container.scrollTo({
|
|
1897
1932
|
top: container.scrollHeight,
|
|
@@ -1901,15 +1936,12 @@ function createProxyHandler<T>(
|
|
|
1901
1936
|
}
|
|
1902
1937
|
}
|
|
1903
1938
|
|
|
1904
|
-
// After the logic runs, it's no longer the initial mount.
|
|
1905
1939
|
isInitialMountRef.current = false;
|
|
1906
|
-
|
|
1907
|
-
// Always run handleScroll once to set the initial visible window.
|
|
1908
1940
|
handleScroll();
|
|
1909
1941
|
|
|
1910
1942
|
return () =>
|
|
1911
1943
|
container.removeEventListener("scroll", handleScroll);
|
|
1912
|
-
}, [totalCount,
|
|
1944
|
+
}, [totalCount, calculateHeights, overscan, stickToBottom]);
|
|
1913
1945
|
|
|
1914
1946
|
const scrollToBottom = useCallback(
|
|
1915
1947
|
(behavior: ScrollBehavior = "smooth") => {
|
|
@@ -1926,37 +1958,44 @@ function createProxyHandler<T>(
|
|
|
1926
1958
|
const scrollToIndex = useCallback(
|
|
1927
1959
|
(index: number, behavior: ScrollBehavior = "smooth") => {
|
|
1928
1960
|
if (containerRef.current) {
|
|
1961
|
+
const { positions } = calculateHeights();
|
|
1929
1962
|
containerRef.current.scrollTo({
|
|
1930
|
-
top: index
|
|
1963
|
+
top: positions[index] || 0,
|
|
1931
1964
|
behavior,
|
|
1932
1965
|
});
|
|
1933
1966
|
}
|
|
1934
1967
|
},
|
|
1935
|
-
[
|
|
1968
|
+
[calculateHeights]
|
|
1936
1969
|
);
|
|
1937
1970
|
|
|
1938
|
-
//
|
|
1971
|
+
// Calculate actual heights for rendering
|
|
1972
|
+
const {
|
|
1973
|
+
totalHeight: totalHeightForRender,
|
|
1974
|
+
positions: positionsForRender,
|
|
1975
|
+
} = calculateHeights();
|
|
1976
|
+
const offsetY = positionsForRender[range.startIndex] || 0;
|
|
1977
|
+
|
|
1939
1978
|
const virtualizerProps = {
|
|
1940
1979
|
outer: {
|
|
1941
1980
|
ref: containerRef,
|
|
1942
|
-
style: { overflowY: "auto", height: "100%" },
|
|
1981
|
+
style: { overflowY: "auto", height: "100%" } as CSSProperties,
|
|
1943
1982
|
},
|
|
1944
1983
|
inner: {
|
|
1945
1984
|
style: {
|
|
1946
|
-
height: `${
|
|
1985
|
+
height: `${totalHeightForRender}px`,
|
|
1947
1986
|
position: "relative",
|
|
1948
|
-
},
|
|
1987
|
+
} as CSSProperties,
|
|
1949
1988
|
},
|
|
1950
1989
|
list: {
|
|
1951
1990
|
style: {
|
|
1952
|
-
transform: `translateY(${
|
|
1953
|
-
},
|
|
1991
|
+
transform: `translateY(${offsetY}px)`,
|
|
1992
|
+
} as CSSProperties,
|
|
1954
1993
|
},
|
|
1955
1994
|
};
|
|
1956
1995
|
|
|
1957
1996
|
return {
|
|
1958
1997
|
virtualState,
|
|
1959
|
-
virtualizerProps
|
|
1998
|
+
virtualizerProps,
|
|
1960
1999
|
scrollToBottom,
|
|
1961
2000
|
scrollToIndex,
|
|
1962
2001
|
};
|