cogsbox-state 0.5.425 → 0.5.427

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.
@@ -17,11 +17,12 @@ interface FormControlComponentProps<TStateObject> {
17
17
  stateKey: string;
18
18
  }
19
19
  export declare const FormControlComponent: <TStateObject>({ setState, path, child, formOpts, stateKey, }: FormControlComponentProps<TStateObject>) => import("react/jsx-runtime").JSX.Element;
20
- export declare function ValidationWrapper({ formOpts, path, stateKey, children, validIndices, }: {
20
+ export type ValidationWrapperProps = {
21
21
  formOpts?: FormOptsType;
22
22
  path: string[];
23
- stateKey?: string;
23
+ stateKey: string;
24
24
  children: React.ReactNode;
25
25
  validIndices?: number[];
26
- }): import("react/jsx-runtime").JSX.Element;
26
+ };
27
+ export declare function ValidationWrapper({ formOpts, path, stateKey, children, validIndices, }: ValidationWrapperProps): import("react/jsx-runtime").JSX.Element;
27
28
  export {};
@@ -1 +1 @@
1
- {"version":3,"file":"Functions.jsx","sources":["../src/Functions.tsx"],"sourcesContent":["import {\r\n notifyComponent,\r\n type EffectiveSetState,\r\n type FormElementParams,\r\n type FormOptsType,\r\n type UpdateArg,\r\n type 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, formRefStore } from \"./store\";\r\nimport { validateZodPathFunc } from \"./useValidateZodPath\";\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.getState().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 ? index?.toString() : (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.getState().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 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 ? index?.toString() : (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 const fullPathRef = useRef(fullPath);\r\n useEffect(() => {\r\n fullPathRef.current = fullPath; // Ensure latest fullPath is always used\r\n\r\n setValue(selector(getGlobalStore.getState(), fullPath));\r\n\r\n const callback = (store: any) => {\r\n const newValue = selector(store, fullPathRef.current);\r\n\r\n if (!compare(previousValueRef.current, newValue)) {\r\n previousValueRef.current = newValue;\r\n setValue(newValue);\r\n }\r\n };\r\n const unsubscribe = getGlobalStore.subscribe(callback);\r\n return () => {\r\n unsubscribe();\r\n };\r\n }, [fullPath]);\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 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 const returnresult = useStoreSubscription(\r\n fullPath,\r\n (store, path) => store.getValidationErrors(path) || []\r\n );\r\n\r\n return returnresult;\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\r\n path: string[];\r\n child: (obj: FormElementParams<TStateObject>) => JSX.Element;\r\n formOpts?: FormOptsType;\r\n stateKey: string;\r\n}\r\n// Find FormControlComponent in your Functions.ts or equivalent file\r\n\r\nexport const FormControlComponent = <TStateObject,>({\r\n setState, // This is the real effectiveSetState from the hook\r\n path,\r\n child,\r\n formOpts,\r\n stateKey,\r\n}: FormControlComponentProps<TStateObject>) => {\r\n const { registerFormRef, getFormRef } = formRefStore.getState();\r\n const {\r\n getValidationErrors,\r\n addValidationError,\r\n getInitialOptions,\r\n removeValidationError,\r\n } = getGlobalStore.getState();\r\n\r\n const refKey = stateKey + \".\" + path.join(\".\");\r\n const localFormRef = useRef<HTMLInputElement>(null);\r\n const existingRef = getFormRef(refKey);\r\n if (!existingRef) {\r\n registerFormRef(refKey, localFormRef);\r\n }\r\n const formRef = existingRef || localFormRef;\r\n\r\n // --- START CHANGES ---\r\n\r\n const globalStateValue = useGetKeyState(stateKey, path);\r\n const [localValue, setLocalValue] = useState<any>(globalStateValue);\r\n const isCurrentlyDebouncing = useRef(false);\r\n const debounceTimeoutRef = useRef<NodeJS.Timeout | null>(null);\r\n\r\n // Effect to sync local state if global state changes externally\r\n useEffect(() => {\r\n // Only update local if not actively debouncing a local change\r\n if (!isCurrentlyDebouncing.current && globalStateValue !== localValue) {\r\n setLocalValue(globalStateValue);\r\n }\r\n }, [globalStateValue]); // Removed localValue dependency\r\n\r\n // Effect for cleanup\r\n useEffect(() => {\r\n return () => {\r\n if (debounceTimeoutRef.current) {\r\n clearTimeout(debounceTimeoutRef.current);\r\n debounceTimeoutRef.current = null; // Explicitly nullify\r\n isCurrentlyDebouncing.current = false;\r\n }\r\n };\r\n }, []);\r\n\r\n const debouncedUpdater = (payload: UpdateArg<TStateObject>) => {\r\n setLocalValue(payload); // Update local state immediately\r\n isCurrentlyDebouncing.current = true;\r\n\r\n if (payload === \"\") {\r\n if (debounceTimeoutRef.current) {\r\n clearTimeout(debounceTimeoutRef.current); // Clear pending timer\r\n debounceTimeoutRef.current = null;\r\n }\r\n updateFn(setState, payload, path, validationKey); // Update global state NOW\r\n isCurrentlyDebouncing.current = false; // No longer debouncing\r\n return; // Don't proceed to set another timeout\r\n }\r\n\r\n // If not empty, proceed with normal debouncing\r\n if (debounceTimeoutRef.current) {\r\n clearTimeout(debounceTimeoutRef.current);\r\n }\r\n\r\n debounceTimeoutRef.current = setTimeout(\r\n () => {\r\n isCurrentlyDebouncing.current = false;\r\n updateFn(setState, payload, path, validationKey);\r\n },\r\n formOpts?.debounceTime ??\r\n (typeof globalStateValue == \"boolean\" ? 20 : 200)\r\n );\r\n };\r\n\r\n const initialOptions = getInitialOptions(stateKey);\r\n if (!initialOptions?.validation?.key) {\r\n throw new Error(\"Validation key not found.\");\r\n }\r\n const validationKey = initialOptions.validation.key;\r\n const validateOnBlur = initialOptions.validation.onBlur === true;\r\n\r\n const handleBlur = async () => {\r\n // --- Ensure latest value is flushed if debouncing ---\r\n if (debounceTimeoutRef.current) {\r\n clearTimeout(debounceTimeoutRef.current); // Clear pending timer\r\n debounceTimeoutRef.current = null;\r\n isCurrentlyDebouncing.current = false;\r\n // Ensure the absolute latest local value is committed on blur\r\n updateFn(setState, localValue, path, validationKey);\r\n }\r\n // --- End modification ---\r\n\r\n if (!initialOptions.validation?.zodSchema || !validateOnBlur) return;\r\n removeValidationError(validationKey + \".\" + path.join(\".\"));\r\n try {\r\n // Use the potentially just flushed value\r\n const fieldValue = getGlobalStore\r\n .getState()\r\n .getNestedState(stateKey, path);\r\n await validateZodPathFunc(\r\n validationKey,\r\n initialOptions.validation.zodSchema,\r\n path,\r\n fieldValue\r\n );\r\n // forceUpdate might be needed if validation state update doesn't trigger render\r\n // Consider using useGetValidationErrors hook result directly for validation display\r\n } catch (error) {\r\n console.error(\"Validation error on blur:\", error);\r\n }\r\n };\r\n\r\n const rawSyncStatus = useGetSyncInfo(stateKey, path);\r\n const syncStatus = rawSyncStatus\r\n ? { ...rawSyncStatus, date: new Date(rawSyncStatus.timeStamp) }\r\n : null;\r\n\r\n const childElement = child({\r\n // --- START CHANGES ---\r\n get: () => localValue, // Get should return the immediate local value\r\n set: debouncedUpdater, // Use the new debounced updater\r\n // --- END CHANGES ---\r\n syncStatus,\r\n path: path,\r\n validationErrors: () =>\r\n getValidationErrors(validationKey + \".\" + path.join(\".\")),\r\n addValidationError: (message?: string) => {\r\n removeValidationError(validationKey + \".\" + path.join(\".\"));\r\n addValidationError(validationKey + \".\" + path.join(\".\"), message ?? \"\");\r\n },\r\n inputProps: {\r\n // --- START CHANGES ---\r\n value: localValue ?? \"\", // Input value is always the local state\r\n onChange: (e: any) => debouncedUpdater(e.target.value), // Use debounced updater\r\n // --- END CHANGES ---\r\n onBlur: handleBlur,\r\n ref: formRef,\r\n },\r\n });\r\n\r\n return (\r\n <>\r\n <ValidationWrapper {...{ formOpts, path, stateKey }}>\r\n {childElement}\r\n </ValidationWrapper>\r\n </>\r\n );\r\n};\r\nexport function ValidationWrapper({\r\n formOpts,\r\n path,\r\n\r\n stateKey,\r\n children,\r\n validIndices,\r\n}: {\r\n formOpts?: FormOptsType;\r\n path: string[];\r\n\r\n stateKey?: string;\r\n children: React.ReactNode;\r\n validIndices?: number[];\r\n}) {\r\n const { getInitialOptions } = getGlobalStore.getState();\r\n const thisStateOpts = getInitialOptions(stateKey!);\r\n const validationKey = thisStateOpts?.validation?.key ?? stateKey!;\r\n const validationErrors = useGetValidationErrors(\r\n validationKey,\r\n path,\r\n validIndices\r\n );\r\n // console.log(\r\n // \"validationErrors ValidationWrapper\",\r\n // stateKey,\r\n // validationKey,\r\n // path,\r\n // validationErrors\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\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()}>{children}</React.Fragment>\r\n ),\r\n active: validationErrors.length > 0 ? true : false,\r\n message: formOpts?.validation?.hideMessage\r\n ? \"\"\r\n : formOpts?.validation?.message\r\n ? formOpts?.validation?.message\r\n : thesMessages.map((m) => m).join(\", \"),\r\n path: path,\r\n })\r\n ) : (\r\n <React.Fragment key={path.toString()}>{children}</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","fullPathRef","useEffect","callback","store","newValue","unsubscribe","useGetValidationErrors","validIndices","useGetSyncInfo","key","syncKey","useGetKeyState","FormControlComponent","child","formOpts","registerFormRef","getFormRef","formRefStore","getValidationErrors","addValidationError","getInitialOptions","removeValidationError","refKey","localFormRef","existingRef","formRef","globalStateValue","localValue","setLocalValue","isCurrentlyDebouncing","debounceTimeoutRef","debouncedUpdater","initialOptions","validateOnBlur","handleBlur","fieldValue","validateZodPathFunc","error","rawSyncStatus","syncStatus","childElement","message","e","jsx","Fragment","ValidationWrapper","children","thisStateOpts","validationErrors","thesMessages","newMessage","React","m"],"mappings":"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"}
1
+ {"version":3,"file":"Functions.jsx","sources":["../src/Functions.tsx"],"sourcesContent":["import {\r\n notifyComponent,\r\n type EffectiveSetState,\r\n type FormElementParams,\r\n type FormOptsType,\r\n type UpdateArg,\r\n type 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, formRefStore } from \"./store\";\r\nimport { validateZodPathFunc } from \"./useValidateZodPath\";\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.getState().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 ? index?.toString() : (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.getState().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 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 ? index?.toString() : (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 const fullPathRef = useRef(fullPath);\r\n useEffect(() => {\r\n fullPathRef.current = fullPath; // Ensure latest fullPath is always used\r\n\r\n setValue(selector(getGlobalStore.getState(), fullPath));\r\n\r\n const callback = (store: any) => {\r\n const newValue = selector(store, fullPathRef.current);\r\n\r\n if (!compare(previousValueRef.current, newValue)) {\r\n previousValueRef.current = newValue;\r\n setValue(newValue);\r\n }\r\n };\r\n const unsubscribe = getGlobalStore.subscribe(callback);\r\n return () => {\r\n unsubscribe();\r\n };\r\n }, [fullPath]);\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 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 const returnresult = useStoreSubscription(\r\n fullPath,\r\n (store, path) => store.getValidationErrors(path) || []\r\n );\r\n\r\n return returnresult;\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\r\n path: string[];\r\n child: (obj: FormElementParams<TStateObject>) => JSX.Element;\r\n formOpts?: FormOptsType;\r\n stateKey: string;\r\n}\r\n// Find FormControlComponent in your Functions.ts or equivalent file\r\n\r\nexport const FormControlComponent = <TStateObject,>({\r\n setState, // This is the real effectiveSetState from the hook\r\n path,\r\n child,\r\n formOpts,\r\n stateKey,\r\n}: FormControlComponentProps<TStateObject>) => {\r\n const { registerFormRef, getFormRef } = formRefStore.getState();\r\n const {\r\n getValidationErrors,\r\n addValidationError,\r\n getInitialOptions,\r\n removeValidationError,\r\n } = getGlobalStore.getState();\r\n\r\n const refKey = stateKey + \".\" + path.join(\".\");\r\n const localFormRef = useRef<HTMLInputElement>(null);\r\n const existingRef = getFormRef(refKey);\r\n if (!existingRef) {\r\n registerFormRef(refKey, localFormRef);\r\n }\r\n const formRef = existingRef || localFormRef;\r\n\r\n // --- START CHANGES ---\r\n\r\n const globalStateValue = useGetKeyState(stateKey, path);\r\n const [localValue, setLocalValue] = useState<any>(globalStateValue);\r\n const isCurrentlyDebouncing = useRef(false);\r\n const debounceTimeoutRef = useRef<NodeJS.Timeout | null>(null);\r\n\r\n // Effect to sync local state if global state changes externally\r\n useEffect(() => {\r\n // Only update local if not actively debouncing a local change\r\n if (!isCurrentlyDebouncing.current && globalStateValue !== localValue) {\r\n setLocalValue(globalStateValue);\r\n }\r\n }, [globalStateValue]); // Removed localValue dependency\r\n\r\n // Effect for cleanup\r\n useEffect(() => {\r\n return () => {\r\n if (debounceTimeoutRef.current) {\r\n clearTimeout(debounceTimeoutRef.current);\r\n debounceTimeoutRef.current = null; // Explicitly nullify\r\n isCurrentlyDebouncing.current = false;\r\n }\r\n };\r\n }, []);\r\n\r\n const debouncedUpdater = (payload: UpdateArg<TStateObject>) => {\r\n setLocalValue(payload); // Update local state immediately\r\n isCurrentlyDebouncing.current = true;\r\n\r\n if (payload === \"\") {\r\n if (debounceTimeoutRef.current) {\r\n clearTimeout(debounceTimeoutRef.current); // Clear pending timer\r\n debounceTimeoutRef.current = null;\r\n }\r\n updateFn(setState, payload, path, validationKey); // Update global state NOW\r\n isCurrentlyDebouncing.current = false; // No longer debouncing\r\n return; // Don't proceed to set another timeout\r\n }\r\n\r\n // If not empty, proceed with normal debouncing\r\n if (debounceTimeoutRef.current) {\r\n clearTimeout(debounceTimeoutRef.current);\r\n }\r\n\r\n debounceTimeoutRef.current = setTimeout(\r\n () => {\r\n isCurrentlyDebouncing.current = false;\r\n updateFn(setState, payload, path, validationKey);\r\n },\r\n formOpts?.debounceTime ??\r\n (typeof globalStateValue == \"boolean\" ? 20 : 200)\r\n );\r\n };\r\n\r\n const initialOptions = getInitialOptions(stateKey);\r\n if (!initialOptions?.validation?.key) {\r\n throw new Error(\"Validation key not found.\");\r\n }\r\n const validationKey = initialOptions.validation.key;\r\n const validateOnBlur = initialOptions.validation.onBlur === true;\r\n\r\n const handleBlur = async () => {\r\n // --- Ensure latest value is flushed if debouncing ---\r\n if (debounceTimeoutRef.current) {\r\n clearTimeout(debounceTimeoutRef.current); // Clear pending timer\r\n debounceTimeoutRef.current = null;\r\n isCurrentlyDebouncing.current = false;\r\n // Ensure the absolute latest local value is committed on blur\r\n updateFn(setState, localValue, path, validationKey);\r\n }\r\n // --- End modification ---\r\n\r\n if (!initialOptions.validation?.zodSchema || !validateOnBlur) return;\r\n removeValidationError(validationKey + \".\" + path.join(\".\"));\r\n try {\r\n // Use the potentially just flushed value\r\n const fieldValue = getGlobalStore\r\n .getState()\r\n .getNestedState(stateKey, path);\r\n await validateZodPathFunc(\r\n validationKey,\r\n initialOptions.validation.zodSchema,\r\n path,\r\n fieldValue\r\n );\r\n // forceUpdate might be needed if validation state update doesn't trigger render\r\n // Consider using useGetValidationErrors hook result directly for validation display\r\n } catch (error) {\r\n console.error(\"Validation error on blur:\", error);\r\n }\r\n };\r\n\r\n const rawSyncStatus = useGetSyncInfo(stateKey, path);\r\n const syncStatus = rawSyncStatus\r\n ? { ...rawSyncStatus, date: new Date(rawSyncStatus.timeStamp) }\r\n : null;\r\n\r\n const childElement = child({\r\n // --- START CHANGES ---\r\n get: () => localValue, // Get should return the immediate local value\r\n set: debouncedUpdater, // Use the new debounced updater\r\n // --- END CHANGES ---\r\n syncStatus,\r\n path: path,\r\n validationErrors: () =>\r\n getValidationErrors(validationKey + \".\" + path.join(\".\")),\r\n addValidationError: (message?: string) => {\r\n removeValidationError(validationKey + \".\" + path.join(\".\"));\r\n addValidationError(validationKey + \".\" + path.join(\".\"), message ?? \"\");\r\n },\r\n inputProps: {\r\n // --- START CHANGES ---\r\n value: localValue ?? \"\", // Input value is always the local state\r\n onChange: (e: any) => debouncedUpdater(e.target.value), // Use debounced updater\r\n // --- END CHANGES ---\r\n onBlur: handleBlur,\r\n ref: formRef,\r\n },\r\n });\r\n\r\n return (\r\n <>\r\n <ValidationWrapper {...{ formOpts, path, stateKey }}>\r\n {childElement}\r\n </ValidationWrapper>\r\n </>\r\n );\r\n};\r\nexport type ValidationWrapperProps = {\r\n formOpts?: FormOptsType;\r\n path: string[];\r\n stateKey: string;\r\n children: React.ReactNode;\r\n validIndices?: number[];\r\n};\r\nexport function ValidationWrapper({\r\n formOpts,\r\n path,\r\n\r\n stateKey,\r\n children,\r\n validIndices,\r\n}: ValidationWrapperProps) {\r\n const { getInitialOptions } = getGlobalStore.getState();\r\n const thisStateOpts = getInitialOptions(stateKey!);\r\n const validationKey = thisStateOpts?.validation?.key ?? stateKey!;\r\n const validationErrors = useGetValidationErrors(\r\n validationKey,\r\n path,\r\n validIndices\r\n );\r\n // console.log(\r\n // \"validationErrors ValidationWrapper\",\r\n // stateKey,\r\n // validationKey,\r\n // path,\r\n // validationErrors\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\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()}>{children}</React.Fragment>\r\n ),\r\n active: validationErrors.length > 0 ? true : false,\r\n message: formOpts?.validation?.hideMessage\r\n ? \"\"\r\n : formOpts?.validation?.message\r\n ? formOpts?.validation?.message\r\n : thesMessages.map((m) => m).join(\", \"),\r\n path: path,\r\n })\r\n ) : (\r\n <React.Fragment key={path.toString()}>{children}</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","fullPathRef","useEffect","callback","store","newValue","unsubscribe","useGetValidationErrors","validIndices","useGetSyncInfo","key","syncKey","useGetKeyState","FormControlComponent","child","formOpts","registerFormRef","getFormRef","formRefStore","getValidationErrors","addValidationError","getInitialOptions","removeValidationError","refKey","localFormRef","existingRef","formRef","globalStateValue","localValue","setLocalValue","isCurrentlyDebouncing","debounceTimeoutRef","debouncedUpdater","initialOptions","validateOnBlur","handleBlur","fieldValue","validateZodPathFunc","error","rawSyncStatus","syncStatus","childElement","message","e","jsx","Fragment","ValidationWrapper","children","thisStateOpts","validationErrors","thesMessages","newMessage","React","m"],"mappings":"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"}
package/dist/store.d.ts CHANGED
@@ -32,18 +32,31 @@ export type FormRefStoreState = {
32
32
  getFormRefsByStateKey: (stateKey: string) => Map<string, React.RefObject<any>>;
33
33
  };
