cogsbox-state 0.5.3 → 0.5.5

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/index.d.ts CHANGED
@@ -1,3 +1,2 @@
1
1
  export * from './CogsState.js';
2
- export * from './CogsStateClient.js';
3
2
  export * from './utility.js';
package/dist/index.js CHANGED
@@ -1,25 +1,22 @@
1
- import { $cogsSignal as r, $cogsSignalStore as s, addStateOptions as o, createCogsState as a, useCogsStateFn as g } from "./CogsState.jsx";
2
- import { config as f, useCogsConfig as i } from "./CogsStateClient.jsx";
3
- import { deleteNestedProperty as p, getArrayLengthDifferences as d, getArrayLengthDifferencesArray as u, getDifferences as y, getDifferencesArray as S, getNestedValue as l, isArray as A, isDeepEqual as D, isFunction as m, isObject as C, transformStateFunc as x, updateNestedProperty as F } from "./utility.js";
1
+ import { $cogsSignal as r, $cogsSignalStore as s, addStateOptions as a, createCogsState as n, useCogsStateFn as o } from "./CogsState.jsx";
2
+ import { deleteNestedProperty as i, getArrayLengthDifferences as f, getArrayLengthDifferencesArray as c, getDifferences as d, getDifferencesArray as p, getNestedValue as y, isArray as S, isDeepEqual as u, isFunction as l, isObject as A, transformStateFunc as D, updateNestedProperty as m } from "./utility.js";
4
3
  export {
5
4
  r as $cogsSignal,
6
5
  s as $cogsSignalStore,
7
- o as addStateOptions,
8
- f as config,
9
- a as createCogsState,
10
- p as deleteNestedProperty,
11
- d as getArrayLengthDifferences,
12
- u as getArrayLengthDifferencesArray,
13
- y as getDifferences,
14
- S as getDifferencesArray,
15
- l as getNestedValue,
16
- A as isArray,
17
- D as isDeepEqual,
18
- m as isFunction,
19
- C as isObject,
20
- x as transformStateFunc,
21
- F as updateNestedProperty,
22
- i as useCogsConfig,
23
- g as useCogsStateFn
6
+ a as addStateOptions,
7
+ n as createCogsState,
8
+ i as deleteNestedProperty,
9
+ f as getArrayLengthDifferences,
10
+ c as getArrayLengthDifferencesArray,
11
+ d as getDifferences,
12
+ p as getDifferencesArray,
13
+ y as getNestedValue,
14
+ S as isArray,
15
+ u as isDeepEqual,
16
+ l as isFunction,
17
+ A as isObject,
18
+ D as transformStateFunc,
19
+ m as updateNestedProperty,
20
+ o as useCogsStateFn
24
21
  };
