cogsbox-state 0.5.455 → 0.5.456
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/CogsState.d.ts +7 -5
- package/dist/CogsState.d.ts.map +1 -1
- package/dist/CogsState.jsx +1206 -1196
- package/dist/CogsState.jsx.map +1 -1
- package/package.json +1 -1
- package/src/CogsState.tsx +40 -14
package/dist/CogsState.jsx.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CogsState.jsx","sources":["../src/CogsState.tsx"],"sourcesContent":["'use client';\r\n\r\nimport {\r\n createElement,\r\n memo,\r\n startTransition,\r\n useCallback,\r\n useEffect,\r\n useLayoutEffect,\r\n useMemo,\r\n useRef,\r\n useState,\r\n type CSSProperties,\r\n type ReactNode,\r\n type RefObject,\r\n} from 'react';\r\nimport { createRoot } from 'react-dom/client';\r\nimport {\r\n debounce,\r\n getDifferences,\r\n isArray,\r\n isFunction,\r\n type GenericObject,\r\n} from './utility.js';\r\nimport { ValidationWrapper } from './Functions.js';\r\nimport { isDeepEqual, transformStateFunc } from './utility.js';\r\nimport superjson from 'superjson';\r\nimport { v4 as uuidv4 } from 'uuid';\r\n\r\nimport {\r\n formRefStore,\r\n getGlobalStore,\r\n ValidationStatus,\r\n type ComponentsType,\r\n} from './store.js';\r\nimport { useCogsConfig } from './CogsStateClient.js';\r\nimport { Operation } from 'fast-json-patch';\r\nimport { useInView } from 'react-intersection-observer';\r\nimport * as z3 from 'zod/v3';\r\nimport * as z4 from 'zod/v4';\r\n\r\ntype Prettify<T> = T extends any ? { [K in keyof T]: T[K] } : never;\r\n\r\nexport type VirtualViewOptions = {\r\n itemHeight?: number;\r\n overscan?: number;\r\n stickToBottom?: boolean;\r\n dependencies?: any[];\r\n scrollStickTolerance?: number;\r\n};\r\n\r\n// The result now returns a real StateObject\r\nexport type VirtualStateObjectResult<T extends any[]> = {\r\n /**\r\n * A new, fully-functional StateObject that represents the virtualized slice.\r\n * You can use `.get()`, `.stateMap()`, `.insert()`, `.cut()` etc. on this object.\r\n */\r\n\r\n virtualState: StateObject<T>;\r\n /**\r\n * Props to be spread onto your DOM elements to enable virtualization.\r\n */\r\n virtualizerProps: {\r\n outer: { ref: RefObject<HTMLDivElement>; style: CSSProperties };\r\n inner: { style: CSSProperties };\r\n list: { style: CSSProperties };\r\n };\r\n scrollToBottom: (behavior?: ScrollBehavior) => void;\r\n scrollToIndex: (index: number, behavior?: ScrollBehavior) => void;\r\n};\r\n\r\nexport type SyncInfo = {\r\n timeStamp: number;\r\n userId: number;\r\n};\r\n\r\nexport type FormElementParams<T> = StateObject<T> & {\r\n inputProps: {\r\n ref?: React.RefObject<any>;\r\n value?: T extends boolean ? never : T;\r\n onChange?: (\r\n event: React.ChangeEvent<HTMLInputElement | HTMLTextAreaElement>\r\n ) => void;\r\n onBlur?: () => void;\r\n };\r\n};\r\n\r\nexport type StateKeys = string;\r\n\r\ntype findWithFuncType<U> = (\r\n thisKey: keyof U,\r\n thisValue: U[keyof U]\r\n) => EndType<U> & StateObject<U>;\r\n\r\ntype CutFunctionType<T> = (\r\n index?: number,\r\n options?: { waitForSync?: boolean }\r\n) => StateObject<T>;\r\n\r\nexport type InferArrayElement<T> = T extends (infer U)[] ? U : never;\r\ntype ArraySpecificPrototypeKeys =\r\n | 'concat'\r\n | 'copyWithin'\r\n | 'fill'\r\n | 'find'\r\n | 'findIndex'\r\n | 'flat'\r\n | 'flatMap'\r\n | 'includes'\r\n | 'indexOf'\r\n | 'join'\r\n | 'keys'\r\n | 'lastIndexOf'\r\n | 'map'\r\n | 'pop'\r\n | 'push'\r\n | 'reduce'\r\n | 'reduceRight'\r\n | 'reverse'\r\n | 'shift'\r\n | 'slice'\r\n | 'some'\r\n | 'sort'\r\n | 'splice'\r\n | 'unshift'\r\n | 'values'\r\n | 'entries'\r\n | 'every'\r\n | 'filter'\r\n | 'forEach'\r\n | 'with';\r\nexport type StreamOptions<T, R = T> = {\r\n bufferSize?: number;\r\n flushInterval?: number;\r\n bufferStrategy?: 'sliding' | 'dropping' | 'accumulate';\r\n store?: (buffer: T[]) => R | R[];\r\n onFlush?: (buffer: T[]) => void;\r\n};\r\n\r\nexport type StreamHandle<T> = {\r\n write: (data: T) => void;\r\n writeMany: (data: T[]) => void;\r\n flush: () => void;\r\n close: () => void;\r\n pause: () => void;\r\n resume: () => void;\r\n};\r\nexport type ArrayEndType<TShape extends unknown> = {\r\n stream: <T = Prettify<InferArrayElement<TShape>>, R = T>(\r\n options?: StreamOptions<T, R>\r\n ) => StreamHandle<T>;\r\n findWith: findWithFuncType<Prettify<InferArrayElement<TShape>>>;\r\n index: (index: number) => StateObject<Prettify<InferArrayElement<TShape>>> & {\r\n insert: InsertTypeObj<Prettify<InferArrayElement<TShape>>>;\r\n cut: CutFunctionType<TShape>;\r\n _index: number;\r\n } & EndType<Prettify<InferArrayElement<TShape>>>;\r\n insert: InsertType<Prettify<InferArrayElement<TShape>>>;\r\n cut: CutFunctionType<TShape>;\r\n cutSelected: () => void;\r\n cutByValue: (value: string | number | boolean) => void;\r\n toggleByValue: (value: string | number | boolean) => void;\r\n stateSort: (\r\n compareFn: (\r\n a: Prettify<InferArrayElement<TShape>>,\r\n b: Prettify<InferArrayElement<TShape>>\r\n ) => number\r\n ) => ArrayEndType<TShape>;\r\n useVirtualView: (\r\n options: VirtualViewOptions\r\n ) => VirtualStateObjectResult<Prettify<InferArrayElement<TShape>>[]>;\r\n\r\n stateList: (\r\n callbackfn: (\r\n setter: StateObject<Prettify<InferArrayElement<TShape>>>,\r\n index: number,\r\n arraySetter: StateObject<TShape>\r\n ) => void\r\n ) => any;\r\n stateMap: <U>(\r\n callbackfn: (\r\n setter: StateObject<Prettify<InferArrayElement<TShape>>>,\r\n index: number,\r\n arraySetter: StateObject<TShape>\r\n ) => U\r\n ) => U[];\r\n $stateMap: (\r\n callbackfn: (\r\n setter: StateObject<Prettify<InferArrayElement<TShape>>>,\r\n index: number,\r\n arraySetter: StateObject<TShape>\r\n ) => void\r\n ) => any;\r\n stateFlattenOn: <K extends keyof Prettify<InferArrayElement<TShape>>>(\r\n field: K\r\n ) => StateObject<InferArrayElement<Prettify<InferArrayElement<TShape>>[K]>[]>;\r\n uniqueInsert: (\r\n payload: InsertParams<Prettify<InferArrayElement<TShape>>>,\r\n fields?: (keyof Prettify<InferArrayElement<TShape>>)[],\r\n onMatch?: (existingItem: any) => any\r\n ) => void;\r\n stateFind: (\r\n callbackfn: (\r\n value: Prettify<InferArrayElement<TShape>>,\r\n index: number\r\n ) => boolean\r\n ) => StateObject<Prettify<InferArrayElement<TShape>>> | undefined;\r\n stateFilter: (\r\n callbackfn: (\r\n value: Prettify<InferArrayElement<TShape>>,\r\n index: number\r\n ) => void\r\n ) => ArrayEndType<TShape>;\r\n getSelected: () =>\r\n | StateObject<Prettify<InferArrayElement<TShape>>>\r\n | undefined;\r\n clearSelected: () => void;\r\n getSelectedIndex: () => number;\r\n last: () => StateObject<Prettify<InferArrayElement<TShape>>> | undefined;\r\n} & EndType<TShape>;\r\n\r\nexport type FormOptsType = {\r\n validation?: {\r\n hideMessage?: boolean;\r\n message?: string;\r\n\r\n props?: GenericObject;\r\n disable?: boolean;\r\n };\r\n\r\n debounceTime?: number;\r\n sync?: {\r\n allowInvalidValues?: boolean; // default: false\r\n };\r\n};\r\n\r\nexport type FormControl<T> = (obj: FormElementParams<T>) => JSX.Element;\r\n\r\nexport type UpdateArg<S> = S | ((prevState: S) => S);\r\nexport type InsertParams<S> =\r\n | S\r\n | ((prevState: { state: S; uuid: string }) => S);\r\nexport type UpdateType<T> = (payload: UpdateArg<T>) => { synced: () => void };\r\n\r\nexport type InsertType<T> = (payload: InsertParams<T>, index?: number) => void;\r\nexport type InsertTypeObj<T> = (payload: InsertParams<T>) => void;\r\nexport type ValidationError = {\r\n path: (string | number)[];\r\n message: string;\r\n};\r\ntype EffectFunction<T, R> = (state: T, deps: any[]) => R;\r\nexport type EndType<T, IsArrayElement = false> = {\r\n addValidation: (errors: ValidationError[]) => void;\r\n applyJsonPatch: (patches: any[]) => void;\r\n update: UpdateType<T>;\r\n _path: string[];\r\n _stateKey: string;\r\n formElement: (control: FormControl<T>, opts?: FormOptsType) => JSX.Element;\r\n get: () => T;\r\n getState: () => T;\r\n $get: () => T;\r\n $derive: <R>(fn: EffectFunction<T, R>) => R;\r\n\r\n _status: 'fresh' | 'dirty' | 'synced' | 'restored' | 'unknown';\r\n getStatus: () => 'fresh' | 'dirty' | 'synced' | 'restored' | 'unknown';\r\n\r\n showValidationErrors: () => string[];\r\n setValidation: (ctx: string) => void;\r\n removeValidation: (ctx: string) => void;\r\n ignoreFields: (fields: string[]) => StateObject<T>;\r\n isSelected: boolean;\r\n setSelected: (value: boolean) => void;\r\n toggleSelected: () => void;\r\n getFormRef: () => React.RefObject<any> | undefined;\r\n removeStorage: () => void;\r\n sync: () => void;\r\n validationWrapper: ({\r\n children,\r\n hideMessage,\r\n }: {\r\n children: React.ReactNode;\r\n hideMessage?: boolean;\r\n }) => JSX.Element;\r\n lastSynced?: SyncInfo;\r\n} & (IsArrayElement extends true ? { cut: () => void } : {});\r\n\r\nexport type StateObject<T> = (T extends any[]\r\n ? ArrayEndType<T>\r\n : T extends Record<string, unknown> | object\r\n ? { [K in keyof T]-?: StateObject<T[K]> }\r\n : T extends string | number | boolean | null\r\n ? EndType<T, true>\r\n : never) &\r\n EndType<T, true> & {\r\n toggle: T extends boolean ? () => void : never;\r\n getAllFormRefs: () => Map<string, React.RefObject<any>>;\r\n _componentId: string | null;\r\n getComponents: () => ComponentsType;\r\n validateZodSchema: () => void;\r\n _initialState: T;\r\n updateInitialState: (newState: T | null) => {\r\n fetchId: (field: keyof T) => string | number;\r\n };\r\n _isLoading: boolean;\r\n _serverState: T;\r\n revertToInitialState: (obj?: { validationKey?: string }) => T;\r\n getDifferences: () => string[];\r\n middleware: (\r\n middles: ({\r\n updateLog,\r\n update,\r\n }: {\r\n updateLog: UpdateTypeDetail[] | undefined;\r\n update: UpdateTypeDetail;\r\n }) => void\r\n ) => void;\r\n\r\n getLocalStorage: (key: string) => LocalStorageData<T> | null;\r\n };\r\n\r\nexport type CogsUpdate<T extends unknown> = UpdateType<T>;\r\ntype EffectiveSetStateArg<\r\n T,\r\n UpdateType extends 'update' | 'insert' | 'cut',\r\n> = UpdateType extends 'insert'\r\n ? T extends any[]\r\n ? InsertParams<InferArrayElement<T>>\r\n : never\r\n : UpdateArg<T>;\r\ntype UpdateOptions = {\r\n updateType: 'insert' | 'cut' | 'update';\r\n\r\n sync?: boolean;\r\n};\r\ntype EffectiveSetState<TStateObject> = (\r\n newStateOrFunction:\r\n | EffectiveSetStateArg<TStateObject, 'update'>\r\n | EffectiveSetStateArg<TStateObject, 'insert'>,\r\n path: string[],\r\n updateObj: UpdateOptions,\r\n validationKey?: string\r\n) => void;\r\n\r\nexport type UpdateTypeDetail = {\r\n timeStamp: number;\r\n stateKey: string;\r\n updateType: 'update' | 'insert' | 'cut';\r\n path: string[];\r\n status: 'new' | 'sent' | 'synced';\r\n oldValue: any;\r\n newValue: any;\r\n userId?: number;\r\n};\r\n\r\nexport type ReactivityUnion = 'none' | 'component' | 'deps' | 'all';\r\nexport type ReactivityType =\r\n | 'none'\r\n | 'component'\r\n | 'deps'\r\n | 'all'\r\n | Array<Prettify<'none' | 'component' | 'deps' | 'all'>>;\r\n\r\n// Define the return type of the sync hook locally\r\ntype SyncApi = {\r\n updateState: (data: { operation: any }) => void;\r\n connected: boolean;\r\n clientId: string | null;\r\n subscribers: string[];\r\n};\r\ntype ValidationOptionsType = {\r\n key?: string;\r\n zodSchemaV3?: z3.ZodType<any, any, any>;\r\n zodSchemaV4?: z4.ZodType<any, any, any>;\r\n\r\n onBlur?: boolean;\r\n};\r\nexport type OptionsType<T extends unknown = unknown, TApiParams = never> = {\r\n log?: boolean;\r\n componentId?: string;\r\n cogsSync?: (stateObject: StateObject<T>) => SyncApi;\r\n validation?: ValidationOptionsType;\r\n\r\n serverState?: {\r\n id?: string | number;\r\n data?: T;\r\n status?: 'pending' | 'error' | 'success' | 'loading';\r\n timestamp?: number;\r\n merge?:\r\n | boolean\r\n | {\r\n strategy: 'append' | 'prepend' | 'diff';\r\n key?: string; // For diff strategy - which field to use as unique identifier\r\n };\r\n };\r\n sync?: {\r\n action: (state: T) => Promise<{\r\n success: boolean;\r\n data?: any;\r\n error?: any;\r\n errors?: Array<{\r\n path: (string | number)[];\r\n message: string;\r\n }>;\r\n }>;\r\n onSuccess?: (data: any) => void;\r\n onError?: (error: any) => void;\r\n };\r\n middleware?: ({\r\n updateLog,\r\n update,\r\n }: {\r\n updateLog: UpdateTypeDetail[] | undefined;\r\n update: UpdateTypeDetail;\r\n }) => void;\r\n\r\n modifyState?: (state: T) => T;\r\n localStorage?: {\r\n key: string | ((state: T) => string);\r\n onChange?: (state: T) => void;\r\n };\r\n formElements?: FormsElementsType<T>;\r\n\r\n reactiveDeps?: (state: T) => any[] | true;\r\n reactiveType?: ReactivityType;\r\n syncUpdate?: Partial<UpdateTypeDetail>;\r\n\r\n defaultState?: T;\r\n apiParams?: TApiParams;\r\n dependencies?: any[];\r\n};\r\n\r\nexport type SyncRenderOptions<T extends unknown = unknown> = {\r\n children: React.ReactNode;\r\n time: number;\r\n data?: T;\r\n key?: string;\r\n};\r\n\r\ntype FormsElementsType<T> = {\r\n validation?: (options: {\r\n children: React.ReactNode;\r\n status: ValidationStatus; // Instead of 'active' boolean\r\n\r\n path: string[];\r\n message?: string;\r\n data?: T;\r\n key?: string;\r\n }) => React.ReactNode;\r\n syncRender?: (options: SyncRenderOptions<T>) => React.ReactNode;\r\n};\r\n\r\nexport type InitialStateInnerType<T extends unknown = unknown> = {\r\n initialState: T;\r\n} & OptionsType<T>;\r\n\r\nexport type InitialStateType<T> = {\r\n [key: string]: InitialStateInnerType<T>;\r\n};\r\n\r\nexport type AllStateTypes<T extends unknown> = Record<string, T>;\r\n\r\nexport type CogsInitialState<T> = {\r\n initialState: T;\r\n formElements?: FormsElementsType<T>;\r\n};\r\n\r\nexport type TransformedStateType<T> = {\r\n [P in keyof T]: T[P] extends CogsInitialState<infer U> ? U : T[P];\r\n};\r\n\r\nfunction setAndMergeOptions(stateKey: string, newOptions: OptionsType<any>) {\r\n const getInitialOptions = getGlobalStore.getState().getInitialOptions;\r\n const setInitialStateOptions =\r\n getGlobalStore.getState().setInitialStateOptions;\r\n\r\n const initialOptions = getInitialOptions(stateKey as string) || {};\r\n\r\n setInitialStateOptions(stateKey as string, {\r\n ...initialOptions,\r\n ...newOptions,\r\n });\r\n}\r\n\r\nfunction setOptions<StateKey, Opt>({\r\n stateKey,\r\n options,\r\n initialOptionsPart,\r\n}: {\r\n stateKey: StateKey;\r\n options?: OptionsType<any>;\r\n initialOptionsPart: Record<string, any>;\r\n}) {\r\n const initialOptions = getInitialOptions(stateKey as string) || {};\r\n const initialOptionsPartState = initialOptionsPart[stateKey as string] || {};\r\n const setInitialStateOptions =\r\n getGlobalStore.getState().setInitialStateOptions;\r\n const mergedOptions = { ...initialOptionsPartState, ...initialOptions };\r\n\r\n let needToAdd = false;\r\n if (options) {\r\n for (const key in options) {\r\n if (!mergedOptions.hasOwnProperty(key)) {\r\n needToAdd = true;\r\n mergedOptions[key] = options[key as keyof typeof options];\r\n } else {\r\n if (\r\n key == 'localStorage' &&\r\n options[key] &&\r\n mergedOptions[key].key !== options[key]?.key\r\n ) {\r\n needToAdd = true;\r\n mergedOptions[key] = options[key];\r\n }\r\n if (\r\n key == 'defaultState' &&\r\n options[key] &&\r\n mergedOptions[key] !== options[key] &&\r\n !isDeepEqual(mergedOptions[key], options[key])\r\n ) {\r\n needToAdd = true;\r\n mergedOptions[key] = options[key];\r\n }\r\n }\r\n }\r\n }\r\n\r\n if (needToAdd) {\r\n setInitialStateOptions(stateKey as string, mergedOptions);\r\n }\r\n}\r\nexport function addStateOptions<T extends unknown>(\r\n initialState: T,\r\n { formElements, validation }: OptionsType<T>\r\n) {\r\n return { initialState: initialState, formElements, validation } as T;\r\n}\r\ntype UseCogsStateHook<\r\n T extends Record<string, any>,\r\n apiParams extends Record<string, any> = never,\r\n> = <StateKey extends keyof TransformedStateType<T>>(\r\n stateKey: StateKey,\r\n options?: Prettify<\r\n OptionsType<TransformedStateType<T>[StateKey]> & { apiParams?: apiParams }\r\n >\r\n) => StateObject<TransformedStateType<T>[StateKey]>;\r\n\r\n// Define the type for the options setter using the Transformed state\r\ntype SetCogsOptionsFunc<T extends Record<string, any>> = <\r\n StateKey extends keyof TransformedStateType<T>,\r\n>(\r\n stateKey: StateKey,\r\n options: OptionsType<TransformedStateType<T>[StateKey]>\r\n) => void;\r\n\r\n// Define the final API object shape\r\ntype CogsApi<\r\n T extends Record<string, any>,\r\n apiParams extends Record<string, any> = never,\r\n> = {\r\n useCogsState: UseCogsStateHook<T, apiParams>;\r\n setCogsOptions: SetCogsOptionsFunc<T>;\r\n};\r\n\r\n// Minimal change - just add a second parameter to detect sync schema\r\nexport const createCogsState = <State extends Record<StateKeys, unknown>>(\r\n initialState: State,\r\n opt?: {\r\n formElements?: FormsElementsType<State>;\r\n validation?: ValidationOptionsType;\r\n // Add this flag to indicate it's from sync schema\r\n __fromSyncSchema?: boolean;\r\n __syncNotifications?: Record<string, Function>;\r\n }\r\n) => {\r\n // Keep ALL your existing code exactly the same\r\n let newInitialState = initialState;\r\n\r\n const [statePart, initialOptionsPart] =\r\n transformStateFunc<State>(newInitialState);\r\n\r\n // Only addition - store notifications if provided\r\n if (opt?.__fromSyncSchema && opt?.__syncNotifications) {\r\n getGlobalStore\r\n .getState()\r\n .setInitialStateOptions('__notifications', opt.__syncNotifications);\r\n }\r\n\r\n // ... rest of your existing createCogsState code unchanged ...\r\n\r\n Object.keys(statePart).forEach((key) => {\r\n let existingOptions = initialOptionsPart[key] || {};\r\n\r\n const mergedOptions: any = {\r\n ...existingOptions,\r\n };\r\n\r\n if (opt?.formElements) {\r\n mergedOptions.formElements = {\r\n ...opt.formElements,\r\n ...(existingOptions.formElements || {}),\r\n };\r\n }\r\n\r\n if (opt?.validation) {\r\n mergedOptions.validation = {\r\n ...opt.validation,\r\n ...(existingOptions.validation || {}),\r\n };\r\n\r\n if (opt.validation.key && !existingOptions.validation?.key) {\r\n mergedOptions.validation.key = `${opt.validation.key}.${key}`;\r\n }\r\n }\r\n\r\n if (Object.keys(mergedOptions).length > 0) {\r\n const existingGlobalOptions = getInitialOptions(key);\r\n\r\n if (!existingGlobalOptions) {\r\n getGlobalStore.getState().setInitialStateOptions(key, mergedOptions);\r\n } else {\r\n // Merge with existing global options\r\n getGlobalStore.getState().setInitialStateOptions(key, {\r\n ...existingGlobalOptions,\r\n ...mergedOptions,\r\n });\r\n }\r\n }\r\n });\r\n\r\n Object.keys(statePart).forEach((key) => {\r\n getGlobalStore.getState().initializeShadowState(key, statePart[key]);\r\n });\r\n\r\n type StateKeys = keyof typeof statePart;\r\n\r\n const useCogsState = <StateKey extends StateKeys>(\r\n stateKey: StateKey,\r\n options?: Prettify<OptionsType<(typeof statePart)[StateKey]>>\r\n ) => {\r\n // ... your existing useCogsState implementation ...\r\n const [componentId] = useState(options?.componentId ?? uuidv4());\r\n setOptions({\r\n stateKey,\r\n options: options as any,\r\n initialOptionsPart,\r\n });\r\n\r\n const thiState =\r\n getGlobalStore.getState().getShadowValue(stateKey as string) ||\r\n statePart[stateKey as string];\r\n const partialState = options?.modifyState\r\n ? options.modifyState(thiState)\r\n : thiState;\r\n\r\n const updater = useCogsStateFn<(typeof statePart)[StateKey]>(partialState, {\r\n stateKey: stateKey as string,\r\n syncUpdate: options?.syncUpdate,\r\n componentId,\r\n localStorage: options?.localStorage,\r\n middleware: options?.middleware,\r\n reactiveType: options?.reactiveType,\r\n reactiveDeps: options?.reactiveDeps,\r\n defaultState: options?.defaultState as any,\r\n dependencies: options?.dependencies,\r\n serverState: options?.serverState,\r\n });\r\n\r\n return updater;\r\n };\r\n\r\n function setCogsOptions<StateKey extends StateKeys>(\r\n stateKey: StateKey,\r\n options: OptionsType<(typeof statePart)[StateKey]>\r\n ) {\r\n setOptions({ stateKey, options, initialOptionsPart });\r\n\r\n if (options.localStorage) {\r\n loadAndApplyLocalStorage(stateKey as string, options);\r\n }\r\n\r\n notifyComponents(stateKey as string);\r\n }\r\n\r\n return { useCogsState, setCogsOptions } as CogsApi<State>;\r\n};\r\nexport function createCogsStateFromSync<\r\n TSyncSchema extends {\r\n schemas: Record<\r\n string,\r\n {\r\n schemas: { defaultValues: any };\r\n [key: string]: any;\r\n }\r\n >;\r\n notifications: Record<string, any>;\r\n },\r\n>(\r\n syncSchema: TSyncSchema\r\n): CogsApi<\r\n {\r\n [K in keyof TSyncSchema['schemas']]: TSyncSchema['schemas'][K]['schemas']['defaultValues'];\r\n },\r\n {\r\n [K in keyof TSyncSchema['schemas']]: TSyncSchema['schemas'][K]['apiParams'];\r\n }[keyof {\r\n [K in keyof TSyncSchema['schemas']]: TSyncSchema['schemas'][K]['apiParams'];\r\n }]\r\n> {\r\n const schemas = syncSchema.schemas;\r\n const initialState: any = {};\r\n\r\n // Extract defaultValues from each entry\r\n for (const key in schemas) {\r\n const entry = schemas[key];\r\n initialState[key] = entry?.schemas?.defaultValues || {};\r\n }\r\n\r\n return createCogsState(initialState);\r\n}\r\n\r\nconst {\r\n getInitialOptions,\r\n getValidationErrors,\r\n setStateLog,\r\n updateInitialStateGlobal,\r\n addValidationError,\r\n removeValidationError,\r\n} = getGlobalStore.getState();\r\nconst saveToLocalStorage = <T,>(\r\n state: T,\r\n thisKey: string,\r\n currentInitialOptions: any,\r\n sessionId?: string,\r\n lastSyncedWithServer?: number\r\n) => {\r\n if (currentInitialOptions?.log) {\r\n console.log(\r\n 'saving to localstorage',\r\n thisKey,\r\n currentInitialOptions.localStorage?.key,\r\n sessionId\r\n );\r\n }\r\n\r\n const key = isFunction(currentInitialOptions?.localStorage?.key)\r\n ? currentInitialOptions.localStorage?.key(state)\r\n : currentInitialOptions?.localStorage?.key;\r\n\r\n if (key && sessionId) {\r\n const storageKey = `${sessionId}-${thisKey}-${key}`;\r\n\r\n // Get existing data to preserve lastSyncedWithServer if not explicitly updating it\r\n let existingLastSynced: number | undefined;\r\n try {\r\n const existing = loadFromLocalStorage(storageKey);\r\n existingLastSynced = existing?.lastSyncedWithServer;\r\n } catch {\r\n // Ignore errors, will use undefined\r\n }\r\n const shadowMeta = getGlobalStore.getState().getShadowMetadata(thisKey, []);\r\n\r\n const data: LocalStorageData<T> = {\r\n state,\r\n lastUpdated: Date.now(),\r\n lastSyncedWithServer: lastSyncedWithServer ?? existingLastSynced,\r\n stateSource: shadowMeta?.stateSource,\r\n baseServerState: shadowMeta?.baseServerState,\r\n };\r\n\r\n // Use SuperJSON serialize to get the json part only\r\n const superJsonResult = superjson.serialize(data);\r\n window.localStorage.setItem(\r\n storageKey,\r\n JSON.stringify(superJsonResult.json)\r\n );\r\n }\r\n};\r\n\r\nconst loadFromLocalStorage = (localStorageKey: string) => {\r\n if (!localStorageKey) return null;\r\n\r\n try {\r\n const storedData = window.localStorage.getItem(localStorageKey);\r\n if (!storedData) return null;\r\n\r\n // Parse the json part back normally\r\n const parsedData = JSON.parse(storedData);\r\n\r\n return parsedData;\r\n } catch (error) {\r\n console.error('Error loading from localStorage:', error);\r\n return null;\r\n }\r\n};\r\nconst loadAndApplyLocalStorage = (stateKey: string, options: any) => {\r\n const currentState = getGlobalStore.getState().getShadowValue(stateKey);\r\n const { sessionId } = useCogsConfig();\r\n const localkey = isFunction(options?.localStorage?.key)\r\n ? options.localStorage.key(currentState)\r\n : options?.localStorage?.key;\r\n\r\n if (localkey && sessionId) {\r\n const localData = loadFromLocalStorage(\r\n `${sessionId}-${stateKey}-${localkey}`\r\n );\r\n\r\n if (\r\n localData &&\r\n localData.lastUpdated > (localData.lastSyncedWithServer || 0)\r\n ) {\r\n notifyComponents(stateKey);\r\n return true;\r\n }\r\n }\r\n return false;\r\n};\r\n\r\ntype LocalStorageData<T> = {\r\n state: T;\r\n lastUpdated: number;\r\n lastSyncedWithServer?: number;\r\n baseServerState?: T; // Keep reference to what server state this is based on\r\n stateSource?: 'default' | 'server' | 'localStorage'; // Track origin\r\n};\r\n\r\nconst notifyComponents = (thisKey: string) => {\r\n const stateEntry = getGlobalStore.getState().getShadowMetadata(thisKey, []);\r\n if (!stateEntry) return;\r\n\r\n // Batch component updates\r\n const updates = new Set<() => void>();\r\n stateEntry?.components?.forEach((component) => {\r\n const reactiveTypes = component\r\n ? Array.isArray(component.reactiveType)\r\n ? component.reactiveType\r\n : [component.reactiveType || 'component']\r\n : null;\r\n if (!reactiveTypes?.includes('none')) {\r\n updates.add(() => component.forceUpdate());\r\n }\r\n });\r\n\r\n // Schedule updates in the next tick to allow batching\r\n queueMicrotask(() => {\r\n updates.forEach((update) => update());\r\n });\r\n};\r\n\r\nexport const notifyComponent = (stateKey: string, componentId: string) => {\r\n const stateEntry = getGlobalStore.getState().getShadowMetadata(stateKey, []);\r\n if (stateEntry) {\r\n const fullComponentId = `${stateKey}////${componentId}`;\r\n const component = stateEntry?.components?.get(fullComponentId);\r\n const reactiveTypes = component\r\n ? Array.isArray(component.reactiveType)\r\n ? component.reactiveType\r\n : [component.reactiveType || 'component']\r\n : null;\r\n\r\n // Skip if reactivity is disabled\r\n if (reactiveTypes?.includes('none')) {\r\n return;\r\n }\r\n\r\n if (component) {\r\n // Force an update to ensure the current value is saved\r\n\r\n component.forceUpdate();\r\n }\r\n }\r\n};\r\nfunction markEntireStateAsServerSynced(\r\n stateKey: string,\r\n path: string[],\r\n data: any,\r\n timestamp: number\r\n) {\r\n const store = getGlobalStore.getState();\r\n\r\n // Mark current path as synced\r\n const currentMeta = store.getShadowMetadata(stateKey, path);\r\n store.setShadowMetadata(stateKey, path, {\r\n ...currentMeta,\r\n isDirty: false,\r\n stateSource: 'server',\r\n lastServerSync: timestamp || Date.now(),\r\n });\r\n\r\n // If it's an array, mark each item as synced\r\n if (Array.isArray(data)) {\r\n const arrayMeta = store.getShadowMetadata(stateKey, path);\r\n if (arrayMeta?.arrayKeys) {\r\n arrayMeta.arrayKeys.forEach((itemKey, index) => {\r\n const itemPath = itemKey.split('.').slice(1);\r\n const itemData = data[index];\r\n if (itemData !== undefined) {\r\n markEntireStateAsServerSynced(\r\n stateKey,\r\n itemPath,\r\n itemData,\r\n timestamp\r\n );\r\n }\r\n });\r\n }\r\n }\r\n // If it's an object, mark each field as synced\r\n else if (data && typeof data === 'object' && data.constructor === Object) {\r\n Object.keys(data).forEach((key) => {\r\n const fieldPath = [...path, key];\r\n const fieldData = data[key];\r\n markEntireStateAsServerSynced(stateKey, fieldPath, fieldData, timestamp);\r\n });\r\n }\r\n}\r\n\r\nconst _notifySubscribedComponents = (\r\n stateKey: string,\r\n path: string[],\r\n updateType: 'update' | 'insert' | 'cut',\r\n oldValue: any,\r\n newValue: any\r\n) => {\r\n const store = getGlobalStore.getState();\r\n const rootMeta = store.getShadowMetadata(stateKey, []);\r\n if (!rootMeta?.components) {\r\n return;\r\n }\r\n\r\n const notifiedComponents = new Set<string>();\r\n const shadowMeta = store.getShadowMetadata(stateKey, path);\r\n\r\n // --- PASS 1: Notify specific subscribers based on update type ---\r\n\r\n if (updateType === 'update') {\r\n if (shadowMeta?.pathComponents) {\r\n shadowMeta.pathComponents.forEach((componentId) => {\r\n if (notifiedComponents.has(componentId)) return;\r\n const component = rootMeta.components?.get(componentId);\r\n if (component) {\r\n const reactiveTypes = Array.isArray(component.reactiveType)\r\n ? component.reactiveType\r\n : [component.reactiveType || 'component'];\r\n if (!reactiveTypes.includes('none')) {\r\n component.forceUpdate();\r\n notifiedComponents.add(componentId);\r\n }\r\n }\r\n });\r\n }\r\n\r\n if (\r\n newValue &&\r\n typeof newValue === 'object' &&\r\n !isArray(newValue) &&\r\n oldValue &&\r\n typeof oldValue === 'object' &&\r\n !isArray(oldValue)\r\n ) {\r\n const changedSubPaths = getDifferences(newValue, oldValue);\r\n changedSubPaths.forEach((subPathString) => {\r\n const subPath = subPathString.split('.');\r\n const fullSubPath = [...path, ...subPath];\r\n const subPathMeta = store.getShadowMetadata(stateKey, fullSubPath);\r\n if (subPathMeta?.pathComponents) {\r\n subPathMeta.pathComponents.forEach((componentId) => {\r\n if (notifiedComponents.has(componentId)) return;\r\n const component = rootMeta.components?.get(componentId);\r\n if (component) {\r\n const reactiveTypes = Array.isArray(component.reactiveType)\r\n ? component.reactiveType\r\n : [component.reactiveType || 'component'];\r\n if (!reactiveTypes.includes('none')) {\r\n component.forceUpdate();\r\n notifiedComponents.add(componentId);\r\n }\r\n }\r\n });\r\n }\r\n });\r\n }\r\n } else if (updateType === 'insert' || updateType === 'cut') {\r\n const parentArrayPath = updateType === 'insert' ? path : path.slice(0, -1);\r\n const parentMeta = store.getShadowMetadata(stateKey, parentArrayPath);\r\n if (parentMeta?.pathComponents) {\r\n parentMeta.pathComponents.forEach((componentId) => {\r\n if (!notifiedComponents.has(componentId)) {\r\n const component = rootMeta.components?.get(componentId);\r\n if (component) {\r\n component.forceUpdate();\r\n notifiedComponents.add(componentId);\r\n }\r\n }\r\n });\r\n }\r\n }\r\n\r\n // --- PASS 2: Notify global subscribers ('all', 'deps') ---\r\n\r\n rootMeta.components.forEach((component, componentId) => {\r\n if (notifiedComponents.has(componentId)) {\r\n return;\r\n }\r\n\r\n const reactiveTypes = Array.isArray(component.reactiveType)\r\n ? component.reactiveType\r\n : [component.reactiveType || 'component'];\r\n\r\n if (reactiveTypes.includes('all')) {\r\n component.forceUpdate();\r\n notifiedComponents.add(componentId);\r\n return;\r\n }\r\n\r\n if (reactiveTypes.includes('deps')) {\r\n if (component.depsFunction) {\r\n const currentState = store.getShadowValue(stateKey);\r\n const newDeps = component.depsFunction(currentState);\r\n let shouldUpdate = false;\r\n if (newDeps === true || !isDeepEqual(component.prevDeps, newDeps)) {\r\n if (Array.isArray(newDeps)) component.prevDeps = newDeps;\r\n shouldUpdate = true;\r\n }\r\n if (shouldUpdate) {\r\n component.forceUpdate();\r\n notifiedComponents.add(componentId);\r\n }\r\n }\r\n }\r\n });\r\n};\r\n\r\nexport function useCogsStateFn<TStateObject extends unknown>(\r\n stateObject: TStateObject,\r\n {\r\n stateKey,\r\n\r\n localStorage,\r\n formElements,\r\n reactiveDeps,\r\n reactiveType,\r\n componentId,\r\n defaultState,\r\n syncUpdate,\r\n dependencies,\r\n serverState,\r\n }: {\r\n stateKey?: string;\r\n componentId?: string;\r\n defaultState?: TStateObject;\r\n } & OptionsType<TStateObject> = {}\r\n) {\r\n const [reactiveForce, forceUpdate] = useState({}); //this is the key to reactivity\r\n const { sessionId } = useCogsConfig();\r\n\r\n let noStateKey = stateKey ? false : true;\r\n const [thisKey] = useState(stateKey ?? uuidv4());\r\n const stateLog = getGlobalStore.getState().stateLog[thisKey];\r\n const componentUpdatesRef = useRef(new Set<string>());\r\n const componentIdRef = useRef(componentId ?? uuidv4());\r\n const latestInitialOptionsRef = useRef<OptionsType<TStateObject> | null>(\r\n null\r\n );\r\n latestInitialOptionsRef.current = (getInitialOptions(thisKey as string) ??\r\n null) as OptionsType<TStateObject> | null;\r\n\r\n useEffect(() => {\r\n if (syncUpdate && syncUpdate.stateKey === thisKey && syncUpdate.path?.[0]) {\r\n // Update the actual state value\r\n\r\n // Create combined key and update sync info\r\n const syncKey = `${syncUpdate.stateKey}:${syncUpdate.path.join('.')}`;\r\n getGlobalStore.getState().setSyncInfo(syncKey, {\r\n timeStamp: syncUpdate.timeStamp!,\r\n userId: syncUpdate.userId!,\r\n });\r\n }\r\n }, [syncUpdate]);\r\n\r\n const resolveInitialState = useCallback(\r\n (\r\n overrideOptions?: OptionsType<TStateObject>\r\n ): {\r\n value: TStateObject;\r\n source: 'default' | 'server' | 'localStorage';\r\n timestamp: number;\r\n } => {\r\n // If we pass in options, use them. Otherwise, get from the global store.\r\n const optionsToUse = overrideOptions\r\n ? { ...getInitialOptions(thisKey as string), ...overrideOptions }\r\n : getInitialOptions(thisKey as string);\r\n\r\n const currentOptions = optionsToUse;\r\n const finalDefaultState =\r\n currentOptions?.defaultState || defaultState || stateObject;\r\n\r\n // 1. Check server state\r\n const hasValidServerData =\r\n currentOptions?.serverState?.status === 'success' &&\r\n currentOptions?.serverState?.data !== undefined;\r\n\r\n if (hasValidServerData) {\r\n return {\r\n value: currentOptions.serverState!.data! as any,\r\n source: 'server',\r\n timestamp: currentOptions.serverState!.timestamp || Date.now(),\r\n };\r\n }\r\n // 2. Check localStorage\r\n if (currentOptions?.localStorage?.key && sessionId) {\r\n const localKey = isFunction(currentOptions.localStorage.key)\r\n ? currentOptions.localStorage.key(finalDefaultState)\r\n : currentOptions.localStorage.key;\r\n\r\n const localData = loadFromLocalStorage(\r\n `${sessionId}-${thisKey}-${localKey}`\r\n );\r\n\r\n if (\r\n localData &&\r\n localData.lastUpdated > (currentOptions?.serverState?.timestamp || 0)\r\n ) {\r\n return {\r\n value: localData.state,\r\n source: 'localStorage',\r\n timestamp: localData.lastUpdated,\r\n };\r\n }\r\n }\r\n\r\n // 3. Use default state\r\n return {\r\n value: finalDefaultState || (stateObject as any),\r\n source: 'default',\r\n timestamp: Date.now(),\r\n };\r\n },\r\n [thisKey, defaultState, stateObject, sessionId]\r\n );\r\n\r\n // Effect 1: When this component's serverState prop changes, broadcast it\r\n useEffect(() => {\r\n getGlobalStore.getState().setServerStateUpdate(thisKey, serverState);\r\n }, [serverState, thisKey]);\r\n\r\n // Effect 2: Listen for server state updates from ANY component\r\n useEffect(() => {\r\n const unsubscribe = getGlobalStore\r\n .getState()\r\n .subscribeToPath(thisKey, (event) => {\r\n if (event?.type === 'SERVER_STATE_UPDATE') {\r\n const serverStateData = event.serverState;\r\n\r\n if (\r\n serverStateData?.status === 'success' &&\r\n serverStateData.data !== undefined\r\n ) {\r\n const newOptions = { serverState: serverStateData };\r\n setAndMergeOptions(thisKey, newOptions);\r\n\r\n const mergeConfig =\r\n typeof serverStateData.merge === 'object'\r\n ? serverStateData.merge\r\n : serverStateData.merge === true\r\n ? { strategy: 'append' }\r\n : null;\r\n\r\n const currentState = getGlobalStore\r\n .getState()\r\n .getShadowValue(thisKey);\r\n const incomingData = serverStateData.data;\r\n\r\n if (\r\n mergeConfig &&\r\n Array.isArray(currentState) &&\r\n Array.isArray(incomingData)\r\n ) {\r\n const keyField = mergeConfig.key || 'id';\r\n const existingIds = new Set(\r\n currentState.map((item: any) => item[keyField])\r\n );\r\n\r\n const newUniqueItems = incomingData.filter((item: any) => {\r\n return !existingIds.has(item[keyField]);\r\n });\r\n\r\n if (newUniqueItems.length > 0) {\r\n newUniqueItems.forEach((item) => {\r\n getGlobalStore\r\n .getState()\r\n .insertShadowArrayElement(thisKey, [], item);\r\n\r\n // MARK NEW SERVER ITEMS AS SYNCED\r\n const arrayMeta = getGlobalStore\r\n .getState()\r\n .getShadowMetadata(thisKey, []);\r\n\r\n if (arrayMeta?.arrayKeys) {\r\n const newItemKey =\r\n arrayMeta.arrayKeys[arrayMeta.arrayKeys.length - 1];\r\n if (newItemKey) {\r\n const newItemPath = newItemKey.split('.').slice(1);\r\n\r\n // Mark the new server item as synced, not dirty\r\n getGlobalStore\r\n .getState()\r\n .setShadowMetadata(thisKey, newItemPath, {\r\n isDirty: false,\r\n stateSource: 'server',\r\n lastServerSync:\r\n serverStateData.timestamp || Date.now(),\r\n });\r\n\r\n // Also mark all its child fields as synced if it's an object\r\n const itemValue = getGlobalStore\r\n .getState()\r\n .getShadowValue(newItemKey);\r\n if (\r\n itemValue &&\r\n typeof itemValue === 'object' &&\r\n !Array.isArray(itemValue)\r\n ) {\r\n Object.keys(itemValue).forEach((fieldKey) => {\r\n const fieldPath = [...newItemPath, fieldKey];\r\n getGlobalStore\r\n .getState()\r\n .setShadowMetadata(thisKey, fieldPath, {\r\n isDirty: false,\r\n stateSource: 'server',\r\n lastServerSync:\r\n serverStateData.timestamp || Date.now(),\r\n });\r\n });\r\n }\r\n }\r\n }\r\n });\r\n }\r\n } else {\r\n // For replace strategy or initial load\r\n getGlobalStore\r\n .getState()\r\n .initializeShadowState(thisKey, incomingData);\r\n\r\n // Mark the entire state tree as synced from server\r\n markEntireStateAsServerSynced(\r\n thisKey,\r\n [],\r\n incomingData,\r\n serverStateData.timestamp\r\n );\r\n }\r\n\r\n const meta = getGlobalStore\r\n .getState()\r\n .getShadowMetadata(thisKey, []);\r\n getGlobalStore.getState().setShadowMetadata(thisKey, [], {\r\n ...meta,\r\n stateSource: 'server',\r\n lastServerSync: serverStateData.timestamp || Date.now(),\r\n isDirty: false,\r\n });\r\n }\r\n }\r\n });\r\n\r\n return unsubscribe;\r\n }, [thisKey, resolveInitialState]);\r\n\r\n useEffect(() => {\r\n const existingMeta = getGlobalStore\r\n .getState()\r\n .getShadowMetadata(thisKey, []);\r\n if (existingMeta && existingMeta.stateSource) {\r\n return; // Already initialized, bail out.\r\n }\r\n\r\n const options = getInitialOptions(thisKey as string);\r\n\r\n if (options?.defaultState !== undefined || defaultState !== undefined) {\r\n const finalDefaultState = options?.defaultState || defaultState;\r\n\r\n // Only set defaultState if it's not already set\r\n if (!options?.defaultState) {\r\n setAndMergeOptions(thisKey as string, {\r\n defaultState: finalDefaultState,\r\n });\r\n }\r\n\r\n const { value: resolvedState, source, timestamp } = resolveInitialState();\r\n\r\n getGlobalStore.getState().initializeShadowState(thisKey, resolvedState);\r\n\r\n // Set shadow metadata with the correct source info\r\n getGlobalStore.getState().setShadowMetadata(thisKey, [], {\r\n stateSource: source,\r\n lastServerSync: source === 'server' ? timestamp : undefined,\r\n isDirty: false,\r\n baseServerState: source === 'server' ? resolvedState : undefined,\r\n });\r\n\r\n notifyComponents(thisKey);\r\n }\r\n }, [thisKey, ...(dependencies || [])]);\r\n useLayoutEffect(() => {\r\n if (noStateKey) {\r\n setAndMergeOptions(thisKey as string, {\r\n formElements,\r\n defaultState,\r\n localStorage,\r\n middleware: latestInitialOptionsRef.current?.middleware,\r\n });\r\n }\r\n\r\n const componentKey = `${thisKey}////${componentIdRef.current}`;\r\n\r\n // Register component in shadow metadata at root level\r\n const rootMeta = getGlobalStore.getState().getShadowMetadata(thisKey, []);\r\n const components = rootMeta?.components || new Map();\r\n\r\n components.set(componentKey, {\r\n forceUpdate: () => forceUpdate({}),\r\n reactiveType: reactiveType ?? ['component', 'deps'],\r\n paths: new Set(),\r\n depsFunction: reactiveDeps || undefined,\r\n deps: reactiveDeps\r\n ? reactiveDeps(getGlobalStore.getState().getShadowValue(thisKey))\r\n : [],\r\n prevDeps: reactiveDeps // Initialize prevDeps with the same initial value\r\n ? reactiveDeps(getGlobalStore.getState().getShadowValue(thisKey))\r\n : [],\r\n });\r\n\r\n getGlobalStore.getState().setShadowMetadata(thisKey, [], {\r\n ...rootMeta,\r\n components,\r\n });\r\n forceUpdate({});\r\n return () => {\r\n const meta = getGlobalStore.getState().getShadowMetadata(thisKey, []);\r\n const component = meta?.components?.get(componentKey);\r\n\r\n // Remove from each path we registered to\r\n if (component?.paths) {\r\n component.paths.forEach((fullPath) => {\r\n // fullPath is like \"todos.0.name\", need to split and remove stateKey\r\n const pathParts = fullPath.split('.');\r\n const path = pathParts.slice(1); // Remove stateKey part\r\n\r\n const pathMeta = getGlobalStore\r\n .getState()\r\n .getShadowMetadata(thisKey, path);\r\n if (pathMeta?.pathComponents) {\r\n // Optionally clean up empty Sets\r\n\r\n if (pathMeta.pathComponents.size === 0) {\r\n delete pathMeta.pathComponents;\r\n getGlobalStore\r\n .getState()\r\n .setShadowMetadata(thisKey, path, pathMeta);\r\n }\r\n }\r\n });\r\n }\r\n\r\n // Remove from root components\r\n if (meta?.components) {\r\n getGlobalStore.getState().setShadowMetadata(thisKey, [], meta);\r\n }\r\n };\r\n }, []);\r\n\r\n const syncApiRef = useRef<SyncApi | null>(null);\r\n const effectiveSetState = (\r\n newStateOrFunction: UpdateArg<TStateObject> | InsertParams<TStateObject>,\r\n path: string[],\r\n updateObj: UpdateOptions\r\n ) => {\r\n const fullPath = [thisKey, ...path].join('.');\r\n if (Array.isArray(path)) {\r\n const pathKey = `${thisKey}-${path.join('.')}`;\r\n componentUpdatesRef.current.add(pathKey);\r\n }\r\n const store = getGlobalStore.getState();\r\n\r\n // FETCH ONCE at the beginning\r\n const shadowMeta = store.getShadowMetadata(thisKey, path);\r\n const nestedShadowValue = store.getShadowValue(fullPath) as TStateObject;\r\n\r\n const payload = (\r\n updateObj.updateType === 'insert' && isFunction(newStateOrFunction)\r\n ? newStateOrFunction({ state: nestedShadowValue, uuid: uuidv4() })\r\n : isFunction(newStateOrFunction)\r\n ? newStateOrFunction(nestedShadowValue)\r\n : newStateOrFunction\r\n ) as TStateObject;\r\n\r\n const timeStamp = Date.now();\r\n\r\n const newUpdate = {\r\n timeStamp,\r\n stateKey: thisKey,\r\n path,\r\n updateType: updateObj.updateType,\r\n status: 'new' as const,\r\n oldValue: nestedShadowValue,\r\n newValue: payload,\r\n } satisfies UpdateTypeDetail;\r\n\r\n // Perform the update\r\n switch (updateObj.updateType) {\r\n case 'insert': {\r\n store.insertShadowArrayElement(thisKey, path, newUpdate.newValue);\r\n // The array at `path` has been modified. Mark it AND all its parents as dirty.\r\n store.markAsDirty(thisKey, path, { bubble: true });\r\n\r\n // ALSO mark the newly inserted item itself as dirty\r\n // Get the new item's path and mark it as dirty\r\n const arrayMeta = store.getShadowMetadata(thisKey, path);\r\n if (arrayMeta?.arrayKeys) {\r\n const newItemKey =\r\n arrayMeta.arrayKeys[arrayMeta.arrayKeys.length - 1];\r\n if (newItemKey) {\r\n const newItemPath = newItemKey.split('.').slice(1); // Remove stateKey\r\n store.markAsDirty(thisKey, newItemPath, { bubble: false });\r\n }\r\n }\r\n break;\r\n }\r\n case 'cut': {\r\n const parentArrayPath = path.slice(0, -1);\r\n\r\n store.removeShadowArrayElement(thisKey, path);\r\n store.markAsDirty(thisKey, parentArrayPath, { bubble: true });\r\n break;\r\n }\r\n case 'update': {\r\n store.updateShadowAtPath(thisKey, path, newUpdate.newValue);\r\n store.markAsDirty(thisKey, path, { bubble: true });\r\n break;\r\n }\r\n }\r\n const shouldSync = updateObj.sync !== false;\r\n\r\n if (shouldSync && syncApiRef.current && syncApiRef.current.connected) {\r\n syncApiRef.current.updateState({ operation: newUpdate });\r\n }\r\n // Handle signals - reuse shadowMeta from the beginning\r\n if (shadowMeta?.signals && shadowMeta.signals.length > 0) {\r\n // Use updatedShadowValue if we need the new value, otherwise use payload\r\n const displayValue = updateObj.updateType === 'cut' ? null : payload;\r\n\r\n shadowMeta.signals.forEach(({ parentId, position, effect }) => {\r\n const parent = document.querySelector(`[data-parent-id=\"${parentId}\"]`);\r\n if (parent) {\r\n const childNodes = Array.from(parent.childNodes);\r\n if (childNodes[position]) {\r\n let finalDisplayValue = displayValue;\r\n if (effect && displayValue !== null) {\r\n try {\r\n finalDisplayValue = new Function(\r\n 'state',\r\n `return (${effect})(state)`\r\n )(displayValue);\r\n } catch (err) {\r\n console.error('Error evaluating effect function:', err);\r\n }\r\n }\r\n\r\n if (\r\n finalDisplayValue !== null &&\r\n finalDisplayValue !== undefined &&\r\n typeof finalDisplayValue === 'object'\r\n ) {\r\n finalDisplayValue = JSON.stringify(finalDisplayValue) as any;\r\n }\r\n\r\n childNodes[position].textContent = String(finalDisplayValue ?? '');\r\n }\r\n }\r\n });\r\n }\r\n\r\n // Update in effectiveSetState for insert handling:\r\n if (updateObj.updateType === 'insert') {\r\n // Use shadowMeta from beginning if it's an array\r\n if (shadowMeta?.mapWrappers && shadowMeta.mapWrappers.length > 0) {\r\n // Get fresh array keys after insert\r\n const sourceArrayKeys =\r\n store.getShadowMetadata(thisKey, path)?.arrayKeys || [];\r\n const newItemKey = sourceArrayKeys[sourceArrayKeys.length - 1]!;\r\n const newItemValue = store.getShadowValue(newItemKey);\r\n const fullSourceArray = store.getShadowValue(\r\n [thisKey, ...path].join('.')\r\n );\r\n\r\n if (!newItemKey || newItemValue === undefined) return;\r\n\r\n shadowMeta.mapWrappers.forEach((wrapper) => {\r\n let shouldRender = true;\r\n let insertPosition = -1;\r\n\r\n // Check if wrapper has transforms\r\n if (wrapper.meta?.transforms && wrapper.meta.transforms.length > 0) {\r\n // Check if new item passes all filters\r\n for (const transform of wrapper.meta.transforms) {\r\n if (transform.type === 'filter') {\r\n if (!transform.fn(newItemValue, -1)) {\r\n shouldRender = false;\r\n break;\r\n }\r\n }\r\n }\r\n\r\n if (shouldRender) {\r\n // Get current valid keys by applying transforms\r\n const currentValidKeys = applyTransforms(\r\n thisKey,\r\n path,\r\n wrapper.meta.transforms\r\n );\r\n\r\n // Find where to insert based on sort\r\n const sortTransform = wrapper.meta.transforms.find(\r\n (t: any) => t.type === 'sort'\r\n );\r\n if (sortTransform) {\r\n // Add new item to the list and sort to find position\r\n const allItems = currentValidKeys.map((key) => ({\r\n key,\r\n value: store.getShadowValue(key),\r\n }));\r\n\r\n allItems.push({ key: newItemKey, value: newItemValue });\r\n allItems.sort((a, b) => sortTransform.fn(a.value, b.value));\r\n\r\n insertPosition = allItems.findIndex(\r\n (item) => item.key === newItemKey\r\n );\r\n } else {\r\n // No sort, insert at end\r\n insertPosition = currentValidKeys.length;\r\n }\r\n }\r\n } else {\r\n // No transforms, always render at end\r\n shouldRender = true;\r\n insertPosition = sourceArrayKeys.length - 1;\r\n }\r\n\r\n if (!shouldRender) {\r\n return; // Skip this wrapper, item doesn't pass filters\r\n }\r\n\r\n if (wrapper.containerRef && wrapper.containerRef.isConnected) {\r\n const itemElement = document.createElement('div');\r\n itemElement.setAttribute('data-item-path', newItemKey);\r\n\r\n // Insert at correct position\r\n const children = Array.from(wrapper.containerRef.children);\r\n if (insertPosition >= 0 && insertPosition < children.length) {\r\n wrapper.containerRef.insertBefore(\r\n itemElement,\r\n children[insertPosition]!\r\n );\r\n } else {\r\n wrapper.containerRef.appendChild(itemElement);\r\n }\r\n\r\n const root = createRoot(itemElement);\r\n const componentId = uuidv4();\r\n const itemPath = newItemKey.split('.').slice(1);\r\n\r\n const arraySetter = wrapper.rebuildStateShape({\r\n path: wrapper.path,\r\n currentState: fullSourceArray,\r\n componentId: wrapper.componentId,\r\n meta: wrapper.meta,\r\n });\r\n\r\n root.render(\r\n createElement(MemoizedCogsItemWrapper, {\r\n stateKey: thisKey,\r\n itemComponentId: componentId,\r\n itemPath: itemPath,\r\n localIndex: insertPosition,\r\n arraySetter: arraySetter,\r\n rebuildStateShape: wrapper.rebuildStateShape,\r\n renderFn: wrapper.mapFn,\r\n })\r\n );\r\n }\r\n });\r\n }\r\n }\r\n if (updateObj.updateType === 'cut') {\r\n const arrayPath = path.slice(0, -1);\r\n const arrayMeta = store.getShadowMetadata(thisKey, arrayPath);\r\n\r\n if (arrayMeta?.mapWrappers && arrayMeta.mapWrappers.length > 0) {\r\n arrayMeta.mapWrappers.forEach((wrapper) => {\r\n if (wrapper.containerRef && wrapper.containerRef.isConnected) {\r\n const elementToRemove = wrapper.containerRef.querySelector(\r\n `[data-item-path=\"${fullPath}\"]`\r\n );\r\n if (elementToRemove) {\r\n elementToRemove.remove();\r\n }\r\n }\r\n });\r\n }\r\n }\r\n\r\n // Assumes `isDeepEqual` is available in this scope.\r\n // Assumes `isDeepEqual` is available in this scope.\r\n\r\n const newState = getGlobalStore.getState().getShadowValue(thisKey);\r\n const rootMeta = getGlobalStore.getState().getShadowMetadata(thisKey, []);\r\n const notifiedComponents = new Set<string>();\r\n console.log(\r\n 'rootMeta',\r\n thisKey,\r\n getGlobalStore.getState().shadowStateStore\r\n );\r\n if (!rootMeta?.components) {\r\n return newState;\r\n }\r\n\r\n // --- PASS 1: Notify specific subscribers based on update type ---\r\n\r\n if (updateObj.updateType === 'update') {\r\n // --- Bubble-up Notification ---\r\n // When a nested property changes, notify components listening at that exact path,\r\n // and also \"bubble up\" to notify components listening on parent paths.\r\n // e.g., an update to `user.address.street` notifies listeners of `street`, `address`, and `user`.\r\n let currentPath = [...path]; // Create a mutable copy of the path\r\n\r\n while (true) {\r\n const currentPathMeta = store.getShadowMetadata(thisKey, currentPath);\r\n\r\n if (currentPathMeta?.pathComponents) {\r\n currentPathMeta.pathComponents.forEach((componentId) => {\r\n if (notifiedComponents.has(componentId)) {\r\n return; // Avoid sending redundant notifications\r\n }\r\n const component = rootMeta.components?.get(componentId);\r\n if (component) {\r\n const reactiveTypes = Array.isArray(component.reactiveType)\r\n ? component.reactiveType\r\n : [component.reactiveType || 'component'];\r\n\r\n // This notification logic applies to components that depend on object structures.\r\n if (!reactiveTypes.includes('none')) {\r\n component.forceUpdate();\r\n notifiedComponents.add(componentId);\r\n }\r\n }\r\n });\r\n }\r\n\r\n if (currentPath.length === 0) {\r\n break; // We've reached the root, stop bubbling.\r\n }\r\n currentPath.pop(); // Go up one level for the next iteration.\r\n }\r\n\r\n // ADDITIONALLY, if the payload is an object, perform a deep-check and\r\n // notify any components that are subscribed to specific sub-paths that changed.\r\n if (\r\n payload &&\r\n typeof payload === 'object' &&\r\n !isArray(payload) &&\r\n nestedShadowValue &&\r\n typeof nestedShadowValue === 'object' &&\r\n !isArray(nestedShadowValue)\r\n ) {\r\n // Get a list of dot-separated paths that have changed (e.g., ['name', 'address.city'])\r\n const changedSubPaths = getDifferences(payload, nestedShadowValue);\r\n\r\n changedSubPaths.forEach((subPathString) => {\r\n const subPath = subPathString.split('.');\r\n const fullSubPath = [...path, ...subPath];\r\n\r\n // Get the metadata (and subscribers) for this specific nested path\r\n const subPathMeta = store.getShadowMetadata(thisKey, fullSubPath);\r\n if (subPathMeta?.pathComponents) {\r\n subPathMeta.pathComponents.forEach((componentId) => {\r\n // Avoid sending a redundant update\r\n if (notifiedComponents.has(componentId)) {\r\n return;\r\n }\r\n const component = rootMeta.components?.get(componentId);\r\n if (component) {\r\n const reactiveTypes = Array.isArray(component.reactiveType)\r\n ? component.reactiveType\r\n : [component.reactiveType || 'component'];\r\n\r\n if (!reactiveTypes.includes('none')) {\r\n component.forceUpdate();\r\n notifiedComponents.add(componentId);\r\n }\r\n }\r\n });\r\n }\r\n });\r\n }\r\n } else if (\r\n updateObj.updateType === 'insert' ||\r\n updateObj.updateType === 'cut'\r\n ) {\r\n // For array structural changes, notify components listening to the parent array.\r\n const parentArrayPath =\r\n updateObj.updateType === 'insert' ? path : path.slice(0, -1);\r\n\r\n const parentMeta = store.getShadowMetadata(thisKey, parentArrayPath);\r\n\r\n // Handle signal updates for array length, etc.\r\n if (parentMeta?.signals && parentMeta.signals.length > 0) {\r\n const parentFullPath = [thisKey, ...parentArrayPath].join('.');\r\n const parentValue = store.getShadowValue(parentFullPath);\r\n\r\n parentMeta.signals.forEach(({ parentId, position, effect }) => {\r\n const parent = document.querySelector(\r\n `[data-parent-id=\"${parentId}\"]`\r\n );\r\n if (parent) {\r\n const childNodes = Array.from(parent.childNodes);\r\n if (childNodes[position]) {\r\n let displayValue = parentValue;\r\n if (effect) {\r\n try {\r\n displayValue = new Function(\r\n 'state',\r\n `return (${effect})(state)`\r\n )(parentValue);\r\n } catch (err) {\r\n console.error('Error evaluating effect function:', err);\r\n displayValue = parentValue;\r\n }\r\n }\r\n\r\n if (\r\n displayValue !== null &&\r\n displayValue !== undefined &&\r\n typeof displayValue === 'object'\r\n ) {\r\n displayValue = JSON.stringify(displayValue);\r\n }\r\n\r\n childNodes[position].textContent = String(displayValue ?? '');\r\n }\r\n }\r\n });\r\n }\r\n\r\n // Notify components subscribed to the array itself.\r\n if (parentMeta?.pathComponents) {\r\n parentMeta.pathComponents.forEach((componentId) => {\r\n if (!notifiedComponents.has(componentId)) {\r\n const component = rootMeta.components?.get(componentId);\r\n if (component) {\r\n component.forceUpdate();\r\n notifiedComponents.add(componentId);\r\n }\r\n }\r\n });\r\n }\r\n }\r\n\r\n rootMeta.components.forEach((component, componentId) => {\r\n if (notifiedComponents.has(componentId)) {\r\n return;\r\n }\r\n\r\n const reactiveTypes = Array.isArray(component.reactiveType)\r\n ? component.reactiveType\r\n : [component.reactiveType || 'component'];\r\n\r\n if (reactiveTypes.includes('all')) {\r\n component.forceUpdate();\r\n notifiedComponents.add(componentId);\r\n return;\r\n }\r\n\r\n if (reactiveTypes.includes('deps')) {\r\n if (component.depsFunction) {\r\n const currentState = store.getShadowValue(thisKey);\r\n const newDeps = component.depsFunction(currentState);\r\n let shouldUpdate = false;\r\n\r\n if (newDeps === true) {\r\n shouldUpdate = true;\r\n } else if (Array.isArray(newDeps)) {\r\n if (!isDeepEqual(component.prevDeps, newDeps)) {\r\n component.prevDeps = newDeps;\r\n shouldUpdate = true;\r\n }\r\n }\r\n\r\n if (shouldUpdate) {\r\n component.forceUpdate();\r\n notifiedComponents.add(componentId);\r\n }\r\n }\r\n }\r\n });\r\n notifiedComponents.clear();\r\n setStateLog(thisKey, (prevLogs) => {\r\n const logs = [...(prevLogs ?? []), newUpdate];\r\n const aggregatedLogs = new Map<string, typeof newUpdate>();\r\n\r\n logs.forEach((log) => {\r\n const uniqueKey = `${log.stateKey}:${JSON.stringify(log.path)}`;\r\n const existing = aggregatedLogs.get(uniqueKey);\r\n\r\n if (existing) {\r\n existing.timeStamp = Math.max(existing.timeStamp, log.timeStamp);\r\n existing.newValue = log.newValue;\r\n existing.oldValue = existing.oldValue ?? log.oldValue;\r\n existing.updateType = log.updateType;\r\n } else {\r\n aggregatedLogs.set(uniqueKey, { ...(log as any) });\r\n }\r\n });\r\n\r\n return Array.from(aggregatedLogs.values());\r\n });\r\n\r\n saveToLocalStorage(\r\n payload,\r\n thisKey,\r\n latestInitialOptionsRef.current,\r\n sessionId\r\n );\r\n\r\n if (latestInitialOptionsRef.current?.middleware) {\r\n latestInitialOptionsRef.current!.middleware({\r\n updateLog: stateLog,\r\n update: newUpdate,\r\n });\r\n }\r\n\r\n return newState;\r\n };\r\n\r\n if (!getGlobalStore.getState().initialStateGlobal[thisKey]) {\r\n updateInitialStateGlobal(thisKey, stateObject);\r\n }\r\n\r\n const updaterFinal = useMemo(() => {\r\n return createProxyHandler<TStateObject>(\r\n thisKey,\r\n effectiveSetState,\r\n componentIdRef.current,\r\n sessionId\r\n );\r\n }, [thisKey, sessionId]);\r\n\r\n const cogsSyncFn = latestInitialOptionsRef.current?.cogsSync;\r\n if (cogsSyncFn) {\r\n syncApiRef.current = cogsSyncFn(updaterFinal);\r\n }\r\n\r\n return updaterFinal;\r\n}\r\n\r\nexport type MetaData = {\r\n /**\r\n * An array of the full, unique string IDs (e.g., `\"stateKey.arrayName.id:123\"`)\r\n * of the items that belong to the current derived \"view\" of an array.\r\n * This is the primary mechanism for tracking the state of filtered or sorted lists.\r\n *\r\n * - `stateFilter` populates this with only the IDs of items that passed the filter.\r\n * - `stateSort` reorders this list to match the new sort order.\r\n * - All subsequent chained operations (like `.get()`, `.index()`, or `.cut()`)\r\n * MUST consult this list first to know which items they apply to and in what order.\r\n */\r\n validIds?: string[];\r\n\r\n /**\r\n * An array of the actual filter functions that have been applied in a chain.\r\n * This is primarily used by reactive renderers like `$stateMap` to make predictions.\r\n *\r\n * For example, when a new item is inserted into the original source array, a\r\n * `$stateMap` renderer on a filtered view can use these functions to test if the\r\n * newly inserted item should be dynamically rendered in its view.\r\n */\r\n transforms?: Array<{\r\n type: 'filter' | 'sort';\r\n fn: Function;\r\n }>;\r\n};\r\n\r\nfunction hashTransforms(transforms: any[]) {\r\n if (!transforms || transforms.length === 0) {\r\n return '';\r\n }\r\n // This creates a string representation of the transforms AND their dependencies.\r\n // Example: \"filter['red']sort['score','asc']\"\r\n return transforms\r\n .map(\r\n (transform) =>\r\n // Safely stringify dependencies. An empty array becomes '[]'.\r\n `${transform.type}${JSON.stringify(transform.dependencies || [])}`\r\n )\r\n .join('');\r\n}\r\nconst applyTransforms = (\r\n stateKey: string,\r\n path: string[],\r\n transforms?: Array<{ type: 'filter' | 'sort'; fn: Function }>\r\n): string[] => {\r\n let arrayKeys =\r\n getGlobalStore.getState().getShadowMetadata(stateKey, path)?.arrayKeys ||\r\n [];\r\n\r\n if (!transforms || transforms.length === 0) {\r\n return arrayKeys;\r\n }\r\n\r\n let itemsWithKeys = arrayKeys.map((key) => ({\r\n key,\r\n value: getGlobalStore.getState().getShadowValue(key),\r\n }));\r\n\r\n for (const transform of transforms) {\r\n if (transform.type === 'filter') {\r\n itemsWithKeys = itemsWithKeys.filter(({ value }, index) =>\r\n transform.fn(value, index)\r\n );\r\n } else if (transform.type === 'sort') {\r\n itemsWithKeys.sort((a, b) => transform.fn(a.value, b.value));\r\n }\r\n }\r\n\r\n return itemsWithKeys.map(({ key }) => key);\r\n};\r\nconst registerComponentDependency = (\r\n stateKey: string,\r\n componentId: string,\r\n dependencyPath: string[]\r\n) => {\r\n const fullComponentId = `${stateKey}////${componentId}`;\r\n const { addPathComponent, getShadowMetadata } = getGlobalStore.getState();\r\n\r\n // First, check if the component should even be registered.\r\n // This check is safe to do outside the setter.\r\n const rootMeta = getShadowMetadata(stateKey, []);\r\n const component = rootMeta?.components?.get(fullComponentId);\r\n\r\n if (\r\n !component ||\r\n component.reactiveType === 'none' ||\r\n !(\r\n Array.isArray(component.reactiveType)\r\n ? component.reactiveType\r\n : [component.reactiveType]\r\n ).includes('component')\r\n ) {\r\n return;\r\n }\r\n\r\n // Now, call the single, safe, atomic function to perform the update.\r\n addPathComponent(stateKey, dependencyPath, fullComponentId);\r\n};\r\nconst notifySelectionComponents = (\r\n stateKey: string,\r\n parentPath: string[],\r\n currentSelected?: string | undefined\r\n) => {\r\n const store = getGlobalStore.getState();\r\n const rootMeta = store.getShadowMetadata(stateKey, []);\r\n const notifiedComponents = new Set<string>();\r\n\r\n // Handle \"all\" reactive components first\r\n if (rootMeta?.components) {\r\n rootMeta.components.forEach((component, componentId) => {\r\n const reactiveTypes = Array.isArray(component.reactiveType)\r\n ? component.reactiveType\r\n : [component.reactiveType || 'component'];\r\n\r\n if (reactiveTypes.includes('all')) {\r\n component.forceUpdate();\r\n notifiedComponents.add(componentId);\r\n }\r\n });\r\n }\r\n\r\n store\r\n .getShadowMetadata(stateKey, [...parentPath, 'getSelected'])\r\n ?.pathComponents?.forEach((componentId) => {\r\n const thisComp = rootMeta?.components?.get(componentId);\r\n thisComp?.forceUpdate();\r\n });\r\n\r\n const parentMeta = store.getShadowMetadata(stateKey, parentPath);\r\n for (let arrayKey of parentMeta?.arrayKeys || []) {\r\n const key = arrayKey + '.selected';\r\n const selectedItem = store.getShadowMetadata(\r\n stateKey,\r\n key.split('.').slice(1)\r\n );\r\n if (arrayKey == currentSelected) {\r\n selectedItem?.pathComponents?.forEach((componentId) => {\r\n const thisComp = rootMeta?.components?.get(componentId);\r\n thisComp?.forceUpdate();\r\n });\r\n }\r\n }\r\n};\r\nfunction createProxyHandler<T>(\r\n stateKey: string,\r\n effectiveSetState: EffectiveSetState<T>,\r\n componentId: string,\r\n sessionId?: string\r\n): StateObject<T> {\r\n type CacheEntry = {\r\n proxy: any;\r\n stateVersion: number;\r\n };\r\n\r\n const shapeCache = new Map<string, CacheEntry>();\r\n let stateVersion = 0;\r\n\r\n const invalidateCachePath = (path: string[]) => {\r\n const pathKey = path.join('.');\r\n for (const [key] of shapeCache) {\r\n if (key === pathKey || key.startsWith(pathKey + '.')) {\r\n shapeCache.delete(key);\r\n }\r\n }\r\n stateVersion++;\r\n };\r\n\r\n function rebuildStateShape({\r\n currentState,\r\n path = [],\r\n meta,\r\n componentId,\r\n }: {\r\n currentState: T;\r\n path: string[];\r\n componentId: string;\r\n meta?: MetaData;\r\n }): any {\r\n const cacheKey = path.map(String).join('.');\r\n const stateKeyPathKey = [stateKey, ...path].join('.');\r\n\r\n currentState = getGlobalStore\r\n .getState()\r\n .getShadowValue(stateKeyPathKey, meta?.validIds);\r\n\r\n type CallableStateObject<T> = {\r\n (): T;\r\n } & {\r\n [key: string]: any;\r\n };\r\n\r\n const baseFunction = function () {\r\n return getGlobalStore().getShadowValue(stateKey, path);\r\n } as unknown as CallableStateObject<T>;\r\n\r\n // We attach baseObj properties *inside* the get trap now to avoid recursion\r\n // This is a placeholder for the proxy.\r\n\r\n const handler = {\r\n apply(target: any, thisArg: any, args: any[]) {\r\n //return getGlobalStore().getShadowValue(stateKey, path);\r\n },\r\n\r\n get(target: any, prop: string) {\r\n // V--------- THE CRUCIAL FIX IS HERE ---------V\r\n // This handles requests for internal functions on the proxy,\r\n // returning the function itself instead of treating it as state.\r\n if (prop === '_rebuildStateShape') {\r\n return rebuildStateShape;\r\n }\r\n const baseObjProps = Object.getOwnPropertyNames(baseObj);\r\n if (baseObjProps.includes(prop) && path.length === 0) {\r\n return (baseObj as any)[prop];\r\n }\r\n // ^--------- END OF FIX ---------^\r\n\r\n if (prop === 'getDifferences') {\r\n return () => {\r\n const shadowMeta = getGlobalStore\r\n .getState()\r\n .getShadowMetadata(stateKey, []);\r\n const currentState = getGlobalStore\r\n .getState()\r\n .getShadowValue(stateKey);\r\n\r\n // Use the appropriate base state for comparison\r\n let baseState;\r\n if (\r\n shadowMeta?.stateSource === 'server' &&\r\n shadowMeta.baseServerState\r\n ) {\r\n baseState = shadowMeta.baseServerState;\r\n } else {\r\n baseState =\r\n getGlobalStore.getState().initialStateGlobal[stateKey];\r\n }\r\n\r\n return getDifferences(currentState, baseState);\r\n };\r\n }\r\n if (prop === 'sync' && path.length === 0) {\r\n return async function () {\r\n const options = getGlobalStore\r\n .getState()\r\n .getInitialOptions(stateKey);\r\n const sync = options?.sync;\r\n\r\n if (!sync) {\r\n console.error(`No mutation defined for state key \"${stateKey}\"`);\r\n return { success: false, error: `No mutation defined` };\r\n }\r\n\r\n const state = getGlobalStore\r\n .getState()\r\n .getShadowValue(stateKey, []);\r\n const validationKey = options?.validation?.key;\r\n\r\n try {\r\n const response = await sync.action(state);\r\n if (\r\n response &&\r\n !response.success &&\r\n response.errors &&\r\n validationKey\r\n ) {\r\n getGlobalStore.getState().removeValidationError(validationKey);\r\n response.errors.forEach((error) => {\r\n const errorPath = [validationKey, ...error.path].join('.');\r\n getGlobalStore\r\n .getState()\r\n .addValidationError(errorPath, error.message);\r\n });\r\n notifyComponents(stateKey);\r\n }\r\n\r\n if (response?.success) {\r\n // Mark as synced and not dirty\r\n const shadowMeta = getGlobalStore\r\n .getState()\r\n .getShadowMetadata(stateKey, []);\r\n getGlobalStore.getState().setShadowMetadata(stateKey, [], {\r\n ...shadowMeta,\r\n isDirty: false,\r\n lastServerSync: Date.now(),\r\n stateSource: 'server',\r\n baseServerState: state, // Update base server state\r\n });\r\n\r\n if (sync.onSuccess) {\r\n sync.onSuccess(response.data);\r\n }\r\n } else if (!response?.success && sync.onError)\r\n sync.onError(response.error);\r\n\r\n return response;\r\n } catch (error) {\r\n if (sync.onError) sync.onError(error);\r\n return { success: false, error };\r\n }\r\n };\r\n }\r\n // Fixed getStatus function in createProxyHandler\r\n if (prop === '_status' || prop === 'getStatus') {\r\n const getStatusFunc = () => {\r\n const shadowMeta = getGlobalStore\r\n .getState()\r\n .getShadowMetadata(stateKey, path);\r\n const value = getGlobalStore\r\n .getState()\r\n .getShadowValue(stateKeyPathKey);\r\n\r\n // Priority 1: Explicitly dirty items\r\n if (shadowMeta?.isDirty === true) {\r\n return 'dirty';\r\n }\r\n\r\n // Priority 2: Explicitly synced items (isDirty: false)\r\n if (shadowMeta?.isDirty === false) {\r\n return 'synced';\r\n }\r\n\r\n // Priority 3: Items from server source (should be synced even without explicit isDirty flag)\r\n if (shadowMeta?.stateSource === 'server') {\r\n return 'synced';\r\n }\r\n\r\n // Priority 4: Items restored from localStorage\r\n if (shadowMeta?.stateSource === 'localStorage') {\r\n return 'restored';\r\n }\r\n\r\n // Priority 5: Items from default/initial state\r\n if (shadowMeta?.stateSource === 'default') {\r\n return 'fresh';\r\n }\r\n\r\n // Priority 6: Check if this is part of initial server load\r\n // Look up the tree to see if parent has server source\r\n const rootMeta = getGlobalStore\r\n .getState()\r\n .getShadowMetadata(stateKey, []);\r\n if (rootMeta?.stateSource === 'server' && !shadowMeta?.isDirty) {\r\n return 'synced';\r\n }\r\n\r\n // Priority 7: If no metadata exists but value exists, it's probably fresh\r\n if (value !== undefined && !shadowMeta) {\r\n return 'fresh';\r\n }\r\n\r\n // Fallback\r\n return 'unknown';\r\n };\r\n\r\n return prop === '_status' ? getStatusFunc() : getStatusFunc;\r\n }\r\n if (prop === 'removeStorage') {\r\n return () => {\r\n const initialState =\r\n getGlobalStore.getState().initialStateGlobal[stateKey];\r\n const initalOptionsGet = getInitialOptions(stateKey as string);\r\n const localKey = isFunction(initalOptionsGet?.localStorage?.key)\r\n ? initalOptionsGet.localStorage.key(initialState)\r\n : initalOptionsGet?.localStorage?.key;\r\n const storageKey = `${sessionId}-${stateKey}-${localKey}`;\r\n if (storageKey) localStorage.removeItem(storageKey);\r\n };\r\n }\r\n if (prop === 'showValidationErrors') {\r\n return () => {\r\n const meta = getGlobalStore\r\n .getState()\r\n .getShadowMetadata(stateKey, path);\r\n if (\r\n meta?.validation?.status === 'VALIDATION_FAILED' &&\r\n meta.validation.message\r\n ) {\r\n return [meta.validation.message];\r\n }\r\n return [];\r\n };\r\n }\r\n if (Array.isArray(currentState)) {\r\n if (prop === 'getSelected') {\r\n return () => {\r\n const fullKey = stateKey + '.' + path.join('.');\r\n registerComponentDependency(stateKey, componentId, [\r\n ...path,\r\n 'getSelected',\r\n ]);\r\n\r\n const selectedIndicesMap =\r\n getGlobalStore.getState().selectedIndicesMap;\r\n if (!selectedIndicesMap || !selectedIndicesMap.has(fullKey)) {\r\n return undefined;\r\n }\r\n\r\n const selectedItemKey = selectedIndicesMap.get(fullKey)!;\r\n if (meta?.validIds) {\r\n if (!meta.validIds.includes(selectedItemKey)) {\r\n return undefined;\r\n }\r\n }\r\n\r\n const value = getGlobalStore\r\n .getState()\r\n .getShadowValue(selectedItemKey);\r\n\r\n if (!value) {\r\n return undefined;\r\n }\r\n\r\n return rebuildStateShape({\r\n currentState: value,\r\n path: selectedItemKey.split('.').slice(1) as string[],\r\n componentId: componentId!,\r\n });\r\n };\r\n }\r\n if (prop === 'getSelectedIndex') {\r\n return () => {\r\n const selectedIndex = getGlobalStore\r\n .getState()\r\n .getSelectedIndex(\r\n stateKey + '.' + path.join('.'),\r\n meta?.validIds\r\n );\r\n\r\n return selectedIndex;\r\n };\r\n }\r\n if (prop === 'clearSelected') {\r\n notifySelectionComponents(stateKey, path);\r\n return () => {\r\n getGlobalStore.getState().clearSelectedIndex({\r\n arrayKey: stateKey + '.' + path.join('.'),\r\n });\r\n };\r\n }\r\n\r\n if (prop === 'useVirtualView') {\r\n return (\r\n options: VirtualViewOptions\r\n ): VirtualStateObjectResult<any[]> => {\r\n const {\r\n itemHeight = 50,\r\n overscan = 6,\r\n stickToBottom = false,\r\n scrollStickTolerance = 75,\r\n } = options;\r\n\r\n const containerRef = useRef<HTMLDivElement | null>(null);\r\n const [range, setRange] = useState({\r\n startIndex: 0,\r\n endIndex: 10,\r\n });\r\n const [rerender, forceUpdate] = useState({});\r\n const initialScrollRef = useRef(true);\r\n\r\n // Scroll state management\r\n const scrollStateRef = useRef({\r\n isUserScrolling: false,\r\n lastScrollTop: 0,\r\n scrollUpCount: 0,\r\n isNearBottom: true,\r\n });\r\n\r\n // Measurement cache\r\n const measurementCache = useRef(\r\n new Map<string, { height: number; offset: number }>()\r\n );\r\n\r\n // Separate effect for handling rerender updates\r\n useLayoutEffect(() => {\r\n if (\r\n !stickToBottom ||\r\n !containerRef.current ||\r\n scrollStateRef.current.isUserScrolling\r\n )\r\n return;\r\n\r\n const container = containerRef.current;\r\n container.scrollTo({\r\n top: container.scrollHeight,\r\n behavior: initialScrollRef.current ? 'instant' : 'smooth',\r\n });\r\n }, [rerender, stickToBottom]);\r\n\r\n const arrayKeys =\r\n getGlobalStore.getState().getShadowMetadata(stateKey, path)\r\n ?.arrayKeys || [];\r\n\r\n // Calculate total height and offsets\r\n const { totalHeight, itemOffsets } = useMemo(() => {\r\n let runningOffset = 0;\r\n const offsets = new Map<\r\n string,\r\n { height: number; offset: number }\r\n >();\r\n const allItemKeys =\r\n getGlobalStore.getState().getShadowMetadata(stateKey, path)\r\n ?.arrayKeys || [];\r\n\r\n allItemKeys.forEach((itemKey) => {\r\n const itemPath = itemKey.split('.').slice(1);\r\n const measuredHeight =\r\n getGlobalStore\r\n .getState()\r\n .getShadowMetadata(stateKey, itemPath)?.virtualizer\r\n ?.itemHeight || itemHeight;\r\n\r\n offsets.set(itemKey, {\r\n height: measuredHeight,\r\n offset: runningOffset,\r\n });\r\n\r\n runningOffset += measuredHeight;\r\n });\r\n\r\n measurementCache.current = offsets;\r\n return { totalHeight: runningOffset, itemOffsets: offsets };\r\n }, [arrayKeys.length, itemHeight]);\r\n\r\n // Improved initial positioning effect\r\n useLayoutEffect(() => {\r\n if (\r\n stickToBottom &&\r\n arrayKeys.length > 0 &&\r\n containerRef.current &&\r\n !scrollStateRef.current.isUserScrolling &&\r\n initialScrollRef.current\r\n ) {\r\n const container = containerRef.current;\r\n\r\n // Wait for container to have dimensions\r\n const waitForContainer = () => {\r\n if (container.clientHeight > 0) {\r\n const visibleCount = Math.ceil(\r\n container.clientHeight / itemHeight\r\n );\r\n const endIndex = arrayKeys.length - 1;\r\n const startIndex = Math.max(\r\n 0,\r\n endIndex - visibleCount - overscan\r\n );\r\n\r\n setRange({ startIndex, endIndex });\r\n\r\n // Ensure scroll after range is set\r\n requestAnimationFrame(() => {\r\n scrollToBottom('instant');\r\n initialScrollRef.current = false; // Mark initial scroll as done\r\n });\r\n } else {\r\n // Container not ready, try again\r\n requestAnimationFrame(waitForContainer);\r\n }\r\n };\r\n\r\n waitForContainer();\r\n }\r\n }, [arrayKeys.length, stickToBottom, itemHeight, overscan]);\r\n\r\n // Combined scroll handler\r\n const handleScroll = useCallback(() => {\r\n const container = containerRef.current;\r\n if (!container) return;\r\n\r\n const currentScrollTop = container.scrollTop;\r\n const { scrollHeight, clientHeight } = container;\r\n const scrollState = scrollStateRef.current;\r\n\r\n // Check if user is near bottom\r\n const distanceFromBottom =\r\n scrollHeight - (currentScrollTop + clientHeight);\r\n const wasNearBottom = scrollState.isNearBottom;\r\n scrollState.isNearBottom =\r\n distanceFromBottom <= scrollStickTolerance;\r\n\r\n // Detect scroll direction\r\n if (currentScrollTop < scrollState.lastScrollTop) {\r\n // User scrolled up\r\n scrollState.scrollUpCount++;\r\n\r\n if (scrollState.scrollUpCount > 3 && wasNearBottom) {\r\n // User has deliberately scrolled away from bottom\r\n scrollState.isUserScrolling = true;\r\n console.log('User scrolled away from bottom');\r\n }\r\n } else if (scrollState.isNearBottom) {\r\n // Reset if we're back near the bottom\r\n scrollState.isUserScrolling = false;\r\n scrollState.scrollUpCount = 0;\r\n }\r\n\r\n scrollState.lastScrollTop = currentScrollTop;\r\n\r\n // Update visible range\r\n let newStartIndex = 0;\r\n for (let i = 0; i < arrayKeys.length; i++) {\r\n const itemKey = arrayKeys[i];\r\n const item = measurementCache.current.get(itemKey!);\r\n if (item && item.offset + item.height > currentScrollTop) {\r\n newStartIndex = i;\r\n break;\r\n }\r\n }\r\n\r\n // Only update if range actually changed\r\n if (newStartIndex !== range.startIndex) {\r\n const visibleCount = Math.ceil(clientHeight / itemHeight);\r\n setRange({\r\n startIndex: Math.max(0, newStartIndex - overscan),\r\n endIndex: Math.min(\r\n arrayKeys.length - 1,\r\n newStartIndex + visibleCount + overscan\r\n ),\r\n });\r\n }\r\n }, [\r\n arrayKeys.length,\r\n range.startIndex,\r\n itemHeight,\r\n overscan,\r\n scrollStickTolerance,\r\n ]);\r\n\r\n // Set up scroll listener\r\n useEffect(() => {\r\n const container = containerRef.current;\r\n if (!container || !stickToBottom) return;\r\n\r\n container.addEventListener('scroll', handleScroll, {\r\n passive: true,\r\n });\r\n\r\n return () => {\r\n container.removeEventListener('scroll', handleScroll);\r\n };\r\n }, [handleScroll, stickToBottom]);\r\n const scrollToBottom = useCallback(\r\n (behavior: ScrollBehavior = 'smooth') => {\r\n const container = containerRef.current;\r\n if (!container) return;\r\n\r\n // Reset scroll state\r\n scrollStateRef.current.isUserScrolling = false;\r\n scrollStateRef.current.isNearBottom = true;\r\n scrollStateRef.current.scrollUpCount = 0;\r\n\r\n const performScroll = () => {\r\n // Multiple attempts to ensure we hit the bottom\r\n const attemptScroll = (attempts = 0) => {\r\n if (attempts > 5) return; // Prevent infinite loops\r\n\r\n const currentHeight = container.scrollHeight;\r\n const currentScroll = container.scrollTop;\r\n const clientHeight = container.clientHeight;\r\n\r\n // Check if we're already at the bottom\r\n if (currentScroll + clientHeight >= currentHeight - 1) {\r\n return;\r\n }\r\n\r\n container.scrollTo({\r\n top: currentHeight,\r\n behavior: behavior,\r\n });\r\n\r\n // In slow environments, check again after a short delay\r\n setTimeout(() => {\r\n const newHeight = container.scrollHeight;\r\n const newScroll = container.scrollTop;\r\n\r\n // If height changed or we're not at bottom, try again\r\n if (\r\n newHeight !== currentHeight ||\r\n newScroll + clientHeight < newHeight - 1\r\n ) {\r\n attemptScroll(attempts + 1);\r\n }\r\n }, 50);\r\n };\r\n\r\n attemptScroll();\r\n };\r\n\r\n // Use requestIdleCallback for better performance in slow environments\r\n if ('requestIdleCallback' in window) {\r\n requestIdleCallback(performScroll, { timeout: 100 });\r\n } else {\r\n // Fallback to rAF chain\r\n requestAnimationFrame(() => {\r\n requestAnimationFrame(performScroll);\r\n });\r\n }\r\n },\r\n []\r\n );\r\n // Auto-scroll to bottom when new content arrives\r\n // Consolidated auto-scroll effect with debouncing\r\n useEffect(() => {\r\n if (!stickToBottom || !containerRef.current) return;\r\n\r\n const container = containerRef.current;\r\n const scrollState = scrollStateRef.current;\r\n\r\n // Debounced scroll function\r\n let scrollTimeout: NodeJS.Timeout;\r\n const debouncedScrollToBottom = () => {\r\n clearTimeout(scrollTimeout);\r\n scrollTimeout = setTimeout(() => {\r\n if (\r\n !scrollState.isUserScrolling &&\r\n scrollState.isNearBottom\r\n ) {\r\n scrollToBottom(\r\n initialScrollRef.current ? 'instant' : 'smooth'\r\n );\r\n }\r\n }, 100);\r\n };\r\n\r\n // Single MutationObserver for all DOM changes\r\n const observer = new MutationObserver(() => {\r\n if (!scrollState.isUserScrolling) {\r\n debouncedScrollToBottom();\r\n }\r\n });\r\n\r\n observer.observe(container, {\r\n childList: true,\r\n subtree: true,\r\n attributes: true,\r\n attributeFilter: ['style', 'class'], // More specific than just 'height'\r\n });\r\n\r\n // Handle image loads with event delegation\r\n const handleImageLoad = (e: Event) => {\r\n if (\r\n e.target instanceof HTMLImageElement &&\r\n !scrollState.isUserScrolling\r\n ) {\r\n debouncedScrollToBottom();\r\n }\r\n };\r\n\r\n container.addEventListener('load', handleImageLoad, true);\r\n\r\n // Initial scroll with proper timing\r\n if (initialScrollRef.current) {\r\n // For initial load, wait for next tick to ensure DOM is ready\r\n setTimeout(() => {\r\n scrollToBottom('instant');\r\n }, 0);\r\n } else {\r\n debouncedScrollToBottom();\r\n }\r\n\r\n return () => {\r\n clearTimeout(scrollTimeout);\r\n observer.disconnect();\r\n container.removeEventListener('load', handleImageLoad, true);\r\n };\r\n }, [stickToBottom, arrayKeys.length, scrollToBottom]);\r\n // Create virtual state\r\n const virtualState = useMemo(() => {\r\n const store = getGlobalStore.getState();\r\n const sourceArray = store.getShadowValue(\r\n [stateKey, ...path].join('.')\r\n ) as any[];\r\n const currentKeys =\r\n store.getShadowMetadata(stateKey, path)?.arrayKeys || [];\r\n\r\n const slicedArray = sourceArray.slice(\r\n range.startIndex,\r\n range.endIndex + 1\r\n );\r\n const slicedIds = currentKeys.slice(\r\n range.startIndex,\r\n range.endIndex + 1\r\n );\r\n\r\n return rebuildStateShape({\r\n currentState: slicedArray as any,\r\n path,\r\n componentId: componentId!,\r\n meta: { ...meta, validIds: slicedIds },\r\n });\r\n }, [range.startIndex, range.endIndex, arrayKeys.length]);\r\n\r\n return {\r\n virtualState,\r\n virtualizerProps: {\r\n outer: {\r\n ref: containerRef,\r\n style: {\r\n overflowY: 'auto',\r\n height: '100%',\r\n position: 'relative',\r\n },\r\n },\r\n inner: {\r\n style: {\r\n height: `${totalHeight}px`,\r\n position: 'relative',\r\n },\r\n },\r\n list: {\r\n style: {\r\n transform: `translateY(${\r\n measurementCache.current.get(\r\n arrayKeys[range.startIndex]!\r\n )?.offset || 0\r\n }px)`,\r\n },\r\n },\r\n },\r\n scrollToBottom,\r\n scrollToIndex: (\r\n index: number,\r\n behavior: ScrollBehavior = 'smooth'\r\n ) => {\r\n if (containerRef.current && arrayKeys[index]) {\r\n const offset =\r\n measurementCache.current.get(arrayKeys[index]!)?.offset ||\r\n 0;\r\n containerRef.current.scrollTo({ top: offset, behavior });\r\n }\r\n },\r\n };\r\n };\r\n }\r\n if (prop === 'stateMap') {\r\n return (\r\n callbackfn: (\r\n setter: any,\r\n index: number,\r\n\r\n arraySetter: any\r\n ) => void\r\n ) => {\r\n const [arrayKeys, setArrayKeys] = useState<any>(\r\n meta?.validIds ??\r\n getGlobalStore.getState().getShadowMetadata(stateKey, path)\r\n ?.arrayKeys\r\n );\r\n // getGlobalStore.getState().subscribeToPath(stateKeyPathKey, () => {\r\n // console.log(\r\n // \"stateKeyPathKeyccccccccccccccccc\",\r\n // stateKeyPathKey\r\n // );\r\n // setArrayKeys(\r\n // getGlobalStore.getState().getShadowMetadata(stateKey, path)\r\n // );\r\n // });\r\n\r\n const shadowValue = getGlobalStore\r\n .getState()\r\n .getShadowValue(stateKeyPathKey, meta?.validIds) as any[];\r\n if (!arrayKeys) {\r\n throw new Error('No array keys found for mapping');\r\n }\r\n const arraySetter = rebuildStateShape({\r\n currentState: shadowValue as any,\r\n path,\r\n componentId: componentId!,\r\n meta,\r\n });\r\n\r\n return shadowValue.map((item, index) => {\r\n const itemPath = arrayKeys[index]?.split('.').slice(1);\r\n const itemSetter = rebuildStateShape({\r\n currentState: item,\r\n path: itemPath as any,\r\n componentId: componentId!,\r\n meta,\r\n });\r\n\r\n return callbackfn(\r\n itemSetter,\r\n index,\r\n\r\n arraySetter\r\n );\r\n });\r\n };\r\n }\r\n\r\n if (prop === '$stateMap') {\r\n return (callbackfn: any) =>\r\n createElement(SignalMapRenderer, {\r\n proxy: {\r\n _stateKey: stateKey,\r\n _path: path,\r\n _mapFn: callbackfn,\r\n _meta: meta,\r\n },\r\n rebuildStateShape,\r\n });\r\n } // In createProxyHandler -> handler -> get -> if (Array.isArray(currentState))\r\n\r\n if (prop === 'stateFind') {\r\n return (\r\n callbackfn: (value: any, index: number) => boolean\r\n ): StateObject<any> | undefined => {\r\n // 1. Use the correct set of keys: filtered/sorted from meta, or all keys from the store.\r\n const arrayKeys =\r\n meta?.validIds ??\r\n getGlobalStore.getState().getShadowMetadata(stateKey, path)\r\n ?.arrayKeys;\r\n\r\n if (!arrayKeys) {\r\n return undefined;\r\n }\r\n\r\n // 2. Iterate through the keys, get the value for each, and run the callback.\r\n for (let i = 0; i < arrayKeys.length; i++) {\r\n const itemKey = arrayKeys[i];\r\n if (!itemKey) continue; // Safety check\r\n\r\n const itemValue = getGlobalStore\r\n .getState()\r\n .getShadowValue(itemKey);\r\n\r\n // 3. If the callback returns true, we've found our item.\r\n if (callbackfn(itemValue, i)) {\r\n // Get the item's path relative to the stateKey (e.g., ['messages', '42'] -> ['42'])\r\n const itemPath = itemKey.split('.').slice(1);\r\n\r\n // 4. Rebuild a new, fully functional StateObject for just that item and return it.\r\n return rebuildStateShape({\r\n currentState: itemValue,\r\n path: itemPath,\r\n componentId: componentId,\r\n meta, // Pass along meta for potential further chaining\r\n });\r\n }\r\n }\r\n\r\n // 5. If the loop finishes without finding anything, return undefined.\r\n return undefined;\r\n };\r\n }\r\n if (prop === 'stateFilter') {\r\n return (callbackfn: (value: any, index: number) => boolean) => {\r\n const arrayKeys =\r\n meta?.validIds ??\r\n getGlobalStore.getState().getShadowMetadata(stateKey, path)\r\n ?.arrayKeys;\r\n\r\n if (!arrayKeys) {\r\n throw new Error('No array keys found for filtering.');\r\n }\r\n\r\n const newValidIds: string[] = [];\r\n const filteredArray = currentState.filter(\r\n (val: any, index: number) => {\r\n const didPass = callbackfn(val, index);\r\n if (didPass) {\r\n newValidIds.push(arrayKeys[index]!);\r\n return true;\r\n }\r\n return false;\r\n }\r\n );\r\n\r\n return rebuildStateShape({\r\n currentState: filteredArray as any,\r\n path,\r\n componentId: componentId!,\r\n meta: {\r\n validIds: newValidIds,\r\n transforms: [\r\n ...(meta?.transforms || []),\r\n {\r\n type: 'filter',\r\n fn: callbackfn,\r\n },\r\n ],\r\n },\r\n });\r\n };\r\n }\r\n if (prop === 'stateSort') {\r\n return (compareFn: (a: any, b: any) => number) => {\r\n const arrayKeys =\r\n meta?.validIds ??\r\n getGlobalStore.getState().getShadowMetadata(stateKey, path)\r\n ?.arrayKeys;\r\n if (!arrayKeys) {\r\n throw new Error('No array keys found for sorting');\r\n }\r\n const itemsWithIds = currentState.map((item, index) => ({\r\n item,\r\n key: arrayKeys[index],\r\n }));\r\n\r\n itemsWithIds\r\n .sort((a, b) => compareFn(a.item, b.item))\r\n .filter(Boolean);\r\n\r\n return rebuildStateShape({\r\n currentState: itemsWithIds.map((i) => i.item) as any,\r\n path,\r\n componentId: componentId!,\r\n meta: {\r\n validIds: itemsWithIds.map((i) => i.key) as string[],\r\n transforms: [\r\n ...(meta?.transforms || []),\r\n { type: 'sort', fn: compareFn },\r\n ],\r\n },\r\n });\r\n };\r\n }\r\n // In createProxyHandler, inside the get trap where you have other array methods:\r\n if (prop === 'stream') {\r\n return function <U = InferArrayElement<T>, R = U>(\r\n options: StreamOptions<U, R> = {}\r\n ): StreamHandle<U> {\r\n const {\r\n bufferSize = 100,\r\n flushInterval = 100,\r\n bufferStrategy = 'accumulate',\r\n store,\r\n onFlush,\r\n } = options;\r\n\r\n let buffer: U[] = [];\r\n let isPaused = false;\r\n let flushTimer: NodeJS.Timeout | null = null;\r\n\r\n const addToBuffer = (item: U) => {\r\n if (isPaused) return;\r\n\r\n if (\r\n bufferStrategy === 'sliding' &&\r\n buffer.length >= bufferSize\r\n ) {\r\n buffer.shift();\r\n } else if (\r\n bufferStrategy === 'dropping' &&\r\n buffer.length >= bufferSize\r\n ) {\r\n return;\r\n }\r\n\r\n buffer.push(item);\r\n\r\n if (buffer.length >= bufferSize) {\r\n flushBuffer();\r\n }\r\n };\r\n\r\n const flushBuffer = () => {\r\n if (buffer.length === 0) return;\r\n\r\n const toFlush = [...buffer];\r\n buffer = [];\r\n\r\n if (store) {\r\n const result = store(toFlush);\r\n if (result !== undefined) {\r\n const items = Array.isArray(result) ? result : [result];\r\n items.forEach((item) => {\r\n effectiveSetState(item as any, path, {\r\n updateType: 'insert',\r\n });\r\n });\r\n }\r\n } else {\r\n toFlush.forEach((item) => {\r\n effectiveSetState(item as any, path, {\r\n updateType: 'insert',\r\n });\r\n });\r\n }\r\n\r\n onFlush?.(toFlush);\r\n };\r\n\r\n if (flushInterval > 0) {\r\n flushTimer = setInterval(flushBuffer, flushInterval);\r\n }\r\n\r\n const streamId = uuidv4();\r\n const currentMeta =\r\n getGlobalStore.getState().getShadowMetadata(stateKey, path) ||\r\n {};\r\n const streams = currentMeta.streams || new Map();\r\n streams.set(streamId, { buffer, flushTimer });\r\n\r\n getGlobalStore.getState().setShadowMetadata(stateKey, path, {\r\n ...currentMeta,\r\n streams,\r\n });\r\n\r\n return {\r\n write: (data: U) => addToBuffer(data),\r\n writeMany: (data: U[]) => data.forEach(addToBuffer),\r\n flush: () => flushBuffer(),\r\n pause: () => {\r\n isPaused = true;\r\n },\r\n resume: () => {\r\n isPaused = false;\r\n if (buffer.length > 0) flushBuffer();\r\n },\r\n close: () => {\r\n flushBuffer();\r\n if (flushTimer) clearInterval(flushTimer);\r\n\r\n const meta = getGlobalStore\r\n .getState()\r\n .getShadowMetadata(stateKey, path);\r\n if (meta?.streams) {\r\n meta.streams.delete(streamId);\r\n }\r\n },\r\n };\r\n };\r\n }\r\n\r\n if (prop === 'stateList') {\r\n return (\r\n callbackfn: (\r\n setter: any,\r\n index: number,\r\n arraySetter: any\r\n ) => ReactNode\r\n ) => {\r\n const StateListWrapper = () => {\r\n const componentIdsRef = useRef<Map<string, string>>(new Map());\r\n\r\n const cacheKey =\r\n meta?.transforms && meta.transforms.length > 0\r\n ? `${componentId}-${hashTransforms(meta.transforms)}`\r\n : `${componentId}-base`;\r\n\r\n const [updateTrigger, forceUpdate] = useState({});\r\n\r\n const { validIds, arrayValues } = useMemo(() => {\r\n const cached = getGlobalStore\r\n .getState()\r\n .getShadowMetadata(stateKey, path)\r\n ?.transformCaches?.get(cacheKey);\r\n\r\n let freshValidIds: string[];\r\n\r\n if (cached && cached.validIds) {\r\n freshValidIds = cached.validIds;\r\n } else {\r\n freshValidIds = applyTransforms(\r\n stateKey,\r\n path,\r\n meta?.transforms\r\n );\r\n\r\n getGlobalStore\r\n .getState()\r\n .setTransformCache(stateKey, path, cacheKey, {\r\n validIds: freshValidIds,\r\n computedAt: Date.now(),\r\n transforms: meta?.transforms || [],\r\n });\r\n }\r\n\r\n const freshValues = getGlobalStore\r\n .getState()\r\n .getShadowValue(stateKeyPathKey, freshValidIds);\r\n\r\n return {\r\n validIds: freshValidIds,\r\n arrayValues: freshValues || [],\r\n };\r\n }, [cacheKey, updateTrigger]);\r\n\r\n useEffect(() => {\r\n const unsubscribe = getGlobalStore\r\n .getState()\r\n .subscribeToPath(stateKeyPathKey, (e) => {\r\n // A data change has occurred for the source array.\r\n\r\n if (e.type === 'GET_SELECTED') {\r\n return;\r\n }\r\n const shadowMeta = getGlobalStore\r\n .getState()\r\n .getShadowMetadata(stateKey, path);\r\n\r\n const caches = shadowMeta?.transformCaches;\r\n if (caches) {\r\n // Iterate over ALL keys in the cache map.\r\n for (const key of caches.keys()) {\r\n // If the key belongs to this component instance, delete it.\r\n // This purges caches for 'sort by name', 'sort by score', etc.\r\n if (key.startsWith(componentId)) {\r\n caches.delete(key);\r\n }\r\n }\r\n }\r\n\r\n if (\r\n e.type === 'INSERT' ||\r\n e.type === 'REMOVE' ||\r\n e.type === 'CLEAR_SELECTION'\r\n ) {\r\n forceUpdate({});\r\n }\r\n });\r\n\r\n return () => {\r\n unsubscribe();\r\n };\r\n\r\n // This effect's logic now depends on the componentId to perform the purge.\r\n }, [componentId, stateKeyPathKey]);\r\n\r\n if (!Array.isArray(arrayValues)) {\r\n return null;\r\n }\r\n\r\n const arraySetter = rebuildStateShape({\r\n currentState: arrayValues as any,\r\n path,\r\n componentId: componentId!,\r\n meta: {\r\n ...meta,\r\n validIds: validIds,\r\n },\r\n });\r\n\r\n return (\r\n <>\r\n {arrayValues.map((item, localIndex) => {\r\n const itemKey = validIds[localIndex];\r\n\r\n if (!itemKey) {\r\n return null;\r\n }\r\n\r\n let itemComponentId =\r\n componentIdsRef.current.get(itemKey);\r\n if (!itemComponentId) {\r\n itemComponentId = uuidv4();\r\n componentIdsRef.current.set(itemKey, itemComponentId);\r\n }\r\n\r\n const itemPath = itemKey.split('.').slice(1);\r\n\r\n return createElement(MemoizedCogsItemWrapper, {\r\n key: itemKey,\r\n stateKey,\r\n itemComponentId,\r\n itemPath,\r\n localIndex,\r\n arraySetter,\r\n rebuildStateShape,\r\n renderFn: callbackfn,\r\n });\r\n })}\r\n </>\r\n );\r\n };\r\n\r\n return <StateListWrapper />;\r\n };\r\n }\r\n if (prop === 'stateFlattenOn') {\r\n return (fieldName: string) => {\r\n const arrayToMap = currentState as any[];\r\n shapeCache.clear();\r\n stateVersion++;\r\n const flattenedResults = arrayToMap.flatMap(\r\n (val: any) => val[fieldName] ?? []\r\n );\r\n return rebuildStateShape({\r\n currentState: flattenedResults as any,\r\n path: [...path, '[*]', fieldName],\r\n componentId: componentId!,\r\n meta,\r\n });\r\n };\r\n }\r\n if (prop === 'index') {\r\n return (index: number) => {\r\n const arrayKeys = getGlobalStore\r\n .getState()\r\n .getShadowMetadata(stateKey, path)\r\n ?.arrayKeys?.filter(\r\n (key) =>\r\n !meta?.validIds ||\r\n (meta?.validIds && meta?.validIds?.includes(key))\r\n );\r\n const itemId = arrayKeys?.[index];\r\n if (!itemId) return undefined;\r\n const value = getGlobalStore\r\n .getState()\r\n .getShadowValue(itemId, meta?.validIds);\r\n const state = rebuildStateShape({\r\n currentState: value,\r\n path: itemId.split('.').slice(1) as string[],\r\n componentId: componentId!,\r\n meta,\r\n });\r\n return state;\r\n };\r\n }\r\n if (prop === 'last') {\r\n return () => {\r\n const currentArray = getGlobalStore\r\n .getState()\r\n .getShadowValue(stateKey, path) as any[];\r\n if (currentArray.length === 0) return undefined;\r\n const lastIndex = currentArray.length - 1;\r\n const lastValue = currentArray[lastIndex];\r\n const newPath = [...path, lastIndex.toString()];\r\n return rebuildStateShape({\r\n currentState: lastValue,\r\n path: newPath,\r\n componentId: componentId!,\r\n meta,\r\n });\r\n };\r\n }\r\n if (prop === 'insert') {\r\n return (\r\n payload: InsertParams<InferArrayElement<T>>,\r\n index?: number\r\n ) => {\r\n effectiveSetState(payload as any, path, { updateType: 'insert' });\r\n return rebuildStateShape({\r\n currentState: getGlobalStore\r\n .getState()\r\n .getShadowValue(stateKey, path),\r\n path,\r\n componentId: componentId!,\r\n meta,\r\n });\r\n };\r\n }\r\n if (prop === 'uniqueInsert') {\r\n return (\r\n payload: UpdateArg<T>,\r\n fields?: (keyof InferArrayElement<T>)[],\r\n onMatch?: (existingItem: any) => any\r\n ) => {\r\n const currentArray = getGlobalStore\r\n .getState()\r\n .getShadowValue(stateKey, path) as any[];\r\n const newValue = isFunction<T>(payload)\r\n ? payload(currentArray as any)\r\n : (payload as any);\r\n\r\n let matchedItem: any = null;\r\n const isUnique = !currentArray.some((item) => {\r\n const isMatch = fields\r\n ? fields.every((field) =>\r\n isDeepEqual(item[field], newValue[field])\r\n )\r\n : isDeepEqual(item, newValue);\r\n if (isMatch) matchedItem = item;\r\n return isMatch;\r\n });\r\n\r\n if (isUnique) {\r\n invalidateCachePath(path);\r\n effectiveSetState(newValue, path, { updateType: 'insert' });\r\n } else if (onMatch && matchedItem) {\r\n const updatedItem = onMatch(matchedItem);\r\n const updatedArray = currentArray.map((item) =>\r\n isDeepEqual(item, matchedItem) ? updatedItem : item\r\n );\r\n invalidateCachePath(path);\r\n effectiveSetState(updatedArray as any, path, {\r\n updateType: 'update',\r\n });\r\n }\r\n };\r\n }\r\n\r\n if (prop === 'cut') {\r\n return (index?: number, options?: { waitForSync?: boolean }) => {\r\n const validKeys =\r\n meta?.validIds ??\r\n getGlobalStore.getState().getShadowMetadata(stateKey, path)\r\n ?.arrayKeys;\r\n\r\n if (!validKeys || validKeys.length === 0) return;\r\n\r\n const indexToCut =\r\n index == -1\r\n ? validKeys.length - 1\r\n : index !== undefined\r\n ? index\r\n : validKeys.length - 1;\r\n\r\n const fullIdToCut = validKeys[indexToCut];\r\n if (!fullIdToCut) return; // Index out of bounds\r\n\r\n const pathForCut = fullIdToCut.split('.').slice(1);\r\n effectiveSetState(currentState, pathForCut, {\r\n updateType: 'cut',\r\n });\r\n };\r\n }\r\n if (prop === 'cutSelected') {\r\n return () => {\r\n const validKeys = applyTransforms(\r\n stateKey,\r\n path,\r\n meta?.transforms\r\n );\r\n\r\n if (!validKeys || validKeys.length === 0) return;\r\n\r\n const indexKeyToCut = getGlobalStore\r\n .getState()\r\n .selectedIndicesMap.get(stateKeyPathKey);\r\n\r\n let indexToCut = validKeys.findIndex(\r\n (key) => key === indexKeyToCut\r\n );\r\n\r\n const pathForCut = validKeys[\r\n indexToCut == -1 ? validKeys.length - 1 : indexToCut\r\n ]\r\n ?.split('.')\r\n .slice(1);\r\n getGlobalStore\r\n .getState()\r\n .clearSelectedIndex({ arrayKey: stateKeyPathKey });\r\n const parentPath = pathForCut?.slice(0, -1)!;\r\n notifySelectionComponents(stateKey, parentPath);\r\n effectiveSetState(currentState, pathForCut!, {\r\n updateType: 'cut',\r\n });\r\n };\r\n }\r\n if (prop === 'cutByValue') {\r\n return (value: string | number | boolean) => {\r\n // Step 1: Get the list of all unique keys for the current view.\r\n const arrayMeta = getGlobalStore\r\n .getState()\r\n .getShadowMetadata(stateKey, path);\r\n const relevantKeys = meta?.validIds ?? arrayMeta?.arrayKeys;\r\n\r\n if (!relevantKeys) return;\r\n\r\n let keyToCut: string | null = null;\r\n\r\n // Step 2: Iterate through the KEYS, get the value for each, and find the match.\r\n for (const key of relevantKeys) {\r\n const itemValue = getGlobalStore.getState().getShadowValue(key);\r\n if (itemValue === value) {\r\n keyToCut = key;\r\n break; // We found the key, no need to search further.\r\n }\r\n }\r\n\r\n // Step 3: If we found a matching key, use it to perform the cut.\r\n if (keyToCut) {\r\n const itemPath = keyToCut.split('.').slice(1);\r\n effectiveSetState(null as any, itemPath, { updateType: 'cut' });\r\n }\r\n };\r\n }\r\n\r\n if (prop === 'toggleByValue') {\r\n return (value: string | number | boolean) => {\r\n // Step 1: Get the list of all unique keys for the current view.\r\n const arrayMeta = getGlobalStore\r\n .getState()\r\n .getShadowMetadata(stateKey, path);\r\n const relevantKeys = meta?.validIds ?? arrayMeta?.arrayKeys;\r\n\r\n if (!relevantKeys) return;\r\n\r\n let keyToCut: string | null = null;\r\n\r\n // Step 2: Iterate through the KEYS to find the one matching the value. This is the robust way.\r\n for (const key of relevantKeys) {\r\n const itemValue = getGlobalStore.getState().getShadowValue(key);\r\n console.log('itemValue sdasdasdasd', itemValue);\r\n if (itemValue === value) {\r\n keyToCut = key;\r\n break; // Found it!\r\n }\r\n }\r\n console.log('itemValue keyToCut', keyToCut);\r\n // Step 3: Act based on whether the key was found.\r\n if (keyToCut) {\r\n // Item exists, so we CUT it using its *actual* key.\r\n const itemPath = keyToCut.split('.').slice(1);\r\n console.log('itemValue keyToCut', keyToCut);\r\n effectiveSetState(value as any, itemPath, {\r\n updateType: 'cut',\r\n });\r\n } else {\r\n // Item does not exist, so we INSERT it.\r\n effectiveSetState(value as any, path, { updateType: 'insert' });\r\n }\r\n };\r\n }\r\n if (prop === 'findWith') {\r\n return (\r\n searchKey: keyof InferArrayElement<T>,\r\n searchValue: any\r\n ) => {\r\n const arrayKeys = getGlobalStore\r\n .getState()\r\n .getShadowMetadata(stateKey, path)?.arrayKeys;\r\n\r\n if (!arrayKeys) {\r\n throw new Error('No array keys found for sorting');\r\n }\r\n\r\n let value = null;\r\n let foundPath: string[] = [];\r\n\r\n for (const fullPath of arrayKeys) {\r\n let shadowValue = getGlobalStore\r\n .getState()\r\n .getShadowValue(fullPath, meta?.validIds);\r\n if (shadowValue && shadowValue[searchKey] === searchValue) {\r\n value = shadowValue;\r\n foundPath = fullPath.split('.').slice(1);\r\n break;\r\n }\r\n }\r\n\r\n return rebuildStateShape({\r\n currentState: value as any,\r\n path: foundPath,\r\n componentId: componentId!,\r\n meta,\r\n });\r\n };\r\n }\r\n }\r\n\r\n if (prop === 'cut') {\r\n let shadowValue = getGlobalStore\r\n .getState()\r\n .getShadowValue(path.join('.'));\r\n\r\n return () => {\r\n effectiveSetState(shadowValue, path, { updateType: 'cut' });\r\n };\r\n }\r\n\r\n if (prop === 'get') {\r\n return () => {\r\n registerComponentDependency(stateKey, componentId, path);\r\n return getGlobalStore\r\n .getState()\r\n .getShadowValue(stateKeyPathKey, meta?.validIds);\r\n };\r\n }\r\n if (prop === 'getState') {\r\n return () => {\r\n return getGlobalStore\r\n .getState()\r\n .getShadowValue(stateKeyPathKey, meta?.validIds);\r\n };\r\n }\r\n\r\n if (prop === '$derive') {\r\n return (fn: any) =>\r\n $cogsSignal({\r\n _stateKey: stateKey,\r\n _path: path,\r\n _effect: fn.toString(),\r\n _meta: meta,\r\n });\r\n }\r\n // in CogsState.ts -> createProxyHandler -> handler -> get\r\n\r\n if (prop === '$get') {\r\n return () =>\r\n $cogsSignal({ _stateKey: stateKey, _path: path, _meta: meta });\r\n }\r\n if (prop === 'lastSynced') {\r\n const syncKey = `${stateKey}:${path.join('.')}`;\r\n return getGlobalStore.getState().getSyncInfo(syncKey);\r\n }\r\n if (prop == 'getLocalStorage') {\r\n return (key: string) =>\r\n loadFromLocalStorage(sessionId + '-' + stateKey + '-' + key);\r\n }\r\n\r\n if (prop === 'isSelected') {\r\n const parentPath = [stateKey, ...path].slice(0, -1);\r\n notifySelectionComponents(stateKey, path, undefined);\r\n if (\r\n Array.isArray(\r\n getGlobalStore\r\n .getState()\r\n .getShadowValue(parentPath.join('.'), meta?.validIds)\r\n )\r\n ) {\r\n const itemId = path[path.length - 1];\r\n const fullParentKey = parentPath.join('.');\r\n\r\n const selectedItemKey = getGlobalStore\r\n .getState()\r\n .selectedIndicesMap.get(fullParentKey);\r\n\r\n const fullItemKey = stateKey + '.' + path.join('.');\r\n\r\n return selectedItemKey === fullItemKey;\r\n }\r\n return undefined;\r\n }\r\n\r\n // Then use it in both:\r\n if (prop === 'setSelected') {\r\n return (value: boolean) => {\r\n const parentPath = path.slice(0, -1);\r\n const fullParentKey = stateKey + '.' + parentPath.join('.');\r\n const fullItemKey = stateKey + '.' + path.join('.');\r\n\r\n notifySelectionComponents(stateKey, parentPath, undefined);\r\n\r\n const selectedIndex = getGlobalStore\r\n .getState()\r\n .selectedIndicesMap.get(fullParentKey);\r\n\r\n if (value) {\r\n getGlobalStore\r\n .getState()\r\n .setSelectedIndex(fullParentKey, fullItemKey);\r\n }\r\n };\r\n }\r\n\r\n if (prop === 'toggleSelected') {\r\n return () => {\r\n const parentPath = path.slice(0, -1);\r\n const fullParentKey = stateKey + '.' + parentPath.join('.');\r\n const fullItemKey = stateKey + '.' + path.join('.');\r\n\r\n const currentSelected = getGlobalStore\r\n .getState()\r\n .selectedIndicesMap.get(fullParentKey);\r\n\r\n if (currentSelected === fullItemKey) {\r\n getGlobalStore\r\n .getState()\r\n .clearSelectedIndex({ arrayKey: fullParentKey });\r\n } else {\r\n getGlobalStore\r\n .getState()\r\n .setSelectedIndex(fullParentKey, fullItemKey);\r\n }\r\n };\r\n }\r\n if (prop === '_componentId') {\r\n return componentId;\r\n }\r\n if (path.length == 0) {\r\n if (prop === 'addValidation') {\r\n return (errors: ValidationError[]) => {\r\n const init = getGlobalStore\r\n .getState()\r\n .getInitialOptions(stateKey)?.validation;\r\n if (!init?.key) throw new Error('Validation key not found');\r\n removeValidationError(init.key);\r\n errors.forEach((error) => {\r\n const fullErrorPath = [init.key, ...error.path].join('.');\r\n addValidationError(fullErrorPath, error.message);\r\n });\r\n notifyComponents(stateKey);\r\n };\r\n }\r\n if (prop === 'applyJsonPatch') {\r\n return (patches: Operation[]) => {\r\n const store = getGlobalStore.getState();\r\n const rootMeta = store.getShadowMetadata(stateKey, []);\r\n if (!rootMeta?.components) return;\r\n\r\n const convertPath = (jsonPath: string): string[] => {\r\n if (!jsonPath || jsonPath === '/') return [];\r\n return jsonPath\r\n .split('/')\r\n .slice(1)\r\n .map((p) => p.replace(/~1/g, '/').replace(/~0/g, '~'));\r\n };\r\n\r\n const notifiedComponents = new Set<string>();\r\n\r\n for (const patch of patches) {\r\n const relativePath = convertPath(patch.path);\r\n\r\n switch (patch.op) {\r\n case 'add':\r\n case 'replace': {\r\n const { value } = patch as {\r\n op: 'add' | 'replace';\r\n path: string;\r\n value: any;\r\n };\r\n store.updateShadowAtPath(stateKey, relativePath, value);\r\n store.markAsDirty(stateKey, relativePath, { bubble: true });\r\n\r\n // Bubble up - notify components at this path and all parent paths\r\n let currentPath = [...relativePath];\r\n while (true) {\r\n const pathMeta = store.getShadowMetadata(\r\n stateKey,\r\n currentPath\r\n );\r\n console.log('pathMeta', pathMeta);\r\n if (pathMeta?.pathComponents) {\r\n pathMeta.pathComponents.forEach((componentId) => {\r\n if (!notifiedComponents.has(componentId)) {\r\n const component =\r\n rootMeta.components?.get(componentId);\r\n if (component) {\r\n component.forceUpdate();\r\n notifiedComponents.add(componentId);\r\n }\r\n }\r\n });\r\n }\r\n\r\n if (currentPath.length === 0) break;\r\n currentPath.pop(); // Go up one level\r\n }\r\n break;\r\n }\r\n case 'remove': {\r\n const parentPath = relativePath.slice(0, -1);\r\n store.removeShadowArrayElement(stateKey, relativePath);\r\n store.markAsDirty(stateKey, parentPath, { bubble: true });\r\n\r\n // Bubble up from parent path\r\n let currentPath = [...parentPath];\r\n while (true) {\r\n const pathMeta = store.getShadowMetadata(\r\n stateKey,\r\n currentPath\r\n );\r\n if (pathMeta?.pathComponents) {\r\n pathMeta.pathComponents.forEach((componentId) => {\r\n if (!notifiedComponents.has(componentId)) {\r\n const component =\r\n rootMeta.components?.get(componentId);\r\n if (component) {\r\n component.forceUpdate();\r\n notifiedComponents.add(componentId);\r\n }\r\n }\r\n });\r\n }\r\n\r\n if (currentPath.length === 0) break;\r\n currentPath.pop();\r\n }\r\n break;\r\n }\r\n }\r\n }\r\n };\r\n }\r\n if (prop === 'validateZodSchema') {\r\n return () => {\r\n const init = getGlobalStore\r\n .getState()\r\n .getInitialOptions(stateKey)?.validation;\r\n\r\n // UPDATED: Select v4 schema, with a fallback to v3\r\n const zodSchema = init?.zodSchemaV4 || init?.zodSchemaV3;\r\n\r\n if (!zodSchema || !init?.key) {\r\n throw new Error(\r\n 'Zod schema (v3 or v4) or validation key not found'\r\n );\r\n }\r\n\r\n removeValidationError(init.key);\r\n const thisObject = getGlobalStore\r\n .getState()\r\n .getShadowValue(stateKey);\r\n\r\n // Use the selected schema for parsing\r\n const result = zodSchema.safeParse(thisObject);\r\n\r\n if (!result.success) {\r\n // This logic already handles both v3 and v4 error types correctly\r\n if ('issues' in result.error) {\r\n // Zod v4 error\r\n result.error.issues.forEach((error) => {\r\n const fullErrorPath = [init.key, ...error.path].join('.');\r\n addValidationError(fullErrorPath, error.message);\r\n });\r\n } else {\r\n // Zod v3 error\r\n (result.error as any).errors.forEach((error: any) => {\r\n const fullErrorPath = [init.key, ...error.path].join('.');\r\n addValidationError(fullErrorPath, error.message);\r\n });\r\n }\r\n\r\n notifyComponents(stateKey);\r\n return false;\r\n }\r\n return true;\r\n };\r\n }\r\n\r\n if (prop === 'getComponents')\r\n return () =>\r\n getGlobalStore.getState().getShadowMetadata(stateKey, [])\r\n ?.components;\r\n if (prop === 'getAllFormRefs')\r\n return () =>\r\n formRefStore.getState().getFormRefsByStateKey(stateKey);\r\n }\r\n if (prop === 'getFormRef') {\r\n return () =>\r\n formRefStore.getState().getFormRef(stateKey + '.' + path.join('.'));\r\n }\r\n if (prop === 'validationWrapper') {\r\n return ({\r\n children,\r\n hideMessage,\r\n }: {\r\n children: React.ReactNode;\r\n hideMessage?: boolean;\r\n }) => (\r\n <ValidationWrapper\r\n formOpts={\r\n hideMessage ? { validation: { message: '' } } : undefined\r\n }\r\n path={path}\r\n stateKey={stateKey}\r\n >\r\n {children}\r\n </ValidationWrapper>\r\n );\r\n }\r\n if (prop === '_stateKey') return stateKey;\r\n if (prop === '_path') return path;\r\n if (prop === 'update') {\r\n return (payload: UpdateArg<T>) => {\r\n // Step 1: This is the same. It performs the data update.\r\n effectiveSetState(payload as any, path, { updateType: 'update' });\r\n\r\n return {\r\n /**\r\n * Marks this specific item, which was just updated, as 'synced' (not dirty).\r\n */\r\n synced: () => {\r\n // This function \"remembers\" the path of the item that was just updated.\r\n const shadowMeta = getGlobalStore\r\n .getState()\r\n .getShadowMetadata(stateKey, path);\r\n\r\n // It updates ONLY the metadata for that specific item.\r\n getGlobalStore.getState().setShadowMetadata(stateKey, path, {\r\n ...shadowMeta,\r\n isDirty: false, // EXPLICITLY set to false, not just undefined\r\n stateSource: 'server', // Mark as coming from server\r\n lastServerSync: Date.now(), // Add timestamp\r\n });\r\n\r\n // Force a re-render for components watching this path\r\n const fullPath = [stateKey, ...path].join('.');\r\n getGlobalStore.getState().notifyPathSubscribers(fullPath, {\r\n type: 'SYNC_STATUS_CHANGE',\r\n isDirty: false,\r\n });\r\n },\r\n };\r\n };\r\n }\r\n\r\n if (prop === 'toggle') {\r\n const currentValueAtPath = getGlobalStore\r\n .getState()\r\n .getShadowValue([stateKey, ...path].join('.'));\r\n\r\n console.log('currentValueAtPath', currentValueAtPath);\r\n if (typeof currentState != 'boolean') {\r\n throw new Error('toggle() can only be used on boolean values');\r\n }\r\n return () => {\r\n effectiveSetState(!currentValueAtPath as any, path, {\r\n updateType: 'update',\r\n });\r\n };\r\n }\r\n if (prop === 'formElement') {\r\n return (child: FormControl<T>, formOpts?: FormOptsType) => {\r\n return (\r\n <FormElementWrapper\r\n stateKey={stateKey}\r\n path={path}\r\n rebuildStateShape={rebuildStateShape}\r\n setState={effectiveSetState}\r\n formOpts={formOpts}\r\n renderFn={child as any}\r\n />\r\n );\r\n };\r\n }\r\n const nextPath = [...path, prop];\r\n const nextValue = getGlobalStore\r\n .getState()\r\n .getShadowValue(stateKey, nextPath);\r\n return rebuildStateShape({\r\n currentState: nextValue,\r\n path: nextPath,\r\n componentId: componentId!,\r\n meta,\r\n });\r\n },\r\n };\r\n\r\n const proxyInstance = new Proxy(baseFunction, handler);\r\n shapeCache.set(cacheKey, {\r\n proxy: proxyInstance,\r\n stateVersion: stateVersion,\r\n });\r\n return proxyInstance;\r\n }\r\n\r\n const baseObj = {\r\n removeValidation: (obj?: { validationKey?: string }) => {\r\n if (obj?.validationKey) {\r\n removeValidationError(obj.validationKey);\r\n }\r\n },\r\n revertToInitialState: (obj?: { validationKey?: string }) => {\r\n const init = getGlobalStore\r\n .getState()\r\n .getInitialOptions(stateKey)?.validation;\r\n if (init?.key) {\r\n removeValidationError(init.key);\r\n }\r\n\r\n if (obj?.validationKey) {\r\n removeValidationError(obj.validationKey);\r\n }\r\n\r\n const shadowMeta = getGlobalStore\r\n .getState()\r\n .getShadowMetadata(stateKey, []);\r\n let revertState;\r\n\r\n if (shadowMeta?.stateSource === 'server' && shadowMeta.baseServerState) {\r\n // Revert to last known server state\r\n revertState = shadowMeta.baseServerState;\r\n } else {\r\n // Revert to initial/default state\r\n revertState = getGlobalStore.getState().initialStateGlobal[stateKey];\r\n }\r\n const initialState =\r\n getGlobalStore.getState().initialStateGlobal[stateKey];\r\n\r\n getGlobalStore.getState().clearSelectedIndexesForState(stateKey);\r\n shapeCache.clear();\r\n stateVersion++;\r\n getGlobalStore.getState().initializeShadowState(stateKey, initialState);\r\n const newProxy = rebuildStateShape({\r\n currentState: initialState,\r\n path: [],\r\n componentId: componentId!,\r\n });\r\n const initalOptionsGet = getInitialOptions(stateKey as string);\r\n const localKey = isFunction(initalOptionsGet?.localStorage?.key)\r\n ? initalOptionsGet?.localStorage?.key(initialState)\r\n : initalOptionsGet?.localStorage?.key;\r\n\r\n const storageKey = `${sessionId}-${stateKey}-${localKey}`;\r\n\r\n if (storageKey) {\r\n localStorage.removeItem(storageKey);\r\n }\r\n\r\n const stateEntry = getGlobalStore\r\n .getState()\r\n .getShadowMetadata(stateKey, []);\r\n if (stateEntry) {\r\n stateEntry?.components?.forEach((component) => {\r\n component.forceUpdate();\r\n });\r\n }\r\n\r\n return initialState;\r\n },\r\n updateInitialState: (newState: T) => {\r\n shapeCache.clear();\r\n stateVersion++;\r\n\r\n const newUpdaterState = createProxyHandler(\r\n stateKey,\r\n effectiveSetState,\r\n componentId,\r\n sessionId\r\n );\r\n const initialState =\r\n getGlobalStore.getState().initialStateGlobal[stateKey];\r\n const initalOptionsGet = getInitialOptions(stateKey as string);\r\n const localKey = isFunction(initalOptionsGet?.localStorage?.key)\r\n ? initalOptionsGet?.localStorage?.key(initialState)\r\n : initalOptionsGet?.localStorage?.key;\r\n\r\n const storageKey = `${sessionId}-${stateKey}-${localKey}`;\r\n\r\n if (localStorage.getItem(storageKey)) {\r\n localStorage.removeItem(storageKey);\r\n }\r\n startTransition(() => {\r\n updateInitialStateGlobal(stateKey, newState);\r\n getGlobalStore.getState().initializeShadowState(stateKey, newState);\r\n\r\n const stateEntry = getGlobalStore\r\n .getState()\r\n .getShadowMetadata(stateKey, []);\r\n\r\n if (stateEntry) {\r\n stateEntry?.components?.forEach((component) => {\r\n component.forceUpdate();\r\n });\r\n }\r\n });\r\n\r\n return {\r\n fetchId: (field: keyof T) => (newUpdaterState.get() as any)[field],\r\n };\r\n },\r\n };\r\n const returnShape = rebuildStateShape({\r\n currentState: getGlobalStore.getState().getShadowValue(stateKey, []),\r\n componentId,\r\n path: [],\r\n });\r\n\r\n return returnShape;\r\n}\r\n\r\nexport function $cogsSignal(proxy: {\r\n _path: string[];\r\n _stateKey: string;\r\n _effect?: string;\r\n\r\n _meta?: MetaData;\r\n}) {\r\n return createElement(SignalRenderer, { proxy });\r\n}\r\n\r\nfunction SignalMapRenderer({\r\n proxy,\r\n rebuildStateShape,\r\n}: {\r\n proxy: {\r\n _stateKey: string;\r\n _path: string[];\r\n _meta?: MetaData;\r\n _mapFn: (\r\n setter: any,\r\n index: number,\r\n\r\n arraySetter: any\r\n ) => ReactNode;\r\n };\r\n rebuildStateShape: (stuff: {\r\n currentState: any;\r\n path: string[];\r\n componentId: string;\r\n meta?: MetaData;\r\n }) => any;\r\n}): JSX.Element | null {\r\n const containerRef = useRef<HTMLDivElement>(null);\r\n const instanceIdRef = useRef<string>(`map-${crypto.randomUUID()}`);\r\n const isSetupRef = useRef(false);\r\n const rootsMapRef = useRef<Map<string, any>>(new Map());\r\n\r\n // Setup effect - store the map function in shadow metadata\r\n useEffect(() => {\r\n const container = containerRef.current;\r\n if (!container || isSetupRef.current) return;\r\n\r\n const timeoutId = setTimeout(() => {\r\n // Store map wrapper in metadata\r\n const currentMeta =\r\n getGlobalStore\r\n .getState()\r\n .getShadowMetadata(proxy._stateKey, proxy._path) || {};\r\n\r\n const mapWrappers = currentMeta.mapWrappers || [];\r\n mapWrappers.push({\r\n instanceId: instanceIdRef.current,\r\n mapFn: proxy._mapFn,\r\n containerRef: container,\r\n rebuildStateShape: rebuildStateShape,\r\n path: proxy._path,\r\n componentId: instanceIdRef.current,\r\n meta: proxy._meta,\r\n });\r\n\r\n getGlobalStore\r\n .getState()\r\n .setShadowMetadata(proxy._stateKey, proxy._path, {\r\n ...currentMeta,\r\n mapWrappers,\r\n });\r\n\r\n isSetupRef.current = true;\r\n\r\n // Initial render\r\n renderInitialItems();\r\n }, 0);\r\n\r\n // Cleanup\r\n return () => {\r\n clearTimeout(timeoutId);\r\n if (instanceIdRef.current) {\r\n const currentMeta =\r\n getGlobalStore\r\n .getState()\r\n .getShadowMetadata(proxy._stateKey, proxy._path) || {};\r\n if (currentMeta.mapWrappers) {\r\n currentMeta.mapWrappers = currentMeta.mapWrappers.filter(\r\n (w) => w.instanceId !== instanceIdRef.current\r\n );\r\n getGlobalStore\r\n .getState()\r\n .setShadowMetadata(proxy._stateKey, proxy._path, currentMeta);\r\n }\r\n }\r\n rootsMapRef.current.forEach((root) => root.unmount());\r\n };\r\n }, []);\r\n\r\n const renderInitialItems = () => {\r\n const container = containerRef.current;\r\n if (!container) return;\r\n\r\n const value = getGlobalStore\r\n .getState()\r\n .getShadowValue(\r\n [proxy._stateKey, ...proxy._path].join('.'),\r\n proxy._meta?.validIds\r\n ) as any[];\r\n\r\n if (!Array.isArray(value)) return;\r\n\r\n // --- BUG FIX IS HERE ---\r\n // Prioritize the filtered IDs from the meta object, just like the regular `stateMap`.\r\n // This ensures the keys match the filtered data.\r\n const arrayKeys =\r\n proxy._meta?.validIds ??\r\n getGlobalStore.getState().getShadowMetadata(proxy._stateKey, proxy._path)\r\n ?.arrayKeys ??\r\n [];\r\n // --- END OF FIX ---\r\n\r\n const arraySetter = rebuildStateShape({\r\n currentState: value,\r\n path: proxy._path,\r\n componentId: instanceIdRef.current,\r\n meta: proxy._meta,\r\n });\r\n\r\n value.forEach((item, index) => {\r\n const itemKey = arrayKeys[index]!; // Now this will be the correct key for the filtered item\r\n if (!itemKey) return; // Safeguard if there's a mismatch\r\n\r\n const itemComponentId = uuidv4();\r\n const itemElement = document.createElement('div');\r\n\r\n itemElement.setAttribute('data-item-path', itemKey);\r\n container.appendChild(itemElement);\r\n\r\n const root = createRoot(itemElement);\r\n rootsMapRef.current.set(itemKey, root);\r\n\r\n const itemPath = itemKey.split('.').slice(1) as string[];\r\n\r\n // Render CogsItemWrapper instead of direct render\r\n root.render(\r\n createElement(MemoizedCogsItemWrapper, {\r\n stateKey: proxy._stateKey,\r\n itemComponentId: itemComponentId,\r\n itemPath: itemPath,\r\n localIndex: index,\r\n arraySetter: arraySetter,\r\n rebuildStateShape: rebuildStateShape,\r\n renderFn: proxy._mapFn,\r\n })\r\n );\r\n });\r\n };\r\n\r\n return <div ref={containerRef} data-map-container={instanceIdRef.current} />;\r\n}\r\n\r\nfunction SignalRenderer({\r\n proxy,\r\n}: {\r\n proxy: {\r\n _path: string[];\r\n _stateKey: string;\r\n _effect?: string;\r\n _meta?: MetaData;\r\n };\r\n}) {\r\n const elementRef = useRef<HTMLSpanElement>(null);\r\n const instanceIdRef = useRef<string | null>(null);\r\n const isSetupRef = useRef(false);\r\n const signalId = `${proxy._stateKey}-${proxy._path.join('.')}`;\r\n const value = getGlobalStore\r\n .getState()\r\n .getShadowValue(\r\n [proxy._stateKey, ...proxy._path].join('.'),\r\n proxy._meta?.validIds\r\n );\r\n\r\n // Setup effect - runs only once\r\n useEffect(() => {\r\n const element = elementRef.current;\r\n if (!element || isSetupRef.current) return;\r\n\r\n const timeoutId = setTimeout(() => {\r\n if (!element.parentElement) {\r\n console.warn('Parent element not found for signal', signalId);\r\n return;\r\n }\r\n\r\n const parentElement = element.parentElement;\r\n const childNodes = Array.from(parentElement.childNodes);\r\n const position = childNodes.indexOf(element);\r\n\r\n let parentId = parentElement.getAttribute('data-parent-id');\r\n if (!parentId) {\r\n parentId = `parent-${crypto.randomUUID()}`;\r\n parentElement.setAttribute('data-parent-id', parentId);\r\n }\r\n\r\n instanceIdRef.current = `instance-${crypto.randomUUID()}`;\r\n\r\n // Store signal info in shadow metadata\r\n const currentMeta =\r\n getGlobalStore\r\n .getState()\r\n .getShadowMetadata(proxy._stateKey, proxy._path) || {};\r\n const signals = currentMeta.signals || [];\r\n signals.push({\r\n instanceId: instanceIdRef.current,\r\n parentId,\r\n position,\r\n effect: proxy._effect,\r\n });\r\n\r\n getGlobalStore\r\n .getState()\r\n .setShadowMetadata(proxy._stateKey, proxy._path, {\r\n ...currentMeta,\r\n signals,\r\n });\r\n\r\n let displayValue = value;\r\n if (proxy._effect) {\r\n try {\r\n displayValue = new Function(\r\n 'state',\r\n `return (${proxy._effect})(state)`\r\n )(value);\r\n } catch (err) {\r\n console.error('Error evaluating effect function:', err);\r\n }\r\n }\r\n\r\n if (displayValue !== null && typeof displayValue === 'object') {\r\n displayValue = JSON.stringify(displayValue);\r\n }\r\n const textNode = document.createTextNode(String(displayValue ?? ''));\r\n element.replaceWith(textNode);\r\n isSetupRef.current = true;\r\n }, 0);\r\n\r\n return () => {\r\n clearTimeout(timeoutId);\r\n if (instanceIdRef.current) {\r\n const currentMeta =\r\n getGlobalStore\r\n .getState()\r\n .getShadowMetadata(proxy._stateKey, proxy._path) || {};\r\n if (currentMeta.signals) {\r\n currentMeta.signals = currentMeta.signals.filter(\r\n (s) => s.instanceId !== instanceIdRef.current\r\n );\r\n getGlobalStore\r\n .getState()\r\n .setShadowMetadata(proxy._stateKey, proxy._path, currentMeta);\r\n }\r\n }\r\n };\r\n }, []);\r\n\r\n return createElement('span', {\r\n ref: elementRef,\r\n style: { display: 'contents' },\r\n 'data-signal-id': signalId,\r\n });\r\n}\r\n\r\nconst MemoizedCogsItemWrapper = memo(\r\n ListItemWrapper,\r\n (prevProps, nextProps) => {\r\n // Re-render if any of these change:\r\n return (\r\n prevProps.itemPath.join('.') === nextProps.itemPath.join('.') &&\r\n prevProps.stateKey === nextProps.stateKey &&\r\n prevProps.itemComponentId === nextProps.itemComponentId &&\r\n prevProps.localIndex === nextProps.localIndex\r\n );\r\n }\r\n);\r\n\r\nconst useImageLoaded = (ref: RefObject<HTMLElement>): boolean => {\r\n const [loaded, setLoaded] = useState(false);\r\n\r\n useLayoutEffect(() => {\r\n if (!ref.current) {\r\n setLoaded(true);\r\n return;\r\n }\r\n\r\n const images = Array.from(ref.current.querySelectorAll('img'));\r\n\r\n // If there are no images, we are \"loaded\" immediately.\r\n if (images.length === 0) {\r\n setLoaded(true);\r\n return;\r\n }\r\n\r\n let loadedCount = 0;\r\n const handleImageLoad = () => {\r\n loadedCount++;\r\n if (loadedCount === images.length) {\r\n setLoaded(true);\r\n }\r\n };\r\n\r\n images.forEach((image) => {\r\n if (image.complete) {\r\n handleImageLoad();\r\n } else {\r\n image.addEventListener('load', handleImageLoad);\r\n image.addEventListener('error', handleImageLoad);\r\n }\r\n });\r\n\r\n return () => {\r\n images.forEach((image) => {\r\n image.removeEventListener('load', handleImageLoad);\r\n image.removeEventListener('error', handleImageLoad);\r\n });\r\n };\r\n }, [ref.current]);\r\n\r\n return loaded;\r\n};\r\n\r\nfunction ListItemWrapper({\r\n stateKey,\r\n itemComponentId,\r\n itemPath,\r\n localIndex,\r\n arraySetter,\r\n rebuildStateShape,\r\n renderFn,\r\n}: {\r\n stateKey: string;\r\n itemComponentId: string;\r\n itemPath: string[];\r\n localIndex: number;\r\n arraySetter: any;\r\n\r\n rebuildStateShape: (options: {\r\n currentState: any;\r\n path: string[];\r\n componentId: string;\r\n meta?: any;\r\n }) => any;\r\n renderFn: (\r\n setter: any,\r\n index: number,\r\n\r\n arraySetter: any\r\n ) => React.ReactNode;\r\n}) {\r\n const [, forceUpdate] = useState({});\r\n const { ref: inViewRef, inView } = useInView();\r\n const elementRef = useRef<HTMLDivElement | null>(null);\r\n\r\n const imagesLoaded = useImageLoaded(elementRef);\r\n const hasReportedInitialHeight = useRef(false);\r\n const fullKey = [stateKey, ...itemPath].join('.');\r\n useRegisterComponent(stateKey, itemComponentId, forceUpdate);\r\n\r\n const setRefs = useCallback(\r\n (element: HTMLDivElement | null) => {\r\n elementRef.current = element;\r\n inViewRef(element); // This is the ref from useInView\r\n },\r\n [inViewRef]\r\n );\r\n\r\n useEffect(() => {\r\n getGlobalStore.getState().subscribeToPath(fullKey, (e) => {\r\n forceUpdate({});\r\n });\r\n }, []);\r\n useEffect(() => {\r\n if (!inView || !imagesLoaded || hasReportedInitialHeight.current) {\r\n return;\r\n }\r\n\r\n const element = elementRef.current;\r\n if (element && element.offsetHeight > 0) {\r\n hasReportedInitialHeight.current = true;\r\n const newHeight = element.offsetHeight;\r\n\r\n getGlobalStore.getState().setShadowMetadata(stateKey, itemPath, {\r\n virtualizer: {\r\n itemHeight: newHeight,\r\n domRef: element,\r\n },\r\n });\r\n\r\n const arrayPath = itemPath.slice(0, -1);\r\n const arrayPathKey = [stateKey, ...arrayPath].join('.');\r\n getGlobalStore.getState().notifyPathSubscribers(arrayPathKey, {\r\n type: 'ITEMHEIGHT',\r\n itemKey: itemPath.join('.'),\r\n\r\n ref: elementRef.current,\r\n });\r\n }\r\n }, [inView, imagesLoaded, stateKey, itemPath]);\r\n\r\n const fullItemPath = [stateKey, ...itemPath].join('.');\r\n const itemValue = getGlobalStore.getState().getShadowValue(fullItemPath);\r\n\r\n if (itemValue === undefined) {\r\n return null;\r\n }\r\n\r\n const itemSetter = rebuildStateShape({\r\n currentState: itemValue,\r\n path: itemPath,\r\n componentId: itemComponentId,\r\n });\r\n const children = renderFn(itemSetter, localIndex, arraySetter);\r\n\r\n return <div ref={setRefs}>{children}</div>;\r\n}\r\n\r\nfunction FormElementWrapper({\r\n stateKey,\r\n path,\r\n rebuildStateShape,\r\n renderFn,\r\n formOpts,\r\n setState,\r\n}: {\r\n stateKey: string;\r\n path: string[];\r\n rebuildStateShape: (options: {\r\n currentState: any;\r\n path: string[];\r\n componentId: string;\r\n meta?: any;\r\n }) => any;\r\n renderFn: (params: FormElementParams<any>) => React.ReactNode;\r\n formOpts?: FormOptsType;\r\n setState: any;\r\n}) {\r\n const [componentId] = useState(() => uuidv4());\r\n const [, forceUpdate] = useState({});\r\n\r\n const stateKeyPathKey = [stateKey, ...path].join('.');\r\n useRegisterComponent(stateKey, componentId, forceUpdate);\r\n const globalStateValue = getGlobalStore\r\n .getState()\r\n .getShadowValue(stateKeyPathKey);\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 useEffect(() => {\r\n if (\r\n !isCurrentlyDebouncing.current &&\r\n !isDeepEqual(globalStateValue, localValue)\r\n ) {\r\n setLocalValue(globalStateValue);\r\n }\r\n }, [globalStateValue]);\r\n\r\n useEffect(() => {\r\n const unsubscribe = getGlobalStore\r\n .getState()\r\n .subscribeToPath(stateKeyPathKey, (newValue) => {\r\n if (!isCurrentlyDebouncing.current && localValue !== newValue) {\r\n forceUpdate({});\r\n }\r\n });\r\n return () => {\r\n unsubscribe();\r\n if (debounceTimeoutRef.current) {\r\n clearTimeout(debounceTimeoutRef.current);\r\n isCurrentlyDebouncing.current = false;\r\n }\r\n };\r\n }, []);\r\n\r\n const debouncedUpdate = useCallback(\r\n (newValue: any) => {\r\n const currentType = typeof globalStateValue;\r\n if (currentType === 'number' && typeof newValue === 'string') {\r\n newValue = newValue === '' ? 0 : Number(newValue);\r\n }\r\n setLocalValue(newValue);\r\n isCurrentlyDebouncing.current = true;\r\n\r\n if (debounceTimeoutRef.current) {\r\n clearTimeout(debounceTimeoutRef.current);\r\n }\r\n\r\n const debounceTime = formOpts?.debounceTime ?? 200;\r\n\r\n debounceTimeoutRef.current = setTimeout(() => {\r\n isCurrentlyDebouncing.current = false;\r\n\r\n // Update state\r\n setState(newValue, path, { updateType: 'update' });\r\n\r\n // Perform LIVE validation (gentle)\r\n const { getInitialOptions, setShadowMetadata, getShadowMetadata } =\r\n getGlobalStore.getState();\r\n const validationOptions = getInitialOptions(stateKey)?.validation;\r\n const zodSchema =\r\n validationOptions?.zodSchemaV4 || validationOptions?.zodSchemaV3;\r\n\r\n if (zodSchema) {\r\n const fullState = getGlobalStore.getState().getShadowValue(stateKey);\r\n const result = zodSchema.safeParse(fullState);\r\n\r\n const currentMeta = getShadowMetadata(stateKey, path) || {};\r\n\r\n if (!result.success) {\r\n const errors =\r\n 'issues' in result.error\r\n ? result.error.issues\r\n : (result.error as any).errors;\r\n const pathErrors = errors.filter(\r\n (error: any) =>\r\n JSON.stringify(error.path) === JSON.stringify(path)\r\n );\r\n\r\n if (pathErrors.length > 0) {\r\n setShadowMetadata(stateKey, path, {\r\n ...currentMeta,\r\n validation: {\r\n status: 'INVALID_LIVE',\r\n message: pathErrors[0]?.message,\r\n validatedValue: newValue,\r\n },\r\n });\r\n } else {\r\n // This field has no errors - clear validation\r\n setShadowMetadata(stateKey, path, {\r\n ...currentMeta,\r\n validation: {\r\n status: 'VALID_LIVE',\r\n validatedValue: newValue,\r\n },\r\n });\r\n }\r\n } else {\r\n // Validation passed - clear any existing errors\r\n setShadowMetadata(stateKey, path, {\r\n ...currentMeta,\r\n validation: {\r\n status: 'VALID_LIVE',\r\n validatedValue: newValue,\r\n },\r\n });\r\n }\r\n }\r\n }, debounceTime);\r\n forceUpdate({});\r\n },\r\n [setState, path, formOpts?.debounceTime, stateKey]\r\n );\r\n\r\n // --- NEW onBlur HANDLER ---\r\n // This replaces the old commented-out method with a modern approach.\r\n const handleBlur = useCallback(async () => {\r\n console.log('handleBlur triggered');\r\n\r\n // Commit any pending changes\r\n if (debounceTimeoutRef.current) {\r\n clearTimeout(debounceTimeoutRef.current);\r\n debounceTimeoutRef.current = null;\r\n isCurrentlyDebouncing.current = false;\r\n setState(localValue, path, { updateType: 'update' });\r\n }\r\n\r\n const { getInitialOptions } = getGlobalStore.getState();\r\n const validationOptions = getInitialOptions(stateKey)?.validation;\r\n const zodSchema =\r\n validationOptions?.zodSchemaV4 || validationOptions?.zodSchemaV3;\r\n\r\n if (!zodSchema) return;\r\n\r\n // Get the full path including stateKey\r\n\r\n // Update validation state to \"validating\"\r\n const currentMeta = getGlobalStore\r\n .getState()\r\n .getShadowMetadata(stateKey, path);\r\n getGlobalStore.getState().setShadowMetadata(stateKey, path, {\r\n ...currentMeta,\r\n validation: {\r\n status: 'DIRTY',\r\n validatedValue: localValue,\r\n },\r\n });\r\n\r\n // Validate full state\r\n const fullState = getGlobalStore.getState().getShadowValue(stateKey);\r\n const result = zodSchema.safeParse(fullState);\r\n console.log('result ', result);\r\n if (!result.success) {\r\n const errors =\r\n 'issues' in result.error\r\n ? result.error.issues\r\n : (result.error as any).errors;\r\n\r\n console.log('All validation errors:', errors);\r\n console.log('Current blur path:', path);\r\n\r\n // Find errors for this specific path\r\n const pathErrors = errors.filter((error: any) => {\r\n console.log('Processing error:', error);\r\n\r\n // For array paths, we need to translate indices to ULIDs\r\n if (path.some((p) => p.startsWith('id:'))) {\r\n console.log('Detected array path with ULID');\r\n\r\n // This is an array item path like [\"id:xyz\", \"name\"]\r\n const parentPath = path[0]!.startsWith('id:')\r\n ? []\r\n : path.slice(0, -1);\r\n\r\n console.log('Parent path:', parentPath);\r\n\r\n const arrayMeta = getGlobalStore\r\n .getState()\r\n .getShadowMetadata(stateKey, parentPath);\r\n\r\n console.log('Array metadata:', arrayMeta);\r\n\r\n if (arrayMeta?.arrayKeys) {\r\n const itemKey = [stateKey, ...path.slice(0, -1)].join('.');\r\n const itemIndex = arrayMeta.arrayKeys.indexOf(itemKey);\r\n\r\n console.log('Item key:', itemKey, 'Index:', itemIndex);\r\n\r\n // Compare with Zod path\r\n const zodPath = [...parentPath, itemIndex, ...path.slice(-1)];\r\n const match =\r\n JSON.stringify(error.path) === JSON.stringify(zodPath);\r\n\r\n console.log('Zod path comparison:', {\r\n zodPath,\r\n errorPath: error.path,\r\n match,\r\n });\r\n return match;\r\n }\r\n }\r\n\r\n const directMatch = JSON.stringify(error.path) === JSON.stringify(path);\r\n console.log('Direct path comparison:', {\r\n errorPath: error.path,\r\n currentPath: path,\r\n match: directMatch,\r\n });\r\n return directMatch;\r\n });\r\n\r\n console.log('Filtered path errors:', pathErrors);\r\n // Update shadow metadata with validation result\r\n getGlobalStore.getState().setShadowMetadata(stateKey, path, {\r\n ...currentMeta,\r\n validation: {\r\n status: 'VALIDATION_FAILED',\r\n message: pathErrors[0]?.message,\r\n validatedValue: localValue,\r\n },\r\n });\r\n } else {\r\n // Validation passed\r\n getGlobalStore.getState().setShadowMetadata(stateKey, path, {\r\n ...currentMeta,\r\n validation: {\r\n status: 'VALID_PENDING_SYNC',\r\n validatedValue: localValue,\r\n },\r\n });\r\n }\r\n forceUpdate({});\r\n }, [stateKey, path, localValue, setState]);\r\n\r\n const baseState = rebuildStateShape({\r\n currentState: globalStateValue,\r\n path: path,\r\n componentId: componentId,\r\n });\r\n\r\n const stateWithInputProps = new Proxy(baseState, {\r\n get(target, prop) {\r\n if (prop === 'inputProps') {\r\n return {\r\n value: localValue ?? '',\r\n onChange: (e: any) => {\r\n debouncedUpdate(e.target.value);\r\n },\r\n // 5. Wire the new onBlur handler to the input props.\r\n onBlur: handleBlur,\r\n ref: formRefStore\r\n .getState()\r\n .getFormRef(stateKey + '.' + path.join('.')),\r\n };\r\n }\r\n\r\n return target[prop];\r\n },\r\n });\r\n\r\n return (\r\n <ValidationWrapper formOpts={formOpts} path={path} stateKey={stateKey}>\r\n {renderFn(stateWithInputProps)}\r\n </ValidationWrapper>\r\n );\r\n}\r\nfunction useRegisterComponent(\r\n stateKey: string,\r\n componentId: string,\r\n forceUpdate: (o: object) => void\r\n) {\r\n const fullComponentId = `${stateKey}////${componentId}`;\r\n\r\n useLayoutEffect(() => {\r\n const { registerComponent, unregisterComponent } =\r\n getGlobalStore.getState();\r\n\r\n // Call the safe, centralized function to register\r\n registerComponent(stateKey, fullComponentId, {\r\n forceUpdate: () => forceUpdate({}),\r\n paths: new Set(),\r\n reactiveType: ['component'],\r\n });\r\n\r\n // The cleanup now calls the safe, centralized unregister function\r\n return () => {\r\n unregisterComponent(stateKey, fullComponentId);\r\n };\r\n }, [stateKey, fullComponentId]); // Dependencies are stable and correct\r\n}\r\n"],"names":["setAndMergeOptions","stateKey","newOptions","getInitialOptions","getGlobalStore","setInitialStateOptions","initialOptions","setOptions","options","initialOptionsPart","initialOptionsPartState","mergedOptions","needToAdd","key","isDeepEqual","addStateOptions","initialState","formElements","validation","createCogsState","opt","newInitialState","statePart","transformStateFunc","existingOptions","existingGlobalOptions","useCogsState","componentId","useState","uuidv4","thiState","partialState","useCogsStateFn","setCogsOptions","loadAndApplyLocalStorage","notifyComponents","createCogsStateFromSync","syncSchema","schemas","entry","getValidationErrors","setStateLog","updateInitialStateGlobal","addValidationError","removeValidationError","saveToLocalStorage","state","thisKey","currentInitialOptions","sessionId","lastSyncedWithServer","isFunction","storageKey","existingLastSynced","loadFromLocalStorage","shadowMeta","data","superJsonResult","superjson","localStorageKey","storedData","error","currentState","useCogsConfig","localkey","localData","stateEntry","updates","component","update","notifyComponent","fullComponentId","markEntireStateAsServerSynced","path","timestamp","store","currentMeta","arrayMeta","itemKey","index","itemPath","itemData","fieldPath","fieldData","stateObject","localStorage","reactiveDeps","reactiveType","defaultState","syncUpdate","dependencies","serverState","reactiveForce","forceUpdate","noStateKey","stateLog","componentUpdatesRef","useRef","componentIdRef","latestInitialOptionsRef","useEffect","syncKey","resolveInitialState","useCallback","overrideOptions","currentOptions","finalDefaultState","localKey","event","serverStateData","mergeConfig","incomingData","keyField","existingIds","item","newUniqueItems","newItemKey","newItemPath","itemValue","fieldKey","meta","existingMeta","resolvedState","source","useLayoutEffect","componentKey","rootMeta","components","fullPath","pathMeta","syncApiRef","effectiveSetState","newStateOrFunction","updateObj","pathKey","nestedShadowValue","payload","newUpdate","parentArrayPath","displayValue","parentId","position","effect","parent","childNodes","finalDisplayValue","err","sourceArrayKeys","newItemValue","fullSourceArray","wrapper","shouldRender","insertPosition","transform","currentValidKeys","applyTransforms","sortTransform","t","allItems","a","b","itemElement","children","root","createRoot","arraySetter","createElement","MemoizedCogsItemWrapper","arrayPath","elementToRemove","newState","notifiedComponents","currentPath","currentPathMeta","isArray","getDifferences","subPathString","subPath","fullSubPath","subPathMeta","parentMeta","parentFullPath","parentValue","reactiveTypes","newDeps","shouldUpdate","prevLogs","logs","aggregatedLogs","log","uniqueKey","existing","updaterFinal","useMemo","createProxyHandler","cogsSyncFn","hashTransforms","transforms","arrayKeys","itemsWithKeys","value","registerComponentDependency","dependencyPath","addPathComponent","getShadowMetadata","notifySelectionComponents","parentPath","currentSelected","arrayKey","selectedItem","shapeCache","stateVersion","invalidateCachePath","rebuildStateShape","cacheKey","stateKeyPathKey","baseFunction","handler","target","thisArg","args","prop","baseObj","baseState","sync","validationKey","response","errorPath","getStatusFunc","initalOptionsGet","fullKey","selectedIndicesMap","selectedItemKey","itemHeight","overscan","stickToBottom","scrollStickTolerance","containerRef","range","setRange","rerender","initialScrollRef","scrollStateRef","measurementCache","container","totalHeight","itemOffsets","runningOffset","offsets","measuredHeight","waitForContainer","visibleCount","endIndex","startIndex","scrollToBottom","handleScroll","currentScrollTop","scrollHeight","clientHeight","scrollState","distanceFromBottom","wasNearBottom","newStartIndex","i","behavior","performScroll","attemptScroll","attempts","currentHeight","currentScroll","newHeight","newScroll","scrollTimeout","debouncedScrollToBottom","observer","handleImageLoad","e","sourceArray","currentKeys","slicedArray","slicedIds","offset","callbackfn","setArrayKeys","shadowValue","itemSetter","SignalMapRenderer","newValidIds","filteredArray","val","compareFn","itemsWithIds","bufferSize","flushInterval","bufferStrategy","onFlush","buffer","isPaused","flushTimer","addToBuffer","flushBuffer","toFlush","result","streamId","streams","componentIdsRef","updateTrigger","validIds","arrayValues","cached","freshValidIds","freshValues","unsubscribe","caches","jsx","Fragment","localIndex","itemComponentId","fieldName","arrayToMap","flattenedResults","itemId","currentArray","lastIndex","lastValue","newPath","fields","onMatch","newValue","matchedItem","isMatch","field","updatedItem","updatedArray","validKeys","indexToCut","fullIdToCut","pathForCut","indexKeyToCut","relevantKeys","keyToCut","searchKey","searchValue","foundPath","fn","$cogsSignal","fullParentKey","fullItemKey","errors","init","fullErrorPath","patches","convertPath","jsonPath","patch","relativePath","zodSchema","thisObject","formRefStore","hideMessage","ValidationWrapper","currentValueAtPath","child","formOpts","FormElementWrapper","nextPath","nextValue","proxyInstance","obj","newUpdaterState","startTransition","proxy","SignalRenderer","instanceIdRef","isSetupRef","rootsMapRef","timeoutId","mapWrappers","renderInitialItems","elementRef","signalId","element","parentElement","signals","textNode","s","memo","ListItemWrapper","prevProps","nextProps","useImageLoaded","ref","loaded","setLoaded","images","loadedCount","image","renderFn","inViewRef","inView","useInView","imagesLoaded","hasReportedInitialHeight","useRegisterComponent","setRefs","arrayPathKey","fullItemPath","setState","globalStateValue","localValue","setLocalValue","isCurrentlyDebouncing","debounceTimeoutRef","debouncedUpdate","debounceTime","setShadowMetadata","validationOptions","fullState","pathErrors","handleBlur","p","itemIndex","zodPath","match","directMatch","stateWithInputProps","registerComponent","unregisterComponent"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"CogsState.jsx","sources":["../src/CogsState.tsx"],"sourcesContent":["'use client';\r\n\r\nimport {\r\n createElement,\r\n memo,\r\n startTransition,\r\n useCallback,\r\n useEffect,\r\n useLayoutEffect,\r\n useMemo,\r\n useRef,\r\n useState,\r\n type CSSProperties,\r\n type ReactNode,\r\n type RefObject,\r\n} from 'react';\r\nimport { createRoot } from 'react-dom/client';\r\nimport {\r\n debounce,\r\n getDifferences,\r\n isArray,\r\n isFunction,\r\n type GenericObject,\r\n} from './utility.js';\r\nimport { ValidationWrapper } from './Functions.js';\r\nimport { isDeepEqual, transformStateFunc } from './utility.js';\r\nimport superjson from 'superjson';\r\nimport { v4 as uuidv4 } from 'uuid';\r\n\r\nimport {\r\n formRefStore,\r\n getGlobalStore,\r\n ValidationStatus,\r\n type ComponentsType,\r\n} from './store.js';\r\nimport { useCogsConfig } from './CogsStateClient.js';\r\nimport { Operation } from 'fast-json-patch';\r\nimport { useInView } from 'react-intersection-observer';\r\nimport * as z3 from 'zod/v3';\r\nimport * as z4 from 'zod/v4';\r\nimport z from 'zod';\r\n\r\ntype Prettify<T> = T extends any ? { [K in keyof T]: T[K] } : never;\r\n\r\nexport type VirtualViewOptions = {\r\n itemHeight?: number;\r\n overscan?: number;\r\n stickToBottom?: boolean;\r\n dependencies?: any[];\r\n scrollStickTolerance?: number;\r\n};\r\n\r\n// The result now returns a real StateObject\r\nexport type VirtualStateObjectResult<T extends any[]> = {\r\n /**\r\n * A new, fully-functional StateObject that represents the virtualized slice.\r\n * You can use `.get()`, `.stateMap()`, `.insert()`, `.cut()` etc. on this object.\r\n */\r\n\r\n virtualState: StateObject<T>;\r\n /**\r\n * Props to be spread onto your DOM elements to enable virtualization.\r\n */\r\n virtualizerProps: {\r\n outer: { ref: RefObject<HTMLDivElement>; style: CSSProperties };\r\n inner: { style: CSSProperties };\r\n list: { style: CSSProperties };\r\n };\r\n scrollToBottom: (behavior?: ScrollBehavior) => void;\r\n scrollToIndex: (index: number, behavior?: ScrollBehavior) => void;\r\n};\r\n\r\nexport type SyncInfo = {\r\n timeStamp: number;\r\n userId: number;\r\n};\r\n\r\nexport type FormElementParams<T> = StateObject<T> & {\r\n inputProps: {\r\n ref?: React.RefObject<any>;\r\n value?: T extends boolean ? never : T;\r\n onChange?: (\r\n event: React.ChangeEvent<HTMLInputElement | HTMLTextAreaElement>\r\n ) => void;\r\n onBlur?: () => void;\r\n };\r\n};\r\n\r\nexport type StateKeys = string;\r\n\r\ntype findWithFuncType<U> = (\r\n thisKey: keyof U,\r\n thisValue: U[keyof U]\r\n) => EndType<U> & StateObject<U>;\r\n\r\ntype CutFunctionType<T> = (\r\n index?: number,\r\n options?: { waitForSync?: boolean }\r\n) => StateObject<T>;\r\n\r\nexport type InferArrayElement<T> = T extends (infer U)[] ? U : never;\r\ntype ArraySpecificPrototypeKeys =\r\n | 'concat'\r\n | 'copyWithin'\r\n | 'fill'\r\n | 'find'\r\n | 'findIndex'\r\n | 'flat'\r\n | 'flatMap'\r\n | 'includes'\r\n | 'indexOf'\r\n | 'join'\r\n | 'keys'\r\n | 'lastIndexOf'\r\n | 'map'\r\n | 'pop'\r\n | 'push'\r\n | 'reduce'\r\n | 'reduceRight'\r\n | 'reverse'\r\n | 'shift'\r\n | 'slice'\r\n | 'some'\r\n | 'sort'\r\n | 'splice'\r\n | 'unshift'\r\n | 'values'\r\n | 'entries'\r\n | 'every'\r\n | 'filter'\r\n | 'forEach'\r\n | 'with';\r\nexport type StreamOptions<T, R = T> = {\r\n bufferSize?: number;\r\n flushInterval?: number;\r\n bufferStrategy?: 'sliding' | 'dropping' | 'accumulate';\r\n store?: (buffer: T[]) => R | R[];\r\n onFlush?: (buffer: T[]) => void;\r\n};\r\n\r\nexport type StreamHandle<T> = {\r\n write: (data: T) => void;\r\n writeMany: (data: T[]) => void;\r\n flush: () => void;\r\n close: () => void;\r\n pause: () => void;\r\n resume: () => void;\r\n};\r\nexport type ArrayEndType<TShape extends unknown> = {\r\n stream: <T = Prettify<InferArrayElement<TShape>>, R = T>(\r\n options?: StreamOptions<T, R>\r\n ) => StreamHandle<T>;\r\n findWith: findWithFuncType<Prettify<InferArrayElement<TShape>>>;\r\n index: (index: number) => StateObject<Prettify<InferArrayElement<TShape>>> & {\r\n insert: InsertTypeObj<Prettify<InferArrayElement<TShape>>>;\r\n cut: CutFunctionType<TShape>;\r\n _index: number;\r\n } & EndType<Prettify<InferArrayElement<TShape>>>;\r\n insert: InsertType<Prettify<InferArrayElement<TShape>>>;\r\n cut: CutFunctionType<TShape>;\r\n cutSelected: () => void;\r\n cutByValue: (value: string | number | boolean) => void;\r\n toggleByValue: (value: string | number | boolean) => void;\r\n stateSort: (\r\n compareFn: (\r\n a: Prettify<InferArrayElement<TShape>>,\r\n b: Prettify<InferArrayElement<TShape>>\r\n ) => number\r\n ) => ArrayEndType<TShape>;\r\n useVirtualView: (\r\n options: VirtualViewOptions\r\n ) => VirtualStateObjectResult<Prettify<InferArrayElement<TShape>>[]>;\r\n\r\n stateList: (\r\n callbackfn: (\r\n setter: StateObject<Prettify<InferArrayElement<TShape>>>,\r\n index: number,\r\n arraySetter: StateObject<TShape>\r\n ) => void\r\n ) => any;\r\n stateMap: <U>(\r\n callbackfn: (\r\n setter: StateObject<Prettify<InferArrayElement<TShape>>>,\r\n index: number,\r\n arraySetter: StateObject<TShape>\r\n ) => U\r\n ) => U[];\r\n $stateMap: (\r\n callbackfn: (\r\n setter: StateObject<Prettify<InferArrayElement<TShape>>>,\r\n index: number,\r\n arraySetter: StateObject<TShape>\r\n ) => void\r\n ) => any;\r\n stateFlattenOn: <K extends keyof Prettify<InferArrayElement<TShape>>>(\r\n field: K\r\n ) => StateObject<InferArrayElement<Prettify<InferArrayElement<TShape>>[K]>[]>;\r\n uniqueInsert: (\r\n payload: InsertParams<Prettify<InferArrayElement<TShape>>>,\r\n fields?: (keyof Prettify<InferArrayElement<TShape>>)[],\r\n onMatch?: (existingItem: any) => any\r\n ) => void;\r\n stateFind: (\r\n callbackfn: (\r\n value: Prettify<InferArrayElement<TShape>>,\r\n index: number\r\n ) => boolean\r\n ) => StateObject<Prettify<InferArrayElement<TShape>>> | undefined;\r\n stateFilter: (\r\n callbackfn: (\r\n value: Prettify<InferArrayElement<TShape>>,\r\n index: number\r\n ) => void\r\n ) => ArrayEndType<TShape>;\r\n getSelected: () =>\r\n | StateObject<Prettify<InferArrayElement<TShape>>>\r\n | undefined;\r\n clearSelected: () => void;\r\n getSelectedIndex: () => number;\r\n last: () => StateObject<Prettify<InferArrayElement<TShape>>> | undefined;\r\n} & EndType<TShape>;\r\n\r\nexport type FormOptsType = {\r\n validation?: {\r\n hideMessage?: boolean;\r\n message?: string;\r\n\r\n props?: GenericObject;\r\n disable?: boolean;\r\n };\r\n\r\n debounceTime?: number;\r\n sync?: {\r\n allowInvalidValues?: boolean; // default: false\r\n };\r\n};\r\n\r\nexport type FormControl<T> = (obj: FormElementParams<T>) => JSX.Element;\r\n\r\nexport type UpdateArg<S> = S | ((prevState: S) => S);\r\nexport type InsertParams<S> =\r\n | S\r\n | ((prevState: { state: S; uuid: string }) => S);\r\nexport type UpdateType<T> = (payload: UpdateArg<T>) => { synced: () => void };\r\n\r\nexport type InsertType<T> = (payload: InsertParams<T>, index?: number) => void;\r\nexport type InsertTypeObj<T> = (payload: InsertParams<T>) => void;\r\nexport type ValidationError = {\r\n path: (string | number)[];\r\n message: string;\r\n};\r\ntype EffectFunction<T, R> = (state: T, deps: any[]) => R;\r\nexport type EndType<T, IsArrayElement = false> = {\r\n addValidation: (errors: ValidationError[]) => void;\r\n applyJsonPatch: (patches: any[]) => void;\r\n update: UpdateType<T>;\r\n _path: string[];\r\n _stateKey: string;\r\n formElement: (control: FormControl<T>, opts?: FormOptsType) => JSX.Element;\r\n get: () => T;\r\n getState: () => T;\r\n $get: () => T;\r\n $derive: <R>(fn: EffectFunction<T, R>) => R;\r\n\r\n _status: 'fresh' | 'dirty' | 'synced' | 'restored' | 'unknown';\r\n getStatus: () => 'fresh' | 'dirty' | 'synced' | 'restored' | 'unknown';\r\n\r\n showValidationErrors: () => string[];\r\n setValidation: (ctx: string) => void;\r\n removeValidation: (ctx: string) => void;\r\n ignoreFields: (fields: string[]) => StateObject<T>;\r\n isSelected: boolean;\r\n setSelected: (value: boolean) => void;\r\n toggleSelected: () => void;\r\n getFormRef: () => React.RefObject<any> | undefined;\r\n removeStorage: () => void;\r\n sync: () => void;\r\n validationWrapper: ({\r\n children,\r\n hideMessage,\r\n }: {\r\n children: React.ReactNode;\r\n hideMessage?: boolean;\r\n }) => JSX.Element;\r\n lastSynced?: SyncInfo;\r\n} & (IsArrayElement extends true ? { cut: () => void } : {});\r\n\r\nexport type StateObject<T> = (T extends any[]\r\n ? ArrayEndType<T>\r\n : T extends Record<string, unknown> | object\r\n ? { [K in keyof T]-?: StateObject<T[K]> }\r\n : T extends string | number | boolean | null\r\n ? EndType<T, true>\r\n : never) &\r\n EndType<T, true> & {\r\n toggle: T extends boolean ? () => void : never;\r\n getAllFormRefs: () => Map<string, React.RefObject<any>>;\r\n _componentId: string | null;\r\n getComponents: () => ComponentsType;\r\n validateZodSchema: () => void;\r\n _initialState: T;\r\n updateInitialState: (newState: T | null) => {\r\n fetchId: (field: keyof T) => string | number;\r\n };\r\n _isLoading: boolean;\r\n _serverState: T;\r\n revertToInitialState: (obj?: { validationKey?: string }) => T;\r\n getDifferences: () => string[];\r\n middleware: (\r\n middles: ({\r\n updateLog,\r\n update,\r\n }: {\r\n updateLog: UpdateTypeDetail[] | undefined;\r\n update: UpdateTypeDetail;\r\n }) => void\r\n ) => void;\r\n\r\n getLocalStorage: (key: string) => LocalStorageData<T> | null;\r\n };\r\n\r\nexport type CogsUpdate<T extends unknown> = UpdateType<T>;\r\ntype EffectiveSetStateArg<\r\n T,\r\n UpdateType extends 'update' | 'insert' | 'cut',\r\n> = UpdateType extends 'insert'\r\n ? T extends any[]\r\n ? InsertParams<InferArrayElement<T>>\r\n : never\r\n : UpdateArg<T>;\r\ntype UpdateOptions = {\r\n updateType: 'insert' | 'cut' | 'update';\r\n\r\n sync?: boolean;\r\n};\r\ntype EffectiveSetState<TStateObject> = (\r\n newStateOrFunction:\r\n | EffectiveSetStateArg<TStateObject, 'update'>\r\n | EffectiveSetStateArg<TStateObject, 'insert'>,\r\n path: string[],\r\n updateObj: UpdateOptions,\r\n validationKey?: string\r\n) => void;\r\n\r\nexport type UpdateTypeDetail = {\r\n timeStamp: number;\r\n stateKey: string;\r\n updateType: 'update' | 'insert' | 'cut';\r\n path: string[];\r\n status: 'new' | 'sent' | 'synced';\r\n oldValue: any;\r\n newValue: any;\r\n userId?: number;\r\n};\r\n\r\nexport type ReactivityUnion = 'none' | 'component' | 'deps' | 'all';\r\nexport type ReactivityType =\r\n | 'none'\r\n | 'component'\r\n | 'deps'\r\n | 'all'\r\n | Array<Prettify<'none' | 'component' | 'deps' | 'all'>>;\r\n\r\n// Define the return type of the sync hook locally\r\ntype SyncApi = {\r\n updateState: (data: { operation: any }) => void;\r\n connected: boolean;\r\n clientId: string | null;\r\n subscribers: string[];\r\n};\r\ntype ValidationOptionsType = {\r\n key?: string;\r\n zodSchemaV3?: z3.ZodType<any, any, any>;\r\n zodSchemaV4?: z4.ZodType<any, any, any>;\r\n\r\n onBlur?: boolean;\r\n};\r\nexport type OptionsType<T extends unknown = unknown, TApiParams = never> = {\r\n log?: boolean;\r\n componentId?: string;\r\n cogsSync?: (stateObject: StateObject<T>) => SyncApi;\r\n validation?: ValidationOptionsType;\r\n\r\n serverState?: {\r\n id?: string | number;\r\n data?: T;\r\n status?: 'pending' | 'error' | 'success' | 'loading';\r\n timestamp?: number;\r\n merge?:\r\n | boolean\r\n | {\r\n strategy: 'append' | 'prepend' | 'diff';\r\n key?: string; // For diff strategy - which field to use as unique identifier\r\n };\r\n };\r\n sync?: {\r\n action: (state: T) => Promise<{\r\n success: boolean;\r\n data?: any;\r\n error?: any;\r\n errors?: Array<{\r\n path: (string | number)[];\r\n message: string;\r\n }>;\r\n }>;\r\n onSuccess?: (data: any) => void;\r\n onError?: (error: any) => void;\r\n };\r\n middleware?: ({\r\n updateLog,\r\n update,\r\n }: {\r\n updateLog: UpdateTypeDetail[] | undefined;\r\n update: UpdateTypeDetail;\r\n }) => void;\r\n\r\n modifyState?: (state: T) => T;\r\n localStorage?: {\r\n key: string | ((state: T) => string);\r\n onChange?: (state: T) => void;\r\n };\r\n formElements?: FormsElementsType<T>;\r\n\r\n reactiveDeps?: (state: T) => any[] | true;\r\n reactiveType?: ReactivityType;\r\n syncUpdate?: Partial<UpdateTypeDetail>;\r\n\r\n defaultState?: T;\r\n apiParams?: TApiParams;\r\n dependencies?: any[];\r\n};\r\n\r\nexport type SyncRenderOptions<T extends unknown = unknown> = {\r\n children: React.ReactNode;\r\n time: number;\r\n data?: T;\r\n key?: string;\r\n};\r\n\r\ntype FormsElementsType<T> = {\r\n validation?: (options: {\r\n children: React.ReactNode;\r\n status: ValidationStatus; // Instead of 'active' boolean\r\n\r\n path: string[];\r\n message?: string;\r\n data?: T;\r\n key?: string;\r\n }) => React.ReactNode;\r\n syncRender?: (options: SyncRenderOptions<T>) => React.ReactNode;\r\n};\r\n\r\nexport type InitialStateInnerType<T extends unknown = unknown> = {\r\n initialState: T;\r\n} & OptionsType<T>;\r\n\r\nexport type InitialStateType<T> = {\r\n [key: string]: InitialStateInnerType<T>;\r\n};\r\n\r\nexport type AllStateTypes<T extends unknown> = Record<string, T>;\r\n\r\nexport type CogsInitialState<T> = {\r\n initialState: T;\r\n formElements?: FormsElementsType<T>;\r\n};\r\n\r\nexport type TransformedStateType<T> = {\r\n [P in keyof T]: T[P] extends CogsInitialState<infer U> ? U : T[P];\r\n};\r\n\r\nfunction setAndMergeOptions(stateKey: string, newOptions: OptionsType<any>) {\r\n const getInitialOptions = getGlobalStore.getState().getInitialOptions;\r\n const setInitialStateOptions =\r\n getGlobalStore.getState().setInitialStateOptions;\r\n\r\n const initialOptions = getInitialOptions(stateKey as string) || {};\r\n\r\n setInitialStateOptions(stateKey as string, {\r\n ...initialOptions,\r\n ...newOptions,\r\n });\r\n}\r\n\r\nfunction setOptions<StateKey, Opt>({\r\n stateKey,\r\n options,\r\n initialOptionsPart,\r\n}: {\r\n stateKey: StateKey;\r\n options?: OptionsType<any>;\r\n initialOptionsPart: Record<string, any>;\r\n}) {\r\n const initialOptions = getInitialOptions(stateKey as string) || {};\r\n const initialOptionsPartState = initialOptionsPart[stateKey as string] || {};\r\n const setInitialStateOptions =\r\n getGlobalStore.getState().setInitialStateOptions;\r\n const mergedOptions = { ...initialOptionsPartState, ...initialOptions };\r\n\r\n let needToAdd = false;\r\n if (options) {\r\n for (const key in options) {\r\n if (!mergedOptions.hasOwnProperty(key)) {\r\n needToAdd = true;\r\n mergedOptions[key] = options[key as keyof typeof options];\r\n } else {\r\n if (\r\n key == 'localStorage' &&\r\n options[key] &&\r\n mergedOptions[key].key !== options[key]?.key\r\n ) {\r\n needToAdd = true;\r\n mergedOptions[key] = options[key];\r\n }\r\n if (\r\n key == 'defaultState' &&\r\n options[key] &&\r\n mergedOptions[key] !== options[key] &&\r\n !isDeepEqual(mergedOptions[key], options[key])\r\n ) {\r\n needToAdd = true;\r\n mergedOptions[key] = options[key];\r\n }\r\n }\r\n }\r\n }\r\n\r\n if (needToAdd) {\r\n setInitialStateOptions(stateKey as string, mergedOptions);\r\n }\r\n}\r\nexport function addStateOptions<T extends unknown>(\r\n initialState: T,\r\n { formElements, validation }: OptionsType<T>\r\n) {\r\n return { initialState: initialState, formElements, validation } as T;\r\n}\r\ntype UseCogsStateHook<\r\n T extends Record<string, any>,\r\n apiParams extends Record<string, any> = never,\r\n> = <StateKey extends keyof TransformedStateType<T>>(\r\n stateKey: StateKey,\r\n options?: Prettify<\r\n OptionsType<TransformedStateType<T>[StateKey]> & { apiParams?: apiParams }\r\n >\r\n) => StateObject<TransformedStateType<T>[StateKey]>;\r\n\r\n// Define the type for the options setter using the Transformed state\r\ntype SetCogsOptionsFunc<T extends Record<string, any>> = <\r\n StateKey extends keyof TransformedStateType<T>,\r\n>(\r\n stateKey: StateKey,\r\n options: OptionsType<TransformedStateType<T>[StateKey]>\r\n) => void;\r\n\r\n// Define the final API object shape\r\ntype CogsApi<\r\n T extends Record<string, any>,\r\n apiParams extends Record<string, any> = never,\r\n> = {\r\n useCogsState: UseCogsStateHook<T, apiParams>;\r\n setCogsOptions: SetCogsOptionsFunc<T>;\r\n};\r\nexport const createCogsState = <State extends Record<StateKeys, unknown>>(\r\n initialState: State,\r\n opt?: {\r\n formElements?: FormsElementsType<State>;\r\n validation?: ValidationOptionsType;\r\n __fromSyncSchema?: boolean;\r\n __syncNotifications?: Record<string, Function>;\r\n __apiParamsMap?: Record<string, any>; // Add this\r\n }\r\n) => {\r\n let newInitialState = initialState;\r\n\r\n const [statePart, initialOptionsPart] =\r\n transformStateFunc<State>(newInitialState);\r\n\r\n // Store notifications if provided\r\n if (opt?.__fromSyncSchema && opt?.__syncNotifications) {\r\n getGlobalStore\r\n .getState()\r\n .setInitialStateOptions('__notifications', opt.__syncNotifications);\r\n }\r\n\r\n // Store apiParams map if provided\r\n if (opt?.__fromSyncSchema && opt?.__apiParamsMap) {\r\n getGlobalStore\r\n .getState()\r\n .setInitialStateOptions('__apiParamsMap', opt.__apiParamsMap);\r\n }\r\n\r\n // ... rest of your existing createCogsState code unchanged ...\r\n\r\n Object.keys(statePart).forEach((key) => {\r\n let existingOptions = initialOptionsPart[key] || {};\r\n\r\n const mergedOptions: any = {\r\n ...existingOptions,\r\n };\r\n\r\n if (opt?.formElements) {\r\n mergedOptions.formElements = {\r\n ...opt.formElements,\r\n ...(existingOptions.formElements || {}),\r\n };\r\n }\r\n\r\n if (opt?.validation) {\r\n mergedOptions.validation = {\r\n ...opt.validation,\r\n ...(existingOptions.validation || {}),\r\n };\r\n\r\n if (opt.validation.key && !existingOptions.validation?.key) {\r\n mergedOptions.validation.key = `${opt.validation.key}.${key}`;\r\n }\r\n }\r\n\r\n if (Object.keys(mergedOptions).length > 0) {\r\n const existingGlobalOptions = getInitialOptions(key);\r\n\r\n if (!existingGlobalOptions) {\r\n getGlobalStore.getState().setInitialStateOptions(key, mergedOptions);\r\n } else {\r\n // Merge with existing global options\r\n getGlobalStore.getState().setInitialStateOptions(key, {\r\n ...existingGlobalOptions,\r\n ...mergedOptions,\r\n });\r\n }\r\n }\r\n });\r\n\r\n Object.keys(statePart).forEach((key) => {\r\n getGlobalStore.getState().initializeShadowState(key, statePart[key]);\r\n });\r\n\r\n type StateKeys = keyof typeof statePart;\r\n\r\n const useCogsState = <StateKey extends StateKeys>(\r\n stateKey: StateKey,\r\n options?: Prettify<OptionsType<(typeof statePart)[StateKey]>>\r\n ) => {\r\n const [componentId] = useState(options?.componentId ?? uuidv4());\r\n const apiParamsSchema = opt?.__apiParamsMap?.[stateKey as string];\r\n\r\n // Merge apiParams into options\r\n const enhancedOptions = {\r\n ...options,\r\n apiParamsSchema, // Add the schema here\r\n } as any;\r\n\r\n setOptions({\r\n stateKey,\r\n options: enhancedOptions,\r\n initialOptionsPart,\r\n });\r\n const thiState =\r\n getGlobalStore.getState().getShadowValue(stateKey as string) ||\r\n statePart[stateKey as string];\r\n const partialState = options?.modifyState\r\n ? options.modifyState(thiState)\r\n : thiState;\r\n\r\n const updater = useCogsStateFn<(typeof statePart)[StateKey]>(partialState, {\r\n stateKey: stateKey as string,\r\n syncUpdate: options?.syncUpdate,\r\n componentId,\r\n localStorage: options?.localStorage,\r\n middleware: options?.middleware,\r\n reactiveType: options?.reactiveType,\r\n reactiveDeps: options?.reactiveDeps,\r\n defaultState: options?.defaultState as any,\r\n dependencies: options?.dependencies,\r\n serverState: options?.serverState,\r\n });\r\n\r\n return updater;\r\n };\r\n\r\n function setCogsOptions<StateKey extends StateKeys>(\r\n stateKey: StateKey,\r\n options: OptionsType<(typeof statePart)[StateKey]>\r\n ) {\r\n setOptions({ stateKey, options, initialOptionsPart });\r\n\r\n if (options.localStorage) {\r\n loadAndApplyLocalStorage(stateKey as string, options);\r\n }\r\n\r\n notifyComponents(stateKey as string);\r\n }\r\n\r\n return { useCogsState, setCogsOptions } as CogsApi<State>;\r\n};\r\n\r\nexport function createCogsStateFromSync<\r\n TSyncSchema extends {\r\n schemas: Record<\r\n string,\r\n {\r\n schemas: { defaultValues: any };\r\n apiParamsSchema?: any; // This contains the zod schema for params\r\n [key: string]: any;\r\n }\r\n >;\r\n notifications: Record<string, any>;\r\n },\r\n>(\r\n syncSchema: TSyncSchema\r\n): CogsApi<\r\n {\r\n [K in keyof TSyncSchema['schemas']]: TSyncSchema['schemas'][K]['schemas']['defaultValues'];\r\n },\r\n {\r\n [K in keyof TSyncSchema['schemas']]: TSyncSchema['schemas'][K]['apiParamsSchema'] extends z.ZodObject<any>\r\n ? z.infer<TSyncSchema['schemas'][K]['apiParamsSchema']>\r\n : never;\r\n }[keyof TSyncSchema['schemas']]\r\n> {\r\n const schemas = syncSchema.schemas;\r\n const initialState: any = {};\r\n const apiParamsMap: any = {};\r\n\r\n // Extract defaultValues AND apiParams from each entry\r\n for (const key in schemas) {\r\n const entry = schemas[key];\r\n initialState[key] = entry?.schemas?.defaultValues || {};\r\n\r\n // Store the apiParamsSchema for each key\r\n if (entry?.apiParamsSchema) {\r\n apiParamsMap[key] = entry.apiParamsSchema;\r\n }\r\n }\r\n\r\n // Pass the sync schema metadata to createCogsState\r\n return createCogsState(initialState, {\r\n __fromSyncSchema: true,\r\n __syncNotifications: syncSchema.notifications,\r\n __apiParamsMap: apiParamsMap, // Pass the apiParams schemas\r\n }) as any;\r\n}\r\n\r\nconst {\r\n getInitialOptions,\r\n getValidationErrors,\r\n setStateLog,\r\n updateInitialStateGlobal,\r\n addValidationError,\r\n removeValidationError,\r\n} = getGlobalStore.getState();\r\nconst saveToLocalStorage = <T,>(\r\n state: T,\r\n thisKey: string,\r\n currentInitialOptions: any,\r\n sessionId?: string,\r\n lastSyncedWithServer?: number\r\n) => {\r\n if (currentInitialOptions?.log) {\r\n console.log(\r\n 'saving to localstorage',\r\n thisKey,\r\n currentInitialOptions.localStorage?.key,\r\n sessionId\r\n );\r\n }\r\n\r\n const key = isFunction(currentInitialOptions?.localStorage?.key)\r\n ? currentInitialOptions.localStorage?.key(state)\r\n : currentInitialOptions?.localStorage?.key;\r\n\r\n if (key && sessionId) {\r\n const storageKey = `${sessionId}-${thisKey}-${key}`;\r\n\r\n // Get existing data to preserve lastSyncedWithServer if not explicitly updating it\r\n let existingLastSynced: number | undefined;\r\n try {\r\n const existing = loadFromLocalStorage(storageKey);\r\n existingLastSynced = existing?.lastSyncedWithServer;\r\n } catch {\r\n // Ignore errors, will use undefined\r\n }\r\n const shadowMeta = getGlobalStore.getState().getShadowMetadata(thisKey, []);\r\n\r\n const data: LocalStorageData<T> = {\r\n state,\r\n lastUpdated: Date.now(),\r\n lastSyncedWithServer: lastSyncedWithServer ?? existingLastSynced,\r\n stateSource: shadowMeta?.stateSource,\r\n baseServerState: shadowMeta?.baseServerState,\r\n };\r\n\r\n // Use SuperJSON serialize to get the json part only\r\n const superJsonResult = superjson.serialize(data);\r\n window.localStorage.setItem(\r\n storageKey,\r\n JSON.stringify(superJsonResult.json)\r\n );\r\n }\r\n};\r\n\r\nconst loadFromLocalStorage = (localStorageKey: string) => {\r\n if (!localStorageKey) return null;\r\n\r\n try {\r\n const storedData = window.localStorage.getItem(localStorageKey);\r\n if (!storedData) return null;\r\n\r\n // Parse the json part back normally\r\n const parsedData = JSON.parse(storedData);\r\n\r\n return parsedData;\r\n } catch (error) {\r\n console.error('Error loading from localStorage:', error);\r\n return null;\r\n }\r\n};\r\nconst loadAndApplyLocalStorage = (stateKey: string, options: any) => {\r\n const currentState = getGlobalStore.getState().getShadowValue(stateKey);\r\n const { sessionId } = useCogsConfig();\r\n const localkey = isFunction(options?.localStorage?.key)\r\n ? options.localStorage.key(currentState)\r\n : options?.localStorage?.key;\r\n\r\n if (localkey && sessionId) {\r\n const localData = loadFromLocalStorage(\r\n `${sessionId}-${stateKey}-${localkey}`\r\n );\r\n\r\n if (\r\n localData &&\r\n localData.lastUpdated > (localData.lastSyncedWithServer || 0)\r\n ) {\r\n notifyComponents(stateKey);\r\n return true;\r\n }\r\n }\r\n return false;\r\n};\r\n\r\ntype LocalStorageData<T> = {\r\n state: T;\r\n lastUpdated: number;\r\n lastSyncedWithServer?: number;\r\n baseServerState?: T; // Keep reference to what server state this is based on\r\n stateSource?: 'default' | 'server' | 'localStorage'; // Track origin\r\n};\r\n\r\nconst notifyComponents = (thisKey: string) => {\r\n const stateEntry = getGlobalStore.getState().getShadowMetadata(thisKey, []);\r\n if (!stateEntry) return;\r\n\r\n // Batch component updates\r\n const updates = new Set<() => void>();\r\n stateEntry?.components?.forEach((component) => {\r\n const reactiveTypes = component\r\n ? Array.isArray(component.reactiveType)\r\n ? component.reactiveType\r\n : [component.reactiveType || 'component']\r\n : null;\r\n if (!reactiveTypes?.includes('none')) {\r\n updates.add(() => component.forceUpdate());\r\n }\r\n });\r\n\r\n // Schedule updates in the next tick to allow batching\r\n queueMicrotask(() => {\r\n updates.forEach((update) => update());\r\n });\r\n};\r\n\r\nexport const notifyComponent = (stateKey: string, componentId: string) => {\r\n const stateEntry = getGlobalStore.getState().getShadowMetadata(stateKey, []);\r\n if (stateEntry) {\r\n const fullComponentId = `${stateKey}////${componentId}`;\r\n const component = stateEntry?.components?.get(fullComponentId);\r\n const reactiveTypes = component\r\n ? Array.isArray(component.reactiveType)\r\n ? component.reactiveType\r\n : [component.reactiveType || 'component']\r\n : null;\r\n\r\n // Skip if reactivity is disabled\r\n if (reactiveTypes?.includes('none')) {\r\n return;\r\n }\r\n\r\n if (component) {\r\n // Force an update to ensure the current value is saved\r\n\r\n component.forceUpdate();\r\n }\r\n }\r\n};\r\nfunction markEntireStateAsServerSynced(\r\n stateKey: string,\r\n path: string[],\r\n data: any,\r\n timestamp: number\r\n) {\r\n const store = getGlobalStore.getState();\r\n\r\n // Mark current path as synced\r\n const currentMeta = store.getShadowMetadata(stateKey, path);\r\n store.setShadowMetadata(stateKey, path, {\r\n ...currentMeta,\r\n isDirty: false,\r\n stateSource: 'server',\r\n lastServerSync: timestamp || Date.now(),\r\n });\r\n\r\n // If it's an array, mark each item as synced\r\n if (Array.isArray(data)) {\r\n const arrayMeta = store.getShadowMetadata(stateKey, path);\r\n if (arrayMeta?.arrayKeys) {\r\n arrayMeta.arrayKeys.forEach((itemKey, index) => {\r\n const itemPath = itemKey.split('.').slice(1);\r\n const itemData = data[index];\r\n if (itemData !== undefined) {\r\n markEntireStateAsServerSynced(\r\n stateKey,\r\n itemPath,\r\n itemData,\r\n timestamp\r\n );\r\n }\r\n });\r\n }\r\n }\r\n // If it's an object, mark each field as synced\r\n else if (data && typeof data === 'object' && data.constructor === Object) {\r\n Object.keys(data).forEach((key) => {\r\n const fieldPath = [...path, key];\r\n const fieldData = data[key];\r\n markEntireStateAsServerSynced(stateKey, fieldPath, fieldData, timestamp);\r\n });\r\n }\r\n}\r\n\r\nconst _notifySubscribedComponents = (\r\n stateKey: string,\r\n path: string[],\r\n updateType: 'update' | 'insert' | 'cut',\r\n oldValue: any,\r\n newValue: any\r\n) => {\r\n const store = getGlobalStore.getState();\r\n const rootMeta = store.getShadowMetadata(stateKey, []);\r\n if (!rootMeta?.components) {\r\n return;\r\n }\r\n\r\n const notifiedComponents = new Set<string>();\r\n const shadowMeta = store.getShadowMetadata(stateKey, path);\r\n\r\n // --- PASS 1: Notify specific subscribers based on update type ---\r\n\r\n if (updateType === 'update') {\r\n if (shadowMeta?.pathComponents) {\r\n shadowMeta.pathComponents.forEach((componentId) => {\r\n if (notifiedComponents.has(componentId)) return;\r\n const component = rootMeta.components?.get(componentId);\r\n if (component) {\r\n const reactiveTypes = Array.isArray(component.reactiveType)\r\n ? component.reactiveType\r\n : [component.reactiveType || 'component'];\r\n if (!reactiveTypes.includes('none')) {\r\n component.forceUpdate();\r\n notifiedComponents.add(componentId);\r\n }\r\n }\r\n });\r\n }\r\n\r\n if (\r\n newValue &&\r\n typeof newValue === 'object' &&\r\n !isArray(newValue) &&\r\n oldValue &&\r\n typeof oldValue === 'object' &&\r\n !isArray(oldValue)\r\n ) {\r\n const changedSubPaths = getDifferences(newValue, oldValue);\r\n changedSubPaths.forEach((subPathString) => {\r\n const subPath = subPathString.split('.');\r\n const fullSubPath = [...path, ...subPath];\r\n const subPathMeta = store.getShadowMetadata(stateKey, fullSubPath);\r\n if (subPathMeta?.pathComponents) {\r\n subPathMeta.pathComponents.forEach((componentId) => {\r\n if (notifiedComponents.has(componentId)) return;\r\n const component = rootMeta.components?.get(componentId);\r\n if (component) {\r\n const reactiveTypes = Array.isArray(component.reactiveType)\r\n ? component.reactiveType\r\n : [component.reactiveType || 'component'];\r\n if (!reactiveTypes.includes('none')) {\r\n component.forceUpdate();\r\n notifiedComponents.add(componentId);\r\n }\r\n }\r\n });\r\n }\r\n });\r\n }\r\n } else if (updateType === 'insert' || updateType === 'cut') {\r\n const parentArrayPath = updateType === 'insert' ? path : path.slice(0, -1);\r\n const parentMeta = store.getShadowMetadata(stateKey, parentArrayPath);\r\n if (parentMeta?.pathComponents) {\r\n parentMeta.pathComponents.forEach((componentId) => {\r\n if (!notifiedComponents.has(componentId)) {\r\n const component = rootMeta.components?.get(componentId);\r\n if (component) {\r\n component.forceUpdate();\r\n notifiedComponents.add(componentId);\r\n }\r\n }\r\n });\r\n }\r\n }\r\n\r\n // --- PASS 2: Notify global subscribers ('all', 'deps') ---\r\n\r\n rootMeta.components.forEach((component, componentId) => {\r\n if (notifiedComponents.has(componentId)) {\r\n return;\r\n }\r\n\r\n const reactiveTypes = Array.isArray(component.reactiveType)\r\n ? component.reactiveType\r\n : [component.reactiveType || 'component'];\r\n\r\n if (reactiveTypes.includes('all')) {\r\n component.forceUpdate();\r\n notifiedComponents.add(componentId);\r\n return;\r\n }\r\n\r\n if (reactiveTypes.includes('deps')) {\r\n if (component.depsFunction) {\r\n const currentState = store.getShadowValue(stateKey);\r\n const newDeps = component.depsFunction(currentState);\r\n let shouldUpdate = false;\r\n if (newDeps === true || !isDeepEqual(component.prevDeps, newDeps)) {\r\n if (Array.isArray(newDeps)) component.prevDeps = newDeps;\r\n shouldUpdate = true;\r\n }\r\n if (shouldUpdate) {\r\n component.forceUpdate();\r\n notifiedComponents.add(componentId);\r\n }\r\n }\r\n }\r\n });\r\n};\r\n\r\nexport function useCogsStateFn<TStateObject extends unknown>(\r\n stateObject: TStateObject,\r\n {\r\n stateKey,\r\n\r\n localStorage,\r\n formElements,\r\n reactiveDeps,\r\n reactiveType,\r\n componentId,\r\n defaultState,\r\n syncUpdate,\r\n dependencies,\r\n serverState,\r\n apiParamsSchema,\r\n }: {\r\n stateKey?: string;\r\n componentId?: string;\r\n defaultState?: TStateObject;\r\n apiParamsSchema?: z.ZodObject<any>; // Add this type\r\n } & OptionsType<TStateObject> = {}\r\n) {\r\n const [reactiveForce, forceUpdate] = useState({}); //this is the key to reactivity\r\n const { sessionId } = useCogsConfig();\r\n\r\n let noStateKey = stateKey ? false : true;\r\n const [thisKey] = useState(stateKey ?? uuidv4());\r\n const stateLog = getGlobalStore.getState().stateLog[thisKey];\r\n const componentUpdatesRef = useRef(new Set<string>());\r\n const componentIdRef = useRef(componentId ?? uuidv4());\r\n const latestInitialOptionsRef = useRef<OptionsType<TStateObject> | null>(\r\n null\r\n );\r\n latestInitialOptionsRef.current = (getInitialOptions(thisKey as string) ??\r\n null) as OptionsType<TStateObject> | null;\r\n\r\n useEffect(() => {\r\n if (syncUpdate && syncUpdate.stateKey === thisKey && syncUpdate.path?.[0]) {\r\n // Update the actual state value\r\n\r\n // Create combined key and update sync info\r\n const syncKey = `${syncUpdate.stateKey}:${syncUpdate.path.join('.')}`;\r\n getGlobalStore.getState().setSyncInfo(syncKey, {\r\n timeStamp: syncUpdate.timeStamp!,\r\n userId: syncUpdate.userId!,\r\n });\r\n }\r\n }, [syncUpdate]);\r\n\r\n const resolveInitialState = useCallback(\r\n (\r\n overrideOptions?: OptionsType<TStateObject>\r\n ): {\r\n value: TStateObject;\r\n source: 'default' | 'server' | 'localStorage';\r\n timestamp: number;\r\n } => {\r\n // If we pass in options, use them. Otherwise, get from the global store.\r\n const optionsToUse = overrideOptions\r\n ? { ...getInitialOptions(thisKey as string), ...overrideOptions }\r\n : getInitialOptions(thisKey as string);\r\n\r\n const currentOptions = optionsToUse;\r\n const finalDefaultState =\r\n currentOptions?.defaultState || defaultState || stateObject;\r\n\r\n // 1. Check server state\r\n const hasValidServerData =\r\n currentOptions?.serverState?.status === 'success' &&\r\n currentOptions?.serverState?.data !== undefined;\r\n\r\n if (hasValidServerData) {\r\n return {\r\n value: currentOptions.serverState!.data! as any,\r\n source: 'server',\r\n timestamp: currentOptions.serverState!.timestamp || Date.now(),\r\n };\r\n }\r\n // 2. Check localStorage\r\n if (currentOptions?.localStorage?.key && sessionId) {\r\n const localKey = isFunction(currentOptions.localStorage.key)\r\n ? currentOptions.localStorage.key(finalDefaultState)\r\n : currentOptions.localStorage.key;\r\n\r\n const localData = loadFromLocalStorage(\r\n `${sessionId}-${thisKey}-${localKey}`\r\n );\r\n\r\n if (\r\n localData &&\r\n localData.lastUpdated > (currentOptions?.serverState?.timestamp || 0)\r\n ) {\r\n return {\r\n value: localData.state,\r\n source: 'localStorage',\r\n timestamp: localData.lastUpdated,\r\n };\r\n }\r\n }\r\n\r\n // 3. Use default state\r\n return {\r\n value: finalDefaultState || (stateObject as any),\r\n source: 'default',\r\n timestamp: Date.now(),\r\n };\r\n },\r\n [thisKey, defaultState, stateObject, sessionId]\r\n );\r\n\r\n // Effect 1: When this component's serverState prop changes, broadcast it\r\n useEffect(() => {\r\n getGlobalStore.getState().setServerStateUpdate(thisKey, serverState);\r\n }, [serverState, thisKey]);\r\n\r\n // Effect 2: Listen for server state updates from ANY component\r\n useEffect(() => {\r\n const unsubscribe = getGlobalStore\r\n .getState()\r\n .subscribeToPath(thisKey, (event) => {\r\n if (event?.type === 'SERVER_STATE_UPDATE') {\r\n const serverStateData = event.serverState;\r\n\r\n if (\r\n serverStateData?.status === 'success' &&\r\n serverStateData.data !== undefined\r\n ) {\r\n const newOptions = { serverState: serverStateData };\r\n setAndMergeOptions(thisKey, newOptions);\r\n\r\n const mergeConfig =\r\n typeof serverStateData.merge === 'object'\r\n ? serverStateData.merge\r\n : serverStateData.merge === true\r\n ? { strategy: 'append' }\r\n : null;\r\n\r\n const currentState = getGlobalStore\r\n .getState()\r\n .getShadowValue(thisKey);\r\n const incomingData = serverStateData.data;\r\n\r\n if (\r\n mergeConfig &&\r\n Array.isArray(currentState) &&\r\n Array.isArray(incomingData)\r\n ) {\r\n const keyField = mergeConfig.key || 'id';\r\n const existingIds = new Set(\r\n currentState.map((item: any) => item[keyField])\r\n );\r\n\r\n const newUniqueItems = incomingData.filter((item: any) => {\r\n return !existingIds.has(item[keyField]);\r\n });\r\n\r\n if (newUniqueItems.length > 0) {\r\n newUniqueItems.forEach((item) => {\r\n getGlobalStore\r\n .getState()\r\n .insertShadowArrayElement(thisKey, [], item);\r\n\r\n // MARK NEW SERVER ITEMS AS SYNCED\r\n const arrayMeta = getGlobalStore\r\n .getState()\r\n .getShadowMetadata(thisKey, []);\r\n\r\n if (arrayMeta?.arrayKeys) {\r\n const newItemKey =\r\n arrayMeta.arrayKeys[arrayMeta.arrayKeys.length - 1];\r\n if (newItemKey) {\r\n const newItemPath = newItemKey.split('.').slice(1);\r\n\r\n // Mark the new server item as synced, not dirty\r\n getGlobalStore\r\n .getState()\r\n .setShadowMetadata(thisKey, newItemPath, {\r\n isDirty: false,\r\n stateSource: 'server',\r\n lastServerSync:\r\n serverStateData.timestamp || Date.now(),\r\n });\r\n\r\n // Also mark all its child fields as synced if it's an object\r\n const itemValue = getGlobalStore\r\n .getState()\r\n .getShadowValue(newItemKey);\r\n if (\r\n itemValue &&\r\n typeof itemValue === 'object' &&\r\n !Array.isArray(itemValue)\r\n ) {\r\n Object.keys(itemValue).forEach((fieldKey) => {\r\n const fieldPath = [...newItemPath, fieldKey];\r\n getGlobalStore\r\n .getState()\r\n .setShadowMetadata(thisKey, fieldPath, {\r\n isDirty: false,\r\n stateSource: 'server',\r\n lastServerSync:\r\n serverStateData.timestamp || Date.now(),\r\n });\r\n });\r\n }\r\n }\r\n }\r\n });\r\n }\r\n } else {\r\n // For replace strategy or initial load\r\n getGlobalStore\r\n .getState()\r\n .initializeShadowState(thisKey, incomingData);\r\n\r\n // Mark the entire state tree as synced from server\r\n markEntireStateAsServerSynced(\r\n thisKey,\r\n [],\r\n incomingData,\r\n serverStateData.timestamp\r\n );\r\n }\r\n\r\n const meta = getGlobalStore\r\n .getState()\r\n .getShadowMetadata(thisKey, []);\r\n getGlobalStore.getState().setShadowMetadata(thisKey, [], {\r\n ...meta,\r\n stateSource: 'server',\r\n lastServerSync: serverStateData.timestamp || Date.now(),\r\n isDirty: false,\r\n });\r\n }\r\n }\r\n });\r\n\r\n return unsubscribe;\r\n }, [thisKey, resolveInitialState]);\r\n\r\n useEffect(() => {\r\n const existingMeta = getGlobalStore\r\n .getState()\r\n .getShadowMetadata(thisKey, []);\r\n if (existingMeta && existingMeta.stateSource) {\r\n return; // Already initialized, bail out.\r\n }\r\n\r\n const options = getInitialOptions(thisKey as string);\r\n\r\n if (options?.defaultState !== undefined || defaultState !== undefined) {\r\n const finalDefaultState = options?.defaultState || defaultState;\r\n\r\n // Only set defaultState if it's not already set\r\n if (!options?.defaultState) {\r\n setAndMergeOptions(thisKey as string, {\r\n defaultState: finalDefaultState,\r\n });\r\n }\r\n\r\n const { value: resolvedState, source, timestamp } = resolveInitialState();\r\n\r\n getGlobalStore.getState().initializeShadowState(thisKey, resolvedState);\r\n\r\n // Set shadow metadata with the correct source info\r\n getGlobalStore.getState().setShadowMetadata(thisKey, [], {\r\n stateSource: source,\r\n lastServerSync: source === 'server' ? timestamp : undefined,\r\n isDirty: false,\r\n baseServerState: source === 'server' ? resolvedState : undefined,\r\n });\r\n\r\n notifyComponents(thisKey);\r\n }\r\n }, [thisKey, ...(dependencies || [])]);\r\n useLayoutEffect(() => {\r\n if (noStateKey) {\r\n setAndMergeOptions(thisKey as string, {\r\n formElements,\r\n defaultState,\r\n localStorage,\r\n middleware: latestInitialOptionsRef.current?.middleware,\r\n });\r\n }\r\n\r\n const componentKey = `${thisKey}////${componentIdRef.current}`;\r\n\r\n // Register component in shadow metadata at root level\r\n const rootMeta = getGlobalStore.getState().getShadowMetadata(thisKey, []);\r\n const components = rootMeta?.components || new Map();\r\n\r\n components.set(componentKey, {\r\n forceUpdate: () => forceUpdate({}),\r\n reactiveType: reactiveType ?? ['component', 'deps'],\r\n paths: new Set(),\r\n depsFunction: reactiveDeps || undefined,\r\n deps: reactiveDeps\r\n ? reactiveDeps(getGlobalStore.getState().getShadowValue(thisKey))\r\n : [],\r\n prevDeps: reactiveDeps // Initialize prevDeps with the same initial value\r\n ? reactiveDeps(getGlobalStore.getState().getShadowValue(thisKey))\r\n : [],\r\n });\r\n\r\n getGlobalStore.getState().setShadowMetadata(thisKey, [], {\r\n ...rootMeta,\r\n components,\r\n });\r\n forceUpdate({});\r\n return () => {\r\n const meta = getGlobalStore.getState().getShadowMetadata(thisKey, []);\r\n const component = meta?.components?.get(componentKey);\r\n\r\n // Remove from each path we registered to\r\n if (component?.paths) {\r\n component.paths.forEach((fullPath) => {\r\n // fullPath is like \"todos.0.name\", need to split and remove stateKey\r\n const pathParts = fullPath.split('.');\r\n const path = pathParts.slice(1); // Remove stateKey part\r\n\r\n const pathMeta = getGlobalStore\r\n .getState()\r\n .getShadowMetadata(thisKey, path);\r\n if (pathMeta?.pathComponents) {\r\n // Optionally clean up empty Sets\r\n\r\n if (pathMeta.pathComponents.size === 0) {\r\n delete pathMeta.pathComponents;\r\n getGlobalStore\r\n .getState()\r\n .setShadowMetadata(thisKey, path, pathMeta);\r\n }\r\n }\r\n });\r\n }\r\n\r\n // Remove from root components\r\n if (meta?.components) {\r\n getGlobalStore.getState().setShadowMetadata(thisKey, [], meta);\r\n }\r\n };\r\n }, []);\r\n\r\n const syncApiRef = useRef<SyncApi | null>(null);\r\n const effectiveSetState = (\r\n newStateOrFunction: UpdateArg<TStateObject> | InsertParams<TStateObject>,\r\n path: string[],\r\n updateObj: UpdateOptions\r\n ) => {\r\n const fullPath = [thisKey, ...path].join('.');\r\n if (Array.isArray(path)) {\r\n const pathKey = `${thisKey}-${path.join('.')}`;\r\n componentUpdatesRef.current.add(pathKey);\r\n }\r\n const store = getGlobalStore.getState();\r\n\r\n // FETCH ONCE at the beginning\r\n const shadowMeta = store.getShadowMetadata(thisKey, path);\r\n const nestedShadowValue = store.getShadowValue(fullPath) as TStateObject;\r\n\r\n const payload = (\r\n updateObj.updateType === 'insert' && isFunction(newStateOrFunction)\r\n ? newStateOrFunction({ state: nestedShadowValue, uuid: uuidv4() })\r\n : isFunction(newStateOrFunction)\r\n ? newStateOrFunction(nestedShadowValue)\r\n : newStateOrFunction\r\n ) as TStateObject;\r\n\r\n const timeStamp = Date.now();\r\n\r\n const newUpdate = {\r\n timeStamp,\r\n stateKey: thisKey,\r\n path,\r\n updateType: updateObj.updateType,\r\n status: 'new' as const,\r\n oldValue: nestedShadowValue,\r\n newValue: payload,\r\n } satisfies UpdateTypeDetail;\r\n\r\n // Perform the update\r\n switch (updateObj.updateType) {\r\n case 'insert': {\r\n store.insertShadowArrayElement(thisKey, path, newUpdate.newValue);\r\n // The array at `path` has been modified. Mark it AND all its parents as dirty.\r\n store.markAsDirty(thisKey, path, { bubble: true });\r\n\r\n // ALSO mark the newly inserted item itself as dirty\r\n // Get the new item's path and mark it as dirty\r\n const arrayMeta = store.getShadowMetadata(thisKey, path);\r\n if (arrayMeta?.arrayKeys) {\r\n const newItemKey =\r\n arrayMeta.arrayKeys[arrayMeta.arrayKeys.length - 1];\r\n if (newItemKey) {\r\n const newItemPath = newItemKey.split('.').slice(1); // Remove stateKey\r\n store.markAsDirty(thisKey, newItemPath, { bubble: false });\r\n }\r\n }\r\n break;\r\n }\r\n case 'cut': {\r\n const parentArrayPath = path.slice(0, -1);\r\n\r\n store.removeShadowArrayElement(thisKey, path);\r\n store.markAsDirty(thisKey, parentArrayPath, { bubble: true });\r\n break;\r\n }\r\n case 'update': {\r\n store.updateShadowAtPath(thisKey, path, newUpdate.newValue);\r\n store.markAsDirty(thisKey, path, { bubble: true });\r\n break;\r\n }\r\n }\r\n const shouldSync = updateObj.sync !== false;\r\n\r\n if (shouldSync && syncApiRef.current && syncApiRef.current.connected) {\r\n syncApiRef.current.updateState({ operation: newUpdate });\r\n }\r\n // Handle signals - reuse shadowMeta from the beginning\r\n if (shadowMeta?.signals && shadowMeta.signals.length > 0) {\r\n // Use updatedShadowValue if we need the new value, otherwise use payload\r\n const displayValue = updateObj.updateType === 'cut' ? null : payload;\r\n\r\n shadowMeta.signals.forEach(({ parentId, position, effect }) => {\r\n const parent = document.querySelector(`[data-parent-id=\"${parentId}\"]`);\r\n if (parent) {\r\n const childNodes = Array.from(parent.childNodes);\r\n if (childNodes[position]) {\r\n let finalDisplayValue = displayValue;\r\n if (effect && displayValue !== null) {\r\n try {\r\n finalDisplayValue = new Function(\r\n 'state',\r\n `return (${effect})(state)`\r\n )(displayValue);\r\n } catch (err) {\r\n console.error('Error evaluating effect function:', err);\r\n }\r\n }\r\n\r\n if (\r\n finalDisplayValue !== null &&\r\n finalDisplayValue !== undefined &&\r\n typeof finalDisplayValue === 'object'\r\n ) {\r\n finalDisplayValue = JSON.stringify(finalDisplayValue) as any;\r\n }\r\n\r\n childNodes[position].textContent = String(finalDisplayValue ?? '');\r\n }\r\n }\r\n });\r\n }\r\n\r\n // Update in effectiveSetState for insert handling:\r\n if (updateObj.updateType === 'insert') {\r\n // Use shadowMeta from beginning if it's an array\r\n if (shadowMeta?.mapWrappers && shadowMeta.mapWrappers.length > 0) {\r\n // Get fresh array keys after insert\r\n const sourceArrayKeys =\r\n store.getShadowMetadata(thisKey, path)?.arrayKeys || [];\r\n const newItemKey = sourceArrayKeys[sourceArrayKeys.length - 1]!;\r\n const newItemValue = store.getShadowValue(newItemKey);\r\n const fullSourceArray = store.getShadowValue(\r\n [thisKey, ...path].join('.')\r\n );\r\n\r\n if (!newItemKey || newItemValue === undefined) return;\r\n\r\n shadowMeta.mapWrappers.forEach((wrapper) => {\r\n let shouldRender = true;\r\n let insertPosition = -1;\r\n\r\n // Check if wrapper has transforms\r\n if (wrapper.meta?.transforms && wrapper.meta.transforms.length > 0) {\r\n // Check if new item passes all filters\r\n for (const transform of wrapper.meta.transforms) {\r\n if (transform.type === 'filter') {\r\n if (!transform.fn(newItemValue, -1)) {\r\n shouldRender = false;\r\n break;\r\n }\r\n }\r\n }\r\n\r\n if (shouldRender) {\r\n // Get current valid keys by applying transforms\r\n const currentValidKeys = applyTransforms(\r\n thisKey,\r\n path,\r\n wrapper.meta.transforms\r\n );\r\n\r\n // Find where to insert based on sort\r\n const sortTransform = wrapper.meta.transforms.find(\r\n (t: any) => t.type === 'sort'\r\n );\r\n if (sortTransform) {\r\n // Add new item to the list and sort to find position\r\n const allItems = currentValidKeys.map((key) => ({\r\n key,\r\n value: store.getShadowValue(key),\r\n }));\r\n\r\n allItems.push({ key: newItemKey, value: newItemValue });\r\n allItems.sort((a, b) => sortTransform.fn(a.value, b.value));\r\n\r\n insertPosition = allItems.findIndex(\r\n (item) => item.key === newItemKey\r\n );\r\n } else {\r\n // No sort, insert at end\r\n insertPosition = currentValidKeys.length;\r\n }\r\n }\r\n } else {\r\n // No transforms, always render at end\r\n shouldRender = true;\r\n insertPosition = sourceArrayKeys.length - 1;\r\n }\r\n\r\n if (!shouldRender) {\r\n return; // Skip this wrapper, item doesn't pass filters\r\n }\r\n\r\n if (wrapper.containerRef && wrapper.containerRef.isConnected) {\r\n const itemElement = document.createElement('div');\r\n itemElement.setAttribute('data-item-path', newItemKey);\r\n\r\n // Insert at correct position\r\n const children = Array.from(wrapper.containerRef.children);\r\n if (insertPosition >= 0 && insertPosition < children.length) {\r\n wrapper.containerRef.insertBefore(\r\n itemElement,\r\n children[insertPosition]!\r\n );\r\n } else {\r\n wrapper.containerRef.appendChild(itemElement);\r\n }\r\n\r\n const root = createRoot(itemElement);\r\n const componentId = uuidv4();\r\n const itemPath = newItemKey.split('.').slice(1);\r\n\r\n const arraySetter = wrapper.rebuildStateShape({\r\n path: wrapper.path,\r\n currentState: fullSourceArray,\r\n componentId: wrapper.componentId,\r\n meta: wrapper.meta,\r\n });\r\n\r\n root.render(\r\n createElement(MemoizedCogsItemWrapper, {\r\n stateKey: thisKey,\r\n itemComponentId: componentId,\r\n itemPath: itemPath,\r\n localIndex: insertPosition,\r\n arraySetter: arraySetter,\r\n rebuildStateShape: wrapper.rebuildStateShape,\r\n renderFn: wrapper.mapFn,\r\n })\r\n );\r\n }\r\n });\r\n }\r\n }\r\n if (updateObj.updateType === 'cut') {\r\n const arrayPath = path.slice(0, -1);\r\n const arrayMeta = store.getShadowMetadata(thisKey, arrayPath);\r\n\r\n if (arrayMeta?.mapWrappers && arrayMeta.mapWrappers.length > 0) {\r\n arrayMeta.mapWrappers.forEach((wrapper) => {\r\n if (wrapper.containerRef && wrapper.containerRef.isConnected) {\r\n const elementToRemove = wrapper.containerRef.querySelector(\r\n `[data-item-path=\"${fullPath}\"]`\r\n );\r\n if (elementToRemove) {\r\n elementToRemove.remove();\r\n }\r\n }\r\n });\r\n }\r\n }\r\n\r\n // Assumes `isDeepEqual` is available in this scope.\r\n // Assumes `isDeepEqual` is available in this scope.\r\n\r\n const newState = getGlobalStore.getState().getShadowValue(thisKey);\r\n const rootMeta = getGlobalStore.getState().getShadowMetadata(thisKey, []);\r\n const notifiedComponents = new Set<string>();\r\n console.log(\r\n 'rootMeta',\r\n thisKey,\r\n getGlobalStore.getState().shadowStateStore\r\n );\r\n if (!rootMeta?.components) {\r\n return newState;\r\n }\r\n\r\n // --- PASS 1: Notify specific subscribers based on update type ---\r\n\r\n if (updateObj.updateType === 'update') {\r\n // --- Bubble-up Notification ---\r\n // When a nested property changes, notify components listening at that exact path,\r\n // and also \"bubble up\" to notify components listening on parent paths.\r\n // e.g., an update to `user.address.street` notifies listeners of `street`, `address`, and `user`.\r\n let currentPath = [...path]; // Create a mutable copy of the path\r\n\r\n while (true) {\r\n const currentPathMeta = store.getShadowMetadata(thisKey, currentPath);\r\n\r\n if (currentPathMeta?.pathComponents) {\r\n currentPathMeta.pathComponents.forEach((componentId) => {\r\n if (notifiedComponents.has(componentId)) {\r\n return; // Avoid sending redundant notifications\r\n }\r\n const component = rootMeta.components?.get(componentId);\r\n if (component) {\r\n const reactiveTypes = Array.isArray(component.reactiveType)\r\n ? component.reactiveType\r\n : [component.reactiveType || 'component'];\r\n\r\n // This notification logic applies to components that depend on object structures.\r\n if (!reactiveTypes.includes('none')) {\r\n component.forceUpdate();\r\n notifiedComponents.add(componentId);\r\n }\r\n }\r\n });\r\n }\r\n\r\n if (currentPath.length === 0) {\r\n break; // We've reached the root, stop bubbling.\r\n }\r\n currentPath.pop(); // Go up one level for the next iteration.\r\n }\r\n\r\n // ADDITIONALLY, if the payload is an object, perform a deep-check and\r\n // notify any components that are subscribed to specific sub-paths that changed.\r\n if (\r\n payload &&\r\n typeof payload === 'object' &&\r\n !isArray(payload) &&\r\n nestedShadowValue &&\r\n typeof nestedShadowValue === 'object' &&\r\n !isArray(nestedShadowValue)\r\n ) {\r\n // Get a list of dot-separated paths that have changed (e.g., ['name', 'address.city'])\r\n const changedSubPaths = getDifferences(payload, nestedShadowValue);\r\n\r\n changedSubPaths.forEach((subPathString) => {\r\n const subPath = subPathString.split('.');\r\n const fullSubPath = [...path, ...subPath];\r\n\r\n // Get the metadata (and subscribers) for this specific nested path\r\n const subPathMeta = store.getShadowMetadata(thisKey, fullSubPath);\r\n if (subPathMeta?.pathComponents) {\r\n subPathMeta.pathComponents.forEach((componentId) => {\r\n // Avoid sending a redundant update\r\n if (notifiedComponents.has(componentId)) {\r\n return;\r\n }\r\n const component = rootMeta.components?.get(componentId);\r\n if (component) {\r\n const reactiveTypes = Array.isArray(component.reactiveType)\r\n ? component.reactiveType\r\n : [component.reactiveType || 'component'];\r\n\r\n if (!reactiveTypes.includes('none')) {\r\n component.forceUpdate();\r\n notifiedComponents.add(componentId);\r\n }\r\n }\r\n });\r\n }\r\n });\r\n }\r\n } else if (\r\n updateObj.updateType === 'insert' ||\r\n updateObj.updateType === 'cut'\r\n ) {\r\n // For array structural changes, notify components listening to the parent array.\r\n const parentArrayPath =\r\n updateObj.updateType === 'insert' ? path : path.slice(0, -1);\r\n\r\n const parentMeta = store.getShadowMetadata(thisKey, parentArrayPath);\r\n\r\n // Handle signal updates for array length, etc.\r\n if (parentMeta?.signals && parentMeta.signals.length > 0) {\r\n const parentFullPath = [thisKey, ...parentArrayPath].join('.');\r\n const parentValue = store.getShadowValue(parentFullPath);\r\n\r\n parentMeta.signals.forEach(({ parentId, position, effect }) => {\r\n const parent = document.querySelector(\r\n `[data-parent-id=\"${parentId}\"]`\r\n );\r\n if (parent) {\r\n const childNodes = Array.from(parent.childNodes);\r\n if (childNodes[position]) {\r\n let displayValue = parentValue;\r\n if (effect) {\r\n try {\r\n displayValue = new Function(\r\n 'state',\r\n `return (${effect})(state)`\r\n )(parentValue);\r\n } catch (err) {\r\n console.error('Error evaluating effect function:', err);\r\n displayValue = parentValue;\r\n }\r\n }\r\n\r\n if (\r\n displayValue !== null &&\r\n displayValue !== undefined &&\r\n typeof displayValue === 'object'\r\n ) {\r\n displayValue = JSON.stringify(displayValue);\r\n }\r\n\r\n childNodes[position].textContent = String(displayValue ?? '');\r\n }\r\n }\r\n });\r\n }\r\n\r\n // Notify components subscribed to the array itself.\r\n if (parentMeta?.pathComponents) {\r\n parentMeta.pathComponents.forEach((componentId) => {\r\n if (!notifiedComponents.has(componentId)) {\r\n const component = rootMeta.components?.get(componentId);\r\n if (component) {\r\n component.forceUpdate();\r\n notifiedComponents.add(componentId);\r\n }\r\n }\r\n });\r\n }\r\n }\r\n\r\n rootMeta.components.forEach((component, componentId) => {\r\n if (notifiedComponents.has(componentId)) {\r\n return;\r\n }\r\n\r\n const reactiveTypes = Array.isArray(component.reactiveType)\r\n ? component.reactiveType\r\n : [component.reactiveType || 'component'];\r\n\r\n if (reactiveTypes.includes('all')) {\r\n component.forceUpdate();\r\n notifiedComponents.add(componentId);\r\n return;\r\n }\r\n\r\n if (reactiveTypes.includes('deps')) {\r\n if (component.depsFunction) {\r\n const currentState = store.getShadowValue(thisKey);\r\n const newDeps = component.depsFunction(currentState);\r\n let shouldUpdate = false;\r\n\r\n if (newDeps === true) {\r\n shouldUpdate = true;\r\n } else if (Array.isArray(newDeps)) {\r\n if (!isDeepEqual(component.prevDeps, newDeps)) {\r\n component.prevDeps = newDeps;\r\n shouldUpdate = true;\r\n }\r\n }\r\n\r\n if (shouldUpdate) {\r\n component.forceUpdate();\r\n notifiedComponents.add(componentId);\r\n }\r\n }\r\n }\r\n });\r\n notifiedComponents.clear();\r\n setStateLog(thisKey, (prevLogs) => {\r\n const logs = [...(prevLogs ?? []), newUpdate];\r\n const aggregatedLogs = new Map<string, typeof newUpdate>();\r\n\r\n logs.forEach((log) => {\r\n const uniqueKey = `${log.stateKey}:${JSON.stringify(log.path)}`;\r\n const existing = aggregatedLogs.get(uniqueKey);\r\n\r\n if (existing) {\r\n existing.timeStamp = Math.max(existing.timeStamp, log.timeStamp);\r\n existing.newValue = log.newValue;\r\n existing.oldValue = existing.oldValue ?? log.oldValue;\r\n existing.updateType = log.updateType;\r\n } else {\r\n aggregatedLogs.set(uniqueKey, { ...(log as any) });\r\n }\r\n });\r\n\r\n return Array.from(aggregatedLogs.values());\r\n });\r\n\r\n saveToLocalStorage(\r\n payload,\r\n thisKey,\r\n latestInitialOptionsRef.current,\r\n sessionId\r\n );\r\n\r\n if (latestInitialOptionsRef.current?.middleware) {\r\n latestInitialOptionsRef.current!.middleware({\r\n updateLog: stateLog,\r\n update: newUpdate,\r\n });\r\n }\r\n\r\n return newState;\r\n };\r\n\r\n if (!getGlobalStore.getState().initialStateGlobal[thisKey]) {\r\n updateInitialStateGlobal(thisKey, stateObject);\r\n }\r\n\r\n const updaterFinal = useMemo(() => {\r\n return createProxyHandler<TStateObject>(\r\n thisKey,\r\n effectiveSetState,\r\n componentIdRef.current,\r\n sessionId\r\n );\r\n }, [thisKey, sessionId]);\r\n\r\n const cogsSyncFn = latestInitialOptionsRef.current?.cogsSync;\r\n if (cogsSyncFn) {\r\n syncApiRef.current = cogsSyncFn(updaterFinal);\r\n }\r\n\r\n return updaterFinal;\r\n}\r\n\r\nexport type MetaData = {\r\n /**\r\n * An array of the full, unique string IDs (e.g., `\"stateKey.arrayName.id:123\"`)\r\n * of the items that belong to the current derived \"view\" of an array.\r\n * This is the primary mechanism for tracking the state of filtered or sorted lists.\r\n *\r\n * - `stateFilter` populates this with only the IDs of items that passed the filter.\r\n * - `stateSort` reorders this list to match the new sort order.\r\n * - All subsequent chained operations (like `.get()`, `.index()`, or `.cut()`)\r\n * MUST consult this list first to know which items they apply to and in what order.\r\n */\r\n validIds?: string[];\r\n\r\n /**\r\n * An array of the actual filter functions that have been applied in a chain.\r\n * This is primarily used by reactive renderers like `$stateMap` to make predictions.\r\n *\r\n * For example, when a new item is inserted into the original source array, a\r\n * `$stateMap` renderer on a filtered view can use these functions to test if the\r\n * newly inserted item should be dynamically rendered in its view.\r\n */\r\n transforms?: Array<{\r\n type: 'filter' | 'sort';\r\n fn: Function;\r\n }>;\r\n};\r\n\r\nfunction hashTransforms(transforms: any[]) {\r\n if (!transforms || transforms.length === 0) {\r\n return '';\r\n }\r\n // This creates a string representation of the transforms AND their dependencies.\r\n // Example: \"filter['red']sort['score','asc']\"\r\n return transforms\r\n .map(\r\n (transform) =>\r\n // Safely stringify dependencies. An empty array becomes '[]'.\r\n `${transform.type}${JSON.stringify(transform.dependencies || [])}`\r\n )\r\n .join('');\r\n}\r\nconst applyTransforms = (\r\n stateKey: string,\r\n path: string[],\r\n transforms?: Array<{ type: 'filter' | 'sort'; fn: Function }>\r\n): string[] => {\r\n let arrayKeys =\r\n getGlobalStore.getState().getShadowMetadata(stateKey, path)?.arrayKeys ||\r\n [];\r\n\r\n if (!transforms || transforms.length === 0) {\r\n return arrayKeys;\r\n }\r\n\r\n let itemsWithKeys = arrayKeys.map((key) => ({\r\n key,\r\n value: getGlobalStore.getState().getShadowValue(key),\r\n }));\r\n\r\n for (const transform of transforms) {\r\n if (transform.type === 'filter') {\r\n itemsWithKeys = itemsWithKeys.filter(({ value }, index) =>\r\n transform.fn(value, index)\r\n );\r\n } else if (transform.type === 'sort') {\r\n itemsWithKeys.sort((a, b) => transform.fn(a.value, b.value));\r\n }\r\n }\r\n\r\n return itemsWithKeys.map(({ key }) => key);\r\n};\r\nconst registerComponentDependency = (\r\n stateKey: string,\r\n componentId: string,\r\n dependencyPath: string[]\r\n) => {\r\n const fullComponentId = `${stateKey}////${componentId}`;\r\n const { addPathComponent, getShadowMetadata } = getGlobalStore.getState();\r\n\r\n // First, check if the component should even be registered.\r\n // This check is safe to do outside the setter.\r\n const rootMeta = getShadowMetadata(stateKey, []);\r\n const component = rootMeta?.components?.get(fullComponentId);\r\n\r\n if (\r\n !component ||\r\n component.reactiveType === 'none' ||\r\n !(\r\n Array.isArray(component.reactiveType)\r\n ? component.reactiveType\r\n : [component.reactiveType]\r\n ).includes('component')\r\n ) {\r\n return;\r\n }\r\n\r\n // Now, call the single, safe, atomic function to perform the update.\r\n addPathComponent(stateKey, dependencyPath, fullComponentId);\r\n};\r\nconst notifySelectionComponents = (\r\n stateKey: string,\r\n parentPath: string[],\r\n currentSelected?: string | undefined\r\n) => {\r\n const store = getGlobalStore.getState();\r\n const rootMeta = store.getShadowMetadata(stateKey, []);\r\n const notifiedComponents = new Set<string>();\r\n\r\n // Handle \"all\" reactive components first\r\n if (rootMeta?.components) {\r\n rootMeta.components.forEach((component, componentId) => {\r\n const reactiveTypes = Array.isArray(component.reactiveType)\r\n ? component.reactiveType\r\n : [component.reactiveType || 'component'];\r\n\r\n if (reactiveTypes.includes('all')) {\r\n component.forceUpdate();\r\n notifiedComponents.add(componentId);\r\n }\r\n });\r\n }\r\n\r\n store\r\n .getShadowMetadata(stateKey, [...parentPath, 'getSelected'])\r\n ?.pathComponents?.forEach((componentId) => {\r\n const thisComp = rootMeta?.components?.get(componentId);\r\n thisComp?.forceUpdate();\r\n });\r\n\r\n const parentMeta = store.getShadowMetadata(stateKey, parentPath);\r\n for (let arrayKey of parentMeta?.arrayKeys || []) {\r\n const key = arrayKey + '.selected';\r\n const selectedItem = store.getShadowMetadata(\r\n stateKey,\r\n key.split('.').slice(1)\r\n );\r\n if (arrayKey == currentSelected) {\r\n selectedItem?.pathComponents?.forEach((componentId) => {\r\n const thisComp = rootMeta?.components?.get(componentId);\r\n thisComp?.forceUpdate();\r\n });\r\n }\r\n }\r\n};\r\nfunction createProxyHandler<T>(\r\n stateKey: string,\r\n effectiveSetState: EffectiveSetState<T>,\r\n componentId: string,\r\n sessionId?: string\r\n): StateObject<T> {\r\n type CacheEntry = {\r\n proxy: any;\r\n stateVersion: number;\r\n };\r\n\r\n const shapeCache = new Map<string, CacheEntry>();\r\n let stateVersion = 0;\r\n\r\n const invalidateCachePath = (path: string[]) => {\r\n const pathKey = path.join('.');\r\n for (const [key] of shapeCache) {\r\n if (key === pathKey || key.startsWith(pathKey + '.')) {\r\n shapeCache.delete(key);\r\n }\r\n }\r\n stateVersion++;\r\n };\r\n\r\n function rebuildStateShape({\r\n currentState,\r\n path = [],\r\n meta,\r\n componentId,\r\n }: {\r\n currentState: T;\r\n path: string[];\r\n componentId: string;\r\n meta?: MetaData;\r\n }): any {\r\n const cacheKey = path.map(String).join('.');\r\n const stateKeyPathKey = [stateKey, ...path].join('.');\r\n\r\n currentState = getGlobalStore\r\n .getState()\r\n .getShadowValue(stateKeyPathKey, meta?.validIds);\r\n\r\n type CallableStateObject<T> = {\r\n (): T;\r\n } & {\r\n [key: string]: any;\r\n };\r\n\r\n const baseFunction = function () {\r\n return getGlobalStore().getShadowValue(stateKey, path);\r\n } as unknown as CallableStateObject<T>;\r\n\r\n // We attach baseObj properties *inside* the get trap now to avoid recursion\r\n // This is a placeholder for the proxy.\r\n\r\n const handler = {\r\n apply(target: any, thisArg: any, args: any[]) {\r\n //return getGlobalStore().getShadowValue(stateKey, path);\r\n },\r\n\r\n get(target: any, prop: string) {\r\n // V--------- THE CRUCIAL FIX IS HERE ---------V\r\n // This handles requests for internal functions on the proxy,\r\n // returning the function itself instead of treating it as state.\r\n if (prop === '_rebuildStateShape') {\r\n return rebuildStateShape;\r\n }\r\n const baseObjProps = Object.getOwnPropertyNames(baseObj);\r\n if (baseObjProps.includes(prop) && path.length === 0) {\r\n return (baseObj as any)[prop];\r\n }\r\n // ^--------- END OF FIX ---------^\r\n\r\n if (prop === 'getDifferences') {\r\n return () => {\r\n const shadowMeta = getGlobalStore\r\n .getState()\r\n .getShadowMetadata(stateKey, []);\r\n const currentState = getGlobalStore\r\n .getState()\r\n .getShadowValue(stateKey);\r\n\r\n // Use the appropriate base state for comparison\r\n let baseState;\r\n if (\r\n shadowMeta?.stateSource === 'server' &&\r\n shadowMeta.baseServerState\r\n ) {\r\n baseState = shadowMeta.baseServerState;\r\n } else {\r\n baseState =\r\n getGlobalStore.getState().initialStateGlobal[stateKey];\r\n }\r\n\r\n return getDifferences(currentState, baseState);\r\n };\r\n }\r\n if (prop === 'sync' && path.length === 0) {\r\n return async function () {\r\n const options = getGlobalStore\r\n .getState()\r\n .getInitialOptions(stateKey);\r\n const sync = options?.sync;\r\n\r\n if (!sync) {\r\n console.error(`No mutation defined for state key \"${stateKey}\"`);\r\n return { success: false, error: `No mutation defined` };\r\n }\r\n\r\n const state = getGlobalStore\r\n .getState()\r\n .getShadowValue(stateKey, []);\r\n const validationKey = options?.validation?.key;\r\n\r\n try {\r\n const response = await sync.action(state);\r\n if (\r\n response &&\r\n !response.success &&\r\n response.errors &&\r\n validationKey\r\n ) {\r\n getGlobalStore.getState().removeValidationError(validationKey);\r\n response.errors.forEach((error) => {\r\n const errorPath = [validationKey, ...error.path].join('.');\r\n getGlobalStore\r\n .getState()\r\n .addValidationError(errorPath, error.message);\r\n });\r\n notifyComponents(stateKey);\r\n }\r\n\r\n if (response?.success) {\r\n // Mark as synced and not dirty\r\n const shadowMeta = getGlobalStore\r\n .getState()\r\n .getShadowMetadata(stateKey, []);\r\n getGlobalStore.getState().setShadowMetadata(stateKey, [], {\r\n ...shadowMeta,\r\n isDirty: false,\r\n lastServerSync: Date.now(),\r\n stateSource: 'server',\r\n baseServerState: state, // Update base server state\r\n });\r\n\r\n if (sync.onSuccess) {\r\n sync.onSuccess(response.data);\r\n }\r\n } else if (!response?.success && sync.onError)\r\n sync.onError(response.error);\r\n\r\n return response;\r\n } catch (error) {\r\n if (sync.onError) sync.onError(error);\r\n return { success: false, error };\r\n }\r\n };\r\n }\r\n // Fixed getStatus function in createProxyHandler\r\n if (prop === '_status' || prop === 'getStatus') {\r\n const getStatusFunc = () => {\r\n const shadowMeta = getGlobalStore\r\n .getState()\r\n .getShadowMetadata(stateKey, path);\r\n const value = getGlobalStore\r\n .getState()\r\n .getShadowValue(stateKeyPathKey);\r\n\r\n // Priority 1: Explicitly dirty items\r\n if (shadowMeta?.isDirty === true) {\r\n return 'dirty';\r\n }\r\n\r\n // Priority 2: Explicitly synced items (isDirty: false)\r\n if (shadowMeta?.isDirty === false) {\r\n return 'synced';\r\n }\r\n\r\n // Priority 3: Items from server source (should be synced even without explicit isDirty flag)\r\n if (shadowMeta?.stateSource === 'server') {\r\n return 'synced';\r\n }\r\n\r\n // Priority 4: Items restored from localStorage\r\n if (shadowMeta?.stateSource === 'localStorage') {\r\n return 'restored';\r\n }\r\n\r\n // Priority 5: Items from default/initial state\r\n if (shadowMeta?.stateSource === 'default') {\r\n return 'fresh';\r\n }\r\n\r\n // Priority 6: Check if this is part of initial server load\r\n // Look up the tree to see if parent has server source\r\n const rootMeta = getGlobalStore\r\n .getState()\r\n .getShadowMetadata(stateKey, []);\r\n if (rootMeta?.stateSource === 'server' && !shadowMeta?.isDirty) {\r\n return 'synced';\r\n }\r\n\r\n // Priority 7: If no metadata exists but value exists, it's probably fresh\r\n if (value !== undefined && !shadowMeta) {\r\n return 'fresh';\r\n }\r\n\r\n // Fallback\r\n return 'unknown';\r\n };\r\n\r\n return prop === '_status' ? getStatusFunc() : getStatusFunc;\r\n }\r\n if (prop === 'removeStorage') {\r\n return () => {\r\n const initialState =\r\n getGlobalStore.getState().initialStateGlobal[stateKey];\r\n const initalOptionsGet = getInitialOptions(stateKey as string);\r\n const localKey = isFunction(initalOptionsGet?.localStorage?.key)\r\n ? initalOptionsGet.localStorage.key(initialState)\r\n : initalOptionsGet?.localStorage?.key;\r\n const storageKey = `${sessionId}-${stateKey}-${localKey}`;\r\n if (storageKey) localStorage.removeItem(storageKey);\r\n };\r\n }\r\n if (prop === 'showValidationErrors') {\r\n return () => {\r\n const meta = getGlobalStore\r\n .getState()\r\n .getShadowMetadata(stateKey, path);\r\n if (\r\n meta?.validation?.status === 'VALIDATION_FAILED' &&\r\n meta.validation.message\r\n ) {\r\n return [meta.validation.message];\r\n }\r\n return [];\r\n };\r\n }\r\n if (Array.isArray(currentState)) {\r\n if (prop === 'getSelected') {\r\n return () => {\r\n const fullKey = stateKey + '.' + path.join('.');\r\n registerComponentDependency(stateKey, componentId, [\r\n ...path,\r\n 'getSelected',\r\n ]);\r\n\r\n const selectedIndicesMap =\r\n getGlobalStore.getState().selectedIndicesMap;\r\n if (!selectedIndicesMap || !selectedIndicesMap.has(fullKey)) {\r\n return undefined;\r\n }\r\n\r\n const selectedItemKey = selectedIndicesMap.get(fullKey)!;\r\n if (meta?.validIds) {\r\n if (!meta.validIds.includes(selectedItemKey)) {\r\n return undefined;\r\n }\r\n }\r\n\r\n const value = getGlobalStore\r\n .getState()\r\n .getShadowValue(selectedItemKey);\r\n\r\n if (!value) {\r\n return undefined;\r\n }\r\n\r\n return rebuildStateShape({\r\n currentState: value,\r\n path: selectedItemKey.split('.').slice(1) as string[],\r\n componentId: componentId!,\r\n });\r\n };\r\n }\r\n if (prop === 'getSelectedIndex') {\r\n return () => {\r\n const selectedIndex = getGlobalStore\r\n .getState()\r\n .getSelectedIndex(\r\n stateKey + '.' + path.join('.'),\r\n meta?.validIds\r\n );\r\n\r\n return selectedIndex;\r\n };\r\n }\r\n if (prop === 'clearSelected') {\r\n notifySelectionComponents(stateKey, path);\r\n return () => {\r\n getGlobalStore.getState().clearSelectedIndex({\r\n arrayKey: stateKey + '.' + path.join('.'),\r\n });\r\n };\r\n }\r\n\r\n if (prop === 'useVirtualView') {\r\n return (\r\n options: VirtualViewOptions\r\n ): VirtualStateObjectResult<any[]> => {\r\n const {\r\n itemHeight = 50,\r\n overscan = 6,\r\n stickToBottom = false,\r\n scrollStickTolerance = 75,\r\n } = options;\r\n\r\n const containerRef = useRef<HTMLDivElement | null>(null);\r\n const [range, setRange] = useState({\r\n startIndex: 0,\r\n endIndex: 10,\r\n });\r\n const [rerender, forceUpdate] = useState({});\r\n const initialScrollRef = useRef(true);\r\n\r\n // Scroll state management\r\n const scrollStateRef = useRef({\r\n isUserScrolling: false,\r\n lastScrollTop: 0,\r\n scrollUpCount: 0,\r\n isNearBottom: true,\r\n });\r\n\r\n // Measurement cache\r\n const measurementCache = useRef(\r\n new Map<string, { height: number; offset: number }>()\r\n );\r\n\r\n // Separate effect for handling rerender updates\r\n useLayoutEffect(() => {\r\n if (\r\n !stickToBottom ||\r\n !containerRef.current ||\r\n scrollStateRef.current.isUserScrolling\r\n )\r\n return;\r\n\r\n const container = containerRef.current;\r\n container.scrollTo({\r\n top: container.scrollHeight,\r\n behavior: initialScrollRef.current ? 'instant' : 'smooth',\r\n });\r\n }, [rerender, stickToBottom]);\r\n\r\n const arrayKeys =\r\n getGlobalStore.getState().getShadowMetadata(stateKey, path)\r\n ?.arrayKeys || [];\r\n\r\n // Calculate total height and offsets\r\n const { totalHeight, itemOffsets } = useMemo(() => {\r\n let runningOffset = 0;\r\n const offsets = new Map<\r\n string,\r\n { height: number; offset: number }\r\n >();\r\n const allItemKeys =\r\n getGlobalStore.getState().getShadowMetadata(stateKey, path)\r\n ?.arrayKeys || [];\r\n\r\n allItemKeys.forEach((itemKey) => {\r\n const itemPath = itemKey.split('.').slice(1);\r\n const measuredHeight =\r\n getGlobalStore\r\n .getState()\r\n .getShadowMetadata(stateKey, itemPath)?.virtualizer\r\n ?.itemHeight || itemHeight;\r\n\r\n offsets.set(itemKey, {\r\n height: measuredHeight,\r\n offset: runningOffset,\r\n });\r\n\r\n runningOffset += measuredHeight;\r\n });\r\n\r\n measurementCache.current = offsets;\r\n return { totalHeight: runningOffset, itemOffsets: offsets };\r\n }, [arrayKeys.length, itemHeight]);\r\n\r\n // Improved initial positioning effect\r\n useLayoutEffect(() => {\r\n if (\r\n stickToBottom &&\r\n arrayKeys.length > 0 &&\r\n containerRef.current &&\r\n !scrollStateRef.current.isUserScrolling &&\r\n initialScrollRef.current\r\n ) {\r\n const container = containerRef.current;\r\n\r\n // Wait for container to have dimensions\r\n const waitForContainer = () => {\r\n if (container.clientHeight > 0) {\r\n const visibleCount = Math.ceil(\r\n container.clientHeight / itemHeight\r\n );\r\n const endIndex = arrayKeys.length - 1;\r\n const startIndex = Math.max(\r\n 0,\r\n endIndex - visibleCount - overscan\r\n );\r\n\r\n setRange({ startIndex, endIndex });\r\n\r\n // Ensure scroll after range is set\r\n requestAnimationFrame(() => {\r\n scrollToBottom('instant');\r\n initialScrollRef.current = false; // Mark initial scroll as done\r\n });\r\n } else {\r\n // Container not ready, try again\r\n requestAnimationFrame(waitForContainer);\r\n }\r\n };\r\n\r\n waitForContainer();\r\n }\r\n }, [arrayKeys.length, stickToBottom, itemHeight, overscan]);\r\n\r\n // Combined scroll handler\r\n const handleScroll = useCallback(() => {\r\n const container = containerRef.current;\r\n if (!container) return;\r\n\r\n const currentScrollTop = container.scrollTop;\r\n const { scrollHeight, clientHeight } = container;\r\n const scrollState = scrollStateRef.current;\r\n\r\n // Check if user is near bottom\r\n const distanceFromBottom =\r\n scrollHeight - (currentScrollTop + clientHeight);\r\n const wasNearBottom = scrollState.isNearBottom;\r\n scrollState.isNearBottom =\r\n distanceFromBottom <= scrollStickTolerance;\r\n\r\n // Detect scroll direction\r\n if (currentScrollTop < scrollState.lastScrollTop) {\r\n // User scrolled up\r\n scrollState.scrollUpCount++;\r\n\r\n if (scrollState.scrollUpCount > 3 && wasNearBottom) {\r\n // User has deliberately scrolled away from bottom\r\n scrollState.isUserScrolling = true;\r\n console.log('User scrolled away from bottom');\r\n }\r\n } else if (scrollState.isNearBottom) {\r\n // Reset if we're back near the bottom\r\n scrollState.isUserScrolling = false;\r\n scrollState.scrollUpCount = 0;\r\n }\r\n\r\n scrollState.lastScrollTop = currentScrollTop;\r\n\r\n // Update visible range\r\n let newStartIndex = 0;\r\n for (let i = 0; i < arrayKeys.length; i++) {\r\n const itemKey = arrayKeys[i];\r\n const item = measurementCache.current.get(itemKey!);\r\n if (item && item.offset + item.height > currentScrollTop) {\r\n newStartIndex = i;\r\n break;\r\n }\r\n }\r\n\r\n // Only update if range actually changed\r\n if (newStartIndex !== range.startIndex) {\r\n const visibleCount = Math.ceil(clientHeight / itemHeight);\r\n setRange({\r\n startIndex: Math.max(0, newStartIndex - overscan),\r\n endIndex: Math.min(\r\n arrayKeys.length - 1,\r\n newStartIndex + visibleCount + overscan\r\n ),\r\n });\r\n }\r\n }, [\r\n arrayKeys.length,\r\n range.startIndex,\r\n itemHeight,\r\n overscan,\r\n scrollStickTolerance,\r\n ]);\r\n\r\n // Set up scroll listener\r\n useEffect(() => {\r\n const container = containerRef.current;\r\n if (!container || !stickToBottom) return;\r\n\r\n container.addEventListener('scroll', handleScroll, {\r\n passive: true,\r\n });\r\n\r\n return () => {\r\n container.removeEventListener('scroll', handleScroll);\r\n };\r\n }, [handleScroll, stickToBottom]);\r\n const scrollToBottom = useCallback(\r\n (behavior: ScrollBehavior = 'smooth') => {\r\n const container = containerRef.current;\r\n if (!container) return;\r\n\r\n // Reset scroll state\r\n scrollStateRef.current.isUserScrolling = false;\r\n scrollStateRef.current.isNearBottom = true;\r\n scrollStateRef.current.scrollUpCount = 0;\r\n\r\n const performScroll = () => {\r\n // Multiple attempts to ensure we hit the bottom\r\n const attemptScroll = (attempts = 0) => {\r\n if (attempts > 5) return; // Prevent infinite loops\r\n\r\n const currentHeight = container.scrollHeight;\r\n const currentScroll = container.scrollTop;\r\n const clientHeight = container.clientHeight;\r\n\r\n // Check if we're already at the bottom\r\n if (currentScroll + clientHeight >= currentHeight - 1) {\r\n return;\r\n }\r\n\r\n container.scrollTo({\r\n top: currentHeight,\r\n behavior: behavior,\r\n });\r\n\r\n // In slow environments, check again after a short delay\r\n setTimeout(() => {\r\n const newHeight = container.scrollHeight;\r\n const newScroll = container.scrollTop;\r\n\r\n // If height changed or we're not at bottom, try again\r\n if (\r\n newHeight !== currentHeight ||\r\n newScroll + clientHeight < newHeight - 1\r\n ) {\r\n attemptScroll(attempts + 1);\r\n }\r\n }, 50);\r\n };\r\n\r\n attemptScroll();\r\n };\r\n\r\n // Use requestIdleCallback for better performance in slow environments\r\n if ('requestIdleCallback' in window) {\r\n requestIdleCallback(performScroll, { timeout: 100 });\r\n } else {\r\n // Fallback to rAF chain\r\n requestAnimationFrame(() => {\r\n requestAnimationFrame(performScroll);\r\n });\r\n }\r\n },\r\n []\r\n );\r\n // Auto-scroll to bottom when new content arrives\r\n // Consolidated auto-scroll effect with debouncing\r\n useEffect(() => {\r\n if (!stickToBottom || !containerRef.current) return;\r\n\r\n const container = containerRef.current;\r\n const scrollState = scrollStateRef.current;\r\n\r\n // Debounced scroll function\r\n let scrollTimeout: NodeJS.Timeout;\r\n const debouncedScrollToBottom = () => {\r\n clearTimeout(scrollTimeout);\r\n scrollTimeout = setTimeout(() => {\r\n if (\r\n !scrollState.isUserScrolling &&\r\n scrollState.isNearBottom\r\n ) {\r\n scrollToBottom(\r\n initialScrollRef.current ? 'instant' : 'smooth'\r\n );\r\n }\r\n }, 100);\r\n };\r\n\r\n // Single MutationObserver for all DOM changes\r\n const observer = new MutationObserver(() => {\r\n if (!scrollState.isUserScrolling) {\r\n debouncedScrollToBottom();\r\n }\r\n });\r\n\r\n observer.observe(container, {\r\n childList: true,\r\n subtree: true,\r\n attributes: true,\r\n attributeFilter: ['style', 'class'], // More specific than just 'height'\r\n });\r\n\r\n // Handle image loads with event delegation\r\n const handleImageLoad = (e: Event) => {\r\n if (\r\n e.target instanceof HTMLImageElement &&\r\n !scrollState.isUserScrolling\r\n ) {\r\n debouncedScrollToBottom();\r\n }\r\n };\r\n\r\n container.addEventListener('load', handleImageLoad, true);\r\n\r\n // Initial scroll with proper timing\r\n if (initialScrollRef.current) {\r\n // For initial load, wait for next tick to ensure DOM is ready\r\n setTimeout(() => {\r\n scrollToBottom('instant');\r\n }, 0);\r\n } else {\r\n debouncedScrollToBottom();\r\n }\r\n\r\n return () => {\r\n clearTimeout(scrollTimeout);\r\n observer.disconnect();\r\n container.removeEventListener('load', handleImageLoad, true);\r\n };\r\n }, [stickToBottom, arrayKeys.length, scrollToBottom]);\r\n // Create virtual state\r\n const virtualState = useMemo(() => {\r\n const store = getGlobalStore.getState();\r\n const sourceArray = store.getShadowValue(\r\n [stateKey, ...path].join('.')\r\n ) as any[];\r\n const currentKeys =\r\n store.getShadowMetadata(stateKey, path)?.arrayKeys || [];\r\n\r\n const slicedArray = sourceArray.slice(\r\n range.startIndex,\r\n range.endIndex + 1\r\n );\r\n const slicedIds = currentKeys.slice(\r\n range.startIndex,\r\n range.endIndex + 1\r\n );\r\n\r\n return rebuildStateShape({\r\n currentState: slicedArray as any,\r\n path,\r\n componentId: componentId!,\r\n meta: { ...meta, validIds: slicedIds },\r\n });\r\n }, [range.startIndex, range.endIndex, arrayKeys.length]);\r\n\r\n return {\r\n virtualState,\r\n virtualizerProps: {\r\n outer: {\r\n ref: containerRef,\r\n style: {\r\n overflowY: 'auto',\r\n height: '100%',\r\n position: 'relative',\r\n },\r\n },\r\n inner: {\r\n style: {\r\n height: `${totalHeight}px`,\r\n position: 'relative',\r\n },\r\n },\r\n list: {\r\n style: {\r\n transform: `translateY(${\r\n measurementCache.current.get(\r\n arrayKeys[range.startIndex]!\r\n )?.offset || 0\r\n }px)`,\r\n },\r\n },\r\n },\r\n scrollToBottom,\r\n scrollToIndex: (\r\n index: number,\r\n behavior: ScrollBehavior = 'smooth'\r\n ) => {\r\n if (containerRef.current && arrayKeys[index]) {\r\n const offset =\r\n measurementCache.current.get(arrayKeys[index]!)?.offset ||\r\n 0;\r\n containerRef.current.scrollTo({ top: offset, behavior });\r\n }\r\n },\r\n };\r\n };\r\n }\r\n if (prop === 'stateMap') {\r\n return (\r\n callbackfn: (\r\n setter: any,\r\n index: number,\r\n\r\n arraySetter: any\r\n ) => void\r\n ) => {\r\n const [arrayKeys, setArrayKeys] = useState<any>(\r\n meta?.validIds ??\r\n getGlobalStore.getState().getShadowMetadata(stateKey, path)\r\n ?.arrayKeys\r\n );\r\n // getGlobalStore.getState().subscribeToPath(stateKeyPathKey, () => {\r\n // console.log(\r\n // \"stateKeyPathKeyccccccccccccccccc\",\r\n // stateKeyPathKey\r\n // );\r\n // setArrayKeys(\r\n // getGlobalStore.getState().getShadowMetadata(stateKey, path)\r\n // );\r\n // });\r\n\r\n const shadowValue = getGlobalStore\r\n .getState()\r\n .getShadowValue(stateKeyPathKey, meta?.validIds) as any[];\r\n if (!arrayKeys) {\r\n throw new Error('No array keys found for mapping');\r\n }\r\n const arraySetter = rebuildStateShape({\r\n currentState: shadowValue as any,\r\n path,\r\n componentId: componentId!,\r\n meta,\r\n });\r\n\r\n return shadowValue.map((item, index) => {\r\n const itemPath = arrayKeys[index]?.split('.').slice(1);\r\n const itemSetter = rebuildStateShape({\r\n currentState: item,\r\n path: itemPath as any,\r\n componentId: componentId!,\r\n meta,\r\n });\r\n\r\n return callbackfn(\r\n itemSetter,\r\n index,\r\n\r\n arraySetter\r\n );\r\n });\r\n };\r\n }\r\n\r\n if (prop === '$stateMap') {\r\n return (callbackfn: any) =>\r\n createElement(SignalMapRenderer, {\r\n proxy: {\r\n _stateKey: stateKey,\r\n _path: path,\r\n _mapFn: callbackfn,\r\n _meta: meta,\r\n },\r\n rebuildStateShape,\r\n });\r\n } // In createProxyHandler -> handler -> get -> if (Array.isArray(currentState))\r\n\r\n if (prop === 'stateFind') {\r\n return (\r\n callbackfn: (value: any, index: number) => boolean\r\n ): StateObject<any> | undefined => {\r\n // 1. Use the correct set of keys: filtered/sorted from meta, or all keys from the store.\r\n const arrayKeys =\r\n meta?.validIds ??\r\n getGlobalStore.getState().getShadowMetadata(stateKey, path)\r\n ?.arrayKeys;\r\n\r\n if (!arrayKeys) {\r\n return undefined;\r\n }\r\n\r\n // 2. Iterate through the keys, get the value for each, and run the callback.\r\n for (let i = 0; i < arrayKeys.length; i++) {\r\n const itemKey = arrayKeys[i];\r\n if (!itemKey) continue; // Safety check\r\n\r\n const itemValue = getGlobalStore\r\n .getState()\r\n .getShadowValue(itemKey);\r\n\r\n // 3. If the callback returns true, we've found our item.\r\n if (callbackfn(itemValue, i)) {\r\n // Get the item's path relative to the stateKey (e.g., ['messages', '42'] -> ['42'])\r\n const itemPath = itemKey.split('.').slice(1);\r\n\r\n // 4. Rebuild a new, fully functional StateObject for just that item and return it.\r\n return rebuildStateShape({\r\n currentState: itemValue,\r\n path: itemPath,\r\n componentId: componentId,\r\n meta, // Pass along meta for potential further chaining\r\n });\r\n }\r\n }\r\n\r\n // 5. If the loop finishes without finding anything, return undefined.\r\n return undefined;\r\n };\r\n }\r\n if (prop === 'stateFilter') {\r\n return (callbackfn: (value: any, index: number) => boolean) => {\r\n const arrayKeys =\r\n meta?.validIds ??\r\n getGlobalStore.getState().getShadowMetadata(stateKey, path)\r\n ?.arrayKeys;\r\n\r\n if (!arrayKeys) {\r\n throw new Error('No array keys found for filtering.');\r\n }\r\n\r\n const newValidIds: string[] = [];\r\n const filteredArray = currentState.filter(\r\n (val: any, index: number) => {\r\n const didPass = callbackfn(val, index);\r\n if (didPass) {\r\n newValidIds.push(arrayKeys[index]!);\r\n return true;\r\n }\r\n return false;\r\n }\r\n );\r\n\r\n return rebuildStateShape({\r\n currentState: filteredArray as any,\r\n path,\r\n componentId: componentId!,\r\n meta: {\r\n validIds: newValidIds,\r\n transforms: [\r\n ...(meta?.transforms || []),\r\n {\r\n type: 'filter',\r\n fn: callbackfn,\r\n },\r\n ],\r\n },\r\n });\r\n };\r\n }\r\n if (prop === 'stateSort') {\r\n return (compareFn: (a: any, b: any) => number) => {\r\n const arrayKeys =\r\n meta?.validIds ??\r\n getGlobalStore.getState().getShadowMetadata(stateKey, path)\r\n ?.arrayKeys;\r\n if (!arrayKeys) {\r\n throw new Error('No array keys found for sorting');\r\n }\r\n const itemsWithIds = currentState.map((item, index) => ({\r\n item,\r\n key: arrayKeys[index],\r\n }));\r\n\r\n itemsWithIds\r\n .sort((a, b) => compareFn(a.item, b.item))\r\n .filter(Boolean);\r\n\r\n return rebuildStateShape({\r\n currentState: itemsWithIds.map((i) => i.item) as any,\r\n path,\r\n componentId: componentId!,\r\n meta: {\r\n validIds: itemsWithIds.map((i) => i.key) as string[],\r\n transforms: [\r\n ...(meta?.transforms || []),\r\n { type: 'sort', fn: compareFn },\r\n ],\r\n },\r\n });\r\n };\r\n }\r\n // In createProxyHandler, inside the get trap where you have other array methods:\r\n if (prop === 'stream') {\r\n return function <U = InferArrayElement<T>, R = U>(\r\n options: StreamOptions<U, R> = {}\r\n ): StreamHandle<U> {\r\n const {\r\n bufferSize = 100,\r\n flushInterval = 100,\r\n bufferStrategy = 'accumulate',\r\n store,\r\n onFlush,\r\n } = options;\r\n\r\n let buffer: U[] = [];\r\n let isPaused = false;\r\n let flushTimer: NodeJS.Timeout | null = null;\r\n\r\n const addToBuffer = (item: U) => {\r\n if (isPaused) return;\r\n\r\n if (\r\n bufferStrategy === 'sliding' &&\r\n buffer.length >= bufferSize\r\n ) {\r\n buffer.shift();\r\n } else if (\r\n bufferStrategy === 'dropping' &&\r\n buffer.length >= bufferSize\r\n ) {\r\n return;\r\n }\r\n\r\n buffer.push(item);\r\n\r\n if (buffer.length >= bufferSize) {\r\n flushBuffer();\r\n }\r\n };\r\n\r\n const flushBuffer = () => {\r\n if (buffer.length === 0) return;\r\n\r\n const toFlush = [...buffer];\r\n buffer = [];\r\n\r\n if (store) {\r\n const result = store(toFlush);\r\n if (result !== undefined) {\r\n const items = Array.isArray(result) ? result : [result];\r\n items.forEach((item) => {\r\n effectiveSetState(item as any, path, {\r\n updateType: 'insert',\r\n });\r\n });\r\n }\r\n } else {\r\n toFlush.forEach((item) => {\r\n effectiveSetState(item as any, path, {\r\n updateType: 'insert',\r\n });\r\n });\r\n }\r\n\r\n onFlush?.(toFlush);\r\n };\r\n\r\n if (flushInterval > 0) {\r\n flushTimer = setInterval(flushBuffer, flushInterval);\r\n }\r\n\r\n const streamId = uuidv4();\r\n const currentMeta =\r\n getGlobalStore.getState().getShadowMetadata(stateKey, path) ||\r\n {};\r\n const streams = currentMeta.streams || new Map();\r\n streams.set(streamId, { buffer, flushTimer });\r\n\r\n getGlobalStore.getState().setShadowMetadata(stateKey, path, {\r\n ...currentMeta,\r\n streams,\r\n });\r\n\r\n return {\r\n write: (data: U) => addToBuffer(data),\r\n writeMany: (data: U[]) => data.forEach(addToBuffer),\r\n flush: () => flushBuffer(),\r\n pause: () => {\r\n isPaused = true;\r\n },\r\n resume: () => {\r\n isPaused = false;\r\n if (buffer.length > 0) flushBuffer();\r\n },\r\n close: () => {\r\n flushBuffer();\r\n if (flushTimer) clearInterval(flushTimer);\r\n\r\n const meta = getGlobalStore\r\n .getState()\r\n .getShadowMetadata(stateKey, path);\r\n if (meta?.streams) {\r\n meta.streams.delete(streamId);\r\n }\r\n },\r\n };\r\n };\r\n }\r\n\r\n if (prop === 'stateList') {\r\n return (\r\n callbackfn: (\r\n setter: any,\r\n index: number,\r\n arraySetter: any\r\n ) => ReactNode\r\n ) => {\r\n const StateListWrapper = () => {\r\n const componentIdsRef = useRef<Map<string, string>>(new Map());\r\n\r\n const cacheKey =\r\n meta?.transforms && meta.transforms.length > 0\r\n ? `${componentId}-${hashTransforms(meta.transforms)}`\r\n : `${componentId}-base`;\r\n\r\n const [updateTrigger, forceUpdate] = useState({});\r\n\r\n const { validIds, arrayValues } = useMemo(() => {\r\n const cached = getGlobalStore\r\n .getState()\r\n .getShadowMetadata(stateKey, path)\r\n ?.transformCaches?.get(cacheKey);\r\n\r\n let freshValidIds: string[];\r\n\r\n if (cached && cached.validIds) {\r\n freshValidIds = cached.validIds;\r\n } else {\r\n freshValidIds = applyTransforms(\r\n stateKey,\r\n path,\r\n meta?.transforms\r\n );\r\n\r\n getGlobalStore\r\n .getState()\r\n .setTransformCache(stateKey, path, cacheKey, {\r\n validIds: freshValidIds,\r\n computedAt: Date.now(),\r\n transforms: meta?.transforms || [],\r\n });\r\n }\r\n\r\n const freshValues = getGlobalStore\r\n .getState()\r\n .getShadowValue(stateKeyPathKey, freshValidIds);\r\n\r\n return {\r\n validIds: freshValidIds,\r\n arrayValues: freshValues || [],\r\n };\r\n }, [cacheKey, updateTrigger]);\r\n\r\n useEffect(() => {\r\n const unsubscribe = getGlobalStore\r\n .getState()\r\n .subscribeToPath(stateKeyPathKey, (e) => {\r\n // A data change has occurred for the source array.\r\n\r\n if (e.type === 'GET_SELECTED') {\r\n return;\r\n }\r\n const shadowMeta = getGlobalStore\r\n .getState()\r\n .getShadowMetadata(stateKey, path);\r\n\r\n const caches = shadowMeta?.transformCaches;\r\n if (caches) {\r\n // Iterate over ALL keys in the cache map.\r\n for (const key of caches.keys()) {\r\n // If the key belongs to this component instance, delete it.\r\n // This purges caches for 'sort by name', 'sort by score', etc.\r\n if (key.startsWith(componentId)) {\r\n caches.delete(key);\r\n }\r\n }\r\n }\r\n\r\n if (\r\n e.type === 'INSERT' ||\r\n e.type === 'REMOVE' ||\r\n e.type === 'CLEAR_SELECTION'\r\n ) {\r\n forceUpdate({});\r\n }\r\n });\r\n\r\n return () => {\r\n unsubscribe();\r\n };\r\n\r\n // This effect's logic now depends on the componentId to perform the purge.\r\n }, [componentId, stateKeyPathKey]);\r\n\r\n if (!Array.isArray(arrayValues)) {\r\n return null;\r\n }\r\n\r\n const arraySetter = rebuildStateShape({\r\n currentState: arrayValues as any,\r\n path,\r\n componentId: componentId!,\r\n meta: {\r\n ...meta,\r\n validIds: validIds,\r\n },\r\n });\r\n\r\n return (\r\n <>\r\n {arrayValues.map((item, localIndex) => {\r\n const itemKey = validIds[localIndex];\r\n\r\n if (!itemKey) {\r\n return null;\r\n }\r\n\r\n let itemComponentId =\r\n componentIdsRef.current.get(itemKey);\r\n if (!itemComponentId) {\r\n itemComponentId = uuidv4();\r\n componentIdsRef.current.set(itemKey, itemComponentId);\r\n }\r\n\r\n const itemPath = itemKey.split('.').slice(1);\r\n\r\n return createElement(MemoizedCogsItemWrapper, {\r\n key: itemKey,\r\n stateKey,\r\n itemComponentId,\r\n itemPath,\r\n localIndex,\r\n arraySetter,\r\n rebuildStateShape,\r\n renderFn: callbackfn,\r\n });\r\n })}\r\n </>\r\n );\r\n };\r\n\r\n return <StateListWrapper />;\r\n };\r\n }\r\n if (prop === 'stateFlattenOn') {\r\n return (fieldName: string) => {\r\n const arrayToMap = currentState as any[];\r\n shapeCache.clear();\r\n stateVersion++;\r\n const flattenedResults = arrayToMap.flatMap(\r\n (val: any) => val[fieldName] ?? []\r\n );\r\n return rebuildStateShape({\r\n currentState: flattenedResults as any,\r\n path: [...path, '[*]', fieldName],\r\n componentId: componentId!,\r\n meta,\r\n });\r\n };\r\n }\r\n if (prop === 'index') {\r\n return (index: number) => {\r\n const arrayKeys = getGlobalStore\r\n .getState()\r\n .getShadowMetadata(stateKey, path)\r\n ?.arrayKeys?.filter(\r\n (key) =>\r\n !meta?.validIds ||\r\n (meta?.validIds && meta?.validIds?.includes(key))\r\n );\r\n const itemId = arrayKeys?.[index];\r\n if (!itemId) return undefined;\r\n const value = getGlobalStore\r\n .getState()\r\n .getShadowValue(itemId, meta?.validIds);\r\n const state = rebuildStateShape({\r\n currentState: value,\r\n path: itemId.split('.').slice(1) as string[],\r\n componentId: componentId!,\r\n meta,\r\n });\r\n return state;\r\n };\r\n }\r\n if (prop === 'last') {\r\n return () => {\r\n const currentArray = getGlobalStore\r\n .getState()\r\n .getShadowValue(stateKey, path) as any[];\r\n if (currentArray.length === 0) return undefined;\r\n const lastIndex = currentArray.length - 1;\r\n const lastValue = currentArray[lastIndex];\r\n const newPath = [...path, lastIndex.toString()];\r\n return rebuildStateShape({\r\n currentState: lastValue,\r\n path: newPath,\r\n componentId: componentId!,\r\n meta,\r\n });\r\n };\r\n }\r\n if (prop === 'insert') {\r\n return (\r\n payload: InsertParams<InferArrayElement<T>>,\r\n index?: number\r\n ) => {\r\n effectiveSetState(payload as any, path, { updateType: 'insert' });\r\n return rebuildStateShape({\r\n currentState: getGlobalStore\r\n .getState()\r\n .getShadowValue(stateKey, path),\r\n path,\r\n componentId: componentId!,\r\n meta,\r\n });\r\n };\r\n }\r\n if (prop === 'uniqueInsert') {\r\n return (\r\n payload: UpdateArg<T>,\r\n fields?: (keyof InferArrayElement<T>)[],\r\n onMatch?: (existingItem: any) => any\r\n ) => {\r\n const currentArray = getGlobalStore\r\n .getState()\r\n .getShadowValue(stateKey, path) as any[];\r\n const newValue = isFunction<T>(payload)\r\n ? payload(currentArray as any)\r\n : (payload as any);\r\n\r\n let matchedItem: any = null;\r\n const isUnique = !currentArray.some((item) => {\r\n const isMatch = fields\r\n ? fields.every((field) =>\r\n isDeepEqual(item[field], newValue[field])\r\n )\r\n : isDeepEqual(item, newValue);\r\n if (isMatch) matchedItem = item;\r\n return isMatch;\r\n });\r\n\r\n if (isUnique) {\r\n invalidateCachePath(path);\r\n effectiveSetState(newValue, path, { updateType: 'insert' });\r\n } else if (onMatch && matchedItem) {\r\n const updatedItem = onMatch(matchedItem);\r\n const updatedArray = currentArray.map((item) =>\r\n isDeepEqual(item, matchedItem) ? updatedItem : item\r\n );\r\n invalidateCachePath(path);\r\n effectiveSetState(updatedArray as any, path, {\r\n updateType: 'update',\r\n });\r\n }\r\n };\r\n }\r\n\r\n if (prop === 'cut') {\r\n return (index?: number, options?: { waitForSync?: boolean }) => {\r\n const validKeys =\r\n meta?.validIds ??\r\n getGlobalStore.getState().getShadowMetadata(stateKey, path)\r\n ?.arrayKeys;\r\n\r\n if (!validKeys || validKeys.length === 0) return;\r\n\r\n const indexToCut =\r\n index == -1\r\n ? validKeys.length - 1\r\n : index !== undefined\r\n ? index\r\n : validKeys.length - 1;\r\n\r\n const fullIdToCut = validKeys[indexToCut];\r\n if (!fullIdToCut) return; // Index out of bounds\r\n\r\n const pathForCut = fullIdToCut.split('.').slice(1);\r\n effectiveSetState(currentState, pathForCut, {\r\n updateType: 'cut',\r\n });\r\n };\r\n }\r\n if (prop === 'cutSelected') {\r\n return () => {\r\n const validKeys = applyTransforms(\r\n stateKey,\r\n path,\r\n meta?.transforms\r\n );\r\n\r\n if (!validKeys || validKeys.length === 0) return;\r\n\r\n const indexKeyToCut = getGlobalStore\r\n .getState()\r\n .selectedIndicesMap.get(stateKeyPathKey);\r\n\r\n let indexToCut = validKeys.findIndex(\r\n (key) => key === indexKeyToCut\r\n );\r\n\r\n const pathForCut = validKeys[\r\n indexToCut == -1 ? validKeys.length - 1 : indexToCut\r\n ]\r\n ?.split('.')\r\n .slice(1);\r\n getGlobalStore\r\n .getState()\r\n .clearSelectedIndex({ arrayKey: stateKeyPathKey });\r\n const parentPath = pathForCut?.slice(0, -1)!;\r\n notifySelectionComponents(stateKey, parentPath);\r\n effectiveSetState(currentState, pathForCut!, {\r\n updateType: 'cut',\r\n });\r\n };\r\n }\r\n if (prop === 'cutByValue') {\r\n return (value: string | number | boolean) => {\r\n // Step 1: Get the list of all unique keys for the current view.\r\n const arrayMeta = getGlobalStore\r\n .getState()\r\n .getShadowMetadata(stateKey, path);\r\n const relevantKeys = meta?.validIds ?? arrayMeta?.arrayKeys;\r\n\r\n if (!relevantKeys) return;\r\n\r\n let keyToCut: string | null = null;\r\n\r\n // Step 2: Iterate through the KEYS, get the value for each, and find the match.\r\n for (const key of relevantKeys) {\r\n const itemValue = getGlobalStore.getState().getShadowValue(key);\r\n if (itemValue === value) {\r\n keyToCut = key;\r\n break; // We found the key, no need to search further.\r\n }\r\n }\r\n\r\n // Step 3: If we found a matching key, use it to perform the cut.\r\n if (keyToCut) {\r\n const itemPath = keyToCut.split('.').slice(1);\r\n effectiveSetState(null as any, itemPath, { updateType: 'cut' });\r\n }\r\n };\r\n }\r\n\r\n if (prop === 'toggleByValue') {\r\n return (value: string | number | boolean) => {\r\n // Step 1: Get the list of all unique keys for the current view.\r\n const arrayMeta = getGlobalStore\r\n .getState()\r\n .getShadowMetadata(stateKey, path);\r\n const relevantKeys = meta?.validIds ?? arrayMeta?.arrayKeys;\r\n\r\n if (!relevantKeys) return;\r\n\r\n let keyToCut: string | null = null;\r\n\r\n // Step 2: Iterate through the KEYS to find the one matching the value. This is the robust way.\r\n for (const key of relevantKeys) {\r\n const itemValue = getGlobalStore.getState().getShadowValue(key);\r\n console.log('itemValue sdasdasdasd', itemValue);\r\n if (itemValue === value) {\r\n keyToCut = key;\r\n break; // Found it!\r\n }\r\n }\r\n console.log('itemValue keyToCut', keyToCut);\r\n // Step 3: Act based on whether the key was found.\r\n if (keyToCut) {\r\n // Item exists, so we CUT it using its *actual* key.\r\n const itemPath = keyToCut.split('.').slice(1);\r\n console.log('itemValue keyToCut', keyToCut);\r\n effectiveSetState(value as any, itemPath, {\r\n updateType: 'cut',\r\n });\r\n } else {\r\n // Item does not exist, so we INSERT it.\r\n effectiveSetState(value as any, path, { updateType: 'insert' });\r\n }\r\n };\r\n }\r\n if (prop === 'findWith') {\r\n return (\r\n searchKey: keyof InferArrayElement<T>,\r\n searchValue: any\r\n ) => {\r\n const arrayKeys = getGlobalStore\r\n .getState()\r\n .getShadowMetadata(stateKey, path)?.arrayKeys;\r\n\r\n if (!arrayKeys) {\r\n throw new Error('No array keys found for sorting');\r\n }\r\n\r\n let value = null;\r\n let foundPath: string[] = [];\r\n\r\n for (const fullPath of arrayKeys) {\r\n let shadowValue = getGlobalStore\r\n .getState()\r\n .getShadowValue(fullPath, meta?.validIds);\r\n if (shadowValue && shadowValue[searchKey] === searchValue) {\r\n value = shadowValue;\r\n foundPath = fullPath.split('.').slice(1);\r\n break;\r\n }\r\n }\r\n\r\n return rebuildStateShape({\r\n currentState: value as any,\r\n path: foundPath,\r\n componentId: componentId!,\r\n meta,\r\n });\r\n };\r\n }\r\n }\r\n\r\n if (prop === 'cut') {\r\n let shadowValue = getGlobalStore\r\n .getState()\r\n .getShadowValue(path.join('.'));\r\n\r\n return () => {\r\n effectiveSetState(shadowValue, path, { updateType: 'cut' });\r\n };\r\n }\r\n\r\n if (prop === 'get') {\r\n return () => {\r\n registerComponentDependency(stateKey, componentId, path);\r\n return getGlobalStore\r\n .getState()\r\n .getShadowValue(stateKeyPathKey, meta?.validIds);\r\n };\r\n }\r\n if (prop === 'getState') {\r\n return () => {\r\n return getGlobalStore\r\n .getState()\r\n .getShadowValue(stateKeyPathKey, meta?.validIds);\r\n };\r\n }\r\n\r\n if (prop === '$derive') {\r\n return (fn: any) =>\r\n $cogsSignal({\r\n _stateKey: stateKey,\r\n _path: path,\r\n _effect: fn.toString(),\r\n _meta: meta,\r\n });\r\n }\r\n // in CogsState.ts -> createProxyHandler -> handler -> get\r\n\r\n if (prop === '$get') {\r\n return () =>\r\n $cogsSignal({ _stateKey: stateKey, _path: path, _meta: meta });\r\n }\r\n if (prop === 'lastSynced') {\r\n const syncKey = `${stateKey}:${path.join('.')}`;\r\n return getGlobalStore.getState().getSyncInfo(syncKey);\r\n }\r\n if (prop == 'getLocalStorage') {\r\n return (key: string) =>\r\n loadFromLocalStorage(sessionId + '-' + stateKey + '-' + key);\r\n }\r\n\r\n if (prop === 'isSelected') {\r\n const parentPath = [stateKey, ...path].slice(0, -1);\r\n notifySelectionComponents(stateKey, path, undefined);\r\n if (\r\n Array.isArray(\r\n getGlobalStore\r\n .getState()\r\n .getShadowValue(parentPath.join('.'), meta?.validIds)\r\n )\r\n ) {\r\n const itemId = path[path.length - 1];\r\n const fullParentKey = parentPath.join('.');\r\n\r\n const selectedItemKey = getGlobalStore\r\n .getState()\r\n .selectedIndicesMap.get(fullParentKey);\r\n\r\n const fullItemKey = stateKey + '.' + path.join('.');\r\n\r\n return selectedItemKey === fullItemKey;\r\n }\r\n return undefined;\r\n }\r\n\r\n // Then use it in both:\r\n if (prop === 'setSelected') {\r\n return (value: boolean) => {\r\n const parentPath = path.slice(0, -1);\r\n const fullParentKey = stateKey + '.' + parentPath.join('.');\r\n const fullItemKey = stateKey + '.' + path.join('.');\r\n\r\n notifySelectionComponents(stateKey, parentPath, undefined);\r\n\r\n const selectedIndex = getGlobalStore\r\n .getState()\r\n .selectedIndicesMap.get(fullParentKey);\r\n\r\n if (value) {\r\n getGlobalStore\r\n .getState()\r\n .setSelectedIndex(fullParentKey, fullItemKey);\r\n }\r\n };\r\n }\r\n\r\n if (prop === 'toggleSelected') {\r\n return () => {\r\n const parentPath = path.slice(0, -1);\r\n const fullParentKey = stateKey + '.' + parentPath.join('.');\r\n const fullItemKey = stateKey + '.' + path.join('.');\r\n\r\n const currentSelected = getGlobalStore\r\n .getState()\r\n .selectedIndicesMap.get(fullParentKey);\r\n\r\n if (currentSelected === fullItemKey) {\r\n getGlobalStore\r\n .getState()\r\n .clearSelectedIndex({ arrayKey: fullParentKey });\r\n } else {\r\n getGlobalStore\r\n .getState()\r\n .setSelectedIndex(fullParentKey, fullItemKey);\r\n }\r\n };\r\n }\r\n if (prop === '_componentId') {\r\n return componentId;\r\n }\r\n if (path.length == 0) {\r\n if (prop === 'addValidation') {\r\n return (errors: ValidationError[]) => {\r\n const init = getGlobalStore\r\n .getState()\r\n .getInitialOptions(stateKey)?.validation;\r\n if (!init?.key) throw new Error('Validation key not found');\r\n removeValidationError(init.key);\r\n errors.forEach((error) => {\r\n const fullErrorPath = [init.key, ...error.path].join('.');\r\n addValidationError(fullErrorPath, error.message);\r\n });\r\n notifyComponents(stateKey);\r\n };\r\n }\r\n if (prop === 'applyJsonPatch') {\r\n return (patches: Operation[]) => {\r\n const store = getGlobalStore.getState();\r\n const rootMeta = store.getShadowMetadata(stateKey, []);\r\n if (!rootMeta?.components) return;\r\n\r\n const convertPath = (jsonPath: string): string[] => {\r\n if (!jsonPath || jsonPath === '/') return [];\r\n return jsonPath\r\n .split('/')\r\n .slice(1)\r\n .map((p) => p.replace(/~1/g, '/').replace(/~0/g, '~'));\r\n };\r\n\r\n const notifiedComponents = new Set<string>();\r\n\r\n for (const patch of patches) {\r\n const relativePath = convertPath(patch.path);\r\n\r\n switch (patch.op) {\r\n case 'add':\r\n case 'replace': {\r\n const { value } = patch as {\r\n op: 'add' | 'replace';\r\n path: string;\r\n value: any;\r\n };\r\n store.updateShadowAtPath(stateKey, relativePath, value);\r\n store.markAsDirty(stateKey, relativePath, { bubble: true });\r\n\r\n // Bubble up - notify components at this path and all parent paths\r\n let currentPath = [...relativePath];\r\n while (true) {\r\n const pathMeta = store.getShadowMetadata(\r\n stateKey,\r\n currentPath\r\n );\r\n console.log('pathMeta', pathMeta);\r\n if (pathMeta?.pathComponents) {\r\n pathMeta.pathComponents.forEach((componentId) => {\r\n if (!notifiedComponents.has(componentId)) {\r\n const component =\r\n rootMeta.components?.get(componentId);\r\n if (component) {\r\n component.forceUpdate();\r\n notifiedComponents.add(componentId);\r\n }\r\n }\r\n });\r\n }\r\n\r\n if (currentPath.length === 0) break;\r\n currentPath.pop(); // Go up one level\r\n }\r\n break;\r\n }\r\n case 'remove': {\r\n const parentPath = relativePath.slice(0, -1);\r\n store.removeShadowArrayElement(stateKey, relativePath);\r\n store.markAsDirty(stateKey, parentPath, { bubble: true });\r\n\r\n // Bubble up from parent path\r\n let currentPath = [...parentPath];\r\n while (true) {\r\n const pathMeta = store.getShadowMetadata(\r\n stateKey,\r\n currentPath\r\n );\r\n if (pathMeta?.pathComponents) {\r\n pathMeta.pathComponents.forEach((componentId) => {\r\n if (!notifiedComponents.has(componentId)) {\r\n const component =\r\n rootMeta.components?.get(componentId);\r\n if (component) {\r\n component.forceUpdate();\r\n notifiedComponents.add(componentId);\r\n }\r\n }\r\n });\r\n }\r\n\r\n if (currentPath.length === 0) break;\r\n currentPath.pop();\r\n }\r\n break;\r\n }\r\n }\r\n }\r\n };\r\n }\r\n if (prop === 'validateZodSchema') {\r\n return () => {\r\n const init = getGlobalStore\r\n .getState()\r\n .getInitialOptions(stateKey)?.validation;\r\n\r\n // UPDATED: Select v4 schema, with a fallback to v3\r\n const zodSchema = init?.zodSchemaV4 || init?.zodSchemaV3;\r\n\r\n if (!zodSchema || !init?.key) {\r\n throw new Error(\r\n 'Zod schema (v3 or v4) or validation key not found'\r\n );\r\n }\r\n\r\n removeValidationError(init.key);\r\n const thisObject = getGlobalStore\r\n .getState()\r\n .getShadowValue(stateKey);\r\n\r\n // Use the selected schema for parsing\r\n const result = zodSchema.safeParse(thisObject);\r\n\r\n if (!result.success) {\r\n // This logic already handles both v3 and v4 error types correctly\r\n if ('issues' in result.error) {\r\n // Zod v4 error\r\n result.error.issues.forEach((error) => {\r\n const fullErrorPath = [init.key, ...error.path].join('.');\r\n addValidationError(fullErrorPath, error.message);\r\n });\r\n } else {\r\n // Zod v3 error\r\n (result.error as any).errors.forEach((error: any) => {\r\n const fullErrorPath = [init.key, ...error.path].join('.');\r\n addValidationError(fullErrorPath, error.message);\r\n });\r\n }\r\n\r\n notifyComponents(stateKey);\r\n return false;\r\n }\r\n return true;\r\n };\r\n }\r\n\r\n if (prop === 'getComponents')\r\n return () =>\r\n getGlobalStore.getState().getShadowMetadata(stateKey, [])\r\n ?.components;\r\n if (prop === 'getAllFormRefs')\r\n return () =>\r\n formRefStore.getState().getFormRefsByStateKey(stateKey);\r\n }\r\n if (prop === 'getFormRef') {\r\n return () =>\r\n formRefStore.getState().getFormRef(stateKey + '.' + path.join('.'));\r\n }\r\n if (prop === 'validationWrapper') {\r\n return ({\r\n children,\r\n hideMessage,\r\n }: {\r\n children: React.ReactNode;\r\n hideMessage?: boolean;\r\n }) => (\r\n <ValidationWrapper\r\n formOpts={\r\n hideMessage ? { validation: { message: '' } } : undefined\r\n }\r\n path={path}\r\n stateKey={stateKey}\r\n >\r\n {children}\r\n </ValidationWrapper>\r\n );\r\n }\r\n if (prop === '_stateKey') return stateKey;\r\n if (prop === '_path') return path;\r\n if (prop === 'update') {\r\n return (payload: UpdateArg<T>) => {\r\n // Step 1: This is the same. It performs the data update.\r\n effectiveSetState(payload as any, path, { updateType: 'update' });\r\n\r\n return {\r\n /**\r\n * Marks this specific item, which was just updated, as 'synced' (not dirty).\r\n */\r\n synced: () => {\r\n // This function \"remembers\" the path of the item that was just updated.\r\n const shadowMeta = getGlobalStore\r\n .getState()\r\n .getShadowMetadata(stateKey, path);\r\n\r\n // It updates ONLY the metadata for that specific item.\r\n getGlobalStore.getState().setShadowMetadata(stateKey, path, {\r\n ...shadowMeta,\r\n isDirty: false, // EXPLICITLY set to false, not just undefined\r\n stateSource: 'server', // Mark as coming from server\r\n lastServerSync: Date.now(), // Add timestamp\r\n });\r\n\r\n // Force a re-render for components watching this path\r\n const fullPath = [stateKey, ...path].join('.');\r\n getGlobalStore.getState().notifyPathSubscribers(fullPath, {\r\n type: 'SYNC_STATUS_CHANGE',\r\n isDirty: false,\r\n });\r\n },\r\n };\r\n };\r\n }\r\n\r\n if (prop === 'toggle') {\r\n const currentValueAtPath = getGlobalStore\r\n .getState()\r\n .getShadowValue([stateKey, ...path].join('.'));\r\n\r\n console.log('currentValueAtPath', currentValueAtPath);\r\n if (typeof currentState != 'boolean') {\r\n throw new Error('toggle() can only be used on boolean values');\r\n }\r\n return () => {\r\n effectiveSetState(!currentValueAtPath as any, path, {\r\n updateType: 'update',\r\n });\r\n };\r\n }\r\n if (prop === 'formElement') {\r\n return (child: FormControl<T>, formOpts?: FormOptsType) => {\r\n return (\r\n <FormElementWrapper\r\n stateKey={stateKey}\r\n path={path}\r\n rebuildStateShape={rebuildStateShape}\r\n setState={effectiveSetState}\r\n formOpts={formOpts}\r\n renderFn={child as any}\r\n />\r\n );\r\n };\r\n }\r\n const nextPath = [...path, prop];\r\n const nextValue = getGlobalStore\r\n .getState()\r\n .getShadowValue(stateKey, nextPath);\r\n return rebuildStateShape({\r\n currentState: nextValue,\r\n path: nextPath,\r\n componentId: componentId!,\r\n meta,\r\n });\r\n },\r\n };\r\n\r\n const proxyInstance = new Proxy(baseFunction, handler);\r\n shapeCache.set(cacheKey, {\r\n proxy: proxyInstance,\r\n stateVersion: stateVersion,\r\n });\r\n return proxyInstance;\r\n }\r\n\r\n const baseObj = {\r\n removeValidation: (obj?: { validationKey?: string }) => {\r\n if (obj?.validationKey) {\r\n removeValidationError(obj.validationKey);\r\n }\r\n },\r\n revertToInitialState: (obj?: { validationKey?: string }) => {\r\n const init = getGlobalStore\r\n .getState()\r\n .getInitialOptions(stateKey)?.validation;\r\n if (init?.key) {\r\n removeValidationError(init.key);\r\n }\r\n\r\n if (obj?.validationKey) {\r\n removeValidationError(obj.validationKey);\r\n }\r\n\r\n const shadowMeta = getGlobalStore\r\n .getState()\r\n .getShadowMetadata(stateKey, []);\r\n let revertState;\r\n\r\n if (shadowMeta?.stateSource === 'server' && shadowMeta.baseServerState) {\r\n // Revert to last known server state\r\n revertState = shadowMeta.baseServerState;\r\n } else {\r\n // Revert to initial/default state\r\n revertState = getGlobalStore.getState().initialStateGlobal[stateKey];\r\n }\r\n const initialState =\r\n getGlobalStore.getState().initialStateGlobal[stateKey];\r\n\r\n getGlobalStore.getState().clearSelectedIndexesForState(stateKey);\r\n shapeCache.clear();\r\n stateVersion++;\r\n getGlobalStore.getState().initializeShadowState(stateKey, initialState);\r\n const newProxy = rebuildStateShape({\r\n currentState: initialState,\r\n path: [],\r\n componentId: componentId!,\r\n });\r\n const initalOptionsGet = getInitialOptions(stateKey as string);\r\n const localKey = isFunction(initalOptionsGet?.localStorage?.key)\r\n ? initalOptionsGet?.localStorage?.key(initialState)\r\n : initalOptionsGet?.localStorage?.key;\r\n\r\n const storageKey = `${sessionId}-${stateKey}-${localKey}`;\r\n\r\n if (storageKey) {\r\n localStorage.removeItem(storageKey);\r\n }\r\n\r\n const stateEntry = getGlobalStore\r\n .getState()\r\n .getShadowMetadata(stateKey, []);\r\n if (stateEntry) {\r\n stateEntry?.components?.forEach((component) => {\r\n component.forceUpdate();\r\n });\r\n }\r\n\r\n return initialState;\r\n },\r\n updateInitialState: (newState: T) => {\r\n shapeCache.clear();\r\n stateVersion++;\r\n\r\n const newUpdaterState = createProxyHandler(\r\n stateKey,\r\n effectiveSetState,\r\n componentId,\r\n sessionId\r\n );\r\n const initialState =\r\n getGlobalStore.getState().initialStateGlobal[stateKey];\r\n const initalOptionsGet = getInitialOptions(stateKey as string);\r\n const localKey = isFunction(initalOptionsGet?.localStorage?.key)\r\n ? initalOptionsGet?.localStorage?.key(initialState)\r\n : initalOptionsGet?.localStorage?.key;\r\n\r\n const storageKey = `${sessionId}-${stateKey}-${localKey}`;\r\n\r\n if (localStorage.getItem(storageKey)) {\r\n localStorage.removeItem(storageKey);\r\n }\r\n startTransition(() => {\r\n updateInitialStateGlobal(stateKey, newState);\r\n getGlobalStore.getState().initializeShadowState(stateKey, newState);\r\n\r\n const stateEntry = getGlobalStore\r\n .getState()\r\n .getShadowMetadata(stateKey, []);\r\n\r\n if (stateEntry) {\r\n stateEntry?.components?.forEach((component) => {\r\n component.forceUpdate();\r\n });\r\n }\r\n });\r\n\r\n return {\r\n fetchId: (field: keyof T) => (newUpdaterState.get() as any)[field],\r\n };\r\n },\r\n };\r\n const returnShape = rebuildStateShape({\r\n currentState: getGlobalStore.getState().getShadowValue(stateKey, []),\r\n componentId,\r\n path: [],\r\n });\r\n\r\n return returnShape;\r\n}\r\n\r\nexport function $cogsSignal(proxy: {\r\n _path: string[];\r\n _stateKey: string;\r\n _effect?: string;\r\n\r\n _meta?: MetaData;\r\n}) {\r\n return createElement(SignalRenderer, { proxy });\r\n}\r\n\r\nfunction SignalMapRenderer({\r\n proxy,\r\n rebuildStateShape,\r\n}: {\r\n proxy: {\r\n _stateKey: string;\r\n _path: string[];\r\n _meta?: MetaData;\r\n _mapFn: (\r\n setter: any,\r\n index: number,\r\n\r\n arraySetter: any\r\n ) => ReactNode;\r\n };\r\n rebuildStateShape: (stuff: {\r\n currentState: any;\r\n path: string[];\r\n componentId: string;\r\n meta?: MetaData;\r\n }) => any;\r\n}): JSX.Element | null {\r\n const containerRef = useRef<HTMLDivElement>(null);\r\n const instanceIdRef = useRef<string>(`map-${crypto.randomUUID()}`);\r\n const isSetupRef = useRef(false);\r\n const rootsMapRef = useRef<Map<string, any>>(new Map());\r\n\r\n // Setup effect - store the map function in shadow metadata\r\n useEffect(() => {\r\n const container = containerRef.current;\r\n if (!container || isSetupRef.current) return;\r\n\r\n const timeoutId = setTimeout(() => {\r\n // Store map wrapper in metadata\r\n const currentMeta =\r\n getGlobalStore\r\n .getState()\r\n .getShadowMetadata(proxy._stateKey, proxy._path) || {};\r\n\r\n const mapWrappers = currentMeta.mapWrappers || [];\r\n mapWrappers.push({\r\n instanceId: instanceIdRef.current,\r\n mapFn: proxy._mapFn,\r\n containerRef: container,\r\n rebuildStateShape: rebuildStateShape,\r\n path: proxy._path,\r\n componentId: instanceIdRef.current,\r\n meta: proxy._meta,\r\n });\r\n\r\n getGlobalStore\r\n .getState()\r\n .setShadowMetadata(proxy._stateKey, proxy._path, {\r\n ...currentMeta,\r\n mapWrappers,\r\n });\r\n\r\n isSetupRef.current = true;\r\n\r\n // Initial render\r\n renderInitialItems();\r\n }, 0);\r\n\r\n // Cleanup\r\n return () => {\r\n clearTimeout(timeoutId);\r\n if (instanceIdRef.current) {\r\n const currentMeta =\r\n getGlobalStore\r\n .getState()\r\n .getShadowMetadata(proxy._stateKey, proxy._path) || {};\r\n if (currentMeta.mapWrappers) {\r\n currentMeta.mapWrappers = currentMeta.mapWrappers.filter(\r\n (w) => w.instanceId !== instanceIdRef.current\r\n );\r\n getGlobalStore\r\n .getState()\r\n .setShadowMetadata(proxy._stateKey, proxy._path, currentMeta);\r\n }\r\n }\r\n rootsMapRef.current.forEach((root) => root.unmount());\r\n };\r\n }, []);\r\n\r\n const renderInitialItems = () => {\r\n const container = containerRef.current;\r\n if (!container) return;\r\n\r\n const value = getGlobalStore\r\n .getState()\r\n .getShadowValue(\r\n [proxy._stateKey, ...proxy._path].join('.'),\r\n proxy._meta?.validIds\r\n ) as any[];\r\n\r\n if (!Array.isArray(value)) return;\r\n\r\n // --- BUG FIX IS HERE ---\r\n // Prioritize the filtered IDs from the meta object, just like the regular `stateMap`.\r\n // This ensures the keys match the filtered data.\r\n const arrayKeys =\r\n proxy._meta?.validIds ??\r\n getGlobalStore.getState().getShadowMetadata(proxy._stateKey, proxy._path)\r\n ?.arrayKeys ??\r\n [];\r\n // --- END OF FIX ---\r\n\r\n const arraySetter = rebuildStateShape({\r\n currentState: value,\r\n path: proxy._path,\r\n componentId: instanceIdRef.current,\r\n meta: proxy._meta,\r\n });\r\n\r\n value.forEach((item, index) => {\r\n const itemKey = arrayKeys[index]!; // Now this will be the correct key for the filtered item\r\n if (!itemKey) return; // Safeguard if there's a mismatch\r\n\r\n const itemComponentId = uuidv4();\r\n const itemElement = document.createElement('div');\r\n\r\n itemElement.setAttribute('data-item-path', itemKey);\r\n container.appendChild(itemElement);\r\n\r\n const root = createRoot(itemElement);\r\n rootsMapRef.current.set(itemKey, root);\r\n\r\n const itemPath = itemKey.split('.').slice(1) as string[];\r\n\r\n // Render CogsItemWrapper instead of direct render\r\n root.render(\r\n createElement(MemoizedCogsItemWrapper, {\r\n stateKey: proxy._stateKey,\r\n itemComponentId: itemComponentId,\r\n itemPath: itemPath,\r\n localIndex: index,\r\n arraySetter: arraySetter,\r\n rebuildStateShape: rebuildStateShape,\r\n renderFn: proxy._mapFn,\r\n })\r\n );\r\n });\r\n };\r\n\r\n return <div ref={containerRef} data-map-container={instanceIdRef.current} />;\r\n}\r\n\r\nfunction SignalRenderer({\r\n proxy,\r\n}: {\r\n proxy: {\r\n _path: string[];\r\n _stateKey: string;\r\n _effect?: string;\r\n _meta?: MetaData;\r\n };\r\n}) {\r\n const elementRef = useRef<HTMLSpanElement>(null);\r\n const instanceIdRef = useRef<string | null>(null);\r\n const isSetupRef = useRef(false);\r\n const signalId = `${proxy._stateKey}-${proxy._path.join('.')}`;\r\n const value = getGlobalStore\r\n .getState()\r\n .getShadowValue(\r\n [proxy._stateKey, ...proxy._path].join('.'),\r\n proxy._meta?.validIds\r\n );\r\n\r\n // Setup effect - runs only once\r\n useEffect(() => {\r\n const element = elementRef.current;\r\n if (!element || isSetupRef.current) return;\r\n\r\n const timeoutId = setTimeout(() => {\r\n if (!element.parentElement) {\r\n console.warn('Parent element not found for signal', signalId);\r\n return;\r\n }\r\n\r\n const parentElement = element.parentElement;\r\n const childNodes = Array.from(parentElement.childNodes);\r\n const position = childNodes.indexOf(element);\r\n\r\n let parentId = parentElement.getAttribute('data-parent-id');\r\n if (!parentId) {\r\n parentId = `parent-${crypto.randomUUID()}`;\r\n parentElement.setAttribute('data-parent-id', parentId);\r\n }\r\n\r\n instanceIdRef.current = `instance-${crypto.randomUUID()}`;\r\n\r\n // Store signal info in shadow metadata\r\n const currentMeta =\r\n getGlobalStore\r\n .getState()\r\n .getShadowMetadata(proxy._stateKey, proxy._path) || {};\r\n const signals = currentMeta.signals || [];\r\n signals.push({\r\n instanceId: instanceIdRef.current,\r\n parentId,\r\n position,\r\n effect: proxy._effect,\r\n });\r\n\r\n getGlobalStore\r\n .getState()\r\n .setShadowMetadata(proxy._stateKey, proxy._path, {\r\n ...currentMeta,\r\n signals,\r\n });\r\n\r\n let displayValue = value;\r\n if (proxy._effect) {\r\n try {\r\n displayValue = new Function(\r\n 'state',\r\n `return (${proxy._effect})(state)`\r\n )(value);\r\n } catch (err) {\r\n console.error('Error evaluating effect function:', err);\r\n }\r\n }\r\n\r\n if (displayValue !== null && typeof displayValue === 'object') {\r\n displayValue = JSON.stringify(displayValue);\r\n }\r\n const textNode = document.createTextNode(String(displayValue ?? ''));\r\n element.replaceWith(textNode);\r\n isSetupRef.current = true;\r\n }, 0);\r\n\r\n return () => {\r\n clearTimeout(timeoutId);\r\n if (instanceIdRef.current) {\r\n const currentMeta =\r\n getGlobalStore\r\n .getState()\r\n .getShadowMetadata(proxy._stateKey, proxy._path) || {};\r\n if (currentMeta.signals) {\r\n currentMeta.signals = currentMeta.signals.filter(\r\n (s) => s.instanceId !== instanceIdRef.current\r\n );\r\n getGlobalStore\r\n .getState()\r\n .setShadowMetadata(proxy._stateKey, proxy._path, currentMeta);\r\n }\r\n }\r\n };\r\n }, []);\r\n\r\n return createElement('span', {\r\n ref: elementRef,\r\n style: { display: 'contents' },\r\n 'data-signal-id': signalId,\r\n });\r\n}\r\n\r\nconst MemoizedCogsItemWrapper = memo(\r\n ListItemWrapper,\r\n (prevProps, nextProps) => {\r\n // Re-render if any of these change:\r\n return (\r\n prevProps.itemPath.join('.') === nextProps.itemPath.join('.') &&\r\n prevProps.stateKey === nextProps.stateKey &&\r\n prevProps.itemComponentId === nextProps.itemComponentId &&\r\n prevProps.localIndex === nextProps.localIndex\r\n );\r\n }\r\n);\r\n\r\nconst useImageLoaded = (ref: RefObject<HTMLElement>): boolean => {\r\n const [loaded, setLoaded] = useState(false);\r\n\r\n useLayoutEffect(() => {\r\n if (!ref.current) {\r\n setLoaded(true);\r\n return;\r\n }\r\n\r\n const images = Array.from(ref.current.querySelectorAll('img'));\r\n\r\n // If there are no images, we are \"loaded\" immediately.\r\n if (images.length === 0) {\r\n setLoaded(true);\r\n return;\r\n }\r\n\r\n let loadedCount = 0;\r\n const handleImageLoad = () => {\r\n loadedCount++;\r\n if (loadedCount === images.length) {\r\n setLoaded(true);\r\n }\r\n };\r\n\r\n images.forEach((image) => {\r\n if (image.complete) {\r\n handleImageLoad();\r\n } else {\r\n image.addEventListener('load', handleImageLoad);\r\n image.addEventListener('error', handleImageLoad);\r\n }\r\n });\r\n\r\n return () => {\r\n images.forEach((image) => {\r\n image.removeEventListener('load', handleImageLoad);\r\n image.removeEventListener('error', handleImageLoad);\r\n });\r\n };\r\n }, [ref.current]);\r\n\r\n return loaded;\r\n};\r\n\r\nfunction ListItemWrapper({\r\n stateKey,\r\n itemComponentId,\r\n itemPath,\r\n localIndex,\r\n arraySetter,\r\n rebuildStateShape,\r\n renderFn,\r\n}: {\r\n stateKey: string;\r\n itemComponentId: string;\r\n itemPath: string[];\r\n localIndex: number;\r\n arraySetter: any;\r\n\r\n rebuildStateShape: (options: {\r\n currentState: any;\r\n path: string[];\r\n componentId: string;\r\n meta?: any;\r\n }) => any;\r\n renderFn: (\r\n setter: any,\r\n index: number,\r\n\r\n arraySetter: any\r\n ) => React.ReactNode;\r\n}) {\r\n const [, forceUpdate] = useState({});\r\n const { ref: inViewRef, inView } = useInView();\r\n const elementRef = useRef<HTMLDivElement | null>(null);\r\n\r\n const imagesLoaded = useImageLoaded(elementRef);\r\n const hasReportedInitialHeight = useRef(false);\r\n const fullKey = [stateKey, ...itemPath].join('.');\r\n useRegisterComponent(stateKey, itemComponentId, forceUpdate);\r\n\r\n const setRefs = useCallback(\r\n (element: HTMLDivElement | null) => {\r\n elementRef.current = element;\r\n inViewRef(element); // This is the ref from useInView\r\n },\r\n [inViewRef]\r\n );\r\n\r\n useEffect(() => {\r\n getGlobalStore.getState().subscribeToPath(fullKey, (e) => {\r\n forceUpdate({});\r\n });\r\n }, []);\r\n useEffect(() => {\r\n if (!inView || !imagesLoaded || hasReportedInitialHeight.current) {\r\n return;\r\n }\r\n\r\n const element = elementRef.current;\r\n if (element && element.offsetHeight > 0) {\r\n hasReportedInitialHeight.current = true;\r\n const newHeight = element.offsetHeight;\r\n\r\n getGlobalStore.getState().setShadowMetadata(stateKey, itemPath, {\r\n virtualizer: {\r\n itemHeight: newHeight,\r\n domRef: element,\r\n },\r\n });\r\n\r\n const arrayPath = itemPath.slice(0, -1);\r\n const arrayPathKey = [stateKey, ...arrayPath].join('.');\r\n getGlobalStore.getState().notifyPathSubscribers(arrayPathKey, {\r\n type: 'ITEMHEIGHT',\r\n itemKey: itemPath.join('.'),\r\n\r\n ref: elementRef.current,\r\n });\r\n }\r\n }, [inView, imagesLoaded, stateKey, itemPath]);\r\n\r\n const fullItemPath = [stateKey, ...itemPath].join('.');\r\n const itemValue = getGlobalStore.getState().getShadowValue(fullItemPath);\r\n\r\n if (itemValue === undefined) {\r\n return null;\r\n }\r\n\r\n const itemSetter = rebuildStateShape({\r\n currentState: itemValue,\r\n path: itemPath,\r\n componentId: itemComponentId,\r\n });\r\n const children = renderFn(itemSetter, localIndex, arraySetter);\r\n\r\n return <div ref={setRefs}>{children}</div>;\r\n}\r\n\r\nfunction FormElementWrapper({\r\n stateKey,\r\n path,\r\n rebuildStateShape,\r\n renderFn,\r\n formOpts,\r\n setState,\r\n}: {\r\n stateKey: string;\r\n path: string[];\r\n rebuildStateShape: (options: {\r\n currentState: any;\r\n path: string[];\r\n componentId: string;\r\n meta?: any;\r\n }) => any;\r\n renderFn: (params: FormElementParams<any>) => React.ReactNode;\r\n formOpts?: FormOptsType;\r\n setState: any;\r\n}) {\r\n const [componentId] = useState(() => uuidv4());\r\n const [, forceUpdate] = useState({});\r\n\r\n const stateKeyPathKey = [stateKey, ...path].join('.');\r\n useRegisterComponent(stateKey, componentId, forceUpdate);\r\n const globalStateValue = getGlobalStore\r\n .getState()\r\n .getShadowValue(stateKeyPathKey);\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 useEffect(() => {\r\n if (\r\n !isCurrentlyDebouncing.current &&\r\n !isDeepEqual(globalStateValue, localValue)\r\n ) {\r\n setLocalValue(globalStateValue);\r\n }\r\n }, [globalStateValue]);\r\n\r\n useEffect(() => {\r\n const unsubscribe = getGlobalStore\r\n .getState()\r\n .subscribeToPath(stateKeyPathKey, (newValue) => {\r\n if (!isCurrentlyDebouncing.current && localValue !== newValue) {\r\n forceUpdate({});\r\n }\r\n });\r\n return () => {\r\n unsubscribe();\r\n if (debounceTimeoutRef.current) {\r\n clearTimeout(debounceTimeoutRef.current);\r\n isCurrentlyDebouncing.current = false;\r\n }\r\n };\r\n }, []);\r\n\r\n const debouncedUpdate = useCallback(\r\n (newValue: any) => {\r\n const currentType = typeof globalStateValue;\r\n if (currentType === 'number' && typeof newValue === 'string') {\r\n newValue = newValue === '' ? 0 : Number(newValue);\r\n }\r\n setLocalValue(newValue);\r\n isCurrentlyDebouncing.current = true;\r\n\r\n if (debounceTimeoutRef.current) {\r\n clearTimeout(debounceTimeoutRef.current);\r\n }\r\n\r\n const debounceTime = formOpts?.debounceTime ?? 200;\r\n\r\n debounceTimeoutRef.current = setTimeout(() => {\r\n isCurrentlyDebouncing.current = false;\r\n\r\n // Update state\r\n setState(newValue, path, { updateType: 'update' });\r\n\r\n // Perform LIVE validation (gentle)\r\n const { getInitialOptions, setShadowMetadata, getShadowMetadata } =\r\n getGlobalStore.getState();\r\n const validationOptions = getInitialOptions(stateKey)?.validation;\r\n const zodSchema =\r\n validationOptions?.zodSchemaV4 || validationOptions?.zodSchemaV3;\r\n\r\n if (zodSchema) {\r\n const fullState = getGlobalStore.getState().getShadowValue(stateKey);\r\n const result = zodSchema.safeParse(fullState);\r\n\r\n const currentMeta = getShadowMetadata(stateKey, path) || {};\r\n\r\n if (!result.success) {\r\n const errors =\r\n 'issues' in result.error\r\n ? result.error.issues\r\n : (result.error as any).errors;\r\n const pathErrors = errors.filter(\r\n (error: any) =>\r\n JSON.stringify(error.path) === JSON.stringify(path)\r\n );\r\n\r\n if (pathErrors.length > 0) {\r\n setShadowMetadata(stateKey, path, {\r\n ...currentMeta,\r\n validation: {\r\n status: 'INVALID_LIVE',\r\n message: pathErrors[0]?.message,\r\n validatedValue: newValue,\r\n },\r\n });\r\n } else {\r\n // This field has no errors - clear validation\r\n setShadowMetadata(stateKey, path, {\r\n ...currentMeta,\r\n validation: {\r\n status: 'VALID_LIVE',\r\n validatedValue: newValue,\r\n },\r\n });\r\n }\r\n } else {\r\n // Validation passed - clear any existing errors\r\n setShadowMetadata(stateKey, path, {\r\n ...currentMeta,\r\n validation: {\r\n status: 'VALID_LIVE',\r\n validatedValue: newValue,\r\n },\r\n });\r\n }\r\n }\r\n }, debounceTime);\r\n forceUpdate({});\r\n },\r\n [setState, path, formOpts?.debounceTime, stateKey]\r\n );\r\n\r\n // --- NEW onBlur HANDLER ---\r\n // This replaces the old commented-out method with a modern approach.\r\n const handleBlur = useCallback(async () => {\r\n console.log('handleBlur triggered');\r\n\r\n // Commit any pending changes\r\n if (debounceTimeoutRef.current) {\r\n clearTimeout(debounceTimeoutRef.current);\r\n debounceTimeoutRef.current = null;\r\n isCurrentlyDebouncing.current = false;\r\n setState(localValue, path, { updateType: 'update' });\r\n }\r\n\r\n const { getInitialOptions } = getGlobalStore.getState();\r\n const validationOptions = getInitialOptions(stateKey)?.validation;\r\n const zodSchema =\r\n validationOptions?.zodSchemaV4 || validationOptions?.zodSchemaV3;\r\n\r\n if (!zodSchema) return;\r\n\r\n // Get the full path including stateKey\r\n\r\n // Update validation state to \"validating\"\r\n const currentMeta = getGlobalStore\r\n .getState()\r\n .getShadowMetadata(stateKey, path);\r\n getGlobalStore.getState().setShadowMetadata(stateKey, path, {\r\n ...currentMeta,\r\n validation: {\r\n status: 'DIRTY',\r\n validatedValue: localValue,\r\n },\r\n });\r\n\r\n // Validate full state\r\n const fullState = getGlobalStore.getState().getShadowValue(stateKey);\r\n const result = zodSchema.safeParse(fullState);\r\n console.log('result ', result);\r\n if (!result.success) {\r\n const errors =\r\n 'issues' in result.error\r\n ? result.error.issues\r\n : (result.error as any).errors;\r\n\r\n console.log('All validation errors:', errors);\r\n console.log('Current blur path:', path);\r\n\r\n // Find errors for this specific path\r\n const pathErrors = errors.filter((error: any) => {\r\n console.log('Processing error:', error);\r\n\r\n // For array paths, we need to translate indices to ULIDs\r\n if (path.some((p) => p.startsWith('id:'))) {\r\n console.log('Detected array path with ULID');\r\n\r\n // This is an array item path like [\"id:xyz\", \"name\"]\r\n const parentPath = path[0]!.startsWith('id:')\r\n ? []\r\n : path.slice(0, -1);\r\n\r\n console.log('Parent path:', parentPath);\r\n\r\n const arrayMeta = getGlobalStore\r\n .getState()\r\n .getShadowMetadata(stateKey, parentPath);\r\n\r\n console.log('Array metadata:', arrayMeta);\r\n\r\n if (arrayMeta?.arrayKeys) {\r\n const itemKey = [stateKey, ...path.slice(0, -1)].join('.');\r\n const itemIndex = arrayMeta.arrayKeys.indexOf(itemKey);\r\n\r\n console.log('Item key:', itemKey, 'Index:', itemIndex);\r\n\r\n // Compare with Zod path\r\n const zodPath = [...parentPath, itemIndex, ...path.slice(-1)];\r\n const match =\r\n JSON.stringify(error.path) === JSON.stringify(zodPath);\r\n\r\n console.log('Zod path comparison:', {\r\n zodPath,\r\n errorPath: error.path,\r\n match,\r\n });\r\n return match;\r\n }\r\n }\r\n\r\n const directMatch = JSON.stringify(error.path) === JSON.stringify(path);\r\n console.log('Direct path comparison:', {\r\n errorPath: error.path,\r\n currentPath: path,\r\n match: directMatch,\r\n });\r\n return directMatch;\r\n });\r\n\r\n console.log('Filtered path errors:', pathErrors);\r\n // Update shadow metadata with validation result\r\n getGlobalStore.getState().setShadowMetadata(stateKey, path, {\r\n ...currentMeta,\r\n validation: {\r\n status: 'VALIDATION_FAILED',\r\n message: pathErrors[0]?.message,\r\n validatedValue: localValue,\r\n },\r\n });\r\n } else {\r\n // Validation passed\r\n getGlobalStore.getState().setShadowMetadata(stateKey, path, {\r\n ...currentMeta,\r\n validation: {\r\n status: 'VALID_PENDING_SYNC',\r\n validatedValue: localValue,\r\n },\r\n });\r\n }\r\n forceUpdate({});\r\n }, [stateKey, path, localValue, setState]);\r\n\r\n const baseState = rebuildStateShape({\r\n currentState: globalStateValue,\r\n path: path,\r\n componentId: componentId,\r\n });\r\n\r\n const stateWithInputProps = new Proxy(baseState, {\r\n get(target, prop) {\r\n if (prop === 'inputProps') {\r\n return {\r\n value: localValue ?? '',\r\n onChange: (e: any) => {\r\n debouncedUpdate(e.target.value);\r\n },\r\n // 5. Wire the new onBlur handler to the input props.\r\n onBlur: handleBlur,\r\n ref: formRefStore\r\n .getState()\r\n .getFormRef(stateKey + '.' + path.join('.')),\r\n };\r\n }\r\n\r\n return target[prop];\r\n },\r\n });\r\n\r\n return (\r\n <ValidationWrapper formOpts={formOpts} path={path} stateKey={stateKey}>\r\n {renderFn(stateWithInputProps)}\r\n </ValidationWrapper>\r\n );\r\n}\r\nfunction useRegisterComponent(\r\n stateKey: string,\r\n componentId: string,\r\n forceUpdate: (o: object) => void\r\n) {\r\n const fullComponentId = `${stateKey}////${componentId}`;\r\n\r\n useLayoutEffect(() => {\r\n const { registerComponent, unregisterComponent } =\r\n getGlobalStore.getState();\r\n\r\n // Call the safe, centralized function to register\r\n registerComponent(stateKey, fullComponentId, {\r\n forceUpdate: () => forceUpdate({}),\r\n paths: new Set(),\r\n reactiveType: ['component'],\r\n });\r\n\r\n // The cleanup now calls the safe, centralized unregister function\r\n return () => {\r\n unregisterComponent(stateKey, fullComponentId);\r\n };\r\n }, [stateKey, fullComponentId]); // Dependencies are stable and correct\r\n}\r\n"],"names":["setAndMergeOptions","stateKey","newOptions","getInitialOptions","getGlobalStore","setInitialStateOptions","initialOptions","setOptions","options","initialOptionsPart","initialOptionsPartState","mergedOptions","needToAdd","key","isDeepEqual","addStateOptions","initialState","formElements","validation","createCogsState","opt","newInitialState","statePart","transformStateFunc","existingOptions","existingGlobalOptions","useCogsState","componentId","useState","uuidv4","apiParamsSchema","enhancedOptions","thiState","partialState","useCogsStateFn","setCogsOptions","loadAndApplyLocalStorage","notifyComponents","createCogsStateFromSync","syncSchema","schemas","apiParamsMap","entry","getValidationErrors","setStateLog","updateInitialStateGlobal","addValidationError","removeValidationError","saveToLocalStorage","state","thisKey","currentInitialOptions","sessionId","lastSyncedWithServer","isFunction","storageKey","existingLastSynced","loadFromLocalStorage","shadowMeta","data","superJsonResult","superjson","localStorageKey","storedData","error","currentState","useCogsConfig","localkey","localData","stateEntry","updates","component","update","notifyComponent","fullComponentId","markEntireStateAsServerSynced","path","timestamp","store","currentMeta","arrayMeta","itemKey","index","itemPath","itemData","fieldPath","fieldData","stateObject","localStorage","reactiveDeps","reactiveType","defaultState","syncUpdate","dependencies","serverState","reactiveForce","forceUpdate","noStateKey","stateLog","componentUpdatesRef","useRef","componentIdRef","latestInitialOptionsRef","useEffect","syncKey","resolveInitialState","useCallback","overrideOptions","currentOptions","finalDefaultState","localKey","event","serverStateData","mergeConfig","incomingData","keyField","existingIds","item","newUniqueItems","newItemKey","newItemPath","itemValue","fieldKey","meta","existingMeta","resolvedState","source","useLayoutEffect","componentKey","rootMeta","components","fullPath","pathMeta","syncApiRef","effectiveSetState","newStateOrFunction","updateObj","pathKey","nestedShadowValue","payload","newUpdate","parentArrayPath","displayValue","parentId","position","effect","parent","childNodes","finalDisplayValue","err","sourceArrayKeys","newItemValue","fullSourceArray","wrapper","shouldRender","insertPosition","transform","currentValidKeys","applyTransforms","sortTransform","t","allItems","a","b","itemElement","children","root","createRoot","arraySetter","createElement","MemoizedCogsItemWrapper","arrayPath","elementToRemove","newState","notifiedComponents","currentPath","currentPathMeta","isArray","getDifferences","subPathString","subPath","fullSubPath","subPathMeta","parentMeta","parentFullPath","parentValue","reactiveTypes","newDeps","shouldUpdate","prevLogs","logs","aggregatedLogs","log","uniqueKey","existing","updaterFinal","useMemo","createProxyHandler","cogsSyncFn","hashTransforms","transforms","arrayKeys","itemsWithKeys","value","registerComponentDependency","dependencyPath","addPathComponent","getShadowMetadata","notifySelectionComponents","parentPath","currentSelected","arrayKey","selectedItem","shapeCache","stateVersion","invalidateCachePath","rebuildStateShape","cacheKey","stateKeyPathKey","baseFunction","handler","target","thisArg","args","prop","baseObj","baseState","sync","validationKey","response","errorPath","getStatusFunc","initalOptionsGet","fullKey","selectedIndicesMap","selectedItemKey","itemHeight","overscan","stickToBottom","scrollStickTolerance","containerRef","range","setRange","rerender","initialScrollRef","scrollStateRef","measurementCache","container","totalHeight","itemOffsets","runningOffset","offsets","measuredHeight","waitForContainer","visibleCount","endIndex","startIndex","scrollToBottom","handleScroll","currentScrollTop","scrollHeight","clientHeight","scrollState","distanceFromBottom","wasNearBottom","newStartIndex","i","behavior","performScroll","attemptScroll","attempts","currentHeight","currentScroll","newHeight","newScroll","scrollTimeout","debouncedScrollToBottom","observer","handleImageLoad","e","sourceArray","currentKeys","slicedArray","slicedIds","offset","callbackfn","setArrayKeys","shadowValue","itemSetter","SignalMapRenderer","newValidIds","filteredArray","val","compareFn","itemsWithIds","bufferSize","flushInterval","bufferStrategy","onFlush","buffer","isPaused","flushTimer","addToBuffer","flushBuffer","toFlush","result","streamId","streams","componentIdsRef","updateTrigger","validIds","arrayValues","cached","freshValidIds","freshValues","unsubscribe","caches","jsx","Fragment","localIndex","itemComponentId","fieldName","arrayToMap","flattenedResults","itemId","currentArray","lastIndex","lastValue","newPath","fields","onMatch","newValue","matchedItem","isMatch","field","updatedItem","updatedArray","validKeys","indexToCut","fullIdToCut","pathForCut","indexKeyToCut","relevantKeys","keyToCut","searchKey","searchValue","foundPath","fn","$cogsSignal","fullParentKey","fullItemKey","errors","init","fullErrorPath","patches","convertPath","jsonPath","p","patch","relativePath","zodSchema","thisObject","formRefStore","hideMessage","ValidationWrapper","currentValueAtPath","child","formOpts","FormElementWrapper","nextPath","nextValue","proxyInstance","obj","newUpdaterState","startTransition","proxy","SignalRenderer","instanceIdRef","isSetupRef","rootsMapRef","timeoutId","mapWrappers","renderInitialItems","w","elementRef","signalId","element","parentElement","signals","textNode","s","memo","ListItemWrapper","prevProps","nextProps","useImageLoaded","ref","loaded","setLoaded","images","loadedCount","image","renderFn","inViewRef","inView","useInView","imagesLoaded","hasReportedInitialHeight","useRegisterComponent","setRefs","arrayPathKey","fullItemPath","setState","globalStateValue","localValue","setLocalValue","isCurrentlyDebouncing","debounceTimeoutRef","debouncedUpdate","debounceTime","setShadowMetadata","validationOptions","fullState","pathErrors","handleBlur","itemIndex","zodPath","match","directMatch","stateWithInputProps","registerComponent","unregisterComponent"],"mappings":"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"}
|