cogsbox-state 0.5.465 → 0.5.467
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/README.md +3 -3
- package/dist/CogsState.d.ts +1 -0
- package/dist/CogsState.d.ts.map +1 -1
- package/dist/CogsState.jsx +1008 -1273
- package/dist/CogsState.jsx.map +1 -1
- package/dist/Components.d.ts +39 -0
- package/dist/Components.d.ts.map +1 -0
- package/dist/Components.jsx +281 -0
- package/dist/Components.jsx.map +1 -0
- package/dist/index.js +11 -12
- package/dist/store.d.ts +2 -6
- package/dist/store.d.ts.map +1 -1
- package/dist/store.js +274 -236
- package/dist/store.js.map +1 -1
- package/package.json +1 -1
- package/src/CogsState.tsx +144 -709
- package/src/Components.tsx +541 -0
- package/src/store.ts +293 -221
- package/dist/Functions.d.ts +0 -11
- package/dist/Functions.d.ts.map +0 -1
- package/dist/Functions.jsx +0 -29
- package/dist/Functions.jsx.map +0 -1
- package/src/Functions.tsx +0 -66
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 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 buildShadowNode,\r\n formRefStore,\r\n getGlobalStore,\r\n METADATA_KEYS,\r\n ValidationError,\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\n\r\ntype EffectFunction<T, R> = (state: T, deps: any[]) => R;\r\nexport type EndType<T, IsArrayElement = false> = {\r\n addZodValidation: (errors: ValidationError[]) => void;\r\n clearZodValidation: (paths?: string[]) => 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\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 ? { cutThis: () => 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\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\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 | null,\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\ntype UseSyncType<T> = (state: T, a: SyncOptionsType<any>) => SyncApi;\r\ntype SyncOptionsType<TApiParams> = {\r\n apiParams: TApiParams;\r\n stateKey?: string;\r\n stateRoom:\r\n | number\r\n | string\r\n | (({ clientId }: { clientId: string }) => string | null);\r\n connect?: boolean;\r\n inMemoryState?: boolean;\r\n};\r\nexport type OptionsType<T extends unknown = unknown, TApiParams = never> = {\r\n log?: boolean;\r\n componentId?: string;\r\n syncOptions?: SyncOptionsType<TApiParams>;\r\n\r\n validation?: ValidationOptionsType;\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;\r\n };\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?: ({ update }: { update: UpdateTypeDetail }) => 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\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 hasErrors: boolean;\r\n hasWarnings: boolean;\r\n allErrors: ValidationError[];\r\n\r\n path: string[];\r\n message?: string;\r\n getData?: () => T;\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\nconst {\r\n getInitialOptions,\r\n updateInitialStateGlobal,\r\n // ALIAS THE NEW FUNCTIONS TO THE OLD NAMES\r\n getShadowMetadata,\r\n setShadowMetadata,\r\n getShadowValue,\r\n initializeShadowState,\r\n updateShadowAtPath,\r\n insertShadowArrayElement,\r\n removeShadowArrayElement,\r\n getSelectedIndex,\r\n setInitialStateOptions,\r\n setServerStateUpdate,\r\n markAsDirty,\r\n registerComponent,\r\n unregisterComponent,\r\n addPathComponent,\r\n clearSelectedIndexesForState,\r\n addStateLog,\r\n setSyncInfo,\r\n clearSelectedIndex,\r\n getSyncInfo,\r\n notifyPathSubscribers,\r\n subscribeToPath,\r\n // Note: The old functions are no longer imported under their original names\r\n} = getGlobalStore.getState();\r\nfunction getArrayData(stateKey: string, path: string[], meta?: MetaData) {\r\n const shadowMeta = getShadowMetadata(stateKey, path);\r\n const isArray = !!shadowMeta?.arrayKeys;\r\n\r\n if (!isArray) {\r\n const value = getGlobalStore.getState().getShadowValue(stateKey, path);\r\n return { isArray: false, value, keys: [] };\r\n }\r\n\r\n const arrayPathKey = path.join('.');\r\n const viewIds = meta?.arrayViews?.[arrayPathKey] ?? shadowMeta.arrayKeys;\r\n\r\n // FIX: If the derived view is empty, return an empty array and keys.\r\n if (Array.isArray(viewIds) && viewIds.length === 0) {\r\n return { isArray: true, value: [], keys: [] };\r\n }\r\n\r\n const value = getGlobalStore\r\n .getState()\r\n .getShadowValue(stateKey, path, viewIds);\r\n\r\n return { isArray: true, value, keys: viewIds ?? [] };\r\n}\r\n\r\nfunction findArrayItem(\r\n array: any[],\r\n keys: string[],\r\n predicate: (item: any, index: number) => boolean\r\n): { key: string; index: number; value: any } | null {\r\n for (let i = 0; i < array.length; i++) {\r\n if (predicate(array[i], i)) {\r\n const key = keys[i];\r\n if (key) {\r\n return { key, index: i, value: array[i] };\r\n }\r\n }\r\n }\r\n return null;\r\n}\r\n\r\nfunction setAndMergeOptions(stateKey: string, newOptions: OptionsType<any>) {\r\n const initialOptions = getInitialOptions(stateKey as string) || {};\r\n\r\n setInitialStateOptions(stateKey as string, {\r\n ...initialOptions,\r\n ...newOptions,\r\n });\r\n}\r\nfunction setOptions<StateKey, Opt>({\r\n stateKey,\r\n options,\r\n initialOptionsPart,\r\n}: {\r\n stateKey: StateKey;\r\n options?: OptionsType<any>;\r\n initialOptionsPart: Record<string, any>;\r\n}) {\r\n const initialOptions = getInitialOptions(stateKey as string) || {};\r\n const initialOptionsPartState = initialOptionsPart[stateKey as string] || {};\r\n\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 // Always preserve syncOptions if it exists in mergedOptions but not in options\r\n if (\r\n mergedOptions.syncOptions &&\r\n (!options || !options.hasOwnProperty('syncOptions'))\r\n ) {\r\n needToAdd = true;\r\n }\r\n\r\n if (needToAdd) {\r\n setInitialStateOptions(stateKey as string, mergedOptions);\r\n }\r\n}\r\n\r\nexport function addStateOptions<T extends unknown>(\r\n initialState: T,\r\n { formElements, validation }: OptionsType<T>\r\n) {\r\n return { initialState: initialState, formElements, validation } as T;\r\n}\r\n\r\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\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>;\r\n __useSync?: UseSyncType<State>;\r\n __syncSchemas?: Record<string, any>;\r\n }\r\n) => {\r\n let newInitialState = initialState;\r\n const [statePart, initialOptionsPart] =\r\n transformStateFunc<State>(newInitialState);\r\n\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 if (opt?.__fromSyncSchema && opt?.__apiParamsMap) {\r\n getGlobalStore\r\n .getState()\r\n .setInitialStateOptions('__apiParamsMap', opt.__apiParamsMap);\r\n }\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 if (opt?.__syncSchemas?.[key]?.schemas?.validation) {\r\n mergedOptions.validation = {\r\n zodSchemaV4: opt.__syncSchemas[key].schemas.validation,\r\n ...existingOptions.validation,\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 setInitialStateOptions(key, mergedOptions);\r\n } else {\r\n // Merge with existing global options\r\n 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 initializeShadowState(key, statePart[key]);\r\n });\r\n console.log('new stateObject ', getGlobalStore.getState().shadowStateStore);\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\r\n setOptions({\r\n stateKey,\r\n options,\r\n initialOptionsPart,\r\n });\r\n const thiState =\r\n getShadowValue(stateKey as string, []) || 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 syncOptions: options?.syncOptions,\r\n __useSync: opt?.__useSync as UseSyncType<(typeof statePart)[StateKey]>,\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, never>;\r\n};\r\ntype UseCogsStateHook<\r\n T extends Record<string, any>,\r\n TApiParamsMap extends Record<string, any> = never,\r\n> = <StateKey extends keyof TransformedStateType<T> & string>(\r\n stateKey: StateKey,\r\n options?: [TApiParamsMap] extends [never]\r\n ? // When TApiParamsMap is never (no sync)\r\n Prettify<OptionsType<TransformedStateType<T>[StateKey]>>\r\n : // When TApiParamsMap exists (sync enabled)\r\n StateKey extends keyof TApiParamsMap\r\n ? Prettify<\r\n OptionsType<\r\n TransformedStateType<T>[StateKey],\r\n TApiParamsMap[StateKey]\r\n > & {\r\n syncOptions: Prettify<SyncOptionsType<TApiParamsMap[StateKey]>>;\r\n }\r\n >\r\n : Prettify<OptionsType<TransformedStateType<T>[StateKey]>>\r\n) => StateObject<TransformedStateType<T>[StateKey]>;\r\n\r\n// Update CogsApi to default to never instead of Record<string, never>\r\ntype CogsApi<\r\n T extends Record<string, any>,\r\n TApiParamsMap extends Record<string, any> = never,\r\n> = {\r\n useCogsState: UseCogsStateHook<T, TApiParamsMap>;\r\n setCogsOptions: SetCogsOptionsFunc<T>;\r\n};\r\ntype GetParamType<SchemaEntry> = SchemaEntry extends {\r\n api?: { queryData?: { _paramType?: infer P } };\r\n}\r\n ? P\r\n : never;\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 api?: {\r\n queryData?: any;\r\n };\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 useSync: UseSyncType<any>\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']]: GetParamType<\r\n TSyncSchema['schemas'][K]\r\n >;\r\n }\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 // Extract apiParams from the api.queryData._paramType\r\n if (entry?.api?.queryData?._paramType) {\r\n apiParamsMap[key] = entry.api.queryData._paramType;\r\n }\r\n }\r\n\r\n return createCogsState(initialState, {\r\n __fromSyncSchema: true,\r\n __syncNotifications: syncSchema.notifications,\r\n __apiParamsMap: apiParamsMap,\r\n __useSync: useSync,\r\n __syncSchemas: schemas,\r\n }) as any;\r\n}\r\n\r\nconst saveToLocalStorage = <T,>(\r\n state: T,\r\n thisKey: string,\r\n currentInitialOptions: any,\r\n sessionId?: string,\r\n 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 = 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 = 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 = 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\nfunction markEntireStateAsServerSynced(\r\n stateKey: string,\r\n path: string[],\r\n data: any,\r\n timestamp: number\r\n) {\r\n // Mark current path as synced\r\n const currentMeta = getShadowMetadata(stateKey, path);\r\n 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 = getShadowMetadata(stateKey, path);\r\n if (arrayMeta?.arrayKeys) {\r\n arrayMeta.arrayKeys.forEach((itemKey, index) => {\r\n // Fix: Don't split the itemKey, just use it directly\r\n const itemPath = [...path, itemKey];\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// 5. Batch queue\r\nlet updateBatchQueue: any[] = [];\r\nlet isFlushScheduled = false;\r\n\r\nfunction scheduleFlush() {\r\n if (!isFlushScheduled) {\r\n isFlushScheduled = true;\r\n queueMicrotask(flushQueue);\r\n }\r\n}\r\nfunction handleUpdate(\r\n stateKey: string,\r\n path: string[],\r\n payload: any\r\n): { type: 'update'; oldValue: any; newValue: any; shadowMeta: any } {\r\n // ✅ FIX: Get the old value before the update.\r\n const oldValue = getGlobalStore.getState().getShadowValue(stateKey, path);\r\n\r\n const newValue = isFunction(payload) ? payload(oldValue) : payload;\r\n\r\n // ✅ FIX: The new `updateShadowAtPath` handles metadata preservation automatically.\r\n // The manual loop has been removed.\r\n updateShadowAtPath(stateKey, path, newValue);\r\n\r\n markAsDirty(stateKey, path, { bubble: true });\r\n\r\n // Return the metadata of the node *after* the update.\r\n const newShadowMeta = getShadowMetadata(stateKey, path);\r\n\r\n return {\r\n type: 'update',\r\n oldValue: oldValue,\r\n newValue,\r\n shadowMeta: newShadowMeta,\r\n };\r\n}\r\n// 2. Update signals\r\nfunction updateSignals(shadowMeta: any, displayValue: any) {\r\n if (!shadowMeta?.signals?.length) return;\r\n\r\n shadowMeta.signals.forEach(({ parentId, position, effect }: any) => {\r\n const parent = document.querySelector(`[data-parent-id=\"${parentId}\"]`);\r\n if (!parent) return;\r\n\r\n const childNodes = Array.from(parent.childNodes);\r\n if (!childNodes[position]) return;\r\n\r\n let finalDisplayValue = displayValue;\r\n if (effect && displayValue !== null) {\r\n try {\r\n finalDisplayValue = new Function('state', `return (${effect})(state)`)(\r\n displayValue\r\n );\r\n } catch (err) {\r\n console.error('Error evaluating effect function:', err);\r\n }\r\n }\r\n\r\n if (finalDisplayValue !== null && typeof finalDisplayValue === 'object') {\r\n finalDisplayValue = JSON.stringify(finalDisplayValue);\r\n }\r\n\r\n childNodes[position].textContent = String(finalDisplayValue ?? '');\r\n });\r\n}\r\n\r\nfunction getComponentNotifications(\r\n stateKey: string,\r\n path: string[],\r\n result: any\r\n): Set<any> {\r\n const rootMeta = getShadowMetadata(stateKey, []);\r\n\r\n if (!rootMeta?.components) {\r\n return new Set();\r\n }\r\n\r\n const componentsToNotify = new Set<any>();\r\n\r\n // --- PASS 1: Notify specific subscribers based on update type ---\r\n\r\n if (result.type === 'update') {\r\n // --- Bubble-up Notification ---\r\n // An update to `user.address.street` notifies listeners of `street`, `address`, and `user`.\r\n let currentPath = [...path];\r\n while (true) {\r\n const pathMeta = getShadowMetadata(stateKey, currentPath);\r\n\r\n if (pathMeta?.pathComponents) {\r\n pathMeta.pathComponents.forEach((componentId: string) => {\r\n const component = rootMeta.components?.get(componentId);\r\n // NEW: Add component to the set instead of calling forceUpdate()\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 componentsToNotify.add(component);\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\r\n // --- Deep Object Change Notification ---\r\n // If the new value is an object, notify components subscribed to sub-paths that changed.\r\n if (\r\n result.newValue &&\r\n typeof result.newValue === 'object' &&\r\n !isArray(result.newValue)\r\n ) {\r\n const changedSubPaths = getDifferences(result.newValue, result.oldValue);\r\n\r\n changedSubPaths.forEach((subPathString: string) => {\r\n const subPath = subPathString.split('.');\r\n const fullSubPath = [...path, ...subPath];\r\n const subPathMeta = getShadowMetadata(stateKey, fullSubPath);\r\n\r\n if (subPathMeta?.pathComponents) {\r\n subPathMeta.pathComponents.forEach((componentId: string) => {\r\n const component = rootMeta.components?.get(componentId);\r\n // NEW: Add component to the set\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 componentsToNotify.add(component);\r\n }\r\n }\r\n });\r\n }\r\n });\r\n }\r\n } else if (result.type === 'insert' || result.type === 'cut') {\r\n // For array structural changes (add/remove), notify components listening to the parent array.\r\n const parentArrayPath = result.type === 'insert' ? path : path.slice(0, -1);\r\n const parentMeta = getShadowMetadata(stateKey, parentArrayPath);\r\n\r\n if (parentMeta?.pathComponents) {\r\n parentMeta.pathComponents.forEach((componentId: string) => {\r\n const component = rootMeta.components?.get(componentId);\r\n // NEW: Add component to the set\r\n if (component) {\r\n componentsToNotify.add(component);\r\n }\r\n });\r\n }\r\n }\r\n\r\n // --- PASS 2: Handle 'all' and 'deps' reactivity types ---\r\n // Iterate over all components for this stateKey that haven't been notified yet.\r\n rootMeta.components.forEach((component, componentId) => {\r\n // If we've already added this component, skip it.\r\n if (componentsToNotify.has(component)) {\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 componentsToNotify.add(component);\r\n } else if (reactiveTypes.includes('deps') && component.depsFunction) {\r\n const currentState = getShadowValue(stateKey, []);\r\n const newDeps = component.depsFunction(currentState);\r\n\r\n if (\r\n newDeps === true ||\r\n (Array.isArray(newDeps) && !isDeepEqual(component.prevDeps, newDeps))\r\n ) {\r\n component.prevDeps = newDeps as any; // Update the dependencies for the next check\r\n componentsToNotify.add(component);\r\n }\r\n }\r\n });\r\n\r\n return componentsToNotify;\r\n}\r\n\r\nfunction handleInsert(\r\n stateKey: string,\r\n path: string[],\r\n payload: any\r\n): { type: 'insert'; newValue: any; shadowMeta: any } {\r\n let newValue;\r\n if (isFunction(payload)) {\r\n const { value: currentValue } = getScopedData(stateKey, path);\r\n newValue = payload({ state: currentValue, uuid: uuidv4() });\r\n } else {\r\n newValue = payload;\r\n }\r\n\r\n insertShadowArrayElement(stateKey, path, newValue);\r\n markAsDirty(stateKey, path, { bubble: true });\r\n\r\n const updatedMeta = getShadowMetadata(stateKey, path);\r\n if (updatedMeta?.arrayKeys) {\r\n const newItemKey = updatedMeta.arrayKeys[updatedMeta.arrayKeys.length - 1];\r\n if (newItemKey) {\r\n const newItemPath = newItemKey.split('.').slice(1);\r\n markAsDirty(stateKey, newItemPath, { bubble: false });\r\n }\r\n }\r\n\r\n return { type: 'insert', newValue, shadowMeta: updatedMeta };\r\n}\r\n\r\nfunction handleCut(\r\n stateKey: string,\r\n path: string[]\r\n): { type: 'cut'; oldValue: any; parentPath: string[] } {\r\n const parentArrayPath = path.slice(0, -1);\r\n const oldValue = getShadowValue(stateKey, path);\r\n removeShadowArrayElement(stateKey, path);\r\n markAsDirty(stateKey, parentArrayPath, { bubble: true });\r\n return { type: 'cut', oldValue: oldValue, parentPath: parentArrayPath };\r\n}\r\n\r\nfunction flushQueue() {\r\n const allComponentsToNotify = new Set<any>();\r\n const signalUpdates: { shadowMeta: any; displayValue: any }[] = [];\r\n\r\n const logsToAdd: UpdateTypeDetail[] = [];\r\n\r\n for (const item of updateBatchQueue) {\r\n if (item.status && item.updateType) {\r\n logsToAdd.push(item as UpdateTypeDetail);\r\n continue;\r\n }\r\n\r\n const result = item;\r\n\r\n const displayValue = result.type === 'cut' ? null : result.newValue;\r\n if (result.shadowMeta?.signals?.length > 0) {\r\n signalUpdates.push({ shadowMeta: result.shadowMeta, displayValue });\r\n }\r\n\r\n const componentNotifications = getComponentNotifications(\r\n result.stateKey,\r\n result.path,\r\n result\r\n );\r\n\r\n componentNotifications.forEach((component) => {\r\n allComponentsToNotify.add(component);\r\n });\r\n }\r\n\r\n if (logsToAdd.length > 0) {\r\n addStateLog(logsToAdd);\r\n }\r\n\r\n signalUpdates.forEach(({ shadowMeta, displayValue }) => {\r\n updateSignals(shadowMeta, displayValue);\r\n });\r\n\r\n allComponentsToNotify.forEach((component) => {\r\n component.forceUpdate();\r\n });\r\n\r\n // --- Step 3: CLEANUP ---\r\n // Clear the queue for the next batch of updates.\r\n updateBatchQueue = [];\r\n isFlushScheduled = false;\r\n}\r\n\r\nfunction createEffectiveSetState<T>(\r\n thisKey: string,\r\n syncApiRef: React.MutableRefObject<any>,\r\n sessionId: string | undefined,\r\n latestInitialOptionsRef: React.MutableRefObject<OptionsType<T> | null>\r\n): EffectiveSetState<T> {\r\n // The returned function is the core setter that gets called by all state operations.\r\n // It is now much simpler, delegating all work to the executeUpdate function.\r\n return (newStateOrFunction, path, updateObj, validationKey?) => {\r\n executeUpdate(thisKey, path, newStateOrFunction, updateObj);\r\n };\r\n\r\n // This inner function handles the logic for a single state update.\r\n function executeUpdate(\r\n stateKey: string,\r\n path: string[],\r\n payload: any,\r\n options: UpdateOptions\r\n ) {\r\n // --- Step 1: Execute the core state change (Synchronous & Fast) ---\r\n // This part modifies the in-memory state representation immediately.\r\n let result: any;\r\n switch (options.updateType) {\r\n case 'update':\r\n result = handleUpdate(stateKey, path, payload);\r\n break;\r\n case 'insert':\r\n result = handleInsert(stateKey, path, payload);\r\n break;\r\n case 'cut':\r\n result = handleCut(stateKey, path);\r\n break;\r\n }\r\n\r\n result.stateKey = stateKey;\r\n result.path = path;\r\n updateBatchQueue.push(result);\r\n scheduleFlush();\r\n\r\n const newUpdate: UpdateTypeDetail = {\r\n timeStamp: Date.now(),\r\n stateKey,\r\n path,\r\n updateType: options.updateType,\r\n status: 'new',\r\n oldValue: result.oldValue,\r\n newValue: result.newValue ?? null,\r\n };\r\n\r\n updateBatchQueue.push(newUpdate);\r\n\r\n if (result.newValue !== undefined) {\r\n saveToLocalStorage(\r\n result.newValue,\r\n stateKey,\r\n latestInitialOptionsRef.current,\r\n sessionId\r\n );\r\n }\r\n\r\n if (latestInitialOptionsRef.current?.middleware) {\r\n latestInitialOptionsRef.current.middleware({ update: newUpdate });\r\n }\r\n\r\n if (options.sync !== false && syncApiRef.current?.connected) {\r\n syncApiRef.current.updateState({ operation: newUpdate });\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 __useSync,\r\n }: {\r\n stateKey?: string;\r\n componentId?: string;\r\n defaultState?: TStateObject;\r\n __useSync?: UseSyncType<TStateObject>;\r\n syncOptions?: SyncOptionsType<any>;\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 let noStateKey = stateKey ? false : true;\r\n const [thisKey] = useState(stateKey ?? uuidv4());\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 const syncKey = `${syncUpdate.stateKey}:${syncUpdate.path.join('.')}`;\r\n 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 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 return; // Ignore if no valid data\r\n }\r\n\r\n console.log(\r\n '✅ SERVER_STATE_UPDATE received with data:',\r\n serverStateData\r\n );\r\n\r\n setAndMergeOptions(thisKey, { serverState: serverStateData });\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 // ✅ FIX 1: The path for the root value is now `[]`.\r\n const currentState = getShadowValue(thisKey, []);\r\n const incomingData = serverStateData.data;\r\n\r\n if (\r\n mergeConfig &&\r\n mergeConfig.strategy === 'append' &&\r\n 'key' in mergeConfig && // Type guard for key\r\n Array.isArray(currentState) &&\r\n Array.isArray(incomingData)\r\n ) {\r\n const keyField = mergeConfig.key;\r\n if (!keyField) {\r\n console.error(\r\n \"CogsState: Merge strategy 'append' requires a 'key' field.\"\r\n );\r\n return;\r\n }\r\n console.log('SERVER_STATE_UPDATE 2');\r\n const existingIds = new Set(\r\n currentState.map((item: any) => item[keyField])\r\n );\r\n\r\n const newUniqueItems = incomingData.filter(\r\n (item: any) => !existingIds.has(item[keyField])\r\n );\r\n\r\n if (newUniqueItems.length > 0) {\r\n newUniqueItems.forEach((item) => {\r\n insertShadowArrayElement(thisKey, [], item);\r\n });\r\n }\r\n\r\n // Mark the entire final state as synced\r\n const finalState = getShadowValue(thisKey, []);\r\n markEntireStateAsServerSynced(\r\n thisKey,\r\n [],\r\n finalState,\r\n serverStateData.timestamp\r\n );\r\n } else {\r\n // This handles the \"replace\" strategy (initial load)\r\n initializeShadowState(thisKey, incomingData);\r\n\r\n markEntireStateAsServerSynced(\r\n thisKey,\r\n [],\r\n incomingData,\r\n serverStateData.timestamp\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 const features = {\r\n syncEnabled: !!cogsSyncFn && !!syncOpt,\r\n validationEnabled: !!(\r\n options?.validation?.zodSchemaV4 || options?.validation?.zodSchemaV3\r\n ),\r\n localStorageEnabled: !!options?.localStorage?.key,\r\n };\r\n setShadowMetadata(thisKey, [], {\r\n ...existingMeta,\r\n features,\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 initializeShadowState(thisKey, resolvedState);\r\n\r\n // Set shadow metadata with the correct source info\r\n 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\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 = 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'],\r\n paths: new Set(),\r\n depsFunction: reactiveDeps || undefined,\r\n deps: reactiveDeps ? reactiveDeps(getShadowValue(thisKey, [])) : [],\r\n prevDeps: reactiveDeps // Initialize prevDeps with the same initial value\r\n ? reactiveDeps(getShadowValue(thisKey, []))\r\n : [],\r\n });\r\n\r\n setShadowMetadata(thisKey, [], {\r\n ...rootMeta,\r\n components,\r\n });\r\n forceUpdate({});\r\n return () => {\r\n const meta = 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 setShadowMetadata(thisKey, [], meta);\r\n }\r\n };\r\n }, []);\r\n\r\n const syncApiRef = useRef<SyncApi | null>(null);\r\n const effectiveSetState = createEffectiveSetState(\r\n thisKey,\r\n syncApiRef,\r\n sessionId,\r\n latestInitialOptionsRef\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 const handler = createProxyHandler<TStateObject>(\r\n thisKey,\r\n effectiveSetState,\r\n componentIdRef.current,\r\n sessionId\r\n );\r\n\r\n return handler;\r\n }, [thisKey, sessionId]);\r\n\r\n const cogsSyncFn = __useSync;\r\n const syncOpt = latestInitialOptionsRef.current?.syncOptions;\r\n\r\n if (cogsSyncFn) {\r\n syncApiRef.current = cogsSyncFn(\r\n updaterFinal as any,\r\n syncOpt ?? ({} as any)\r\n );\r\n }\r\n\r\n return updaterFinal;\r\n}\r\n\r\ntype MetaData = {\r\n // Map array paths to their filtered/sorted ID order\r\n arrayViews?: {\r\n [arrayPath: string]: string[]; // e.g. { \"todos\": [\"id:xxx\", \"id:yyy\"], \"todos.id:xxx.subtasks\": [\"id:aaa\"] }\r\n };\r\n transforms?: Array<{\r\n type: 'filter' | 'sort';\r\n fn: Function;\r\n path: string[]; // Which array this transform applies to\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 return transforms\r\n .map(\r\n (transform) =>\r\n `${transform.type}${JSON.stringify(transform.dependencies || [])}`\r\n )\r\n .join('');\r\n}\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 ids = getShadowMetadata(stateKey, path)?.arrayKeys || [];\r\n console.log('ids', ids);\r\n if (!transforms || transforms.length === 0) {\r\n return ids;\r\n }\r\n\r\n // Apply each transform using just IDs\r\n for (const transform of transforms) {\r\n if (transform.type === 'filter') {\r\n const filtered: any[] = [];\r\n ids.forEach((id, index) => {\r\n const value = getShadowValue(stateKey, [...path, id]);\r\n\r\n if (transform.fn(value, index)) {\r\n filtered.push(id);\r\n }\r\n });\r\n ids = filtered;\r\n } else if (transform.type === 'sort') {\r\n ids.sort((a, b) => {\r\n const aValue = getShadowValue(stateKey, [...path, a]);\r\n const bValue = getShadowValue(stateKey, [...path, b]);\r\n return transform.fn(aValue, bValue);\r\n });\r\n }\r\n }\r\n\r\n return ids;\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\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 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 getScopedData(stateKey: string, path: string[], meta?: MetaData) {\r\n const shadowMeta = getShadowMetadata(stateKey, path);\r\n const arrayPathKey = path.join('.');\r\n const arrayKeys = meta?.arrayViews?.[arrayPathKey];\r\n\r\n // FIX: If the derived view is empty, return an empty array directly.\r\n if (Array.isArray(arrayKeys) && arrayKeys.length === 0) {\r\n return {\r\n shadowMeta,\r\n value: [],\r\n arrayKeys: shadowMeta?.arrayKeys,\r\n };\r\n }\r\n\r\n const value = getShadowValue(stateKey, path, arrayKeys);\r\n\r\n return {\r\n shadowMeta,\r\n value,\r\n arrayKeys: shadowMeta?.arrayKeys,\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 const proxyCache = new Map<string, any>();\r\n let stateVersion = 0;\r\n\r\n const methodNames = new Set([\r\n 'sync',\r\n 'getStatus',\r\n 'removeStorage',\r\n 'showValidationErrors',\r\n 'getSelected',\r\n 'getSelectedIndex',\r\n 'clearSelected',\r\n 'useVirtualView',\r\n 'stateMap',\r\n '$stateMap',\r\n 'stateFind',\r\n 'stateFilter',\r\n 'stateSort',\r\n 'stream',\r\n 'stateList',\r\n 'stateFlattenOn',\r\n 'index',\r\n 'last',\r\n 'insert',\r\n 'uniqueInsert',\r\n 'cut',\r\n 'cutSelected',\r\n 'cutByValue',\r\n 'toggleByValue',\r\n 'findWith',\r\n 'cutThis',\r\n 'get',\r\n 'getState',\r\n '$derive',\r\n '$get',\r\n 'lastSynced',\r\n 'getLocalStorage',\r\n 'isSelected',\r\n 'setSelected',\r\n 'toggleSelected',\r\n '_componentId',\r\n 'addZodValidation',\r\n 'clearZodValidation',\r\n 'applyJsonPatch',\r\n 'getComponents',\r\n 'getAllFormRefs',\r\n 'getFormRef',\r\n 'validationWrapper',\r\n '_stateKey',\r\n '_path',\r\n 'update',\r\n 'toggle',\r\n 'formElement',\r\n // Add ANY other method names here\r\n ]);\r\n\r\n function rebuildStateShape({\r\n path = [],\r\n meta,\r\n componentId,\r\n }: {\r\n path: string[];\r\n componentId: string;\r\n meta?: MetaData;\r\n }): any {\r\n const derivationSignature = meta\r\n ? JSON.stringify(meta.arrayViews || meta.transforms)\r\n : '';\r\n const cacheKey = path.join('.') + ':' + derivationSignature;\r\n if (proxyCache.has(cacheKey)) {\r\n return proxyCache.get(cacheKey);\r\n }\r\n const stateKeyPathKey = [stateKey, ...path].join('.');\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 get(target: any, prop: string) {\r\n if (path.length === 0 && prop in rootLevelMethods) {\r\n return rootLevelMethods[prop as keyof typeof rootLevelMethods];\r\n }\r\n if (!methodNames.has(prop)) {\r\n const nextPath = [...path, prop];\r\n return rebuildStateShape({\r\n path: nextPath,\r\n componentId: componentId!,\r\n meta,\r\n });\r\n }\r\n if (prop === '_rebuildStateShape') {\r\n return rebuildStateShape;\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 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 // ✅ Use the optimized helper to get all data in one efficient call\r\n const { shadowMeta, value } = getScopedData(stateKey, path, meta);\r\n\r\n // Priority 1: Explicitly dirty items. This is the most important status.\r\n if (shadowMeta?.isDirty === true) {\r\n return 'dirty';\r\n }\r\n\r\n // ✅ Priority 2: Synced items. This condition is now cleaner.\r\n // An item is considered synced if it came from the server OR was explicitly\r\n // marked as not dirty (isDirty: false), covering all sync-related cases.\r\n if (\r\n shadowMeta?.stateSource === 'server' ||\r\n shadowMeta?.isDirty === false\r\n ) {\r\n return 'synced';\r\n }\r\n\r\n // Priority 3: Items restored from localStorage.\r\n if (shadowMeta?.stateSource === 'localStorage') {\r\n return 'restored';\r\n }\r\n\r\n // Priority 4: Items from default/initial state.\r\n if (shadowMeta?.stateSource === 'default') {\r\n return 'fresh';\r\n }\r\n\r\n // ✅ REMOVED the redundant \"root\" check. The item's own `stateSource` is sufficient.\r\n\r\n // Priority 5: A value exists but has no metadata. This is a fallback.\r\n if (value !== undefined && !shadowMeta) {\r\n return 'fresh';\r\n }\r\n\r\n // Fallback if no other condition is met.\r\n return 'unknown';\r\n };\r\n\r\n // This part remains the same\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 { shadowMeta } = getScopedData(stateKey, path, meta);\r\n if (\r\n shadowMeta?.validation?.status === 'INVALID' &&\r\n shadowMeta.validation.errors.length > 0\r\n ) {\r\n // Return only error-severity messages (not warnings)\r\n return shadowMeta.validation.errors\r\n .filter((err) => err.severity === 'error')\r\n .map((err) => err.message);\r\n }\r\n return [];\r\n };\r\n }\r\n\r\n if (prop === 'getSelected') {\r\n return () => {\r\n const arrayKey = [stateKey, ...path].join('.');\r\n registerComponentDependency(stateKey, componentId, [\r\n ...path,\r\n 'getSelected',\r\n ]);\r\n\r\n const selectedItemKey = getGlobalStore\r\n .getState()\r\n .selectedIndicesMap.get(arrayKey);\r\n if (!selectedItemKey) {\r\n return undefined;\r\n }\r\n\r\n const viewKey = path.join('.');\r\n const currentViewIds = meta?.arrayViews?.[viewKey];\r\n const selectedItemId = selectedItemKey.split('.').pop();\r\n\r\n // FIX: Only return the selected item if it exists in the current filtered/sorted view.\r\n if (currentViewIds && !currentViewIds.includes(selectedItemId!)) {\r\n return undefined;\r\n }\r\n\r\n const value = getShadowValue(\r\n stateKey,\r\n selectedItemKey.split('.').slice(1)\r\n );\r\n if (value === undefined) {\r\n return undefined;\r\n }\r\n\r\n return rebuildStateShape({\r\n path: selectedItemKey.split('.').slice(1) as string[],\r\n componentId: componentId!,\r\n meta,\r\n });\r\n };\r\n }\r\n if (prop === 'getSelectedIndex') {\r\n return () => {\r\n // Key for the array in the global selection map (e.g., \"myState.products\")\r\n const arrayKey = stateKey + '.' + path.join('.');\r\n // Key for this specific view in the meta object (e.g., \"products\")\r\n const viewKey = path.join('.');\r\n\r\n // Get the full path of the selected item (e.g., \"myState.products.id:abc\")\r\n const selectedItemKey = getGlobalStore\r\n .getState()\r\n .selectedIndicesMap.get(arrayKey);\r\n\r\n if (!selectedItemKey) {\r\n return -1; // Nothing is selected for this array.\r\n }\r\n\r\n // Get the list of item IDs for the current filtered/sorted view.\r\n const { keys: viewIds } = getArrayData(stateKey, path, meta);\r\n\r\n if (!viewIds) {\r\n return -1; // Should not happen if it's an array, but a safe guard.\r\n }\r\n\r\n // FIX: Extract just the ID from the full selected item path.\r\n const selectedId = selectedItemKey.split('.').pop();\r\n\r\n // Return the index of that ID within the current view's list of IDs.\r\n return (viewIds as string[]).indexOf(selectedId as string);\r\n };\r\n }\r\n if (prop === 'clearSelected') {\r\n notifySelectionComponents(stateKey, path);\r\n return () => {\r\n 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 = [] } = getScopedData(stateKey, path, meta);\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(stateKey, path) 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 const arrayPath = path.length > 0 ? path.join('.') : 'root';\r\n return rebuildStateShape({\r\n path,\r\n componentId: componentId!,\r\n meta: { ...meta, arrayViews: { [arrayPath]: 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(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: (setter: any, index: number, arraySetter: any) => void\r\n ) => {\r\n // FIX: Use getArrayData to reliably get both the value and the keys of the current view.\r\n const { value: shadowValue, keys: arrayKeys } = getArrayData(\r\n stateKey,\r\n path,\r\n meta\r\n );\r\n\r\n if (!arrayKeys || !Array.isArray(shadowValue)) {\r\n return []; // It's valid to map over an empty array.\r\n }\r\n\r\n const arraySetter = rebuildStateShape({\r\n path,\r\n componentId: componentId!,\r\n meta,\r\n });\r\n\r\n return shadowValue.map((_item, index) => {\r\n const itemKey = arrayKeys[index];\r\n if (!itemKey) return undefined;\r\n\r\n // FIX: Construct the correct path to the item in the original store.\r\n // The path is the array's path plus the specific item's unique key.\r\n const itemPath = [...path, itemKey];\r\n\r\n const itemSetter = rebuildStateShape({\r\n path: itemPath, // This now correctly points to the item in the shadow store.\r\n componentId: componentId!,\r\n meta,\r\n });\r\n\r\n return callbackfn(itemSetter, index, arraySetter);\r\n });\r\n };\r\n }\r\n\r\n if (prop === 'stateFilter') {\r\n return (callbackfn: (value: any, index: number) => boolean) => {\r\n const arrayPathKey = path.length > 0 ? path.join('.') : 'root';\r\n\r\n // ✅ FIX: Get keys from `getArrayData` which correctly resolves them from meta or the full list.\r\n const { keys: currentViewIds, value: array } = getArrayData(\r\n stateKey,\r\n path,\r\n meta\r\n );\r\n\r\n if (!Array.isArray(array)) {\r\n throw new Error('stateFilter can only be used on arrays');\r\n }\r\n\r\n // Filter the array and collect the IDs of the items that pass\r\n const filteredIds: string[] = [];\r\n array.forEach((item, index) => {\r\n if (callbackfn(item, index)) {\r\n // currentViewIds[index] is the original ID before filtering\r\n const id = currentViewIds[index];\r\n if (id) {\r\n filteredIds.push(id);\r\n }\r\n }\r\n });\r\n\r\n // The rest is the same...\r\n return rebuildStateShape({\r\n path,\r\n componentId: componentId!,\r\n meta: {\r\n ...meta,\r\n arrayViews: {\r\n ...(meta?.arrayViews || {}),\r\n [arrayPathKey]: filteredIds,\r\n },\r\n transforms: [\r\n ...(meta?.transforms || []),\r\n { type: 'filter', fn: callbackfn, path },\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 arrayPathKey = path.join('.');\r\n\r\n // FIX: Use the more robust `getArrayData` which always correctly resolves the keys for a view.\r\n const { value: currentArray, keys: currentViewIds } = getArrayData(\r\n stateKey,\r\n path,\r\n meta\r\n );\r\n\r\n if (!Array.isArray(currentArray) || !currentViewIds) {\r\n throw new Error('No array keys found for sorting');\r\n }\r\n\r\n // ... (rest of the function is the same and now works)\r\n const itemsWithIds = currentArray.map((item, index) => ({\r\n item,\r\n key: currentViewIds[index],\r\n }));\r\n itemsWithIds.sort((a, b) => compareFn(a.item, b.item));\r\n const sortedIds = itemsWithIds.map((i) => i.key as string);\r\n\r\n return rebuildStateShape({\r\n path,\r\n componentId: componentId!,\r\n meta: {\r\n ...meta,\r\n arrayViews: {\r\n ...(meta?.arrayViews || {}),\r\n [arrayPathKey]: sortedIds,\r\n },\r\n transforms: [\r\n ...(meta?.transforms || []),\r\n { type: 'sort', fn: compareFn, path },\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 (bufferStrategy === 'sliding' && buffer.length >= bufferSize) {\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 = getShadowMetadata(stateKey, path) || {};\r\n const streams = currentMeta.streams || new Map();\r\n streams.set(streamId, { buffer, flushTimer });\r\n\r\n 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 console.log('meta outside', JSON.stringify(meta));\r\n const StateListWrapper = () => {\r\n const componentIdsRef = useRef<Map<string, string>>(new Map());\r\n\r\n const [updateTrigger, forceUpdate] = useState({});\r\n\r\n console.log('updateTrigger updateTrigger updateTrigger');\r\n\r\n const validIds = applyTransforms(\r\n stateKey,\r\n path,\r\n meta?.transforms\r\n );\r\n //the above get the new coorect valid ids i need ot udpate the meta object with this info\r\n const arrayPathKey = path.length > 0 ? path.join('.') : 'root';\r\n const updatedMeta = {\r\n ...meta,\r\n arrayViews: {\r\n ...(meta?.arrayViews || {}),\r\n [arrayPathKey]: validIds, // Update the arrayViews with the new valid IDs\r\n },\r\n };\r\n\r\n // Now use the updated meta when getting array data\r\n const { value: arrayValues } = getArrayData(\r\n stateKey,\r\n path,\r\n updatedMeta\r\n );\r\n\r\n console.log('validIds', validIds);\r\n console.log('arrayValues', arrayValues);\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 console.log('changed array statelist ', e);\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 // Continue using updatedMeta for the rest of your logic instead of meta\r\n const arraySetter = rebuildStateShape({\r\n path,\r\n componentId: componentId!,\r\n meta: updatedMeta, // Use updated meta here\r\n });\r\n console.log('arrayValues', arrayValues);\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 = 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 = [...path, itemKey];\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 // FIX: Get the definitive list of IDs for the current view from meta.arrayViews.\r\n const arrayPathKey = path.join('.');\r\n const viewIds = meta?.arrayViews?.[arrayPathKey];\r\n\r\n const currentState = getGlobalStore\r\n .getState()\r\n .getShadowValue(stateKey, path, viewIds);\r\n\r\n if (!Array.isArray(currentState)) return [];\r\n\r\n stateVersion++;\r\n\r\n return rebuildStateShape({\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 arrayPathKey = path.join('.');\r\n const viewIds = meta?.arrayViews?.[arrayPathKey];\r\n\r\n if (viewIds) {\r\n const itemId = viewIds[index];\r\n if (!itemId) return undefined;\r\n return rebuildStateShape({\r\n path: [...path, itemId],\r\n componentId: componentId!,\r\n meta,\r\n });\r\n }\r\n\r\n // ✅ FIX: Get the metadata and use the `arrayKeys` property.\r\n const shadowMeta = getShadowMetadata(stateKey, path);\r\n if (!shadowMeta?.arrayKeys) return undefined;\r\n\r\n const itemId = shadowMeta.arrayKeys[index];\r\n if (!itemId) return undefined;\r\n\r\n return rebuildStateShape({\r\n path: [...path, itemId],\r\n componentId: componentId!,\r\n meta,\r\n });\r\n };\r\n }\r\n if (prop === 'last') {\r\n return () => {\r\n // ✅ FIX: Use getArrayData to get the keys for the current view (filtered or not).\r\n const { keys: currentViewIds } = getArrayData(stateKey, path, meta);\r\n\r\n // If the array is empty, there is no last item.\r\n if (!currentViewIds || currentViewIds.length === 0) {\r\n return undefined;\r\n }\r\n\r\n // Get the unique ID of the last item in the current view.\r\n const lastItemKey = currentViewIds[currentViewIds.length - 1];\r\n\r\n // If for some reason the key is invalid, return undefined.\r\n if (!lastItemKey) {\r\n return undefined;\r\n }\r\n\r\n // ✅ FIX: The new path uses the item's unique key, not its numerical index.\r\n const newPath = [...path, lastItemKey];\r\n\r\n // Return a new proxy scoped to that specific item.\r\n return rebuildStateShape({\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 };\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 { value: currentArray } = getScopedData(\r\n stateKey,\r\n path,\r\n meta\r\n ) as {\r\n value: any[];\r\n };\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 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\r\n effectiveSetState(updatedArray as any, path, {\r\n updateType: 'update',\r\n });\r\n }\r\n };\r\n }\r\n if (prop === 'cut') {\r\n return (index?: number, options?: { waitForSync?: boolean }) => {\r\n const shadowMeta = getShadowMetadata(stateKey, path);\r\n if (!shadowMeta?.arrayKeys || shadowMeta.arrayKeys.length === 0)\r\n return;\r\n\r\n const indexToCut =\r\n index === -1\r\n ? shadowMeta.arrayKeys.length - 1\r\n : index !== undefined\r\n ? index\r\n : shadowMeta.arrayKeys.length - 1;\r\n\r\n const idToCut = shadowMeta.arrayKeys[indexToCut];\r\n if (!idToCut) return;\r\n\r\n effectiveSetState(null, [...path, idToCut], {\r\n updateType: 'cut',\r\n });\r\n };\r\n }\r\n if (prop === 'cutSelected') {\r\n return () => {\r\n const arrayKey = [stateKey, ...path].join('.');\r\n\r\n const { keys: currentViewIds } = getArrayData(stateKey, path, meta);\r\n if (!currentViewIds || currentViewIds.length === 0) {\r\n return;\r\n }\r\n const selectedItemKey = getGlobalStore\r\n .getState()\r\n .selectedIndicesMap.get(arrayKey);\r\n\r\n if (!selectedItemKey) {\r\n return;\r\n }\r\n const selectedId = selectedItemKey.split('.').pop() as string;\r\n if (!(currentViewIds as any[]).includes(selectedId!)) {\r\n return;\r\n }\r\n const pathForCut = selectedItemKey.split('.').slice(1);\r\n getGlobalStore.getState().clearSelectedIndex({ arrayKey });\r\n\r\n const parentPath = pathForCut.slice(0, -1);\r\n notifySelectionComponents(stateKey, parentPath);\r\n\r\n effectiveSetState(null, 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 const {\r\n isArray,\r\n value: array,\r\n keys,\r\n } = getArrayData(stateKey, path, meta);\r\n\r\n if (!isArray) return;\r\n\r\n const found = findArrayItem(array, keys, (item) => item === value);\r\n if (found) {\r\n effectiveSetState(null, [...path, found.key], {\r\n updateType: 'cut',\r\n });\r\n }\r\n };\r\n }\r\n\r\n if (prop === 'toggleByValue') {\r\n return (value: string | number | boolean) => {\r\n const {\r\n isArray,\r\n value: array,\r\n keys,\r\n } = getArrayData(stateKey, path, meta);\r\n\r\n if (!isArray) return;\r\n\r\n const found = findArrayItem(array, keys, (item) => item === value);\r\n\r\n if (found) {\r\n const pathForItem = [...path, found.key];\r\n\r\n effectiveSetState(null, pathForItem, {\r\n updateType: 'cut',\r\n });\r\n } else {\r\n effectiveSetState(value as any, path, { updateType: 'insert' });\r\n }\r\n };\r\n }\r\n if (prop === 'findWith') {\r\n return (searchKey: string, searchValue: any) => {\r\n const { isArray, value, keys } = getArrayData(stateKey, path, meta);\r\n\r\n if (!isArray) {\r\n throw new Error('findWith can only be used on arrays');\r\n }\r\n\r\n const found = findArrayItem(\r\n value,\r\n keys,\r\n (item) => item?.[searchKey] === searchValue\r\n );\r\n\r\n // FIX: If found, return a proxy to the item by appending its key to the current path.\r\n if (found) {\r\n return rebuildStateShape({\r\n path: [...path, found.key], // e.g., ['itemInstances', 'inst-1', 'properties', 'prop-b']\r\n componentId: componentId!,\r\n meta,\r\n });\r\n }\r\n\r\n // If not found, return an 'empty' proxy that will resolve to undefined on .get()\r\n // This prevents \"cannot read property 'get' of undefined\" errors.\r\n return rebuildStateShape({\r\n path: [...path, `not_found_${uuidv4()}`],\r\n componentId: componentId!,\r\n meta,\r\n });\r\n };\r\n }\r\n if (prop === 'cutThis') {\r\n const { value: shadowValue } = getScopedData(stateKey, path, meta);\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 const { value } = getScopedData(stateKey, path, meta);\r\n return value;\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 getSyncInfo(syncKey);\r\n }\r\n if (prop == 'getLocalStorage') {\r\n return (key: string) =>\r\n loadFromLocalStorage(sessionId + '-' + stateKey + '-' + key);\r\n }\r\n if (prop === 'isSelected') {\r\n const parentPathArray = path.slice(0, -1);\r\n const parentMeta = getShadowMetadata(stateKey, parentPathArray);\r\n\r\n // FIX: Check if the parent is an array by looking for arrayKeys in its metadata.\r\n if (parentMeta?.arrayKeys) {\r\n const fullParentKey = stateKey + '.' + parentPathArray.join('.');\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 // Logic remains the same.\r\n notifySelectionComponents(stateKey, parentPathArray, undefined);\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 === 'addZodValidation') {\r\n return (zodErrors: any[]) => {\r\n zodErrors.forEach((error) => {\r\n const currentMeta =\r\n getGlobalStore\r\n .getState()\r\n .getShadowMetadata(stateKey, error.path) || {};\r\n\r\n getGlobalStore\r\n .getState()\r\n .setShadowMetadata(stateKey, error.path, {\r\n ...currentMeta,\r\n validation: {\r\n status: 'INVALID',\r\n errors: [\r\n {\r\n source: 'client',\r\n message: error.message,\r\n severity: 'error',\r\n code: error.code,\r\n },\r\n ],\r\n lastValidated: Date.now(),\r\n validatedValue: undefined,\r\n },\r\n });\r\n });\r\n };\r\n }\r\n if (prop === 'clearZodValidation') {\r\n return (path?: string[]) => {\r\n if (!path) {\r\n throw new Error('clearZodValidation requires a path');\r\n }\r\n\r\n const currentMeta = getShadowMetadata(stateKey, path) || {};\r\n\r\n setShadowMetadata(stateKey, path, {\r\n ...currentMeta,\r\n validation: {\r\n status: 'NOT_VALIDATED',\r\n errors: [],\r\n lastValidated: Date.now(),\r\n },\r\n });\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\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\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\r\n if (prop === 'getComponents')\r\n return () => getShadowMetadata(stateKey, [])?.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 // This method is now greatly simplified.\r\n // All the complex batching logic has been removed because our new,\r\n // universal `createEffectiveSetState` function handles it automatically for all operations.\r\n return (payload: UpdateArg<T>) => {\r\n // Simply call effectiveSetState. It will automatically handle queuing\r\n // this operation in the batch for efficient processing.\r\n effectiveSetState(payload as any, path, { updateType: 'update' });\r\n\r\n // The .synced() method is a useful feature that allows developers\r\n // to manually mark a piece of state as \"synced with the server\"\r\n // after an update. This part of the functionality is preserved.\r\n return {\r\n synced: () => {\r\n const shadowMeta = getGlobalStore\r\n .getState()\r\n .getShadowMetadata(stateKey, path);\r\n\r\n // Update the metadata for this specific path\r\n setShadowMetadata(stateKey, path, {\r\n ...shadowMeta,\r\n isDirty: false,\r\n stateSource: 'server',\r\n lastServerSync: Date.now(),\r\n });\r\n\r\n // Notify any components that might be subscribed to the sync status\r\n const fullPath = [stateKey, ...path].join('.');\r\n notifyPathSubscribers(fullPath, {\r\n type: 'SYNC_STATUS_CHANGE',\r\n isDirty: false,\r\n });\r\n },\r\n };\r\n };\r\n }\r\n if (prop === 'toggle') {\r\n const { value: currentValueAtPath } = getScopedData(\r\n stateKey,\r\n path,\r\n meta\r\n );\r\n\r\n if (typeof currentValueAtPath != '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 path: nextPath,\r\n componentId: componentId!,\r\n meta,\r\n });\r\n },\r\n };\r\n\r\n const proxyInstance = new Proxy({}, handler);\r\n proxyCache.set(cacheKey, proxyInstance);\r\n\r\n return proxyInstance;\r\n }\r\n\r\n const rootLevelMethods = {\r\n revertToInitialState: (obj?: { validationKey?: string }) => {\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 clearSelectedIndexesForState(stateKey);\r\n\r\n stateVersion++;\r\n initializeShadowState(stateKey, initialState);\r\n rebuildStateShape({\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 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 initializeShadowState(stateKey, newState);\r\n // initializeShadowStateNEW(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\r\n const returnShape = rebuildStateShape({\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 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 arrayPathKey = proxy._path.join('.');\r\n const viewIds = proxy._meta?.arrayViews?.[arrayPathKey];\r\n\r\n const value = getShadowValue(proxy._stateKey, proxy._path, viewIds);\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 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 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 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 itemValue = getShadowValue(stateKey, itemPath);\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 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 = getShadowValue(stateKey, path);\r\n const [localValue, setLocalValue] = useState<any>(globalStateValue);\r\n const isCurrentlyDebouncing = useRef(false);\r\n const debounceTimeoutRef = useRef<NodeJS.Timeout | null>(null);\r\n\r\n 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 setState(newValue, path, { updateType: 'update' });\r\n\r\n // NEW: Check if validation is enabled via features\r\n const rootMeta = getGlobalStore\r\n .getState()\r\n .getShadowMetadata(stateKey, []);\r\n if (!rootMeta?.features?.validationEnabled) return;\r\n\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 = getShadowValue(stateKey, []);\r\n const result = zodSchema.safeParse(fullState);\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\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',\r\n errors: [\r\n {\r\n source: 'client',\r\n message: pathErrors[0]?.message,\r\n severity: 'warning', // Gentle error during typing\r\n },\r\n ],\r\n lastValidated: Date.now(),\r\n validatedValue: newValue,\r\n },\r\n });\r\n } else {\r\n setShadowMetadata(stateKey, path, {\r\n ...currentMeta,\r\n validation: {\r\n status: 'VALID',\r\n errors: [],\r\n lastValidated: Date.now(),\r\n validatedValue: newValue,\r\n },\r\n });\r\n }\r\n } else {\r\n setShadowMetadata(stateKey, path, {\r\n ...currentMeta,\r\n validation: {\r\n status: 'VALID',\r\n errors: [],\r\n lastValidated: Date.now(),\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 const rootMeta = getShadowMetadata(stateKey, []);\r\n if (!rootMeta?.features?.validationEnabled) return;\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 = getShadowMetadata(stateKey, path);\r\n\r\n setShadowMetadata(stateKey, path, {\r\n ...currentMeta,\r\n validation: {\r\n status: 'VALIDATING',\r\n errors: [],\r\n lastValidated: Date.now(),\r\n validatedValue: localValue,\r\n },\r\n });\r\n\r\n // Validate full state\r\n const fullState = 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 setShadowMetadata(stateKey, path, {\r\n ...currentMeta,\r\n validation: {\r\n status: 'INVALID',\r\n errors: pathErrors.map((err: any) => ({\r\n source: 'client' as const,\r\n message: err.message,\r\n severity: 'error' as const, // Hard error on blur\r\n })),\r\n lastValidated: Date.now(),\r\n validatedValue: localValue,\r\n },\r\n });\r\n } else {\r\n // Validation passed\r\n setShadowMetadata(stateKey, path, {\r\n ...currentMeta,\r\n validation: {\r\n status: 'VALID',\r\n errors: [],\r\n lastValidated: Date.now(),\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 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 // 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":["getInitialOptions","updateInitialStateGlobal","getShadowMetadata","setShadowMetadata","getShadowValue","initializeShadowState","updateShadowAtPath","insertShadowArrayElement","removeShadowArrayElement","getSelectedIndex","setInitialStateOptions","setServerStateUpdate","markAsDirty","registerComponent","unregisterComponent","addPathComponent","clearSelectedIndexesForState","addStateLog","setSyncInfo","clearSelectedIndex","getSyncInfo","notifyPathSubscribers","subscribeToPath","getGlobalStore","getArrayData","stateKey","path","meta","shadowMeta","arrayPathKey","viewIds","findArrayItem","array","keys","predicate","i","key","setAndMergeOptions","newOptions","initialOptions","setOptions","options","initialOptionsPart","mergedOptions","needToAdd","isDeepEqual","addStateOptions","initialState","formElements","validation","createCogsState","opt","newInitialState","statePart","transformStateFunc","existingOptions","existingGlobalOptions","useCogsState","componentId","useState","uuidv4","thiState","partialState","useCogsStateFn","setCogsOptions","loadAndApplyLocalStorage","notifyComponents","createCogsStateFromSync","syncSchema","useSync","schemas","apiParamsMap","entry","saveToLocalStorage","state","thisKey","currentInitialOptions","sessionId","lastSyncedWithServer","isFunction","storageKey","existingLastSynced","loadFromLocalStorage","data","superJsonResult","superjson","localStorageKey","storedData","error","currentState","useCogsConfig","localkey","localData","stateEntry","updates","component","update","markEntireStateAsServerSynced","timestamp","currentMeta","arrayMeta","itemKey","index","itemPath","itemData","fieldPath","fieldData","updateBatchQueue","isFlushScheduled","scheduleFlush","flushQueue","handleUpdate","payload","oldValue","newValue","newShadowMeta","updateSignals","displayValue","parentId","position","effect","parent","childNodes","finalDisplayValue","err","getComponentNotifications","result","rootMeta","componentsToNotify","currentPath","pathMeta","isArray","getDifferences","subPathString","subPath","fullSubPath","subPathMeta","parentArrayPath","parentMeta","reactiveTypes","newDeps","handleInsert","currentValue","getScopedData","updatedMeta","newItemKey","newItemPath","handleCut","allComponentsToNotify","signalUpdates","logsToAdd","item","createEffectiveSetState","syncApiRef","latestInitialOptionsRef","newStateOrFunction","updateObj","validationKey","executeUpdate","newUpdate","stateObject","localStorage","reactiveDeps","reactiveType","defaultState","syncUpdate","dependencies","serverState","__useSync","reactiveForce","forceUpdate","noStateKey","componentIdRef","useRef","useEffect","syncKey","resolveInitialState","useCallback","overrideOptions","currentOptions","finalDefaultState","localKey","event","serverStateData","mergeConfig","incomingData","keyField","existingIds","newUniqueItems","finalState","existingMeta","features","cogsSyncFn","syncOpt","resolvedState","source","useLayoutEffect","componentKey","components","fullPath","effectiveSetState","updaterFinal","useMemo","createProxyHandler","applyTransforms","transforms","ids","transform","filtered","id","value","a","b","aValue","bValue","registerComponentDependency","dependencyPath","fullComponentId","notifySelectionComponents","parentPath","currentSelected","store","notifiedComponents","arrayKey","selectedItem","arrayKeys","proxyCache","methodNames","rebuildStateShape","derivationSignature","cacheKey","stateKeyPathKey","handler","target","prop","rootLevelMethods","nextPath","sync","response","getStatusFunc","initalOptionsGet","selectedItemKey","viewKey","currentViewIds","selectedItemId","selectedId","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","behavior","performScroll","attemptScroll","attempts","currentHeight","currentScroll","newHeight","newScroll","scrollTimeout","debouncedScrollToBottom","observer","handleImageLoad","e","sourceArray","currentKeys","slicedIds","arrayPath","offset","callbackfn","shadowValue","arraySetter","_item","itemSetter","filteredIds","compareFn","currentArray","itemsWithIds","sortedIds","bufferSize","flushInterval","bufferStrategy","onFlush","buffer","isPaused","flushTimer","addToBuffer","flushBuffer","toFlush","streamId","streams","componentIdsRef","updateTrigger","validIds","arrayValues","unsubscribe","caches","jsx","Fragment","localIndex","itemComponentId","createElement","MemoizedCogsItemWrapper","fieldName","itemId","lastItemKey","newPath","fields","onMatch","matchedItem","isMatch","field","updatedItem","updatedArray","indexToCut","idToCut","pathForCut","found","pathForItem","searchKey","searchValue","fn","$cogsSignal","parentPathArray","fullParentKey","fullItemKey","zodErrors","patches","convertPath","jsonPath","p","patch","relativePath","formRefStore","children","hideMessage","ValidationWrapper","currentValueAtPath","child","formOpts","FormElementWrapper","proxyInstance","obj","newState","newUpdaterState","startTransition","proxy","SignalRenderer","elementRef","instanceIdRef","isSetupRef","signalId","element","timeoutId","parentElement","signals","textNode","s","memo","ListItemWrapper","prevProps","nextProps","useImageLoaded","ref","loaded","setLoaded","images","loadedCount","image","renderFn","inViewRef","inView","useInView","imagesLoaded","hasReportedInitialHeight","fullKey","useRegisterComponent","setRefs","itemValue","setState","globalStateValue","localValue","setLocalValue","isCurrentlyDebouncing","debounceTimeoutRef","debouncedUpdate","debounceTime","validationOptions","zodSchema","fullState","pathErrors","handleBlur","errors","itemIndex","zodPath","match","directMatch","baseState","stateWithInputProps"],"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\n\r\nimport {\r\n getDifferences,\r\n isArray,\r\n isFunction,\r\n type GenericObject,\r\n} from './utility.js';\r\nimport {\r\n FormElementWrapper,\r\n MemoizedCogsItemWrapper,\r\n ValidationWrapper,\r\n} from './Components.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 ValidationError,\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\n\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\n\r\ntype EffectFunction<T, R> = (state: T, deps: any[]) => R;\r\nexport type EndType<T, IsArrayElement = false> = {\r\n addZodValidation: (errors: ValidationError[]) => void;\r\n clearZodValidation: (paths?: string[]) => 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\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 ? { cutThis: () => 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\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\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 | null,\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\ntype UseSyncType<T> = (state: T, a: SyncOptionsType<any>) => SyncApi;\r\ntype SyncOptionsType<TApiParams> = {\r\n apiParams: TApiParams;\r\n stateKey?: string;\r\n stateRoom:\r\n | number\r\n | string\r\n | (({ clientId }: { clientId: string }) => string | null);\r\n connect?: boolean;\r\n inMemoryState?: boolean;\r\n};\r\nexport type OptionsType<T extends unknown = unknown, TApiParams = never> = {\r\n log?: boolean;\r\n componentId?: string;\r\n syncOptions?: SyncOptionsType<TApiParams>;\r\n\r\n validation?: ValidationOptionsType;\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;\r\n };\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?: ({ update }: { update: UpdateTypeDetail }) => 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\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 hasErrors: boolean;\r\n hasWarnings: boolean;\r\n allErrors: ValidationError[];\r\n\r\n path: string[];\r\n message?: string;\r\n getData?: () => T;\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\nconst {\r\n getInitialOptions,\r\n updateInitialStateGlobal,\r\n // ALIAS THE NEW FUNCTIONS TO THE OLD NAMES\r\n getShadowMetadata,\r\n setShadowMetadata,\r\n getShadowValue,\r\n initializeShadowState,\r\n updateShadowAtPath,\r\n insertShadowArrayElement,\r\n insertManyShadowArrayElements,\r\n removeShadowArrayElement,\r\n getSelectedIndex,\r\n setInitialStateOptions,\r\n setServerStateUpdate,\r\n markAsDirty,\r\n registerComponent,\r\n unregisterComponent,\r\n addPathComponent,\r\n clearSelectedIndexesForState,\r\n addStateLog,\r\n setSyncInfo,\r\n clearSelectedIndex,\r\n getSyncInfo,\r\n notifyPathSubscribers,\r\n subscribeToPath,\r\n // Note: The old functions are no longer imported under their original names\r\n} = getGlobalStore.getState();\r\nfunction getArrayData(stateKey: string, path: string[], meta?: MetaData) {\r\n const shadowMeta = getShadowMetadata(stateKey, path);\r\n const isArray = !!shadowMeta?.arrayKeys;\r\n\r\n if (!isArray) {\r\n const value = getGlobalStore.getState().getShadowValue(stateKey, path);\r\n return { isArray: false, value, keys: [] };\r\n }\r\n const arrayPathKey = path.length > 0 ? path.join('.') : 'root';\r\n const viewIds = meta?.arrayViews?.[arrayPathKey] ?? shadowMeta.arrayKeys;\r\n\r\n // FIX: If the derived view is empty, return an empty array and keys.\r\n if (Array.isArray(viewIds) && viewIds.length === 0) {\r\n return { isArray: true, value: [], keys: [] };\r\n }\r\n\r\n const value = getGlobalStore\r\n .getState()\r\n .getShadowValue(stateKey, path, viewIds);\r\n\r\n return { isArray: true, value, keys: viewIds ?? [] };\r\n}\r\n\r\nfunction findArrayItem(\r\n array: any[],\r\n keys: string[],\r\n predicate: (item: any, index: number) => boolean\r\n): { key: string; index: number; value: any } | null {\r\n for (let i = 0; i < array.length; i++) {\r\n if (predicate(array[i], i)) {\r\n const key = keys[i];\r\n if (key) {\r\n return { key, index: i, value: array[i] };\r\n }\r\n }\r\n }\r\n return null;\r\n}\r\n\r\nfunction setAndMergeOptions(stateKey: string, newOptions: OptionsType<any>) {\r\n const initialOptions = getInitialOptions(stateKey as string) || {};\r\n\r\n setInitialStateOptions(stateKey as string, {\r\n ...initialOptions,\r\n ...newOptions,\r\n });\r\n}\r\nfunction setOptions<StateKey, Opt>({\r\n stateKey,\r\n options,\r\n initialOptionsPart,\r\n}: {\r\n stateKey: StateKey;\r\n options?: OptionsType<any>;\r\n initialOptionsPart: Record<string, any>;\r\n}) {\r\n const initialOptions = getInitialOptions(stateKey as string) || {};\r\n const initialOptionsPartState = initialOptionsPart[stateKey as string] || {};\r\n\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 // Always preserve syncOptions if it exists in mergedOptions but not in options\r\n if (\r\n mergedOptions.syncOptions &&\r\n (!options || !options.hasOwnProperty('syncOptions'))\r\n ) {\r\n needToAdd = true;\r\n }\r\n\r\n if (needToAdd) {\r\n setInitialStateOptions(stateKey as string, mergedOptions);\r\n }\r\n}\r\n\r\nexport function addStateOptions<T extends unknown>(\r\n initialState: T,\r\n { formElements, validation }: OptionsType<T>\r\n) {\r\n return { initialState: initialState, formElements, validation } as T;\r\n}\r\n\r\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\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>;\r\n __useSync?: UseSyncType<State>;\r\n __syncSchemas?: Record<string, any>;\r\n }\r\n) => {\r\n let newInitialState = initialState;\r\n const [statePart, initialOptionsPart] =\r\n transformStateFunc<State>(newInitialState);\r\n\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 if (opt?.__fromSyncSchema && opt?.__apiParamsMap) {\r\n getGlobalStore\r\n .getState()\r\n .setInitialStateOptions('__apiParamsMap', opt.__apiParamsMap);\r\n }\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 if (opt?.__syncSchemas?.[key]?.schemas?.validation) {\r\n mergedOptions.validation = {\r\n zodSchemaV4: opt.__syncSchemas[key].schemas.validation,\r\n ...existingOptions.validation,\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 setInitialStateOptions(key, mergedOptions);\r\n } else {\r\n // Merge with existing global options\r\n 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 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\r\n setOptions({\r\n stateKey,\r\n options,\r\n initialOptionsPart,\r\n });\r\n const thiState =\r\n getShadowValue(stateKey as string, []) || 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 syncOptions: options?.syncOptions,\r\n __useSync: opt?.__useSync as UseSyncType<(typeof statePart)[StateKey]>,\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, never>;\r\n};\r\ntype UseCogsStateHook<\r\n T extends Record<string, any>,\r\n TApiParamsMap extends Record<string, any> = never,\r\n> = <StateKey extends keyof TransformedStateType<T> & string>(\r\n stateKey: StateKey,\r\n options?: [TApiParamsMap] extends [never]\r\n ? // When TApiParamsMap is never (no sync)\r\n Prettify<OptionsType<TransformedStateType<T>[StateKey]>>\r\n : // When TApiParamsMap exists (sync enabled)\r\n StateKey extends keyof TApiParamsMap\r\n ? Prettify<\r\n OptionsType<\r\n TransformedStateType<T>[StateKey],\r\n TApiParamsMap[StateKey]\r\n > & {\r\n syncOptions: Prettify<SyncOptionsType<TApiParamsMap[StateKey]>>;\r\n }\r\n >\r\n : Prettify<OptionsType<TransformedStateType<T>[StateKey]>>\r\n) => StateObject<TransformedStateType<T>[StateKey]>;\r\n\r\n// Update CogsApi to default to never instead of Record<string, never>\r\ntype CogsApi<\r\n T extends Record<string, any>,\r\n TApiParamsMap extends Record<string, any> = never,\r\n> = {\r\n useCogsState: UseCogsStateHook<T, TApiParamsMap>;\r\n setCogsOptions: SetCogsOptionsFunc<T>;\r\n};\r\ntype GetParamType<SchemaEntry> = SchemaEntry extends {\r\n api?: { queryData?: { _paramType?: infer P } };\r\n}\r\n ? P\r\n : never;\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 api?: {\r\n queryData?: any;\r\n };\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 useSync: UseSyncType<any>\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']]: GetParamType<\r\n TSyncSchema['schemas'][K]\r\n >;\r\n }\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 // Extract apiParams from the api.queryData._paramType\r\n if (entry?.api?.queryData?._paramType) {\r\n apiParamsMap[key] = entry.api.queryData._paramType;\r\n }\r\n }\r\n\r\n return createCogsState(initialState, {\r\n __fromSyncSchema: true,\r\n __syncNotifications: syncSchema.notifications,\r\n __apiParamsMap: apiParamsMap,\r\n __useSync: useSync,\r\n __syncSchemas: schemas,\r\n }) as any;\r\n}\r\n\r\nconst saveToLocalStorage = <T,>(\r\n state: T,\r\n thisKey: string,\r\n currentInitialOptions: any,\r\n sessionId?: string,\r\n 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 = 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 = 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 = 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\nfunction markEntireStateAsServerSynced(\r\n stateKey: string,\r\n path: string[],\r\n data: any,\r\n timestamp: number\r\n) {\r\n // Mark current path as synced\r\n const currentMeta = getShadowMetadata(stateKey, path);\r\n 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 = getShadowMetadata(stateKey, path);\r\n if (arrayMeta?.arrayKeys) {\r\n arrayMeta.arrayKeys.forEach((itemKey, index) => {\r\n // Fix: Don't split the itemKey, just use it directly\r\n const itemPath = [...path, itemKey];\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// 5. Batch queue\r\nlet updateBatchQueue: any[] = [];\r\nlet isFlushScheduled = false;\r\n\r\nfunction scheduleFlush() {\r\n if (!isFlushScheduled) {\r\n isFlushScheduled = true;\r\n queueMicrotask(flushQueue);\r\n }\r\n}\r\nfunction handleUpdate(\r\n stateKey: string,\r\n path: string[],\r\n payload: any\r\n): { type: 'update'; oldValue: any; newValue: any; shadowMeta: any } {\r\n // ✅ FIX: Get the old value before the update.\r\n const oldValue = getGlobalStore.getState().getShadowValue(stateKey, path);\r\n\r\n const newValue = isFunction(payload) ? payload(oldValue) : payload;\r\n\r\n // ✅ FIX: The new `updateShadowAtPath` handles metadata preservation automatically.\r\n // The manual loop has been removed.\r\n updateShadowAtPath(stateKey, path, newValue);\r\n\r\n markAsDirty(stateKey, path, { bubble: true });\r\n\r\n // Return the metadata of the node *after* the update.\r\n const newShadowMeta = getShadowMetadata(stateKey, path);\r\n\r\n return {\r\n type: 'update',\r\n oldValue: oldValue,\r\n newValue,\r\n shadowMeta: newShadowMeta,\r\n };\r\n}\r\n// 2. Update signals\r\nfunction updateSignals(shadowMeta: any, displayValue: any) {\r\n if (!shadowMeta?.signals?.length) return;\r\n\r\n shadowMeta.signals.forEach(({ parentId, position, effect }: any) => {\r\n const parent = document.querySelector(`[data-parent-id=\"${parentId}\"]`);\r\n if (!parent) return;\r\n\r\n const childNodes = Array.from(parent.childNodes);\r\n if (!childNodes[position]) return;\r\n\r\n let finalDisplayValue = displayValue;\r\n if (effect && displayValue !== null) {\r\n try {\r\n finalDisplayValue = new Function('state', `return (${effect})(state)`)(\r\n displayValue\r\n );\r\n } catch (err) {\r\n console.error('Error evaluating effect function:', err);\r\n }\r\n }\r\n\r\n if (finalDisplayValue !== null && typeof finalDisplayValue === 'object') {\r\n finalDisplayValue = JSON.stringify(finalDisplayValue);\r\n }\r\n\r\n childNodes[position].textContent = String(finalDisplayValue ?? '');\r\n });\r\n}\r\n\r\nfunction getComponentNotifications(\r\n stateKey: string,\r\n path: string[],\r\n result: any\r\n): Set<any> {\r\n const rootMeta = getShadowMetadata(stateKey, []);\r\n\r\n if (!rootMeta?.components) {\r\n return new Set();\r\n }\r\n\r\n const componentsToNotify = new Set<any>();\r\n\r\n // --- PASS 1: Notify specific subscribers based on update type ---\r\n\r\n if (result.type === 'update') {\r\n // --- Bubble-up Notification ---\r\n // An update to `user.address.street` notifies listeners of `street`, `address`, and `user`.\r\n let currentPath = [...path];\r\n while (true) {\r\n const pathMeta = getShadowMetadata(stateKey, currentPath);\r\n\r\n if (pathMeta?.pathComponents) {\r\n pathMeta.pathComponents.forEach((componentId: string) => {\r\n const component = rootMeta.components?.get(componentId);\r\n // NEW: Add component to the set instead of calling forceUpdate()\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 componentsToNotify.add(component);\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\r\n // --- Deep Object Change Notification ---\r\n // If the new value is an object, notify components subscribed to sub-paths that changed.\r\n if (\r\n result.newValue &&\r\n typeof result.newValue === 'object' &&\r\n !isArray(result.newValue)\r\n ) {\r\n const changedSubPaths = getDifferences(result.newValue, result.oldValue);\r\n\r\n changedSubPaths.forEach((subPathString: string) => {\r\n const subPath = subPathString.split('.');\r\n const fullSubPath = [...path, ...subPath];\r\n const subPathMeta = getShadowMetadata(stateKey, fullSubPath);\r\n\r\n if (subPathMeta?.pathComponents) {\r\n subPathMeta.pathComponents.forEach((componentId: string) => {\r\n const component = rootMeta.components?.get(componentId);\r\n // NEW: Add component to the set\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 componentsToNotify.add(component);\r\n }\r\n }\r\n });\r\n }\r\n });\r\n }\r\n } else if (result.type === 'insert' || result.type === 'cut') {\r\n // For array structural changes (add/remove), notify components listening to the parent array.\r\n const parentArrayPath = result.type === 'insert' ? path : path.slice(0, -1);\r\n const parentMeta = getShadowMetadata(stateKey, parentArrayPath);\r\n\r\n if (parentMeta?.pathComponents) {\r\n parentMeta.pathComponents.forEach((componentId: string) => {\r\n const component = rootMeta.components?.get(componentId);\r\n // NEW: Add component to the set\r\n if (component) {\r\n componentsToNotify.add(component);\r\n }\r\n });\r\n }\r\n }\r\n\r\n // --- PASS 2: Handle 'all' and 'deps' reactivity types ---\r\n // Iterate over all components for this stateKey that haven't been notified yet.\r\n rootMeta.components.forEach((component, componentId) => {\r\n // If we've already added this component, skip it.\r\n if (componentsToNotify.has(component)) {\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 componentsToNotify.add(component);\r\n } else if (reactiveTypes.includes('deps') && component.depsFunction) {\r\n const currentState = getShadowValue(stateKey, []);\r\n const newDeps = component.depsFunction(currentState);\r\n\r\n if (\r\n newDeps === true ||\r\n (Array.isArray(newDeps) && !isDeepEqual(component.prevDeps, newDeps))\r\n ) {\r\n component.prevDeps = newDeps as any; // Update the dependencies for the next check\r\n componentsToNotify.add(component);\r\n }\r\n }\r\n });\r\n\r\n return componentsToNotify;\r\n}\r\n\r\nfunction handleInsert(\r\n stateKey: string,\r\n path: string[],\r\n payload: any\r\n): { type: 'insert'; newValue: any; shadowMeta: any } {\r\n let newValue;\r\n if (isFunction(payload)) {\r\n const { value: currentValue } = getScopedData(stateKey, path);\r\n newValue = payload({ state: currentValue, uuid: uuidv4() });\r\n } else {\r\n newValue = payload;\r\n }\r\n\r\n insertShadowArrayElement(stateKey, path, newValue);\r\n markAsDirty(stateKey, path, { bubble: true });\r\n\r\n const updatedMeta = getShadowMetadata(stateKey, path);\r\n if (updatedMeta?.arrayKeys) {\r\n const newItemKey = updatedMeta.arrayKeys[updatedMeta.arrayKeys.length - 1];\r\n if (newItemKey) {\r\n const newItemPath = newItemKey.split('.').slice(1);\r\n markAsDirty(stateKey, newItemPath, { bubble: false });\r\n }\r\n }\r\n\r\n return { type: 'insert', newValue, shadowMeta: updatedMeta };\r\n}\r\n\r\nfunction handleCut(\r\n stateKey: string,\r\n path: string[]\r\n): { type: 'cut'; oldValue: any; parentPath: string[] } {\r\n const parentArrayPath = path.slice(0, -1);\r\n const oldValue = getShadowValue(stateKey, path);\r\n removeShadowArrayElement(stateKey, path);\r\n markAsDirty(stateKey, parentArrayPath, { bubble: true });\r\n return { type: 'cut', oldValue: oldValue, parentPath: parentArrayPath };\r\n}\r\n\r\nfunction flushQueue() {\r\n const allComponentsToNotify = new Set<any>();\r\n const signalUpdates: { shadowMeta: any; displayValue: any }[] = [];\r\n\r\n const logsToAdd: UpdateTypeDetail[] = [];\r\n\r\n for (const item of updateBatchQueue) {\r\n if (item.status && item.updateType) {\r\n logsToAdd.push(item as UpdateTypeDetail);\r\n continue;\r\n }\r\n\r\n const result = item;\r\n\r\n const displayValue = result.type === 'cut' ? null : result.newValue;\r\n if (result.shadowMeta?.signals?.length > 0) {\r\n signalUpdates.push({ shadowMeta: result.shadowMeta, displayValue });\r\n }\r\n\r\n const componentNotifications = getComponentNotifications(\r\n result.stateKey,\r\n result.path,\r\n result\r\n );\r\n\r\n componentNotifications.forEach((component) => {\r\n allComponentsToNotify.add(component);\r\n });\r\n }\r\n\r\n if (logsToAdd.length > 0) {\r\n addStateLog(logsToAdd);\r\n }\r\n\r\n signalUpdates.forEach(({ shadowMeta, displayValue }) => {\r\n updateSignals(shadowMeta, displayValue);\r\n });\r\n\r\n allComponentsToNotify.forEach((component) => {\r\n component.forceUpdate();\r\n });\r\n\r\n // --- Step 3: CLEANUP ---\r\n // Clear the queue for the next batch of updates.\r\n updateBatchQueue = [];\r\n isFlushScheduled = false;\r\n}\r\n\r\nfunction createEffectiveSetState<T>(\r\n thisKey: string,\r\n syncApiRef: React.MutableRefObject<any>,\r\n sessionId: string | undefined,\r\n latestInitialOptionsRef: React.MutableRefObject<OptionsType<T> | null>\r\n): EffectiveSetState<T> {\r\n // The returned function is the core setter that gets called by all state operations.\r\n // It is now much simpler, delegating all work to the executeUpdate function.\r\n return (newStateOrFunction, path, updateObj, validationKey?) => {\r\n executeUpdate(thisKey, path, newStateOrFunction, updateObj);\r\n };\r\n\r\n // This inner function handles the logic for a single state update.\r\n function executeUpdate(\r\n stateKey: string,\r\n path: string[],\r\n payload: any,\r\n options: UpdateOptions\r\n ) {\r\n // --- Step 1: Execute the core state change (Synchronous & Fast) ---\r\n // This part modifies the in-memory state representation immediately.\r\n let result: any;\r\n switch (options.updateType) {\r\n case 'update':\r\n result = handleUpdate(stateKey, path, payload);\r\n break;\r\n case 'insert':\r\n result = handleInsert(stateKey, path, payload);\r\n break;\r\n case 'cut':\r\n result = handleCut(stateKey, path);\r\n break;\r\n }\r\n\r\n result.stateKey = stateKey;\r\n result.path = path;\r\n updateBatchQueue.push(result);\r\n scheduleFlush();\r\n\r\n const newUpdate: UpdateTypeDetail = {\r\n timeStamp: Date.now(),\r\n stateKey,\r\n path,\r\n updateType: options.updateType,\r\n status: 'new',\r\n oldValue: result.oldValue,\r\n newValue: result.newValue ?? null,\r\n };\r\n\r\n updateBatchQueue.push(newUpdate);\r\n\r\n if (result.newValue !== undefined) {\r\n saveToLocalStorage(\r\n result.newValue,\r\n stateKey,\r\n latestInitialOptionsRef.current,\r\n sessionId\r\n );\r\n }\r\n\r\n if (latestInitialOptionsRef.current?.middleware) {\r\n latestInitialOptionsRef.current.middleware({ update: newUpdate });\r\n }\r\n\r\n if (options.sync !== false && syncApiRef.current?.connected) {\r\n syncApiRef.current.updateState({ operation: newUpdate });\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 __useSync,\r\n }: {\r\n stateKey?: string;\r\n componentId?: string;\r\n defaultState?: TStateObject;\r\n __useSync?: UseSyncType<TStateObject>;\r\n syncOptions?: SyncOptionsType<any>;\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 let noStateKey = stateKey ? false : true;\r\n const [thisKey] = useState(stateKey ?? uuidv4());\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 const syncKey = `${syncUpdate.stateKey}:${syncUpdate.path.join('.')}`;\r\n 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 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 return; // Ignore if no valid data\r\n }\r\n\r\n setAndMergeOptions(thisKey, { serverState: serverStateData });\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 = getShadowValue(thisKey, []);\r\n const incomingData = serverStateData.data;\r\n\r\n if (\r\n mergeConfig &&\r\n mergeConfig.strategy === 'append' &&\r\n 'key' in mergeConfig && // Type guard for key\r\n Array.isArray(currentState) &&\r\n Array.isArray(incomingData)\r\n ) {\r\n const keyField = mergeConfig.key;\r\n if (!keyField) {\r\n console.error(\r\n \"CogsState: Merge strategy 'append' requires a 'key' field.\"\r\n );\r\n return;\r\n }\r\n\r\n const existingIds = new Set(\r\n currentState.map((item: any) => item[keyField])\r\n );\r\n\r\n const newUniqueItems = incomingData.filter(\r\n (item: any) => !existingIds.has(item[keyField])\r\n );\r\n\r\n if (newUniqueItems.length > 0) {\r\n insertManyShadowArrayElements(thisKey, [], newUniqueItems);\r\n }\r\n\r\n // Mark the entire final state as synced\r\n const finalState = getShadowValue(thisKey, []);\r\n markEntireStateAsServerSynced(\r\n thisKey,\r\n [],\r\n finalState,\r\n serverStateData.timestamp\r\n );\r\n } else {\r\n // This handles the \"replace\" strategy (initial load)\r\n initializeShadowState(thisKey, incomingData);\r\n\r\n markEntireStateAsServerSynced(\r\n thisKey,\r\n [],\r\n incomingData,\r\n serverStateData.timestamp\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 const features = {\r\n syncEnabled: !!cogsSyncFn && !!syncOpt,\r\n validationEnabled: !!(\r\n options?.validation?.zodSchemaV4 || options?.validation?.zodSchemaV3\r\n ),\r\n localStorageEnabled: !!options?.localStorage?.key,\r\n };\r\n setShadowMetadata(thisKey, [], {\r\n ...existingMeta,\r\n features,\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 initializeShadowState(thisKey, resolvedState);\r\n\r\n // Set shadow metadata with the correct source info\r\n 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\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 = 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'],\r\n paths: new Set(),\r\n depsFunction: reactiveDeps || undefined,\r\n deps: reactiveDeps ? reactiveDeps(getShadowValue(thisKey, [])) : [],\r\n prevDeps: reactiveDeps // Initialize prevDeps with the same initial value\r\n ? reactiveDeps(getShadowValue(thisKey, []))\r\n : [],\r\n });\r\n\r\n setShadowMetadata(thisKey, [], {\r\n ...rootMeta,\r\n components,\r\n });\r\n forceUpdate({});\r\n return () => {\r\n const meta = 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 setShadowMetadata(thisKey, [], meta);\r\n }\r\n };\r\n }, []);\r\n\r\n const syncApiRef = useRef<SyncApi | null>(null);\r\n const effectiveSetState = createEffectiveSetState(\r\n thisKey,\r\n syncApiRef,\r\n sessionId,\r\n latestInitialOptionsRef\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 const handler = createProxyHandler<TStateObject>(\r\n thisKey,\r\n effectiveSetState,\r\n componentIdRef.current,\r\n sessionId\r\n );\r\n\r\n return handler;\r\n }, [thisKey, sessionId]);\r\n\r\n const cogsSyncFn = __useSync;\r\n const syncOpt = latestInitialOptionsRef.current?.syncOptions;\r\n\r\n if (cogsSyncFn) {\r\n syncApiRef.current = cogsSyncFn(\r\n updaterFinal as any,\r\n syncOpt ?? ({} as any)\r\n );\r\n }\r\n\r\n return updaterFinal;\r\n}\r\n\r\ntype MetaData = {\r\n // Map array paths to their filtered/sorted ID order\r\n arrayViews?: {\r\n [arrayPath: string]: string[]; // e.g. { \"todos\": [\"id:xxx\", \"id:yyy\"], \"todos.id:xxx.subtasks\": [\"id:aaa\"] }\r\n };\r\n transforms?: Array<{\r\n type: 'filter' | 'sort';\r\n fn: Function;\r\n path: string[]; // Which array this transform applies to\r\n }>;\r\n serverStateIsUpStream?: boolean;\r\n};\r\n\r\nconst applyTransforms = (\r\n stateKey: string,\r\n path: string[],\r\n meta?: MetaData\r\n): string[] => {\r\n let ids = getShadowMetadata(stateKey, path)?.arrayKeys || [];\r\n const transforms = meta?.transforms;\r\n if (!transforms || transforms.length === 0) {\r\n return ids;\r\n }\r\n\r\n // Apply each transform using just IDs\r\n for (const transform of transforms) {\r\n if (transform.type === 'filter') {\r\n const filtered: any[] = [];\r\n ids.forEach((id, index) => {\r\n const value = getShadowValue(stateKey, [...path, id]);\r\n\r\n if (transform.fn(value, index)) {\r\n filtered.push(id);\r\n }\r\n });\r\n ids = filtered;\r\n } else if (transform.type === 'sort') {\r\n ids.sort((a, b) => {\r\n const aValue = getShadowValue(stateKey, [...path, a]);\r\n const bValue = getShadowValue(stateKey, [...path, b]);\r\n return transform.fn(aValue, bValue);\r\n });\r\n }\r\n }\r\n\r\n return ids;\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\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 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 rootMeta = 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 getShadowMetadata(stateKey, [\r\n ...parentPath,\r\n '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 = getShadowMetadata(stateKey, parentPath);\r\n for (let arrayKey of parentMeta?.arrayKeys || []) {\r\n const key = arrayKey + '.selected';\r\n const selectedItem = getShadowMetadata(stateKey, key.split('.').slice(1));\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 getScopedData(stateKey: string, path: string[], meta?: MetaData) {\r\n const shadowMeta = getShadowMetadata(stateKey, path);\r\n const arrayPathKey = path.length > 0 ? path.join('.') : 'root';\r\n const arrayKeys = meta?.arrayViews?.[arrayPathKey];\r\n\r\n // FIX: If the derived view is empty, return an empty array directly.\r\n if (Array.isArray(arrayKeys) && arrayKeys.length === 0) {\r\n return {\r\n shadowMeta,\r\n value: [],\r\n arrayKeys: shadowMeta?.arrayKeys,\r\n };\r\n }\r\n\r\n const value = getShadowValue(stateKey, path, arrayKeys);\r\n\r\n return {\r\n shadowMeta,\r\n value,\r\n arrayKeys: shadowMeta?.arrayKeys,\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 const proxyCache = new Map<string, any>();\r\n let stateVersion = 0;\r\n\r\n const methodNames = new Set([\r\n 'sync',\r\n 'getStatus',\r\n 'removeStorage',\r\n 'showValidationErrors',\r\n 'getSelected',\r\n 'getSelectedIndex',\r\n 'clearSelected',\r\n 'useVirtualView',\r\n 'stateMap',\r\n '$stateMap',\r\n 'stateFind',\r\n 'stateFilter',\r\n 'stateSort',\r\n 'stream',\r\n 'stateList',\r\n 'stateFlattenOn',\r\n 'index',\r\n 'last',\r\n 'insert',\r\n 'uniqueInsert',\r\n 'cut',\r\n 'cutSelected',\r\n 'cutByValue',\r\n 'toggleByValue',\r\n 'findWith',\r\n 'cutThis',\r\n 'get',\r\n 'getState',\r\n '$derive',\r\n '$get',\r\n 'lastSynced',\r\n 'getLocalStorage',\r\n 'isSelected',\r\n 'setSelected',\r\n 'toggleSelected',\r\n '_componentId',\r\n 'addZodValidation',\r\n 'clearZodValidation',\r\n 'applyJsonPatch',\r\n 'getComponents',\r\n 'getAllFormRefs',\r\n 'getFormRef',\r\n 'validationWrapper',\r\n '_stateKey',\r\n '_path',\r\n 'update',\r\n 'toggle',\r\n 'formElement',\r\n // Add ANY other method names here\r\n ]);\r\n\r\n function rebuildStateShape({\r\n path = [],\r\n meta,\r\n componentId,\r\n }: {\r\n path: string[];\r\n componentId: string;\r\n meta?: MetaData;\r\n }): any {\r\n const derivationSignature = meta\r\n ? JSON.stringify(meta.arrayViews || meta.transforms)\r\n : '';\r\n const cacheKey = path.join('.') + ':' + derivationSignature;\r\n if (proxyCache.has(cacheKey)) {\r\n return proxyCache.get(cacheKey);\r\n }\r\n const stateKeyPathKey = [stateKey, ...path].join('.');\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 get(target: any, prop: string) {\r\n if (path.length === 0 && prop in rootLevelMethods) {\r\n return rootLevelMethods[prop as keyof typeof rootLevelMethods];\r\n }\r\n if (!methodNames.has(prop)) {\r\n const nextPath = [...path, prop];\r\n return rebuildStateShape({\r\n path: nextPath,\r\n componentId: componentId!,\r\n meta,\r\n });\r\n }\r\n if (prop === '_rebuildStateShape') {\r\n return rebuildStateShape;\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 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 // ✅ Use the optimized helper to get all data in one efficient call\r\n const { shadowMeta, value } = getScopedData(stateKey, path, meta);\r\n\r\n // Priority 1: Explicitly dirty items. This is the most important status.\r\n if (shadowMeta?.isDirty === true) {\r\n return 'dirty';\r\n }\r\n\r\n // ✅ Priority 2: Synced items. This condition is now cleaner.\r\n // An item is considered synced if it came from the server OR was explicitly\r\n // marked as not dirty (isDirty: false), covering all sync-related cases.\r\n if (\r\n shadowMeta?.stateSource === 'server' ||\r\n shadowMeta?.isDirty === false\r\n ) {\r\n return 'synced';\r\n }\r\n\r\n // Priority 3: Items restored from localStorage.\r\n if (shadowMeta?.stateSource === 'localStorage') {\r\n return 'restored';\r\n }\r\n\r\n // Priority 4: Items from default/initial state.\r\n if (shadowMeta?.stateSource === 'default') {\r\n return 'fresh';\r\n }\r\n\r\n // ✅ REMOVED the redundant \"root\" check. The item's own `stateSource` is sufficient.\r\n\r\n // Priority 5: A value exists but has no metadata. This is a fallback.\r\n if (value !== undefined && !shadowMeta) {\r\n return 'fresh';\r\n }\r\n\r\n // Fallback if no other condition is met.\r\n return 'unknown';\r\n };\r\n\r\n // This part remains the same\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 { shadowMeta } = getScopedData(stateKey, path, meta);\r\n if (\r\n shadowMeta?.validation?.status === 'INVALID' &&\r\n shadowMeta.validation.errors.length > 0\r\n ) {\r\n // Return only error-severity messages (not warnings)\r\n return shadowMeta.validation.errors\r\n .filter((err) => err.severity === 'error')\r\n .map((err) => err.message);\r\n }\r\n return [];\r\n };\r\n }\r\n\r\n if (prop === 'getSelected') {\r\n return () => {\r\n const arrayKey = [stateKey, ...path].join('.');\r\n registerComponentDependency(stateKey, componentId, [\r\n ...path,\r\n 'getSelected',\r\n ]);\r\n\r\n const selectedItemKey = getGlobalStore\r\n .getState()\r\n .selectedIndicesMap.get(arrayKey);\r\n if (!selectedItemKey) {\r\n return undefined;\r\n }\r\n\r\n const viewKey = path.join('.');\r\n const currentViewIds = meta?.arrayViews?.[viewKey];\r\n const selectedItemId = selectedItemKey.split('.').pop();\r\n\r\n // FIX: Only return the selected item if it exists in the current filtered/sorted view.\r\n if (currentViewIds && !currentViewIds.includes(selectedItemId!)) {\r\n return undefined;\r\n }\r\n\r\n const value = getShadowValue(\r\n stateKey,\r\n selectedItemKey.split('.').slice(1)\r\n );\r\n if (value === undefined) {\r\n return undefined;\r\n }\r\n\r\n return rebuildStateShape({\r\n path: selectedItemKey.split('.').slice(1) as string[],\r\n componentId: componentId!,\r\n meta,\r\n });\r\n };\r\n }\r\n if (prop === 'getSelectedIndex') {\r\n return () => {\r\n // Key for the array in the global selection map (e.g., \"myState.products\")\r\n const arrayKey = stateKey + '.' + path.join('.');\r\n // Key for this specific view in the meta object (e.g., \"products\")\r\n const viewKey = path.join('.');\r\n\r\n // Get the full path of the selected item (e.g., \"myState.products.id:abc\")\r\n const selectedItemKey = getGlobalStore\r\n .getState()\r\n .selectedIndicesMap.get(arrayKey);\r\n\r\n if (!selectedItemKey) {\r\n return -1; // Nothing is selected for this array.\r\n }\r\n\r\n // Get the list of item IDs for the current filtered/sorted view.\r\n const { keys: viewIds } = getArrayData(stateKey, path, meta);\r\n\r\n if (!viewIds) {\r\n return -1; // Should not happen if it's an array, but a safe guard.\r\n }\r\n\r\n // FIX: Extract just the ID from the full selected item path.\r\n const selectedId = selectedItemKey.split('.').pop();\r\n\r\n // Return the index of that ID within the current view's list of IDs.\r\n return (viewIds as string[]).indexOf(selectedId as string);\r\n };\r\n }\r\n if (prop === 'clearSelected') {\r\n notifySelectionComponents(stateKey, path);\r\n return () => {\r\n 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 useEffect(() => {\r\n const interval = setInterval(() => {\r\n forceUpdate({});\r\n }, 1000);\r\n return () => clearInterval(interval);\r\n }, []);\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 const { keys: arrayKeys } = getArrayData(stateKey, path, meta);\r\n\r\n // Subscribe to state changes like stateList does\r\n useEffect(() => {\r\n const stateKeyPathKey = [stateKey, ...path].join('.');\r\n const unsubscribe = getGlobalStore\r\n .getState()\r\n .subscribeToPath(stateKeyPathKey, (e) => {\r\n if (e.type === 'GET_SELECTED') {\r\n return;\r\n }\r\n if (e.type === 'SERVER_STATE_UPDATE') {\r\n // forceUpdate({});\r\n }\r\n });\r\n\r\n return () => {\r\n unsubscribe();\r\n };\r\n }, [componentId, stateKey, path.join('.')]);\r\n\r\n // YOUR ORIGINAL INITIAL POSITIONING - KEEPING EXACTLY AS IS\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 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 requestAnimationFrame(() => {\r\n scrollToBottom('instant');\r\n initialScrollRef.current = false;\r\n });\r\n } else {\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 const rangeRef = useRef(range);\r\n useLayoutEffect(() => {\r\n rangeRef.current = range;\r\n }, [range]);\r\n\r\n const arrayKeysRef = useRef(arrayKeys);\r\n useLayoutEffect(() => {\r\n arrayKeysRef.current = arrayKeys;\r\n }, [arrayKeys]);\r\n\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 console.log(\r\n 'hadnlescroll ',\r\n measurementCache.current,\r\n newStartIndex,\r\n range\r\n );\r\n // Only update if range actually changed\r\n if (newStartIndex !== range.startIndex && range.startIndex != 0) {\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) return;\r\n\r\n container.addEventListener('scroll', handleScroll, {\r\n passive: true,\r\n });\r\n return () => {\r\n container.removeEventListener('scroll', handleScroll);\r\n };\r\n }, [handleScroll, stickToBottom]);\r\n\r\n // YOUR ORIGINAL SCROLL TO BOTTOM FUNCTION - KEEPING EXACTLY AS IS\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 scrollStateRef.current.isUserScrolling = false;\r\n scrollStateRef.current.isNearBottom = true;\r\n scrollStateRef.current.scrollUpCount = 0;\r\n\r\n const performScroll = () => {\r\n const attemptScroll = (attempts = 0) => {\r\n if (attempts > 5) return;\r\n\r\n const currentHeight = container.scrollHeight;\r\n const currentScroll = container.scrollTop;\r\n const clientHeight = container.clientHeight;\r\n\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 setTimeout(() => {\r\n const newHeight = container.scrollHeight;\r\n const newScroll = container.scrollTop;\r\n\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 if ('requestIdleCallback' in window) {\r\n requestIdleCallback(performScroll, { timeout: 100 });\r\n } else {\r\n requestAnimationFrame(() => {\r\n requestAnimationFrame(performScroll);\r\n });\r\n }\r\n },\r\n []\r\n );\r\n\r\n // YOUR ORIGINAL AUTO-SCROLL EFFECTS - KEEPING ALL OF THEM\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 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 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'],\r\n });\r\n\r\n if (initialScrollRef.current) {\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 };\r\n }, [stickToBottom, arrayKeys.length, scrollToBottom]);\r\n\r\n // Create virtual state - NO NEED to get values, only IDs!\r\n const virtualState = useMemo(() => {\r\n // 2. Physically slice the corresponding keys.\r\n const slicedKeys = Array.isArray(arrayKeys)\r\n ? arrayKeys.slice(range.startIndex, range.endIndex + 1)\r\n : [];\r\n\r\n // Use the same keying as getArrayData (empty string for root)\r\n const arrayPath = path.length > 0 ? path.join('.') : 'root';\r\n return rebuildStateShape({\r\n path,\r\n componentId: componentId!,\r\n meta: {\r\n ...meta,\r\n arrayViews: { [arrayPath]: slicedKeys },\r\n serverStateIsUpStream: true,\r\n },\r\n });\r\n }, [range.startIndex, range.endIndex, arrayKeys, meta]);\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' as const,\r\n height: '100%',\r\n position: 'relative' as const,\r\n },\r\n },\r\n inner: {\r\n style: {\r\n position: 'relative' as const,\r\n },\r\n },\r\n list: {\r\n style: {\r\n transform: `translateY(${\r\n measurementCache.current.get(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: (setter: any, index: number, arraySetter: any) => void\r\n ) => {\r\n // FIX: Use getArrayData to reliably get both the value and the keys of the current view.\r\n const { value: shadowValue, keys: arrayKeys } = getArrayData(\r\n stateKey,\r\n path,\r\n meta\r\n );\r\n\r\n if (!arrayKeys || !Array.isArray(shadowValue)) {\r\n return []; // It's valid to map over an empty array.\r\n }\r\n\r\n const arraySetter = rebuildStateShape({\r\n path,\r\n componentId: componentId!,\r\n meta,\r\n });\r\n\r\n return shadowValue.map((_item, index) => {\r\n const itemKey = arrayKeys[index];\r\n if (!itemKey) return undefined;\r\n\r\n // FIX: Construct the correct path to the item in the original store.\r\n // The path is the array's path plus the specific item's unique key.\r\n const itemPath = [...path, itemKey];\r\n\r\n const itemSetter = rebuildStateShape({\r\n path: itemPath, // This now correctly points to the item in the shadow store.\r\n componentId: componentId!,\r\n meta,\r\n });\r\n\r\n return callbackfn(itemSetter, index, arraySetter);\r\n });\r\n };\r\n }\r\n\r\n if (prop === 'stateFilter') {\r\n return (callbackfn: (value: any, index: number) => boolean) => {\r\n const arrayPathKey = path.length > 0 ? path.join('.') : 'root';\r\n\r\n // ✅ FIX: Get keys from `getArrayData` which correctly resolves them from meta or the full list.\r\n const { keys: currentViewIds, value: array } = getArrayData(\r\n stateKey,\r\n path,\r\n meta\r\n );\r\n\r\n if (!Array.isArray(array)) {\r\n throw new Error('stateFilter can only be used on arrays');\r\n }\r\n\r\n // Filter the array and collect the IDs of the items that pass\r\n const filteredIds: string[] = [];\r\n array.forEach((item, index) => {\r\n if (callbackfn(item, index)) {\r\n // currentViewIds[index] is the original ID before filtering\r\n const id = currentViewIds[index];\r\n if (id) {\r\n filteredIds.push(id);\r\n }\r\n }\r\n });\r\n\r\n // The rest is the same...\r\n return rebuildStateShape({\r\n path,\r\n componentId: componentId!,\r\n meta: {\r\n ...meta,\r\n arrayViews: {\r\n ...(meta?.arrayViews || {}),\r\n [arrayPathKey]: filteredIds,\r\n },\r\n transforms: [\r\n ...(meta?.transforms || []),\r\n { type: 'filter', fn: callbackfn, path },\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 arrayPathKey = path.length > 0 ? path.join('.') : 'root';\r\n\r\n // FIX: Use the more robust `getArrayData` which always correctly resolves the keys for a view.\r\n const { value: currentArray, keys: currentViewIds } = getArrayData(\r\n stateKey,\r\n path,\r\n meta\r\n );\r\n\r\n if (!Array.isArray(currentArray) || !currentViewIds) {\r\n throw new Error('No array keys found for sorting');\r\n }\r\n\r\n // ... (rest of the function is the same and now works)\r\n const itemsWithIds = currentArray.map((item, index) => ({\r\n item,\r\n key: currentViewIds[index],\r\n }));\r\n itemsWithIds.sort((a, b) => compareFn(a.item, b.item));\r\n const sortedIds = itemsWithIds.map((i) => i.key as string);\r\n\r\n return rebuildStateShape({\r\n path,\r\n componentId: componentId!,\r\n meta: {\r\n ...meta,\r\n arrayViews: {\r\n ...(meta?.arrayViews || {}),\r\n [arrayPathKey]: sortedIds,\r\n },\r\n transforms: [\r\n ...(meta?.transforms || []),\r\n { type: 'sort', fn: compareFn, path },\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 (bufferStrategy === 'sliding' && buffer.length >= bufferSize) {\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 = getShadowMetadata(stateKey, path) || {};\r\n const streams = currentMeta.streams || new Map();\r\n streams.set(streamId, { buffer, flushTimer });\r\n\r\n 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 [updateTrigger, forceUpdate] = useState({});\r\n\r\n const arrayPathKey = path.length > 0 ? path.join('.') : 'root';\r\n\r\n const validIds = applyTransforms(stateKey, path, meta);\r\n\r\n // Memoize the updated meta to prevent creating new objects on every render\r\n const updatedMeta = useMemo(() => {\r\n return {\r\n ...meta,\r\n arrayViews: {\r\n ...(meta?.arrayViews || {}),\r\n [arrayPathKey]: validIds,\r\n },\r\n };\r\n }, [meta, arrayPathKey, validIds]);\r\n\r\n // Now use the updated meta when getting array data\r\n const { value: arrayValues } = getArrayData(\r\n stateKey,\r\n path,\r\n updatedMeta\r\n );\r\n\r\n useEffect(() => {\r\n const unsubscribe = getGlobalStore\r\n .getState()\r\n .subscribeToPath(stateKeyPathKey, (e) => {\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 === 'INSERT_MANY' ||\r\n e.type === 'REMOVE' ||\r\n e.type === 'CLEAR_SELECTION' ||\r\n (e.type === 'SERVER_STATE_UPDATE' &&\r\n !meta?.serverStateIsUpStream)\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 // Continue using updatedMeta for the rest of your logic instead of meta\r\n const arraySetter = rebuildStateShape({\r\n path,\r\n componentId: componentId!,\r\n meta: updatedMeta, // Use updated meta here\r\n });\r\n\r\n const returnValue = 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 = 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 = [...path, itemKey];\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 return <>{returnValue}</>;\r\n };\r\n\r\n return <StateListWrapper />;\r\n };\r\n }\r\n if (prop === 'stateFlattenOn') {\r\n return (fieldName: string) => {\r\n // FIX: Get the definitive list of IDs for the current view from meta.arrayViews.\r\n const arrayPathKey = path.length > 0 ? path.join('.') : 'root';\r\n const viewIds = meta?.arrayViews?.[arrayPathKey];\r\n\r\n const currentState = getGlobalStore\r\n .getState()\r\n .getShadowValue(stateKey, path, viewIds);\r\n\r\n if (!Array.isArray(currentState)) return [];\r\n\r\n stateVersion++;\r\n\r\n return rebuildStateShape({\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 arrayPathKey = path.length > 0 ? path.join('.') : 'root';\r\n const viewIds = meta?.arrayViews?.[arrayPathKey];\r\n\r\n if (viewIds) {\r\n const itemId = viewIds[index];\r\n if (!itemId) return undefined;\r\n return rebuildStateShape({\r\n path: [...path, itemId],\r\n componentId: componentId!,\r\n meta,\r\n });\r\n }\r\n\r\n // ✅ FIX: Get the metadata and use the `arrayKeys` property.\r\n const shadowMeta = getShadowMetadata(stateKey, path);\r\n if (!shadowMeta?.arrayKeys) return undefined;\r\n\r\n const itemId = shadowMeta.arrayKeys[index];\r\n if (!itemId) return undefined;\r\n\r\n return rebuildStateShape({\r\n path: [...path, itemId],\r\n componentId: componentId!,\r\n meta,\r\n });\r\n };\r\n }\r\n if (prop === 'last') {\r\n return () => {\r\n const { keys: currentViewIds } = getArrayData(stateKey, path, meta);\r\n if (!currentViewIds || currentViewIds.length === 0) {\r\n return undefined;\r\n }\r\n const lastItemKey = currentViewIds[currentViewIds.length - 1];\r\n\r\n if (!lastItemKey) {\r\n return undefined;\r\n }\r\n const newPath = [...path, lastItemKey];\r\n\r\n return rebuildStateShape({\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 };\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 { value: currentArray } = getScopedData(\r\n stateKey,\r\n path,\r\n meta\r\n ) as {\r\n value: any[];\r\n };\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 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\r\n effectiveSetState(updatedArray as any, path, {\r\n updateType: 'update',\r\n });\r\n }\r\n };\r\n }\r\n if (prop === 'cut') {\r\n return (index?: number, options?: { waitForSync?: boolean }) => {\r\n const shadowMeta = getShadowMetadata(stateKey, path);\r\n if (!shadowMeta?.arrayKeys || shadowMeta.arrayKeys.length === 0)\r\n return;\r\n\r\n const indexToCut =\r\n index === -1\r\n ? shadowMeta.arrayKeys.length - 1\r\n : index !== undefined\r\n ? index\r\n : shadowMeta.arrayKeys.length - 1;\r\n\r\n const idToCut = shadowMeta.arrayKeys[indexToCut];\r\n if (!idToCut) return;\r\n\r\n effectiveSetState(null, [...path, idToCut], {\r\n updateType: 'cut',\r\n });\r\n };\r\n }\r\n if (prop === 'cutSelected') {\r\n return () => {\r\n const arrayKey = [stateKey, ...path].join('.');\r\n\r\n const { keys: currentViewIds } = getArrayData(stateKey, path, meta);\r\n if (!currentViewIds || currentViewIds.length === 0) {\r\n return;\r\n }\r\n const selectedItemKey = getGlobalStore\r\n .getState()\r\n .selectedIndicesMap.get(arrayKey);\r\n\r\n if (!selectedItemKey) {\r\n return;\r\n }\r\n const selectedId = selectedItemKey.split('.').pop() as string;\r\n\r\n if (!(currentViewIds as any[]).includes(selectedId!)) {\r\n return;\r\n }\r\n const pathForCut = selectedItemKey.split('.').slice(1);\r\n getGlobalStore.getState().clearSelectedIndex({ arrayKey });\r\n\r\n const parentPath = pathForCut.slice(0, -1);\r\n notifySelectionComponents(stateKey, parentPath);\r\n\r\n effectiveSetState(null, 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 const {\r\n isArray,\r\n value: array,\r\n keys,\r\n } = getArrayData(stateKey, path, meta);\r\n\r\n if (!isArray) return;\r\n\r\n const found = findArrayItem(array, keys, (item) => item === value);\r\n if (found) {\r\n effectiveSetState(null, [...path, found.key], {\r\n updateType: 'cut',\r\n });\r\n }\r\n };\r\n }\r\n\r\n if (prop === 'toggleByValue') {\r\n return (value: string | number | boolean) => {\r\n const {\r\n isArray,\r\n value: array,\r\n keys,\r\n } = getArrayData(stateKey, path, meta);\r\n\r\n if (!isArray) return;\r\n\r\n const found = findArrayItem(array, keys, (item) => item === value);\r\n\r\n if (found) {\r\n const pathForItem = [...path, found.key];\r\n\r\n effectiveSetState(null, pathForItem, {\r\n updateType: 'cut',\r\n });\r\n } else {\r\n effectiveSetState(value as any, path, { updateType: 'insert' });\r\n }\r\n };\r\n }\r\n if (prop === 'findWith') {\r\n return (searchKey: string, searchValue: any) => {\r\n const { isArray, value, keys } = getArrayData(stateKey, path, meta);\r\n\r\n if (!isArray) {\r\n throw new Error('findWith can only be used on arrays');\r\n }\r\n\r\n const found = findArrayItem(\r\n value,\r\n keys,\r\n (item) => item?.[searchKey] === searchValue\r\n );\r\n\r\n if (found) {\r\n return rebuildStateShape({\r\n path: [...path, found.key],\r\n componentId: componentId!,\r\n meta,\r\n });\r\n }\r\n\r\n return rebuildStateShape({\r\n path: [...path, `not_found_${uuidv4()}`],\r\n componentId: componentId!,\r\n meta,\r\n });\r\n };\r\n }\r\n if (prop === 'cutThis') {\r\n const { value: shadowValue } = getScopedData(stateKey, path, meta);\r\n const parentPath = path.slice(0, -1);\r\n notifySelectionComponents(stateKey, parentPath);\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 const { value } = getScopedData(stateKey, path, meta);\r\n return value;\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\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 getSyncInfo(syncKey);\r\n }\r\n if (prop == 'getLocalStorage') {\r\n return (key: string) =>\r\n loadFromLocalStorage(sessionId + '-' + stateKey + '-' + key);\r\n }\r\n if (prop === 'isSelected') {\r\n const parentPathArray = path.slice(0, -1);\r\n const parentMeta = getShadowMetadata(stateKey, parentPathArray);\r\n\r\n if (parentMeta?.arrayKeys) {\r\n const fullParentKey = stateKey + '.' + parentPathArray.join('.');\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 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 notifySelectionComponents(stateKey, parentPath);\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 === 'addZodValidation') {\r\n return (zodErrors: any[]) => {\r\n zodErrors.forEach((error) => {\r\n const currentMeta =\r\n getGlobalStore\r\n .getState()\r\n .getShadowMetadata(stateKey, error.path) || {};\r\n\r\n getGlobalStore\r\n .getState()\r\n .setShadowMetadata(stateKey, error.path, {\r\n ...currentMeta,\r\n validation: {\r\n status: 'INVALID',\r\n errors: [\r\n {\r\n source: 'client',\r\n message: error.message,\r\n severity: 'error',\r\n code: error.code,\r\n },\r\n ],\r\n lastValidated: Date.now(),\r\n validatedValue: undefined,\r\n },\r\n });\r\n });\r\n };\r\n }\r\n if (prop === 'clearZodValidation') {\r\n return (path?: string[]) => {\r\n if (!path) {\r\n throw new Error('clearZodValidation requires a path');\r\n }\r\n\r\n const currentMeta = getShadowMetadata(stateKey, path) || {};\r\n\r\n setShadowMetadata(stateKey, path, {\r\n ...currentMeta,\r\n validation: {\r\n status: 'NOT_VALIDATED',\r\n errors: [],\r\n lastValidated: Date.now(),\r\n },\r\n });\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\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\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\r\n if (prop === 'getComponents')\r\n return () => getShadowMetadata(stateKey, [])?.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 effectiveSetState(payload as any, path, { updateType: 'update' });\r\n\r\n return {\r\n synced: () => {\r\n const shadowMeta = getGlobalStore\r\n .getState()\r\n .getShadowMetadata(stateKey, path);\r\n\r\n // Update the metadata for this specific path\r\n setShadowMetadata(stateKey, path, {\r\n ...shadowMeta,\r\n isDirty: false,\r\n stateSource: 'server',\r\n lastServerSync: Date.now(),\r\n });\r\n\r\n // Notify any components that might be subscribed to the sync status\r\n const fullPath = [stateKey, ...path].join('.');\r\n notifyPathSubscribers(fullPath, {\r\n type: 'SYNC_STATUS_CHANGE',\r\n isDirty: false,\r\n });\r\n },\r\n };\r\n };\r\n }\r\n if (prop === 'toggle') {\r\n const { value: currentValueAtPath } = getScopedData(\r\n stateKey,\r\n path,\r\n meta\r\n );\r\n\r\n if (typeof currentValueAtPath != '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 path: nextPath,\r\n componentId: componentId!,\r\n meta,\r\n });\r\n },\r\n };\r\n\r\n const proxyInstance = new Proxy({}, handler);\r\n proxyCache.set(cacheKey, proxyInstance);\r\n\r\n return proxyInstance;\r\n }\r\n\r\n const rootLevelMethods = {\r\n revertToInitialState: (obj?: { validationKey?: string }) => {\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 clearSelectedIndexesForState(stateKey);\r\n\r\n stateVersion++;\r\n initializeShadowState(stateKey, initialState);\r\n rebuildStateShape({\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 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 initializeShadowState(stateKey, newState);\r\n // initializeShadowStateNEW(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\r\n const returnShape = rebuildStateShape({\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 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\r\n const arrayPathKey = proxy._path.length > 0 ? proxy._path.join('.') : 'root';\r\n const viewIds = proxy._meta?.arrayViews?.[arrayPathKey];\r\n\r\n const value = getShadowValue(proxy._stateKey, proxy._path, viewIds);\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"],"names":["getInitialOptions","updateInitialStateGlobal","getShadowMetadata","setShadowMetadata","getShadowValue","initializeShadowState","updateShadowAtPath","insertShadowArrayElement","insertManyShadowArrayElements","removeShadowArrayElement","getSelectedIndex","setInitialStateOptions","setServerStateUpdate","markAsDirty","registerComponent","unregisterComponent","addPathComponent","clearSelectedIndexesForState","addStateLog","setSyncInfo","clearSelectedIndex","getSyncInfo","notifyPathSubscribers","subscribeToPath","getGlobalStore","getArrayData","stateKey","path","meta","shadowMeta","arrayPathKey","viewIds","findArrayItem","array","keys","predicate","i","key","setAndMergeOptions","newOptions","initialOptions","setOptions","options","initialOptionsPart","mergedOptions","needToAdd","isDeepEqual","addStateOptions","initialState","formElements","validation","createCogsState","opt","newInitialState","statePart","transformStateFunc","existingOptions","existingGlobalOptions","useCogsState","componentId","useState","uuidv4","thiState","partialState","useCogsStateFn","setCogsOptions","loadAndApplyLocalStorage","notifyComponents","createCogsStateFromSync","syncSchema","useSync","schemas","apiParamsMap","entry","saveToLocalStorage","state","thisKey","currentInitialOptions","sessionId","lastSyncedWithServer","isFunction","storageKey","existingLastSynced","loadFromLocalStorage","data","superJsonResult","superjson","localStorageKey","storedData","error","currentState","useCogsConfig","localkey","localData","stateEntry","updates","component","update","markEntireStateAsServerSynced","timestamp","currentMeta","arrayMeta","itemKey","index","itemPath","itemData","fieldPath","fieldData","updateBatchQueue","isFlushScheduled","scheduleFlush","flushQueue","handleUpdate","payload","oldValue","newValue","newShadowMeta","updateSignals","displayValue","parentId","position","effect","parent","childNodes","finalDisplayValue","err","getComponentNotifications","result","rootMeta","componentsToNotify","currentPath","pathMeta","isArray","getDifferences","subPathString","subPath","fullSubPath","subPathMeta","parentArrayPath","parentMeta","reactiveTypes","newDeps","handleInsert","currentValue","getScopedData","updatedMeta","newItemKey","newItemPath","handleCut","allComponentsToNotify","signalUpdates","logsToAdd","item","createEffectiveSetState","syncApiRef","latestInitialOptionsRef","newStateOrFunction","updateObj","validationKey","executeUpdate","newUpdate","stateObject","localStorage","reactiveDeps","reactiveType","defaultState","syncUpdate","dependencies","serverState","__useSync","reactiveForce","forceUpdate","noStateKey","componentIdRef","useRef","useEffect","syncKey","resolveInitialState","useCallback","overrideOptions","currentOptions","finalDefaultState","localKey","event","serverStateData","mergeConfig","incomingData","keyField","existingIds","newUniqueItems","finalState","existingMeta","features","cogsSyncFn","syncOpt","resolvedState","source","useLayoutEffect","componentKey","components","fullPath","effectiveSetState","updaterFinal","useMemo","createProxyHandler","applyTransforms","ids","transforms","transform","filtered","id","value","a","b","aValue","bValue","registerComponentDependency","dependencyPath","fullComponentId","notifySelectionComponents","parentPath","currentSelected","notifiedComponents","arrayKey","selectedItem","arrayKeys","proxyCache","methodNames","rebuildStateShape","derivationSignature","cacheKey","stateKeyPathKey","handler","target","prop","rootLevelMethods","nextPath","sync","response","getStatusFunc","initalOptionsGet","selectedItemKey","viewKey","currentViewIds","selectedItemId","selectedId","itemHeight","overscan","stickToBottom","scrollStickTolerance","containerRef","range","setRange","rerender","initialScrollRef","interval","scrollStateRef","measurementCache","unsubscribe","e","container","waitForContainer","visibleCount","endIndex","startIndex","scrollToBottom","rangeRef","arrayKeysRef","handleScroll","currentScrollTop","scrollHeight","clientHeight","scrollState","distanceFromBottom","wasNearBottom","newStartIndex","behavior","performScroll","attemptScroll","attempts","currentHeight","currentScroll","newHeight","newScroll","scrollTimeout","debouncedScrollToBottom","observer","slicedKeys","arrayPath","offset","callbackfn","shadowValue","arraySetter","_item","itemSetter","filteredIds","compareFn","currentArray","itemsWithIds","sortedIds","bufferSize","flushInterval","bufferStrategy","store","onFlush","buffer","isPaused","flushTimer","addToBuffer","flushBuffer","toFlush","streamId","streams","componentIdsRef","updateTrigger","validIds","arrayValues","caches","returnValue","localIndex","itemComponentId","createElement","MemoizedCogsItemWrapper","fieldName","itemId","lastItemKey","newPath","fields","onMatch","matchedItem","isMatch","field","updatedItem","updatedArray","indexToCut","idToCut","pathForCut","found","pathForItem","searchKey","searchValue","fn","$cogsSignal","parentPathArray","fullParentKey","fullItemKey","zodErrors","patches","convertPath","jsonPath","p","patch","relativePath","formRefStore","children","hideMessage","jsx","ValidationWrapper","currentValueAtPath","child","formOpts","FormElementWrapper","proxyInstance","obj","newState","newUpdaterState","startTransition","proxy","SignalRenderer","elementRef","instanceIdRef","isSetupRef","signalId","element","timeoutId","parentElement","signals","textNode","s"],"mappings":"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"}
|