25
22
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;"}
1
+ {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;"}
package/dist/store.d.ts CHANGED
@@ -67,11 +67,15 @@ export type CogsGlobalState = {
67
67
  instanceId: string;
68
68
  parentId: string;
69
69
  position: number;
70
+ effect?: string;
71
+ map?: string;
70
72
  }>>;
71
73
  addSignalElement: (signalId: string, elementInfo: {
72
74
  instanceId: string;
73
75
  parentId: string;
74
76
  position: number;
77
+ effect?: string;
78
+ map?: string;
75
79
  }) => void;
76
80
  removeSignalElement: (signalId: string, instanceId: string) => void;
77
81
  reRenderTriggerPrevValue: Record<string, any>;
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 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 CogsGlobalState = {\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<{ instanceId: string; parentId: string; position: number }>\r\n >;\r\n addSignalElement: (\r\n signalId: string,\r\n elementInfo: { instanceId: string; parentId: string; position: number },\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<\r\n string,\r\n {\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 }\r\n >;\r\n }\r\n >;\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 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 console.log(\"Adding signal element\", signalId, elementInfo);\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 console.log(\"After adding\", current.get(signalId));\r\n set({ signalDomElements: new Map(current) }); // Create new reference to trigger update\r\n },\r\n removeSignalElement: (signalId: string, instanceId: string) => {\r\n console.log(\"Removing signal element\", signalId, instanceId);\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 set((prev) => {\r\n const updatedErrors = new Map(prev.validationErrors);\r\n\r\n const existingMessages = updatedErrors.get(path) || [];\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 console.log(\"updatedErrors\", updatedErrors);\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>(\r\n key: StateKey,\r\n value: StateValue,\r\n ) => {\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>(\r\n initialState: StateValue,\r\n ) => {\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":["getGlobalStore","create","set","get","listener","key","record","state","_","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","newMap"],"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 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 CogsGlobalState = {\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<\r\n string,\r\n {\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 }\r\n >;\r\n }\r\n >;\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 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 console.log(\"Adding signal element\", signalId, elementInfo);\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 console.log(\"After adding\", current.get(signalId));\r\n set({ signalDomElements: new Map(current) }); // Create new reference to trigger update\r\n },\r\n removeSignalElement: (signalId: string, instanceId: string) => {\r\n console.log(\"Removing signal element\", signalId, instanceId);\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 set((prev) => {\r\n const updatedErrors = new Map(prev.validationErrors);\r\n\r\n const existingMessages = updatedErrors.get(path) || [];\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 console.log(\"updatedErrors\", updatedErrors);\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>(\r\n key: StateKey,\r\n value: StateValue,\r\n ) => {\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>(\r\n initialState: StateValue,\r\n ) => {\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":["getGlobalStore","create","set","get","listener","key","record","state","_","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","newMap"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "cogsbox-state",
3
- "version": "0.5.3",
3
+ "version": "0.5.5",
4
4
  "description": "React state management library with form controls and server sync",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -18,12 +18,13 @@
18
18
  ],
19
19
  "repository": "github:cogsbox/cogsbox-state",
20
20
  "scripts": {
21
- "build": "vite build",
21
+ "build": "vite build && rimraf dist/examples",
22
22
  "lint": "eslint src --ext ts,tsx",
23
23
  "format": "prettier --write \"src/**/*.{ts,tsx}\"",
24
24
  "dev": "vite src/examples"
25
25
  },
26
26
  "dependencies": {
27
+ "react-syntax-highlighter": "^15.6.1",
27
28
  "rollup-preserve-directives": "^1.1.3",
28
29
  "uuid": "^9.0.1",
29
30
  "zod": "^3.22.4",
@@ -32,13 +33,13 @@
32
33
  "peerDependencies": {
33
34
  "@types/react": "^18.0.0",
34
35
  "react": "^18.2.0",
35
- "react-dom": "^18.2.0",
36
- "@trpc/next": "^10.0.0"
36
+ "react-dom": "^18.2.0"
37
37
  },
38
38
  "devDependencies": {
39
39
  "@types/node": "^20.11.0",
40
40
  "@types/react": "^18.2.0",
41
41
  "@types/react-dom": "^18.2.0",
42
+ "@types/react-syntax-highlighter": "^15.5.13",
42
43
  "@types/uuid": "^9.0.7",
43
44
  "@typescript-eslint/eslint-plugin": "^6.21.0",
44
45
  "@typescript-eslint/parser": "^6.21.0",
@@ -47,6 +48,7 @@
47
48
  "eslint-plugin-react": "^7.33.2",
48
49
  "eslint-plugin-react-hooks": "^4.6.0",
49
50
  "prettier": "^3.4.0",
51
+ "rimraf": "^6.0.1",
50
52
  "typescript": "^5.3.0",
51
53
  "vite": "^5.0.0",
52
54
  "vite-plugin-dts": "^3.7.0"
@@ -1 +0,0 @@
1
- export {};
@@ -1,177 +0,0 @@
1
- import { j as S } from "./node_modules/react/jsx-runtime.jsx";
2
- import { isFunction as F, getNestedValue as N, updateNestedProperty as j } from "./utility.js";
3
- import v, { r as f } from "./node_modules/react/index.js";
4
- import { getGlobalStore as g } from "./store.js";
5
- function $(s, t, e, n) {
6
- s(
7
- (o) => {
8
- if (F(t)) {
9
- const r = t(N(o, e));
10
- let u = j(e, o, r);
11
- return typeof u == "string" && (u = u.trim()), u;
12
- } else {
13
- let r = !e || e.length == 0 ? t : j(e, o, t);
14
- return typeof r == "string" && (r = r.trim()), r;
15
- }
16
- },
17
- e,
18
- { updateType: "update" },
19
- n
20
- );
21
- }
22
- function P(s, t, e, n, o) {
23
- const r = g.getState().getNestedState(n, e);
24
- s(
25
- (u) => {
26
- let c = !e || e.length == 0 ? u : N(u, [...e]), i = [...c];
27
- return i.splice(
28
- Number(o) == 0 ? o : c.length,
29
- 0,
30
- F(t) ? t(c) : t
31
- ), e.length == 0 ? i : j([...e], u, i);
32
- },
33
- [
34
- ...e,
35
- (r.length - 1).toString()
36
- ],
37
- {
38
- updateType: "insert"
39
- }
40
- );
41
- }
42
- function U(s, t, e, n) {
43
- const o = g.getState().getNestedState(e, t);
44
- s(
45
- (r) => {
46
- const u = N(r, [...t]);
47
- if (n < 0 || n >= u?.length)
48
- throw new Error(`Index ${n} does not exist in the array.`);
49
- const c = n || Number(n) == 0 ? n : u.length - 1, i = [
50
- ...u.slice(0, c),
51
- ...u.slice(c + 1)
52
- ];
53
- return console.log(n), t.length == 0 ? i : j([...t], r, i);
54
- },
55
- [
56
- ...t,
57
- n || n === 0 ? n?.toString() : (o.length - 1).toString()
58
- ],
59
- { updateType: "cut" }
60
- );
61
- }
62
- const b = (s, t, e = (n, o) => JSON.stringify(n) === JSON.stringify(o)) => {
63
- const [n, o] = f.useState(
64
- () => t(g.getState(), s)
65
- ), r = f.useRef(n);
66
- return f.useEffect(() => {
67
- const u = g.subscribe((c) => {
68
- const i = t(c, s);
69
- e(r.current, i) || (r.current = i, o(i));
70
- });
71
- return () => u();
72
- }, [s]), n;
73
- }, y = (s, t, e) => {
74
- const n = s + "." + (t.length > 0 ? [t.join(".")] : []) + (e && e.length > 0 ? "." + e : "");
75
- return e?.length === 0 ? [] : b(
76
- n,
77
- (o, r) => o.getValidationErrors(r) || []
78
- );
79
- }, C = (s, t) => {
80
- const e = `${s}:${t.join(".")}`;
81
- return b(
82
- e,
83
- (n, o) => n.getSyncInfo(o)
84
- );
85
- }, G = (s, t) => b(
86
- `${s}:${t.join(".")}`,
87
- (e, n) => e.getNestedState(s, t)
88
- ), D = ({
89
- setState: s,
90
- validationKey: t,
91
- path: e,
92
- child: n,
93
- formOpts: o,
94
- stateKey: r
95
- }) => {
96
- const { getInitialOptions: u, getValidationErrors: c, removeValidationError: i } = g.getState();
97
- y(t, e), g.getState().serverSyncActions[r], g.getState().serverState[r];
98
- const l = G(r, e), [m, d] = f.useState(
99
- g.getState().getNestedState(r, e)
100
- );
101
- f.useEffect(() => {
102
- d(l);
103
- }, [r, e.join("."), l]);
104
- const a = f.useRef();
105
- let T = (E, I) => {
106
- d(E), a.current && clearTimeout(a.current), a.current = setTimeout(() => {
107
- $(s, E, e, t);
108
- }, o?.debounceTime ?? 300);
109
- };
110
- f.useEffect(() => () => {
111
- a.current && clearTimeout(a.current);
112
- }, []);
113
- const V = C(r, e), w = V ? {
114
- ...V,
115
- date: new Date(V.timeStamp)
116
- } : null, R = n({
117
- get: () => m || g.getState().getNestedState(r, e),
118
- set: T,
119
- syncStatus: w,
120
- path: e,
121
- validationErrors: () => c(t + "." + e.join(".")),
122
- // Add default input props
123
- inputProps: {
124
- value: m || g.getState().getNestedState(r, e) || "",
125
- onChange: (E) => T(E.target.value)
126
- }
127
- });
128
- return /* @__PURE__ */ S.jsx(S.Fragment, { children: /* @__PURE__ */ S.jsx(
129
- A,
130
- {
131
- formOpts: o,
132
- path: e,
133
- validationKey: t,
134
- stateKey: r,
135
- children: R
136
- }
137
- ) });
138
- };
139
- function A({
140
- formOpts: s,
141
- path: t,
142
- validationKey: e,
143
- stateKey: n,
144
- children: o,
145
- validIndices: r
146
- }) {
147
- const { getInitialOptions: u, getValidationErrors: c } = g.getState(), i = y(
148
- e,
149
- t,
150
- r
151
- ), l = [];
152
- if (i) {
153
- const a = i.join(", ");
154
- l.includes(a) || l.push(a);
155
- }
156
- let m = l?.length > 0 ? l?.join(", ") : "";
157
- const d = u(n);
158
- return /* @__PURE__ */ S.jsx(S.Fragment, { children: d?.formElements?.validation && !s?.validation?.disable ? d.formElements.validation({
159
- children: /* @__PURE__ */ S.jsx(v.Fragment, { children: o }, t.toString()),
160
- active: m != "",
161
- message: s?.validation?.message ? s?.validation?.message : s?.validation?.message == "" ? "" : m,
162
- path: t,
163
- ...s?.key && { key: s?.key }
164
- }) : /* @__PURE__ */ S.jsx(v.Fragment, { children: o }, t.toString()) });
165
- }
166
- export {
167
- D as FormControlComponent,
168
- A as ValidationWrapper,
169
- U as cutFunc,
170
- P as pushFunc,
171
- $ as updateFn,
172
- G as useGetKeyState,
173
- C as useGetSyncInfo,
174
- y as useGetValidationErrors,
175
- b as useStoreSubscription
176
- };
177
- //# sourceMappingURL=updaterFunctions.jsx.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"updaterFunctions.jsx","sources":["../src/updaterFunctions.tsx"],"sourcesContent":["import type {\r\n EffectiveSetState,\r\n FormElementParmas,\r\n FormOptsType,\r\n UpdateArg,\r\n UpdateOpts,\r\n} from \"./CogsState\";\r\n\r\nimport { getNestedValue, isFunction, updateNestedProperty } from \"./utility\";\r\nimport { useEffect, useRef, useState } from \"react\";\r\nimport React from \"react\";\r\nimport { getGlobalStore } from \"./store\";\r\n\r\nexport function updateFn<U>(\r\n setState: EffectiveSetState<U>,\r\n payload: UpdateArg<U>,\r\n path: string[],\r\n validationKey?: string,\r\n): void {\r\n setState(\r\n (prevState) => {\r\n if (isFunction<U>(payload)) {\r\n const nestedValue = payload(getNestedValue(prevState, path));\r\n let value = updateNestedProperty(path, prevState, nestedValue);\r\n if (typeof value == \"string\") {\r\n value = value.trim();\r\n }\r\n return value;\r\n } else {\r\n let value =\r\n !path || path.length == 0\r\n ? payload\r\n : updateNestedProperty(path, prevState, payload);\r\n if (typeof value == \"string\") {\r\n value = value.trim();\r\n }\r\n return value;\r\n }\r\n },\r\n path,\r\n { updateType: \"update\" },\r\n validationKey,\r\n );\r\n}\r\n\r\nexport function pushFunc<U>(\r\n setState: EffectiveSetState<U>,\r\n payload: UpdateArg<U>,\r\n path: string[],\r\n stateKey: string,\r\n index?: number,\r\n): void {\r\n const array = getGlobalStore\r\n .getState()\r\n .getNestedState(stateKey, path) as U[];\r\n setState(\r\n (prevState) => {\r\n let arrayToUpdate =\r\n !path || path.length == 0\r\n ? prevState\r\n : getNestedValue(prevState, [...path]);\r\n let returnedArray = [...arrayToUpdate];\r\n\r\n returnedArray.splice(\r\n index || Number(index) == 0 ? index : arrayToUpdate.length,\r\n 0,\r\n isFunction<U>(payload)\r\n ? payload(index == -1 ? undefined : arrayToUpdate)\r\n : payload,\r\n );\r\n const value =\r\n path.length == 0\r\n ? returnedArray\r\n : updateNestedProperty([...path], prevState, returnedArray);\r\n\r\n return value as U;\r\n },\r\n [\r\n ...path,\r\n index || index === 0\r\n ? index?.toString()\r\n : (array!.length - 1).toString(),\r\n ],\r\n {\r\n updateType: \"insert\",\r\n },\r\n );\r\n}\r\n\r\nexport function cutFunc<U>(\r\n setState: EffectiveSetState<U>,\r\n path: string[],\r\n stateKey: string,\r\n index: number,\r\n): void {\r\n const array = getGlobalStore\r\n .getState()\r\n .getNestedState(stateKey, path) as U[];\r\n setState(\r\n (prevState) => {\r\n const arrayToUpdate = getNestedValue(prevState, [...path]);\r\n if (index < 0 || index >= arrayToUpdate?.length) {\r\n throw new Error(`Index ${index} does not exist in the array.`);\r\n }\r\n const indexToCut =\r\n index || Number(index) == 0 ? index : arrayToUpdate.length - 1;\r\n\r\n const updatedArray = [\r\n ...arrayToUpdate.slice(0, indexToCut),\r\n ...arrayToUpdate.slice(indexToCut + 1),\r\n ] as U;\r\n\r\n console.log(index);\r\n return path.length == 0\r\n ? updatedArray\r\n : updateNestedProperty([...path], prevState, updatedArray);\r\n },\r\n [\r\n ...path,\r\n index || index === 0\r\n ? index?.toString()\r\n : (array!.length - 1).toString(),\r\n ],\r\n { updateType: \"cut\" },\r\n );\r\n}\r\n\r\nexport const useStoreSubscription = <T,>(\r\n fullPath: string,\r\n selector: (\r\n store: ReturnType<typeof getGlobalStore.getState>,\r\n path: string,\r\n ) => T,\r\n compare: (a: T, b: T) => boolean = (a, b) =>\r\n JSON.stringify(a) === JSON.stringify(b),\r\n) => {\r\n const [value, setValue] = useState<T>(() =>\r\n selector(getGlobalStore.getState(), fullPath),\r\n );\r\n const previousValueRef = useRef<T>(value);\r\n\r\n useEffect(() => {\r\n const unsubscribe = getGlobalStore.subscribe((store) => {\r\n const newValue = selector(store, fullPath);\r\n if (!compare(previousValueRef.current, newValue)) {\r\n previousValueRef.current = newValue;\r\n setValue(newValue);\r\n }\r\n });\r\n\r\n return () => unsubscribe();\r\n }, [fullPath]);\r\n\r\n return value;\r\n};\r\nexport const useGetValidationErrors = (\r\n validationKey: string,\r\n path: string[],\r\n validIndices?: number[],\r\n) => {\r\n // Construct the full path the same way as ValidationWrapper\r\n const fullPath =\r\n validationKey +\r\n \".\" +\r\n (path.length > 0 ? [path.join(\".\")] : []) +\r\n (validIndices && validIndices.length > 0 ? \".\" + validIndices : \"\");\r\n\r\n // Skip subscription if we have empty indices\r\n if (validIndices?.length === 0) {\r\n return [];\r\n }\r\n\r\n return useStoreSubscription(\r\n fullPath,\r\n (store, path) => store.getValidationErrors(path) || [],\r\n );\r\n};\r\n\r\nexport const useGetSyncInfo = (key: string, path: string[]) => {\r\n const syncKey = `${key}:${path.join(\".\")}`;\r\n return useStoreSubscription(syncKey, (store, path) =>\r\n store.getSyncInfo(path),\r\n );\r\n};\r\nexport const useGetKeyState = (key: string, path: string[]) => {\r\n return useStoreSubscription(`${key}:${path.join(\".\")}`, (store, fullPath) =>\r\n store.getNestedState(key, path),\r\n );\r\n};\r\ninterface FormControlComponentProps<TStateObject> {\r\n setState: EffectiveSetState<TStateObject>;\r\n validationKey: string;\r\n path: string[];\r\n child: (obj: FormElementParmas<TStateObject>) => JSX.Element;\r\n formOpts?: FormOptsType;\r\n stateKey: string;\r\n}\r\nexport const FormControlComponent = <TStateObject,>({\r\n setState,\r\n validationKey,\r\n path,\r\n child,\r\n formOpts,\r\n stateKey,\r\n}: FormControlComponentProps<TStateObject>) => {\r\n const { getInitialOptions, getValidationErrors, removeValidationError } =\r\n getGlobalStore.getState();\r\n const validationErrors = useGetValidationErrors(validationKey, path);\r\n const serverSyncActions =\r\n getGlobalStore.getState().serverSyncActions[stateKey!];\r\n const serverState = getGlobalStore.getState().serverState[stateKey!];\r\n\r\n const stateValue = useGetKeyState(stateKey, path);\r\n const [inputValue, setInputValue] = useState<any>(\r\n getGlobalStore.getState().getNestedState(stateKey, path),\r\n );\r\n\r\n useEffect(() => {\r\n setInputValue(stateValue);\r\n }, [stateKey, path.join(\".\"), stateValue]);\r\n\r\n const timeoutRef = useRef<NodeJS.Timeout>();\r\n\r\n let updater = (payload: UpdateArg<TStateObject>, opts?: UpdateOpts) => {\r\n setInputValue(payload);\r\n\r\n if (timeoutRef.current) {\r\n clearTimeout(timeoutRef.current);\r\n }\r\n\r\n timeoutRef.current = setTimeout(() => {\r\n updateFn(setState, payload, path, validationKey);\r\n }, formOpts?.debounceTime ?? 300);\r\n };\r\n\r\n // Clear timeout on unmount\r\n useEffect(() => {\r\n return () => {\r\n if (timeoutRef.current) {\r\n clearTimeout(timeoutRef.current);\r\n }\r\n };\r\n }, []);\r\n\r\n const rawSyncStatus = useGetSyncInfo(stateKey, path);\r\n const syncStatus = rawSyncStatus\r\n ? {\r\n ...rawSyncStatus,\r\n date: new Date(rawSyncStatus.timeStamp),\r\n }\r\n : null;\r\n const childElement = child({\r\n get: () =>\r\n inputValue ||\r\n getGlobalStore.getState().getNestedState(stateKey, path),\r\n set: updater,\r\n syncStatus,\r\n path: path,\r\n validationErrors: () =>\r\n getValidationErrors(validationKey + \".\" + path.join(\".\")),\r\n\r\n // Add default input props\r\n inputProps: {\r\n value:\r\n inputValue ||\r\n getGlobalStore.getState().getNestedState(stateKey, path) ||\r\n \"\",\r\n onChange: (e: any) => updater(e.target.value),\r\n },\r\n });\r\n\r\n return (\r\n <>\r\n <ValidationWrapper\r\n {...{\r\n formOpts,\r\n path,\r\n validationKey,\r\n stateKey,\r\n }}\r\n >\r\n {childElement}\r\n </ValidationWrapper>\r\n </>\r\n );\r\n};\r\n\r\nexport function ValidationWrapper({\r\n formOpts,\r\n path,\r\n validationKey,\r\n stateKey,\r\n children,\r\n validIndices,\r\n}: {\r\n formOpts?: FormOptsType;\r\n path: string[];\r\n validationKey: string;\r\n stateKey?: string;\r\n children: React.ReactNode;\r\n validIndices?: number[];\r\n}) {\r\n const { getInitialOptions, getValidationErrors } =\r\n getGlobalStore.getState();\r\n const validationErrors = useGetValidationErrors(\r\n validationKey,\r\n path,\r\n validIndices,\r\n );\r\n const thesMessages: string[] = [];\r\n\r\n if (validationErrors) {\r\n const newMessage = validationErrors!.join(\", \");\r\n if (!thesMessages.includes(newMessage)) {\r\n thesMessages.push(newMessage);\r\n }\r\n }\r\n let fullMessageString =\r\n thesMessages?.length > 0 ? thesMessages?.join(\", \") : \"\";\r\n\r\n const thisStateOpts = getInitialOptions(stateKey!);\r\n\r\n return (\r\n <>\r\n {thisStateOpts?.formElements?.validation &&\r\n !formOpts?.validation?.disable ? (\r\n thisStateOpts.formElements!.validation!({\r\n children: (\r\n <React.Fragment key={path.toString()}>\r\n {children}\r\n </React.Fragment>\r\n ),\r\n active: fullMessageString != \"\" ? true : false,\r\n message: formOpts?.validation?.message\r\n ? formOpts?.validation?.message\r\n : formOpts?.validation?.message == \"\"\r\n ? \"\"\r\n : fullMessageString,\r\n path,\r\n\r\n ...(formOpts?.key && { key: formOpts?.key }),\r\n })\r\n ) : (\r\n <React.Fragment key={path.toString()}>\r\n {children}\r\n </React.Fragment>\r\n )}\r\n </>\r\n );\r\n}\r\n"],"names":["updateFn","setState","payload","path","validationKey","prevState","isFunction","nestedValue","getNestedValue","value","updateNestedProperty","pushFunc","stateKey","index","array","getGlobalStore","arrayToUpdate","returnedArray","cutFunc","indexToCut","updatedArray","useStoreSubscription","fullPath","selector","compare","a","b","setValue","useState","previousValueRef","useRef","useEffect","unsubscribe","store","newValue","useGetValidationErrors","validIndices","useGetSyncInfo","key","syncKey","useGetKeyState","FormControlComponent","child","formOpts","getInitialOptions","getValidationErrors","removeValidationError","stateValue","inputValue","setInputValue","timeoutRef","updater","opts","rawSyncStatus","syncStatus","childElement","e","jsx","Fragment","ValidationWrapper","children","validationErrors","thesMessages","newMessage","fullMessageString","thisStateOpts","React"],"mappings":"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"}
File without changes