34
34
  export declare const formRefStore: import('zustand').UseBoundStore<import('zustand').StoreApi<FormRefStoreState>>;
35
- export type CogsGlobalState = {
36
- shadowStateStore: {
37
- [key: string]: any;
35
+ export type ItemMeta = {
36
+ _cogsId: string;
37
+ virtualizer?: {
38
+ itemHeight?: number;
39
+ domRef?: HTMLDivElement | null;
38
40
  };
41
+ syncStatus?: "new" | "syncing" | "synced" | "failed";
42
+ error?: string;
43
+ };
44
+ export type ShadowNode = ItemMeta[] | {
45
+ [key: string]: ShadowNode;
46
+ };
47
+ export type ShadowStateStore = {
48
+ [key: string]: ShadowNode;
49
+ };
50
+ export type CogsGlobalState = {
51
+ shadowStateStore: ShadowStateStore;
39
52
  shadowStateSubscribers: Map<string, Set<() => void>>;
40
53
  subscribeToShadowState: (key: string, callback: () => void) => () => void;
41
- initializeShadowState: (key: string, initialState: any) => void;
42
- updateShadowAtPath: (key: string, path: string[], newValue: any) => void;
43
- insertShadowArrayElement: (key: string, arrayPath: string[], newItem: any) => void;
54
+ initializeShadowState: <T>(key: string, initialState: T) => void;
55
+ updateShadowAtPath: <T>(key: string, path: string[], newValue: T) => void;
56
+ insertShadowArrayElement: (key: string, arrayPath: string[], newItemMeta: ItemMeta) => void;
44
57
  removeShadowArrayElement: (key: string, arrayPath: string[], index: number) => void;
45
- getShadowMetadata: (key: string, path: string[]) => any;
46
- setShadowMetadata: (key: string, path: string[], metadata: any) => void;
58
+ getShadowMetadata: (key: string, path: string[]) => ShadowNode | null;
59
+ setShadowMetadata: (key: string, path: string[], metadata: Partial<ItemMeta>) => void;
47
60
  selectedIndicesMap: Map<string, Map<string, number>>;
48
61
  getSelectedIndex: (stateKey: string, parentPath: string) => number | undefined;
49
62
  setSelectedIndex: (stateKey: string, parentPath: string, index: number | undefined) => void;
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\n\r\nexport type CogsGlobalState = {\r\n // --- Shadow State and Subscription System ---\r\n shadowStateStore: { [key: string]: any };\r\n shadowStateSubscribers: Map<string, Set<() => void>>; // Stores subscribers for shadow state updates\r\n subscribeToShadowState: (key: string, callback: () => void) => () => void; // Subscribes a listener, returns an unsubscribe function\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 // --- Selected Item State ---\r\n selectedIndicesMap: Map<string, Map<string, number>>; // stateKey -> (parentPath -> selectedIndex)\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\r\n // --- Core State and Updaters ---\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 initialStateGlobal: { [key: string]: StateValue };\r\n iniitialCreatedState: { [key: string]: StateValue };\r\n serverState: { [key: string]: StateValue };\r\n\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 updateInitialStateGlobal: (key: string, newState: StateValue) => void;\r\n updateInitialCreatedState: (key: string, newState: StateValue) => void;\r\n setIsLoadingGlobal: (key: string, value: boolean) => void;\r\n setServerState: <StateKey extends StateKeys>(\r\n key: StateKey,\r\n value: StateValue\r\n ) => void;\r\n getInitialOptions: (key: string) => OptionsType | undefined;\r\n setInitialStateOptions: (key: string, value: OptionsType) => void;\r\n\r\n // --- Validation ---\r\n validationErrors: Map<string, string[]>;\r\n addValidationError: (path: string, message: string) => void;\r\n getValidationErrors: (path: string) => string[];\r\n removeValidationError: (path: string) => void;\r\n\r\n // --- Server Sync and Logging ---\r\n serverSyncActions: { [key: string]: SyncActionsType<any> };\r\n serverSyncLog: { [key: string]: SyncLogType[] };\r\n stateLog: { [key: string]: UpdateTypeDetail[] };\r\n syncInfoStore: Map<string, SyncInfo>;\r\n serverSideOrNot: { [key: string]: boolean };\r\n setServerSyncLog: (key: string, newValue: SyncLogType) => void;\r\n setServerSideOrNot: (key: string, value: boolean) => void;\r\n getServerSideOrNot: (key: string) => boolean | undefined;\r\n getThisLocalUpdate: (key: string) => UpdateTypeDetail[] | undefined;\r\n setServerSyncActions: (key: string, value: SyncActionsType<any>) => void;\r\n setStateLog: (\r\n key: string,\r\n updater: (prevUpdates: UpdateTypeDetail[]) => UpdateTypeDetail[]\r\n ) => void;\r\n setSyncInfo: (key: string, syncInfo: SyncInfo) => void;\r\n getSyncInfo: (key: string) => SyncInfo | null;\r\n\r\n // --- Component and DOM Integration ---\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 stateComponents: Map<string, ComponentsType>;\r\n\r\n // --- Deprecated/Legacy (Review for removal) ---\r\n reRenderTriggerPrevValue: Record<string, any>;\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\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 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 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 shadowStateSubscribers: new Map<string, Set<() => void>>(), // key -> Set of callbacks\r\n\r\n subscribeToShadowState: (key: string, callback: () => void) => {\r\n set((state) => {\r\n const newSubs = new Map(state.shadowStateSubscribers);\r\n const subsForKey = newSubs.get(key) || new Set();\r\n subsForKey.add(callback);\r\n newSubs.set(key, subsForKey);\r\n return { shadowStateSubscribers: newSubs };\r\n });\r\n // Return an unsubscribe function\r\n return () => {\r\n set((state) => {\r\n const newSubs = new Map(state.shadowStateSubscribers);\r\n const subsForKey = newSubs.get(key);\r\n if (subsForKey) {\r\n subsForKey.delete(callback);\r\n }\r\n return { shadowStateSubscribers: newSubs };\r\n });\r\n };\r\n },\r\n\r\n setShadowMetadata: (key: string, path: string[], metadata: any) => {\r\n let hasChanged = false;\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 const oldHeight = current.virtualizer?.itemHeight;\r\n const newHeight = metadata.virtualizer?.itemHeight;\r\n\r\n if (newHeight && oldHeight !== newHeight) {\r\n hasChanged = true;\r\n if (!current.virtualizer) current.virtualizer = {};\r\n current.virtualizer.itemHeight = newHeight;\r\n }\r\n\r\n return { shadowStateStore: newShadow };\r\n });\r\n\r\n // If a height value was actually changed, notify the specific subscribers.\r\n if (hasChanged) {\r\n const subscribers = get().shadowStateSubscribers.get(key);\r\n if (subscribers) {\r\n subscribers.forEach((callback) => callback());\r\n }\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","initialState","createShadowStructure","obj","_","i","k","newValue","newShadow","pathCopy","lastSegment","arrayPath","newItem","item","index","callback","newSubs","subsForKey","metadata","hasChanged","oldHeight","newHeight","subscribers","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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"}
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\nexport type ItemMeta = {\r\n _cogsId: string;\r\n virtualizer?: {\r\n itemHeight?: number;\r\n domRef?: HTMLDivElement | null;\r\n };\r\n syncStatus?: \"new\" | \"syncing\" | \"synced\" | \"failed\";\r\n error?: string;\r\n};\r\n\r\n// THE NEW, CORRECT, RECURSIVE TYPE FOR THE SHADOW STATE\r\n// A ShadowNode is either:\r\n// 1. An array of ItemMeta (if it represents a user's array).\r\n// 2. An object that can be indexed by any string, whose values are other ShadowNodes.\r\nexport type ShadowNode = ItemMeta[] | { [key: string]: ShadowNode };\r\n\r\n// This is the top-level type for the store, mapping state keys to our ShadowNode structure.\r\nexport type ShadowStateStore = {\r\n [key: string]: ShadowNode;\r\n};\r\n\r\nexport type CogsGlobalState = {\r\n // --- Shadow State and Subscription System ---\r\n shadowStateStore: ShadowStateStore;\r\n shadowStateSubscribers: Map<string, Set<() => void>>;\r\n subscribeToShadowState: (key: string, callback: () => void) => () => void;\r\n initializeShadowState: <T>(key: string, initialState: T) => void;\r\n updateShadowAtPath: <T>(key: string, path: string[], newValue: T) => void;\r\n insertShadowArrayElement: (\r\n key: string,\r\n arrayPath: string[],\r\n newItemMeta: ItemMeta\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[]) => ShadowNode | null;\r\n setShadowMetadata: (\r\n key: string,\r\n path: string[],\r\n metadata: Partial<ItemMeta>\r\n ) => void;\r\n // --- Selected Item State ---\r\n selectedIndicesMap: Map<string, Map<string, number>>; // stateKey -> (parentPath -> selectedIndex)\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\r\n // --- Core State and Updaters ---\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 initialStateGlobal: { [key: string]: StateValue };\r\n iniitialCreatedState: { [key: string]: StateValue };\r\n serverState: { [key: string]: StateValue };\r\n\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 updateInitialStateGlobal: (key: string, newState: StateValue) => void;\r\n updateInitialCreatedState: (key: string, newState: StateValue) => void;\r\n setIsLoadingGlobal: (key: string, value: boolean) => void;\r\n setServerState: <StateKey extends StateKeys>(\r\n key: StateKey,\r\n value: StateValue\r\n ) => void;\r\n getInitialOptions: (key: string) => OptionsType | undefined;\r\n setInitialStateOptions: (key: string, value: OptionsType) => void;\r\n\r\n // --- Validation ---\r\n validationErrors: Map<string, string[]>;\r\n addValidationError: (path: string, message: string) => void;\r\n getValidationErrors: (path: string) => string[];\r\n removeValidationError: (path: string) => void;\r\n\r\n // --- Server Sync and Logging ---\r\n serverSyncActions: { [key: string]: SyncActionsType<any> };\r\n serverSyncLog: { [key: string]: SyncLogType[] };\r\n stateLog: { [key: string]: UpdateTypeDetail[] };\r\n syncInfoStore: Map<string, SyncInfo>;\r\n serverSideOrNot: { [key: string]: boolean };\r\n setServerSyncLog: (key: string, newValue: SyncLogType) => void;\r\n setServerSideOrNot: (key: string, value: boolean) => void;\r\n getServerSideOrNot: (key: string) => boolean | undefined;\r\n getThisLocalUpdate: (key: string) => UpdateTypeDetail[] | undefined;\r\n setServerSyncActions: (key: string, value: SyncActionsType<any>) => void;\r\n setStateLog: (\r\n key: string,\r\n updater: (prevUpdates: UpdateTypeDetail[]) => UpdateTypeDetail[]\r\n ) => void;\r\n setSyncInfo: (key: string, syncInfo: SyncInfo) => void;\r\n getSyncInfo: (key: string) => SyncInfo | null;\r\n\r\n // --- Component and DOM Integration ---\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 stateComponents: Map<string, ComponentsType>;\r\n\r\n // --- Deprecated/Legacy (Review for removal) ---\r\n reRenderTriggerPrevValue: Record<string, any>;\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\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: any = 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 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: any = 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 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: any = 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 shadowStateSubscribers: new Map<string, Set<() => void>>(), // key -> Set of callbacks\r\n\r\n subscribeToShadowState: (key: string, callback: () => void) => {\r\n set((state) => {\r\n const newSubs = new Map(state.shadowStateSubscribers);\r\n const subsForKey = newSubs.get(key) || new Set();\r\n subsForKey.add(callback);\r\n newSubs.set(key, subsForKey);\r\n return { shadowStateSubscribers: newSubs };\r\n });\r\n // Return an unsubscribe function\r\n return () => {\r\n set((state) => {\r\n const newSubs = new Map(state.shadowStateSubscribers);\r\n const subsForKey = newSubs.get(key);\r\n if (subsForKey) {\r\n subsForKey.delete(callback);\r\n }\r\n return { shadowStateSubscribers: newSubs };\r\n });\r\n };\r\n },\r\n\r\n setShadowMetadata: (key: string, path: string[], metadata: any) => {\r\n let hasChanged = false;\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 const oldHeight = current.virtualizer?.itemHeight;\r\n const newHeight = metadata.virtualizer?.itemHeight;\r\n\r\n if (newHeight && oldHeight !== newHeight) {\r\n hasChanged = true;\r\n if (!current.virtualizer) current.virtualizer = {};\r\n current.virtualizer.itemHeight = newHeight;\r\n }\r\n\r\n return { shadowStateStore: newShadow };\r\n });\r\n\r\n // If a height value was actually changed, notify the specific subscribers.\r\n if (hasChanged) {\r\n const subscribers = get().shadowStateSubscribers.get(key);\r\n if (subscribers) {\r\n subscribers.forEach((callback) => callback());\r\n }\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","initialState","createShadowStructure","obj","_","i","k","newValue","newShadow","pathCopy","lastSegment","arrayPath","newItem","item","index","callback","newSubs","subsForKey","metadata","hasChanged","oldHeight","newHeight","subscribers","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":";AAqDO,MAAMA,IAAeC,EAA0B,CAACC,GAAKC,OAAS;AAAA,EACnE,8BAAc,IAAI;AAAA,EAElB,iBAAiB,CAACC,GAAIC,MACpBH,EAAI,CAACI,MAAU;AACb,UAAMC,IAAU,IAAI,IAAID,EAAM,QAAQ;AAC9B,WAAAC,EAAA,IAAIH,GAAIC,CAAG,GACZ,EAAE,UAAUE,EAAQ;AAAA,EAAA,CAC5B;AAAA,EAEH,YAAY,CAACH,MAAOD,EAAM,EAAA,SAAS,IAAIC,CAAE;AAAA,EAEzC,eAAe,CAACA,MACdF,EAAI,CAACI,MAAU;AACb,UAAMC,IAAU,IAAI,IAAID,EAAM,QAAQ;AACtC,WAAAC,EAAQ,OAAOH,CAAE,GACV,EAAE,UAAUG,EAAQ;AAAA,EAAA,CAC5B;AAAA;AAAA,EAGH,uBAAuB,CAACC,MAAa;AAC7B,UAAAC,IAAUN,IAAM,UAChBO,IAAiBF,IAAW,KAC5BG,wBAAmB,IAAI;AAErB,WAAAF,EAAA,QAAQ,CAACJ,GAAKD,MAAO;AAC3B,OAAIA,EAAG,WAAWM,CAAc,KAAKN,MAAOI,MAC7BG,EAAA,IAAIP,GAAIC,CAAG;AAAA,IAC1B,CACD,GAEMM;AAAA,EAAA;AAEX,EAAE,GAwKWC,IAAiBX,EAAwB,CAACC,GAAKC,OAAS;AAAA,EACnE,kBAAkB,CAAC;AAAA,EACnB,mBAAmB,CAACU,GAAaC,MAAmB;AAClD,UAAMC,IAASZ,IAAM,iBAAiBU,CAAG;AACrC,QAAA,CAACE,EAAe,QAAA;AAEpB,QAAIC,IAAeD;AACnB,eAAWE,KAAWH;AAEhB,UADJE,IAAUA,IAAUC,CAAO,GACvB,CAACD,EAAgB,QAAA;AAGhB,WAAAA;AAAA,EACT;AAAA,EAEA,uBAAuB,CAACH,GAAaK,MAAsB;AACnD,UAAAC,IAAwB,CAACC,MAAkB;AAC3C,UAAA,MAAM,QAAQA,CAAG;AACnB,eAAO,IAAI,MAAMA,EAAI,MAAM,EACxB,KAAK,IAAI,EACT,IAAI,CAACC,GAAGC,MAAMH,EAAsBC,EAAIE,CAAC,CAAC,CAAC;AAEhD,UAAI,OAAOF,KAAQ,YAAYA,MAAQ,MAAM;AAC3C,cAAML,IAAc,CAAC;AACrB,mBAAWQ,KAAKH;AACd,UAAAL,EAAOQ,CAAC,IAAIJ,EAAsBC,EAAIG,CAAC,CAAC;AAEnC,eAAAR;AAAA,MAAA;AAET,aAAO,CAAC;AAAA,IACV;AAEA,IAAAb,EAAI,CAACI,OAAW;AAAA,MACd,kBAAkB;AAAA,QAChB,GAAGA,EAAM;AAAA,QACT,CAACO,CAAG,GAAGM,EAAsBD,CAAY;AAAA,MAAA;AAAA,IAC3C,EACA;AAAA,EACJ;AAAA,EAEA,oBAAoB,CAACL,GAAaC,GAAgBU,MAAkB;AAClE,IAAAtB,EAAI,CAACI,MAAU;AACb,YAAMmB,IAAY,EAAE,GAAGnB,EAAM,iBAAiB;AAC9C,UAAI,CAACmB,EAAUZ,CAAG,EAAU,QAAAP;AAExB,UAAAU,IAAeS,EAAUZ,CAAG;AAC1B,YAAAa,IAAW,CAAC,GAAGZ,CAAI,GACnBa,IAAcD,EAAS,IAAI;AAGjC,iBAAWT,KAAWS;AACpB,QAAKV,EAAQC,CAAO,MAAWD,EAAAC,CAAO,IAAI,CAAC,IAC3CD,IAAUA,EAAQC,CAAO;AAI3B,aAAIU,MAAgB,WACd,MAAM,QAAQH,CAAQ,IACxBR,EAAQW,CAAW,IAAI,IAAI,MAAMH,EAAS,MAAM,IACvC,OAAOA,KAAa,YAAYA,MAAa,OAC9CR,EAAAW,CAAW,IAAI,CAAC,IAExBX,EAAQW,CAAW,IAAIX,EAAQW,CAAW,KAAK,CAAC,IAI7C,EAAE,kBAAkBF,EAAU;AAAA,IAAA,CACtC;AAAA,EACH;AAAA,EAEA,0BAA0B,CACxBZ,GACAe,GACAC,MACG;AACH,IAAA3B,EAAI,CAACI,MAAU;AACb,YAAMmB,IAAY,EAAE,GAAGnB,EAAM,iBAAiB;AAC9C,UAAI,CAACmB,EAAUZ,CAAG,EAAU,QAAAP;AAElB,MAAAmB,EAAAZ,CAAG,IAAI,KAAK,MAAM,KAAK,UAAUY,EAAUZ,CAAG,CAAC,CAAC;AAEtD,UAAAG,IAAeS,EAAUZ,CAAG;AAEhC,iBAAWI,KAAWW;AAEhB,YADJZ,IAAUA,EAAQC,CAAO,GACrB,CAACD,EAAgB,QAAAV;AAGnB,UAAA,MAAM,QAAQU,CAAO,GAAG;AAEpB,cAAAG,IAAwB,CAACC,MAAkB;AAC3C,cAAA,MAAM,QAAQA,CAAG;AACnB,mBAAOA,EAAI,IAAI,CAACU,MAASX,EAAsBW,CAAI,CAAC;AAEtD,cAAI,OAAOV,KAAQ,YAAYA,MAAQ,MAAM;AAC3C,kBAAML,IAAc,CAAC;AACrB,uBAAWQ,KAAKH;AACd,cAAAL,EAAOQ,CAAC,IAAIJ,EAAsBC,EAAIG,CAAC,CAAC;AAEnC,mBAAAR;AAAA,UAAA;AAET,iBAAO,CAAC;AAAA,QACV;AAEQ,QAAAC,EAAA,KAAKG,EAAsBU,CAAO,CAAC;AAAA,MAAA;AAGtC,aAAA,EAAE,kBAAkBJ,EAAU;AAAA,IAAA,CACtC;AAAA,EACH;AAAA,EACA,0BAA0B,CACxBZ,GACAe,GACAG,MACG;AACH,IAAA7B,EAAI,CAACI,MAAU;AACb,YAAMmB,IAAY,EAAE,GAAGnB,EAAM,iBAAiB;AAC1C,UAAAU,IAAeS,EAAUZ,CAAG;AAEhC,iBAAWI,KAAWW;AACpB,QAAAZ,IAAUA,IAAUC,CAAO;AAGzB,aAAA,MAAM,QAAQD,CAAO,KACfA,EAAA,OAAOe,GAAO,CAAC,GAGlB,EAAE,kBAAkBN,EAAU;AAAA,IAAA,CACtC;AAAA,EACH;AAAA,EACA,4CAA4B,IAA6B;AAAA;AAAA,EAEzD,wBAAwB,CAACZ,GAAamB,OACpC9B,EAAI,CAACI,MAAU;AACb,UAAM2B,IAAU,IAAI,IAAI3B,EAAM,sBAAsB,GAC9C4B,IAAaD,EAAQ,IAAIpB,CAAG,yBAAS,IAAI;AAC/C,WAAAqB,EAAW,IAAIF,CAAQ,GACfC,EAAA,IAAIpB,GAAKqB,CAAU,GACpB,EAAE,wBAAwBD,EAAQ;AAAA,EAAA,CAC1C,GAEM,MAAM;AACX,IAAA/B,EAAI,CAACI,MAAU;AACb,YAAM2B,IAAU,IAAI,IAAI3B,EAAM,sBAAsB,GAC9C4B,IAAaD,EAAQ,IAAIpB,CAAG;AAClC,aAAIqB,KACFA,EAAW,OAAOF,CAAQ,GAErB,EAAE,wBAAwBC,EAAQ;AAAA,IAAA,CAC1C;AAAA,EACH;AAAA,EAGF,mBAAmB,CAACpB,GAAaC,GAAgBqB,MAAkB;AACjE,QAAIC,IAAa;AA0BjB,QAzBAlC,EAAI,CAACI,MAAU;AACb,YAAMmB,IAAY,EAAE,GAAGnB,EAAM,iBAAiB;AAC9C,UAAI,CAACmB,EAAUZ,CAAG,EAAU,QAAAP;AAElB,MAAAmB,EAAAZ,CAAG,IAAI,KAAK,MAAM,KAAK,UAAUY,EAAUZ,CAAG,CAAC,CAAC;AAEtD,UAAAG,IAAeS,EAAUZ,CAAG;AAChC,iBAAWI,KAAWH;AACpB,QAAKE,EAAQC,CAAO,MAAWD,EAAAC,CAAO,IAAI,CAAC,IAC3CD,IAAUA,EAAQC,CAAO;AAGrB,YAAAoB,IAAYrB,EAAQ,aAAa,YACjCsB,IAAYH,EAAS,aAAa;AAEpC,aAAAG,KAAaD,MAAcC,MAChBF,IAAA,IACRpB,EAAQ,gBAAaA,EAAQ,cAAc,CAAC,IACjDA,EAAQ,YAAY,aAAasB,IAG5B,EAAE,kBAAkBb,EAAU;AAAA,IAAA,CACtC,GAGGW,GAAY;AACd,YAAMG,IAAcpC,EAAA,EAAM,uBAAuB,IAAIU,CAAG;AACxD,MAAI0B,KACFA,EAAY,QAAQ,CAACP,MAAaA,EAAA,CAAU;AAAA,IAC9C;AAAA,EAEJ;AAAA,EACA,wCAAwB,IAAiC;AAAA;AAAA,EAGzD,kBAAkB,CAACxB,GAAkBgC,MAAuB;AAC1D,UAAMC,IAAWtC,EAAA,EAAM,mBAAmB,IAAIK,CAAQ;AAClD,QAACiC;AACE,aAAAA,EAAS,IAAID,CAAU;AAAA,EAChC;AAAA,EAEA,kBAAkB,CAChBhC,GACAgC,GACAT,MACG;AACH,IAAA7B,EAAI,CAACI,MAAU;AACb,YAAMoC,IAAS,IAAI,IAAIpC,EAAM,kBAAkB;AAC3C,UAAAmC,IAAWC,EAAO,IAAIlC,CAAQ;AAElC,aAAKiC,MACHA,wBAAe,IAAoB,GAC5BC,EAAA,IAAIlC,GAAUiC,CAAQ,IAG3BV,MAAU,SACZU,EAAS,OAAOD,CAAU,IAEjBC,EAAA,IAAID,GAAYT,CAAK,GAGzB;AAAA,QACL,GAAGzB;AAAA,QACH,oBAAoBoC;AAAA,MACtB;AAAA,IAAA,CACD;AAAA,EACH;AAAA,EACA,oBAAoB,CAAC;AAAA,IACnB,UAAAlC;AAAA,IACA,MAAAM;AAAA,EAAA,MAII;AACJ,IAAAZ,EAAI,CAACI,MAAU;AACb,YAAMoC,IAAS,IAAI,IAAIpC,EAAM,kBAAkB,GACzCmC,IAAWC,EAAO,IAAIlC,CAAQ;AAChC,UAAA,CAACiC,EAAiB,QAAAnC;AAChB,YAAAkC,IAAa1B,EAAK,KAAK,GAAG;AAChC,aAAA2B,EAAS,OAAOD,CAAU,GACnB;AAAA,QACL,GAAGlC;AAAA,QACH,oBAAoBoC;AAAA,MACtB;AAAA,IAAA,CACD;AAAA,EACH;AAAA,EACA,8BAA8B,CAAClC,MAAqB;AAClD,IAAAN,EAAI,CAACI,MAAU;AACb,YAAMqC,IAAc,IAAI,IAAIrC,EAAM,kBAAkB;AAEpD,aADgBqC,EAAY,OAAOnC,CAAQ,KAEjC,QAAA;AAAA,QACN,oDAAoDA,CAAQ;AAAA,MAC9D,GACO,EAAE,oBAAoBmC,EAAY,KAElC,CAAC;AAAA,IACV,CACD;AAAA,EACH;AAAA,EACA,qCAAqB,IAAI;AAAA,EACzB,WAAW,CAACC,MAEHzC,EAAA,EAAM,UAAUyC,CAAQ;AAAA,EAGjC,cAAc,CAAC;AAAA,EACf,iBAAiB,CAAC/B,GAAKgC,MACrB3C,EAAI,CAACI,OAAW;AAAA,IACd,GAAGA;AAAA,IACH,cAAc;AAAA,MACZ,GAAGA,EAAM;AAAA,MACT,CAACO,CAAG,GAAGgC;AAAA,IAAA;AAAA,EACT,EACA;AAAA,EACJ,oBAAoB,CAAChC,MACnBX,EAAI,CAACI,MAAU;AACP,UAAA,EAAE,CAACO,CAAG,GAAGQ,GAAG,GAAGyB,EAAA,IAASxC,EAAM;AAC7B,WAAA;AAAA,MACL,GAAGA;AAAA,MACH,cAAcwC;AAAA,IAChB;AAAA,EAAA,CACD;AAAA,EAEH,0BAA0B,CAAC;AAAA,EAC3B,uCAAuB,IAAI;AAAA,EAC3B,kBAAkB,CAChBC,GACAC,MACG;AACG,UAAAhC,IAAUb,IAAM;AACtB,IAAKa,EAAQ,IAAI+B,CAAQ,KACvB/B,EAAQ,IAAI+B,GAAc,oBAAA,IAAA,CAAK,GAEjC/B,EAAQ,IAAI+B,CAAQ,EAAG,IAAIC,CAAW,GAEtC9C,EAAI,EAAE,mBAAmB,IAAI,IAAIc,CAAO,GAAG;AAAA,EAC7C;AAAA,EACA,qBAAqB,CAAC+B,GAAkBE,MAAuB;AACvD,UAAAjC,IAAUb,IAAM,mBAChB+C,IAAWlC,EAAQ,IAAI+B,CAAQ;AACrC,IAAIG,KACOA,EAAA,QAAQ,CAACC,MAAO;AACnB,MAAAA,EAAG,eAAeF,KACpBC,EAAS,OAAOC,CAAE;AAAA,IACpB,CACD,GAEHjD,EAAI,EAAE,mBAAmB,IAAI,IAAIc,CAAO,GAAG;AAAA,EAC7C;AAAA,EACA,qBAAqB,CAAC;AAAA,EACtB,cAAc,CAAC;AAAA,EACf,eAAe,CAAC;AAAA,EAChB,gBAAgB,CAAC;AAAA,EACjB,UAAU,CAAC;AAAA,EACX,iBAAiB,CAAC;AAAA,EAElB,oBAAoB,CAAC;AAAA,EACrB,sBAAsB,CAAC;AAAA,EACvB,2BAA2B,CAACH,GAAKuC,MAAa;AAC5C,IAAAlD,EAAI,CAACmD,OAAU;AAAA,MACb,sBAAsB;AAAA,QACpB,GAAGA,EAAK;AAAA,QACR,CAACxC,CAAG,GAAGuC;AAAA,MAAA;AAAA,IACT,EACA;AAAA,EACJ;AAAA,EAEA,sCAAsB,IAAI;AAAA,EAE1B,aAAa,CAAC;AAAA,EAEd,mBAAmB,CAAC;AAAA,EAEpB,eAAe,CAAC;AAAA,EAChB,iBAAiB,CAAC;AAAA,EAClB,kBAAkB,CAACvC,GAAKW,MAAa;AACnC,IAAAtB,EAAI,CAACI,OAAW;AAAA,MACd,eAAe;AAAA,QACb,GAAGA,EAAM;AAAA,QACT,CAACO,CAAG,GAAG,CAAC,GAAIP,EAAM,cAAcO,CAAG,KAAK,CAAA,GAAKW,CAAQ;AAAA,MAAA;AAAA,IACvD,EACA;AAAA,EACJ;AAAA,EACA,oBAAoB,CAACX,GAAKyC,MAAU;AAClC,IAAApD,EAAI,CAACI,OAAW;AAAA,MACd,iBAAiB;AAAA,QACf,GAAGA,EAAM;AAAA,QACT,CAACO,CAAG,GAAGyC;AAAA,MAAA;AAAA,IACT,EACA;AAAA,EACJ;AAAA,EACA,oBAAoB,CAACzC,MACZV,EAAA,EAAM,gBAAgBU,CAAG;AAAA,EAGlC,oBAAoB,CAACA,MACZV,EAAA,EAAM,SAASU,CAAG;AAAA,EAE3B,gBAAgB,CACdA,GACAyC,MACG;AACH,IAAApD,EAAI,CAACmD,OAAU;AAAA,MACb,aAAa;AAAA,QACX,GAAGA,EAAK;AAAA,QACR,CAACxC,CAAG,GAAGyC;AAAA,MAAA;AAAA,IACT,EACA;AAAA,EACJ;AAAA,EAEA,aAAa,CACXzC,GACA0C,MACG;AACH,IAAArD,EAAI,CAACmD,MAAS;AACZ,YAAMG,IAAiBH,EAAK,SAASxC,CAAG,KAAK,CAAC,GACxC4C,IAAaF,EAAQC,CAAc;AAClC,aAAA;AAAA,QACL,UAAU;AAAA,UACR,GAAGH,EAAK;AAAA,UACR,CAACxC,CAAG,GAAG4C;AAAA,QAAA;AAAA,MAEX;AAAA,IAAA,CACD;AAAA,EACH;AAAA,EACA,oBAAoB,CAAC5C,GAAayC,MAAmB;AACnD,IAAApD,EAAI,CAACmD,OAAU;AAAA,MACb,iBAAiB;AAAA,QACf,GAAGA,EAAK;AAAA,QACR,CAACxC,CAAG,GAAGyC;AAAA,MAAA;AAAA,IACT,EACA;AAAA,EACJ;AAAA,EACA,sBAAsB,CAACzC,GAAayC,MAAgC;AAClE,IAAApD,EAAI,CAACmD,OAAU;AAAA,MACb,mBAAmB;AAAA,QACjB,GAAGA,EAAK;AAAA,QACR,CAACxC,CAAG,GAAGyC;AAAA,MAAA;AAAA,IACT,EACA;AAAA,EACJ;AAAA,EACA,oBAAoB,CAACxC,GAAM4C,MAAY;AACrC,YAAQ,IAAI,uBAAuB,GACnCxD,EAAI,CAACmD,MAAS;AACZ,YAAMM,IAAgB,IAAI,IAAIN,EAAK,gBAAgB,GAC7CO,IAAmBD,EAAc,IAAI7C,CAAI,KAAK,CAAC;AACrD,qBAAQ,IAAI,sBAAsBA,GAAM4C,GAASE,CAAgB,GAEjED,EAAc,IAAI7C,GAAM,CAAC,GAAG8C,GAAkBF,CAAO,CAAC,GAC/C,EAAE,kBAAkBC,EAAc;AAAA,IAAA,CAC1C;AAAA,EACH;AAAA,EACA,uBAAuB,CAAC7C,MAAS;AAC/B,IAAAZ,EAAI,CAACmD,MAAS;AACZ,YAAMM,IAAgB,IAAI,IAAIN,EAAK,gBAAgB;AAEnD,UAAIQ,IAAc;AACZ,YAAAC,IAAYhD,EAAK,MAAM,GAAG;AAChC,mBAAM,KAAK6C,EAAc,KAAM,CAAA,EAAE,QAAQ,CAAC9C,MAAQ;AAC1C,cAAAkD,IAAWlD,EAAI,MAAM,GAAG;AAC1B,YAAAkD,EAAS,UAAUD,EAAU,QAAQ;AACvC,cAAIE,IAAQ;AACZ,mBAAS1C,IAAI,GAAGA,IAAIwC,EAAU,QAAQxC;AACpC,gBAAIyC,EAASzC,CAAC,MAAMwC,EAAUxC,CAAC,GAAG;AACxB,cAAA0C,IAAA;AACR;AAAA,YAAA;AAIJ,UAAIA,MACYH,IAAA,IACdF,EAAc,OAAO9C,CAAG;AAAA,QAC1B;AAAA,MACF,CACD,GAEMgD,IAAc,EAAE,kBAAkBF,EAAkB,IAAAN;AAAA,IAAA,CAC5D;AAAA,EACH;AAAA,EACA,qBAAqB,CAACvC,MAAiB;AACrC,UAAMmD,IAAmB,CAAC,GACpBC,IAAY/D,IAAM,kBAClB2D,IAAYhD,EAAK,MAAM,GAAG,GAG1BqD,IAAe,CAACC,GAAqBC,MACrCD,MAAgB,QAAc,KAC9B,MAAM,QAAQA,CAAW,IACpBA,EAAY,SAAS,SAASC,CAAU,CAAC,IAE3CD,MAAgBC;AAGzB,iBAAM,KAAKH,EAAU,KAAM,CAAA,EAAE,QAAQ,CAACrD,MAAQ;AACtC,YAAAkD,IAAWlD,EAAI,MAAM,GAAG;AAC1B,UAAAkD,EAAS,UAAUD,EAAU,QAAQ;AACvC,YAAIE,IAAQ;AACZ,iBAAS1C,IAAI,GAAGA,IAAIwC,EAAU,QAAQxC,KAAK;AACnC,gBAAA8C,IAAcN,EAAUxC,CAAC,GACzB+C,IAAaN,EAASzC,CAAC;AAG7B,cAAI8C,MAAgB,SAAS,MAAM,QAAQA,CAAW,GAAG;AAEjD,kBAAAE,IAAW,SAASD,CAAU;AAChC,gBAAA,MAAMC,CAAQ,GAAG;AACX,cAAAN,IAAA;AACR;AAAA,YAAA;AAGF,gBAAI,CAACG,EAAaC,GAAaC,CAAU,GAAG;AAClC,cAAAL,IAAA;AACR;AAAA,YAAA;AAAA,UACF,WACSI,MAAgBC,GAAY;AAC7B,YAAAL,IAAA;AACR;AAAA,UAAA;AAAA,QACF;AAGF,YAAIA,GAAO;AACH,gBAAAO,IAAgBL,EAAU,IAAIrD,CAAG;AACvC,UAAI0D,KACKN,EAAA,KAAK,GAAGM,CAAa;AAAA,QAC9B;AAAA,MACF;AAAA,IACF,CACD,GAEMN;AAAA,EACT;AAAA,EACA,mBAAmB,CAACpD,MACXV,EAAA,EAAM,oBAAoBU,CAAG;AAAA,EAEtC,gBAAgB,CAACA,GAAaC,MAAmB;AAC/C,UAAM0D,IAAYrE,IAAM,eAAeU,CAAG,GAEpC4D,IAAuB,CAACrD,GAAU0C,MAA6B;AAC/D,UAAAA,EAAU,WAAW,EAAU,QAAA1C;AAE7B,YAAAsD,IAAcZ,EAAU,CAAC,GACzBa,IAAgBb,EAAU,MAAM,CAAC;AAEvC,UAAIY,MAAgB,OAAO;AACzB,YAAI,CAAC,MAAM,QAAQtD,CAAG,GAAG;AACvB,kBAAQ,KAAK,2CAA2C;AACjD;AAAA,QAAA;AAGL,YAAAuD,EAAc,WAAW,EAAU,QAAAvD;AAGvC,cAAMwD,IAAUxD,EAAI;AAAA,UAAI,CAACU,MACvB2C,EAAqB3C,GAAM6C,CAAa;AAAA,QAC1C;AAGA,eAAI,MAAM,QAAQC,EAAQ,CAAC,CAAC,IACnBA,EAAQ,KAAK,IAGfA;AAAA,MAAA;AAGH,YAAAtB,IAAQlC,EAAIsD,CAA+B;AAC7C,UAAApB,MAAU;AAEP,eAAAmB,EAAqBnB,GAAOqB,CAAa;AAAA,IAClD;AAGO,WAAAF,EAAqBD,GAAW1D,CAAI;AAAA,EAC7C;AAAA,EACA,wBAAwB,CAACD,GAAKyC,MAAU;AACtC,IAAApD,EAAI,CAACmD,OAAU;AAAA,MACb,qBAAqB;AAAA,QACnB,GAAGA,EAAK;AAAA,QACR,CAACxC,CAAG,GAAGyC;AAAA,MAAA;AAAA,IACT,EACA;AAAA,EACJ;AAAA,EACA,0BAA0B,CAACzC,GAAKuC,MAAa;AAC3C,IAAAlD,EAAI,CAACmD,OAAU;AAAA,MACb,oBAAoB;AAAA,QAClB,GAAGA,EAAK;AAAA,QACR,CAACxC,CAAG,GAAGuC;AAAA,MAAA;AAAA,IACT,EACA;AAAA,EACJ;AAAA,EACA,iBAAiB,CAACvC,MACTV,EAAA,EAAM,aAAaU,CAAG;AAAA,EAE/B,iBAAiB,CAACA,GAAKgE,MAAe;AAC9B,UAAA7D,IAAUb,IAAM;AAElB,IAAA,CAACU,KAAO,CAACgE,KAEb3E,EAAI,EAAE,cAAc,EAAE,GAAIc,KAAW,CAAA,GAAK,CAACH,CAAG,GAAGgE,EAAW,GAAG;AAAA,EACjE;AAAA,EACA,aAAa,CAA6BhE,MACjCV,EAAA,EAAM,eAAeU,CAAG;AAAA,EAGjC,UAAU,CAA6BA,GAAeyC,MAAsB;AAC1E,IAAApD,EAAI,CAACmD,OACI;AAAA,MACL,gBAAgB;AAAA,QACd,GAAGA,EAAK;AAAA,QACR,CAACxC,CAAG,GACF,OAAOyC,KAAU,aACbA,EAAMD,EAAK,eAAexC,CAAG,CAAC,IAC9ByC;AAAA,MAAA;AAAA,IAEV,EACD;AAAA,EACH;AAAA,EACA,kBAAkB,CAA6BpC,MAA6B;AAC1E,IAAAhB,EAAI,CAACmD,OAAU;AAAA,MACb,gBAAgB;AAAA,QACd,GAAGA,EAAK;AAAA,QACR,GAAGnC;AAAA,MAAA;AAAA,IACL,EACA;AAAA,EACJ;AAAA,EACA,iBAAiB,CAACA,MAA6B;AAC7C,IAAAhB,EAAI,CAACmD,OAAU;AAAA,MACb,sBAAsB;AAAA,QACpB,GAAGA,EAAK;AAAA,QACR,GAAGnC;AAAA,MAAA;AAAA,IACL,EACA;AAAA,EACJ;AAAA,EAEA,mCAAmB,IAAsB;AAAA,EACzC,aAAa,CAACL,GAAaiE,MACzB5E,EAAI,CAACI,MAAU;AACb,UAAMoC,IAAS,IAAI,IAAIpC,EAAM,aAAa;AACnC,WAAAoC,EAAA,IAAI7B,GAAKiE,CAAQ,GACjB,EAAE,GAAGxE,GAAO,eAAeoC,EAAO;AAAA,EAAA,CAC1C;AAAA,EACH,aAAa,CAAC7B,MAAgBV,EAAA,EAAM,cAAc,IAAIU,CAAG,KAAK;AAChE,EAAE;"}
@@ -23,7 +23,7 @@ type ResultsState = {
23
23
  };
24
24
  export declare const useResultsStore: import('zustand').UseBoundStore<import('zustand').StoreApi<ResultsState>>;
25
25
  export default function useValidateZodPath<T extends ZodRawShape>(validationKey: string, schema: ZodObject<T>, stateKey?: string): {
26
- validateZodPath: (path: string[], data: any, results?: Record<string, ResultItem> | undefined) => "loading" | "success" | "failure" | "error";
26
+ validateZodPath: (path: string[], data: any, results?: Record<string, ResultItem> | undefined) => "error" | "loading" | "success" | "failure";
27
27
  getZodPathResults: (path: string[]) => string[] | ResultItem;
28
28
  zodPathResults: Record<string, ResultItem> | undefined;
29
29
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "cogsbox-state",
3
- "version": "0.5.425",
3
+ "version": "0.5.427",
4
4
  "description": "React state management library with form controls and server sync",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -34,6 +34,7 @@
34
34
  "react-use-measure": "^2.1.7",
35
35
  "rollup-preserve-directives": "^1.1.3",
36
36
  "superjson": "^2.2.2",
37
+ "ulid": "^3.0.1",
37
38
  "uuid": "^9.0.1",
38
39
  "zod": "^3.24.4",
39
40
  "zustand": "^5.0.3"
package/src/CogsState.tsx CHANGED
@@ -1,5 +1,5 @@
1
1
  "use client";
2
-
2
+ import { ulid } from "ulid";
3
3
  import {
4
4
  createElement,
5
5
  startTransition,
@@ -34,7 +34,12 @@ import superjson from "superjson";
34
34
  import { v4 as uuidv4 } from "uuid";
35
35
  import { z } from "zod";
36
36
 
37
- import { formRefStore, getGlobalStore, type ComponentsType } from "./store.js";
37
+ import {
38
+ formRefStore,
39
+ getGlobalStore,
40
+ type ComponentsType,
41
+ type ItemMeta,
42
+ } from "./store.js";
38
43
  import { useCogsConfig } from "./CogsStateClient.js";
39
44
  import { applyPatch } from "fast-json-patch";
40
45
  import useMeasure from "react-use-measure";
@@ -236,6 +241,7 @@ export type FormOptsType = {
236
241
  props?: GenericObject;
237
242
  disable?: boolean;
238
243
  };
244
+
239
245
  debounceTime?: number;
240
246
  };
241
247
 
@@ -1265,14 +1271,21 @@ export function useCogsStateFn<TStateObject extends unknown>(
1265
1271
  break;
1266
1272
 
1267
1273
  case "insert":
1268
- // For array insert, add empty element to shadow array
1269
-
1274
+ // For array insert, create a new metadata object with a ULID.
1270
1275
  const parentPath = path.slice(0, -1);
1271
- store.insertShadowArrayElement(thisKey, parentPath, newValue);
1276
+
1277
+ // THE CHANGE IS HERE: Instead of `newValue`, we insert our metadata object.
1278
+ // The `newValue` from your code is the new item itself, which might have an `id` or `key`.
1279
+ const newId = newValue.id ?? newValue.key ?? ulid();
1280
+ const newMeta = { _cogsId: newId };
1281
+
1282
+ store.insertShadowArrayElement(thisKey, parentPath, newMeta);
1272
1283
  break;
1273
1284
 
1274
1285
  case "cut":
1275
- // For array cut, remove element from shadow a
1286
+ // For array cut, remove element from shadow
1287
+ // THIS PART DOES NOT NEED TO CHANGE. It correctly removes the item
1288
+ // at the specified index from both the data and shadow arrays.
1276
1289
  const arrayPath = path.slice(0, -1);
1277
1290
  const index = parseInt(path[path.length - 1]!);
1278
1291
  store.removeShadowArrayElement(thisKey, arrayPath, index);
@@ -1840,9 +1853,12 @@ function createProxyHandler<T>(
1840
1853
 
1841
1854
  // Calculate heights and positions
1842
1855
  const { totalHeight, positions } = useMemo(() => {
1843
- const shadowArray =
1844
- getGlobalStore.getState().getShadowMetadata(stateKey, path) ||
1845
- [];
1856
+ const rawShadowData = getGlobalStore
1857
+ .getState()
1858
+ .getShadowMetadata(stateKey, path);
1859
+ const shadowArray: ItemMeta[] = Array.isArray(rawShadowData)
1860
+ ? rawShadowData
1861
+ : [];
1846
1862
  let height = 0;
1847
1863
  const pos: number[] = [];
1848
1864
  for (let i = 0; i < totalCount; i++) {
@@ -1877,9 +1893,12 @@ function createProxyHandler<T>(
1877
1893
 
1878
1894
  // Helper to scroll to last item using stored ref
1879
1895
  const scrollToLastItem = useCallback(() => {
1880
- const shadowArray =
1881
- getGlobalStore.getState().getShadowMetadata(stateKey, path) ||
1882
- [];
1896
+ const rawShadowData = getGlobalStore
1897
+ .getState()
1898
+ .getShadowMetadata(stateKey, path);
1899
+ const shadowArray: ItemMeta[] = Array.isArray(rawShadowData)
1900
+ ? rawShadowData
1901
+ : [];
1883
1902
  const lastIndex = totalCount - 1;
1884
1903
 
1885
1904
  if (lastIndex >= 0) {
@@ -2052,10 +2071,12 @@ function createProxyHandler<T>(
2052
2071
 
2053
2072
  // --- Standard Case: All Other Items ---
2054
2073
  // For all other items, we find the ref and use scrollIntoView.
2055
- const shadowArray =
2056
- getGlobalStore
2057
- .getState()
2058
- .getShadowMetadata(stateKey, path) || [];
2074
+ const rawShadowData = getGlobalStore
2075
+ .getState()
2076
+ .getShadowMetadata(stateKey, path);
2077
+ const shadowArray: ItemMeta[] = Array.isArray(rawShadowData)
2078
+ ? rawShadowData
2079
+ : [];
2059
2080
  const itemData = shadowArray[index];
2060
2081
  const element = itemData?.virtualizer?.domRef;
2061
2082
 
@@ -3019,9 +3040,5 @@ function CogsItemWrapper({
3019
3040
  }, [stateKey, itemComponentId, itemPath.join(".")]);
3020
3041
 
3021
3042
  // The rendered output is a simple div that gets measured.
3022
- return (
3023
- <ValidationWrapper {...{ formOpts, path: itemPath, stateKey }}>
3024
- {children}
3025
- </ValidationWrapper>
3026
- );
3043
+ return <div ref={setRefs}>{children}</div>;
3027
3044
  }
package/src/Functions.tsx CHANGED
@@ -344,6 +344,13 @@ export const FormControlComponent = <TStateObject,>({
344
344
  </>
345
345
  );
346
346
  };
347
+ export type ValidationWrapperProps = {
348
+ formOpts?: FormOptsType;
349
+ path: string[];
350
+ stateKey: string;
351
+ children: React.ReactNode;
352
+ validIndices?: number[];
353
+ };
347
354
  export function ValidationWrapper({
348
355
  formOpts,
349
356
  path,
@@ -351,14 +358,7 @@ export function ValidationWrapper({
351
358
  stateKey,
352
359
  children,
353
360
  validIndices,
354
- }: {
355
- formOpts?: FormOptsType;
356
- path: string[];
357
-
358
- stateKey?: string;
359
- children: React.ReactNode;
360
- validIndices?: number[];
361
- }) {
361
+ }: ValidationWrapperProps) {
362
362
  const { getInitialOptions } = getGlobalStore.getState();
363
363
  const thisStateOpts = getInitialOptions(stateKey!);
364
364
  const validationKey = thisStateOpts?.validation?.key ?? stateKey!;
package/src/store.ts CHANGED
@@ -86,39 +86,50 @@ export const formRefStore = create<FormRefStoreState>((set, get) => ({
86
86
  },
87
87
  }));
88
88
 
89
- type ShadowMetadata = {
90
- virtualisedState?: { listItemHeight: number };
91
- syncInfo?: { status: string };
92
- // Add other metadata fields you need
89
+ export type ItemMeta = {
90
+ _cogsId: string;
91
+ virtualizer?: {
92
+ itemHeight?: number;
93
+ domRef?: HTMLDivElement | null;
94
+ };
95
+ syncStatus?: "new" | "syncing" | "synced" | "failed";
96
+ error?: string;
93
97
  };
94
98
 
95
- type ShadowState<T> =
96
- T extends Array<infer U>
97
- ? Array<ShadowState<U>> & ShadowMetadata
98
- : T extends object
99
- ? { [K in keyof T]: ShadowState<T[K]> } & ShadowMetadata
100
- : ShadowMetadata;
99
+ // THE NEW, CORRECT, RECURSIVE TYPE FOR THE SHADOW STATE
100
+ // A ShadowNode is either:
101
+ // 1. An array of ItemMeta (if it represents a user's array).
102
+ // 2. An object that can be indexed by any string, whose values are other ShadowNodes.
103
+ export type ShadowNode = ItemMeta[] | { [key: string]: ShadowNode };
104
+
105
+ // This is the top-level type for the store, mapping state keys to our ShadowNode structure.
106
+ export type ShadowStateStore = {
107
+ [key: string]: ShadowNode;
108
+ };
101
109
 
102
110
  export type CogsGlobalState = {
103
111
  // --- Shadow State and Subscription System ---
104
- shadowStateStore: { [key: string]: any };
105
- shadowStateSubscribers: Map<string, Set<() => void>>; // Stores subscribers for shadow state updates
106
- subscribeToShadowState: (key: string, callback: () => void) => () => void; // Subscribes a listener, returns an unsubscribe function
107
- initializeShadowState: (key: string, initialState: any) => void;
108
- updateShadowAtPath: (key: string, path: string[], newValue: any) => void;
112
+ shadowStateStore: ShadowStateStore;
113
+ shadowStateSubscribers: Map<string, Set<() => void>>;
114
+ subscribeToShadowState: (key: string, callback: () => void) => () => void;
115
+ initializeShadowState: <T>(key: string, initialState: T) => void;
116
+ updateShadowAtPath: <T>(key: string, path: string[], newValue: T) => void;
109
117
  insertShadowArrayElement: (
110
118
  key: string,
111
119
  arrayPath: string[],
112
- newItem: any
120
+ newItemMeta: ItemMeta
113
121
  ) => void;
114
122
  removeShadowArrayElement: (
115
123
  key: string,
116
124
  arrayPath: string[],
117
125
  index: number
118
126
  ) => void;
119
- getShadowMetadata: (key: string, path: string[]) => any;
120
- setShadowMetadata: (key: string, path: string[], metadata: any) => void;
121
-
127
+ getShadowMetadata: (key: string, path: string[]) => ShadowNode | null;
128
+ setShadowMetadata: (
129
+ key: string,
130
+ path: string[],
131
+ metadata: Partial<ItemMeta>
132
+ ) => void;
122
133
  // --- Selected Item State ---
123
134
  selectedIndicesMap: Map<string, Map<string, number>>; // stateKey -> (parentPath -> selectedIndex)
124
135
  getSelectedIndex: (
@@ -247,7 +258,7 @@ export const getGlobalStore = create<CogsGlobalState>((set, get) => ({
247
258
  const shadow = get().shadowStateStore[key];
248
259
  if (!shadow) return null;
249
260
 
250
- let current = shadow;
261
+ let current: any = shadow;
251
262
  for (const segment of path) {
252
263
  current = current?.[segment];
253
264
  if (!current) return null;
@@ -286,7 +297,7 @@ export const getGlobalStore = create<CogsGlobalState>((set, get) => ({
286
297
  const newShadow = { ...state.shadowStateStore };
287
298
  if (!newShadow[key]) return state;
288
299
 
289
- let current = newShadow[key];
300
+ let current: any = newShadow[key];
290
301
  const pathCopy = [...path];
291
302
  const lastSegment = pathCopy.pop();
292
303
 
@@ -358,7 +369,7 @@ export const getGlobalStore = create<CogsGlobalState>((set, get) => ({
358
369
  ) => {
359
370
  set((state) => {
360
371
  const newShadow = { ...state.shadowStateStore };
361
- let current = newShadow[key];
372
+ let current: any = newShadow[key];
362
373
 
363
374
  for (const segment of arrayPath) {
364
375
  current = current?.[segment];