cogsbox-state 0.5.485 → 0.5.486

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.
@@ -1 +1 @@
1
- {"version":3,"file":"Components.js","sources":["../src/Components.tsx"],"sourcesContent":["import {\r\n FormElementParams,\r\n StateObject,\r\n UpdateTypeDetail,\r\n type FormOptsType,\r\n} from './CogsState';\r\nimport { pluginStore } from './pluginStore';\r\nimport {\r\n createMetadataContext,\r\n createScopedMetadataContext,\r\n PluginsApi,\r\n toDeconstructedMethods,\r\n} from './plugins';\r\nimport React, {\r\n memo,\r\n RefObject,\r\n useCallback,\r\n useEffect,\r\n useLayoutEffect,\r\n useRef,\r\n useState,\r\n useMemo,\r\n type ReactNode,\r\n} from 'react';\r\nimport { getGlobalStore, ValidationError, ValidationSeverity } from './store';\r\nimport { useInView } from 'react-intersection-observer';\r\nimport { v4 as uuidv4 } from 'uuid';\r\nimport { isDeepEqual } from './utility';\r\nimport { runValidation } from './validation';\r\n\r\nconst {\r\n getInitialOptions,\r\n\r\n getShadowMetadata,\r\n setShadowMetadata,\r\n getShadowValue,\r\n\r\n registerComponent,\r\n unregisterComponent,\r\n\r\n notifyPathSubscribers,\r\n subscribeToPath,\r\n} = getGlobalStore.getState();\r\nconst { stateHandlers, notifyFormUpdate } = pluginStore.getState();\r\n\r\nexport type ValidationWrapperProps = {\r\n formOpts?: FormOptsType;\r\n path: string[];\r\n stateKey: string;\r\n children: ReactNode;\r\n};\r\n\r\nexport function ValidationWrapper({\r\n formOpts,\r\n path,\r\n stateKey,\r\n children,\r\n}: ValidationWrapperProps) {\r\n const { getInitialOptions, getShadowMetadata, getShadowValue } =\r\n getGlobalStore.getState();\r\n const thisStateOpts = getInitialOptions(stateKey!);\r\n\r\n const shadowMeta = getShadowMetadata(stateKey!, path);\r\n const validationState = shadowMeta?.validation;\r\n\r\n const status = validationState?.status || 'NOT_VALIDATED';\r\n\r\n const errors = (validationState?.errors || []).map((err) => ({\r\n ...err,\r\n path: path,\r\n })) as ValidationError[];\r\n const errorMessages = errors\r\n .filter((err) => err.severity === 'error')\r\n .map((err) => err.message);\r\n const warningMessages = errors\r\n .filter((err) => err.severity === 'warning')\r\n .map((err) => err.message);\r\n\r\n // Use first error, or first warning if no errors\r\n const message = errorMessages[0] || warningMessages[0];\r\n const primarySeverity: ValidationSeverity =\r\n errorMessages.length > 0\r\n ? 'error'\r\n : warningMessages.length > 0\r\n ? 'warning'\r\n : undefined;\r\n const { registeredPlugins } = pluginStore.getState();\r\n const pluginsApi: PluginsApi = {};\r\n\r\n // We iterate over ALL registered plugins in the app.\r\n registeredPlugins.forEach((plugin) => {\r\n if (thisStateOpts && thisStateOpts.hasOwnProperty(plugin.name)) {\r\n const pluginName = plugin.name;\r\n\r\n const hookData = pluginStore\r\n .getState()\r\n .getHookResult(stateKey!, pluginName);\r\n\r\n const scopedMetadata = createScopedMetadataContext(\r\n stateKey!,\r\n pluginName,\r\n path\r\n );\r\n\r\n pluginsApi[pluginName] = {\r\n hookData,\r\n getFieldMetaData: scopedMetadata.getFieldMetaData,\r\n setFieldMetaData: scopedMetadata.setFieldMetaData,\r\n removeFieldMetaData: scopedMetadata.removeFieldMetaData,\r\n };\r\n }\r\n });\r\n\r\n return (\r\n <>\r\n {thisStateOpts?.formElements?.validation &&\r\n !formOpts?.validation?.disable ? (\r\n thisStateOpts.formElements!.validation!({\r\n children: (\r\n <React.Fragment key={path.toString()}>{children}</React.Fragment>\r\n ),\r\n status, // Now passes the new ValidationStatus type\r\n message: formOpts?.validation?.hideMessage\r\n ? ''\r\n : formOpts?.validation?.message || message || '',\r\n severity: primarySeverity,\r\n hasErrors: errorMessages.length > 0,\r\n hasWarnings: warningMessages.length > 0,\r\n allErrors: errors,\r\n path: path,\r\n getData: () => getShadowValue(stateKey!, path),\r\n plugins: pluginsApi,\r\n })\r\n ) : (\r\n <React.Fragment key={path.toString()}>{children}</React.Fragment>\r\n )}\r\n </>\r\n );\r\n}\r\nexport const 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\nexport function 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 rebuildStateShape: any;\r\n renderFn: any;\r\n}) {\r\n const [, forceUpdate] = useState({});\r\n const { ref: inViewRef, inView } = useInView();\r\n const elementRef = useRef<HTMLElement | null>(null); // Changed to HTMLElement to be generic\r\n\r\n const fullKey = [stateKey, ...itemPath].join('.');\r\n\r\n useRegisterComponent(stateKey, itemComponentId, forceUpdate);\r\n\r\n const setRefs = useCallback(\r\n (element: HTMLElement | null) => {\r\n elementRef.current = element;\r\n inViewRef(element);\r\n },\r\n [inViewRef]\r\n );\r\n\r\n useEffect(() => {\r\n const unsubscribe = subscribeToPath(fullKey, (e) => {\r\n forceUpdate({});\r\n });\r\n return () => unsubscribe();\r\n }, [fullKey]);\r\n\r\n const itemValue = getShadowValue(stateKey, itemPath);\r\n if (itemValue === undefined) return null;\r\n\r\n const itemSetter = rebuildStateShape({\r\n currentState: itemValue,\r\n path: itemPath,\r\n componentId: itemComponentId,\r\n });\r\n\r\n // 1. Render the user's content (e.g. the <tr>)\r\n const children = renderFn(itemSetter, localIndex, arraySetter);\r\n\r\n // 2. AUTO-DETECT: If it is a single valid element (<tr>, <div>, <li>), inject the ref.\r\n if (React.isValidElement(children)) {\r\n // We clone the element and force our ref onto it\r\n return React.cloneElement(children as React.ReactElement<any>, {\r\n ref: (node: any) => {\r\n // Apply our virtualization ref\r\n setRefs(node);\r\n\r\n // Preserve any ref the user might have put on the element themselves\r\n const { ref: existingRef } = children as any;\r\n if (typeof existingRef === 'function') {\r\n existingRef(node);\r\n } else if (existingRef && 'current' in existingRef) {\r\n (existingRef as any).current = node;\r\n }\r\n },\r\n });\r\n }\r\n\r\n // 3. Fallback: If they returned a Fragment or string, we MUST wrap it to measure it.\r\n // (Note: This specific fallback will still break inside a <tbody>, but\r\n // as long as you return a <tr> above, line 90 catches it).\r\n return <div ref={setRefs}>{children}</div>;\r\n}\r\n\r\nexport function 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>) => ReactNode;\r\n formOpts?: FormOptsType;\r\n setState: any;\r\n}) {\r\n const componentId = useRef(uuidv4()).current;\r\n\r\n const [, forceUpdate] = useState({});\r\n const formElementRef = useRef<any>(null);\r\n const stateKeyPathKey = [stateKey, ...path].join('.');\r\n useRegisterComponent(stateKey, componentId, forceUpdate);\r\n // Get the shadow node to access typeInfo and schema\r\n const shadowNode = getGlobalStore.getState().getShadowNode(stateKey, path);\r\n const typeInfo = shadowNode?._meta?.typeInfo;\r\n\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 { getShadowMetadata, setShadowMetadata } = getGlobalStore.getState();\r\n console.log('FormElementWrapper effect running for:', stateKey, path);\r\n\r\n // Initialize clientActivityState if needed\r\n const currentMeta = getShadowMetadata(stateKey, path) || {};\r\n if (!currentMeta.clientActivityState) {\r\n currentMeta.clientActivityState = { elements: new Map() };\r\n }\r\n\r\n // Detect element type from the ref\r\n const detectElementType = () => {\r\n const el = formElementRef.current;\r\n if (!el) return 'input';\r\n const tagName = el.tagName.toLowerCase();\r\n if (tagName === 'textarea') return 'textarea';\r\n if (tagName === 'select') return 'select';\r\n if (tagName === 'input') {\r\n const type = (el as HTMLInputElement).type;\r\n if (type === 'checkbox') return 'checkbox';\r\n if (type === 'radio') return 'radio';\r\n if (type === 'range') return 'range';\r\n if (type === 'file') return 'file';\r\n }\r\n return 'input';\r\n };\r\n\r\n // Add this element to the Map\r\n currentMeta.clientActivityState.elements.set(componentId, {\r\n domRef: formElementRef,\r\n elementType: detectElementType(),\r\n inputType: formElementRef.current?.type,\r\n mountedAt: Date.now(),\r\n });\r\n console.log('currentMeta', currentMeta);\r\n setShadowMetadata(stateKey, path, currentMeta);\r\n\r\n // Subscribe to path updates\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\r\n // Cleanup\r\n return () => {\r\n unsubscribe();\r\n\r\n if (debounceTimeoutRef.current) {\r\n clearTimeout(debounceTimeoutRef.current);\r\n isCurrentlyDebouncing.current = false;\r\n }\r\n\r\n // Remove element from Map\r\n const meta = getGlobalStore.getState().getShadowMetadata(stateKey, path);\r\n if (meta?.clientActivityState?.elements) {\r\n meta.clientActivityState.elements.delete(componentId);\r\n setShadowMetadata(stateKey, path, meta);\r\n }\r\n };\r\n }, []);\r\n\r\n const debouncedUpdate = useCallback(\r\n (newValue: any) => {\r\n const liveTypeInfo =\r\n getGlobalStore.getState().getShadowNode(stateKey, path)?._meta\r\n ?.typeInfo ?? typeInfo;\r\n\r\n // Type conversion logic (keep existing)\r\n if (liveTypeInfo) {\r\n if (liveTypeInfo.type === 'number' && typeof newValue === 'string') {\r\n newValue =\r\n newValue === ''\r\n ? liveTypeInfo.nullable\r\n ? null\r\n : (liveTypeInfo.default ?? 0)\r\n : Number(newValue);\r\n } else if (\r\n liveTypeInfo.type === 'boolean' &&\r\n typeof newValue === 'string'\r\n ) {\r\n newValue = newValue === 'true' || newValue === '1';\r\n } else if (\r\n liveTypeInfo.type === 'date' &&\r\n typeof newValue === 'string'\r\n ) {\r\n newValue = new Date(newValue);\r\n }\r\n } else {\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 }\r\n\r\n setLocalValue(newValue);\r\n\r\n // Update input activity details\r\n const { getShadowMetadata, setShadowMetadata } =\r\n getGlobalStore.getState();\r\n const meta = getShadowMetadata(stateKey, path);\r\n if (meta?.clientActivityState?.elements?.has(componentId)) {\r\n const element = meta.clientActivityState.elements.get(componentId);\r\n if (element && element.currentActivity?.type === 'focus') {\r\n element!.currentActivity.details = {\r\n ...element!.currentActivity.details,\r\n value: newValue,\r\n previousValue:\r\n element!.currentActivity.details?.value || globalStateValue,\r\n inputLength:\r\n typeof newValue === 'string' ? newValue.length : undefined,\r\n keystrokeCount:\r\n (element!.currentActivity.details?.keystrokeCount || 0) + 1,\r\n };\r\n setShadowMetadata(stateKey, path, meta);\r\n }\r\n }\r\n const element = meta?.clientActivityState?.elements?.get(componentId);\r\n\r\n // Notify plugins\r\n notifyFormUpdate({\r\n stateKey,\r\n activityType: 'input', // Changed from 'type'\r\n path,\r\n timestamp: Date.now(),\r\n details: {\r\n value: newValue,\r\n inputLength:\r\n typeof newValue === 'string' ? newValue.length : undefined,\r\n isComposing: false, // You'd need to track this from the actual input event\r\n isPasting: false, // You'd need to track this from paste events\r\n keystrokeCount:\r\n (element?.currentActivity?.details?.keystrokeCount || 0) + 1,\r\n },\r\n });\r\n // Validation (keep existing)\r\n const virtualOperation: UpdateTypeDetail = {\r\n stateKey,\r\n path,\r\n newValue: newValue,\r\n updateType: 'update',\r\n timeStamp: Date.now(),\r\n status: 'new',\r\n oldValue: globalStateValue,\r\n };\r\n runValidation(virtualOperation, 'onChange');\r\n\r\n // Debounce state update (keep existing)\r\n isCurrentlyDebouncing.current = true;\r\n if (debounceTimeoutRef.current) {\r\n clearTimeout(debounceTimeoutRef.current);\r\n }\r\n\r\n const debounceTime = formOpts?.debounceTime ?? 200;\r\n debounceTimeoutRef.current = setTimeout(() => {\r\n isCurrentlyDebouncing.current = false;\r\n setState(newValue, path, {\r\n updateType: 'update',\r\n validationTrigger: 'onChange',\r\n });\r\n }, debounceTime);\r\n },\r\n [\r\n setState,\r\n path,\r\n formOpts?.debounceTime,\r\n typeInfo,\r\n globalStateValue,\r\n stateKey,\r\n componentId,\r\n ]\r\n );\r\n\r\n const handleFocus = useCallback(() => {\r\n const { getShadowMetadata, setShadowMetadata } = getGlobalStore.getState();\r\n\r\n // Update element's current activity\r\n const meta = getShadowMetadata(stateKey, path);\r\n if (meta?.clientActivityState?.elements?.has(componentId)) {\r\n const element = meta.clientActivityState.elements.get(componentId)!;\r\n element.currentActivity = {\r\n type: 'focus',\r\n startTime: Date.now(),\r\n details: {\r\n value: localValue,\r\n inputLength:\r\n typeof localValue === 'string' ? localValue.length : undefined,\r\n },\r\n };\r\n setShadowMetadata(stateKey, path, meta);\r\n }\r\n\r\n // Notify plugins\r\n notifyFormUpdate({\r\n stateKey,\r\n activityType: 'focus', // Changed from 'type'\r\n path,\r\n timestamp: Date.now(),\r\n details: {\r\n cursorPosition: formElementRef.current?.selectionStart,\r\n },\r\n });\r\n }, [stateKey, path, componentId, localValue]);\r\n const handleBlur = useCallback(() => {\r\n const { getShadowMetadata, setShadowMetadata } = getGlobalStore.getState();\r\n\r\n // Clear debounce if active\r\n if (debounceTimeoutRef.current) {\r\n clearTimeout(debounceTimeoutRef.current);\r\n debounceTimeoutRef.current = null;\r\n isCurrentlyDebouncing.current = false;\r\n setState(localValue, path, { updateType: 'update' });\r\n }\r\n\r\n // Clear element's current activity\r\n const meta = getShadowMetadata(stateKey, path);\r\n if (meta?.clientActivityState?.elements?.has(componentId)) {\r\n const element = meta.clientActivityState.elements.get(componentId)!;\r\n element.currentActivity = undefined;\r\n setShadowMetadata(stateKey, path, meta);\r\n }\r\n const focusStartTime =\r\n meta?.clientActivityState?.elements?.get(componentId)?.currentActivity\r\n ?.startTime;\r\n\r\n const validationOptions = getInitialOptions(stateKey)?.validation;\r\n if (validationOptions?.onBlur) {\r\n runValidation(\r\n {\r\n stateKey,\r\n path,\r\n newValue: localValue,\r\n updateType: 'update',\r\n timeStamp: Date.now(),\r\n status: 'new',\r\n oldValue: globalStateValue,\r\n },\r\n 'onBlur'\r\n );\r\n }\r\n\r\n // Refine / plugin validation runs after field validation so it wins on conflict\r\n notifyFormUpdate({\r\n stateKey,\r\n activityType: 'blur',\r\n path,\r\n timestamp: Date.now(),\r\n duration: focusStartTime ? Date.now() - focusStartTime : undefined,\r\n details: {\r\n duration: focusStartTime ? Date.now() - focusStartTime : 0,\r\n },\r\n });\r\n }, [localValue, setState, path, stateKey, componentId, globalStateValue]);\r\n\r\n const baseState = rebuildStateShape({\r\n path: path,\r\n componentId: componentId,\r\n meta: undefined,\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 onFocus: handleFocus,\r\n onBlur: handleBlur,\r\n ref: formElementRef,\r\n };\r\n }\r\n\r\n return target[prop];\r\n },\r\n });\r\n\r\n const initialElement = renderFn(stateWithInputProps);\r\n\r\n return (\r\n <ValidationWrapper formOpts={formOpts} path={path} stateKey={stateKey}>\r\n {initialElement}\r\n </ValidationWrapper>\r\n );\r\n}\r\n\r\nexport function 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 registerComponent(stateKey, fullComponentId, {\r\n forceUpdate: () => forceUpdate({}),\r\n paths: new Set(),\r\n reactiveType: ['component'],\r\n });\r\n return () => {\r\n unregisterComponent(stateKey, fullComponentId);\r\n };\r\n }, [stateKey, fullComponentId]);\r\n}\r\n\r\nexport function IsolatedComponentWrapper({\r\n stateKey,\r\n path, // The path of the parent node (e.g. ['form'])\r\n dependencies, // NEW: Optional array of Proxy objects or path arrays\r\n rebuildStateShape,\r\n renderFn,\r\n}: {\r\n stateKey: string;\r\n path: string[];\r\n dependencies?: any[]; // The explicit list of dependencies\r\n rebuildStateShape: (options: any) => any;\r\n renderFn: (state: any) => React.ReactNode;\r\n}) {\r\n const [componentId] = useState(() => uuidv4());\r\n const [, forceUpdate] = useState({});\r\n\r\n useRegisterComponent(stateKey, componentId, forceUpdate);\r\n\r\n const pathsToSubscribe = useMemo(() => {\r\n if (dependencies && dependencies.length > 0) {\r\n return dependencies.map((dep) => {\r\n return [stateKey, ...dep.$_path].join('.');\r\n });\r\n }\r\n\r\n return [[stateKey, ...path].join('.')];\r\n }, [stateKey, path, dependencies]);\r\n\r\n // 2. Subscribe to ALL calculated paths\r\n useEffect(() => {\r\n const store = getGlobalStore.getState();\r\n\r\n // Create an array of unsubscribe functions\r\n const unsubs = pathsToSubscribe.map((fullPathKey) => {\r\n return store.subscribeToPath(fullPathKey, () => {\r\n forceUpdate({});\r\n });\r\n });\r\n\r\n return () => {\r\n unsubs.forEach((unsub) => unsub());\r\n };\r\n }, [pathsToSubscribe]);\r\n\r\n const baseState = rebuildStateShape({\r\n path: path,\r\n componentId: componentId,\r\n meta: undefined,\r\n });\r\n\r\n return <>{renderFn(baseState)}</>;\r\n}\r\n// 1. Define the MINIMAL props needed.\r\ntype PluginWrapperProps = {\r\n children: ReactNode;\r\n stateKey: string;\r\n path: string[];\r\n pluginName: string;\r\n wrapperDepth: number;\r\n};\r\n\r\nconst PluginWrapper = memo(function PluginWrapper({\r\n children,\r\n stateKey,\r\n path,\r\n pluginName,\r\n wrapperDepth,\r\n}: PluginWrapperProps) {\r\n const [, forceUpdate] = useState({});\r\n\r\n useEffect(() => {\r\n const fullPathKey = [stateKey, ...path].join('.');\r\n const unsubscribe = getGlobalStore\r\n .getState()\r\n .subscribeToPath(fullPathKey, () => {\r\n forceUpdate({});\r\n });\r\n return unsubscribe;\r\n }, [stateKey, path]);\r\n\r\n const plugin = pluginStore\r\n .getState()\r\n .registeredPlugins.find((p) => p.name === pluginName);\r\n\r\n const stateHandler: StateObject<any> | undefined = pluginStore\r\n .getState()\r\n .stateHandlers.get(stateKey);\r\n\r\n const typeInfo = getGlobalStore.getState().getShadowNode(stateKey, path)\r\n ?._meta?.typeInfo;\r\n\r\n const options = pluginStore\r\n .getState()\r\n .pluginOptions.get(stateKey)\r\n ?.get(pluginName);\r\n\r\n const hookData = pluginStore.getState().getHookResult(stateKey, pluginName);\r\n\r\n if (!plugin?.formWrapper || !stateHandler) {\r\n return <>{children}</>;\r\n }\r\n\r\n const deconstructed = toDeconstructedMethods(stateHandler);\r\n const scopedMetadataContext = createScopedMetadataContext(\r\n stateKey,\r\n plugin.name,\r\n path\r\n );\r\n return plugin.formWrapper({\r\n element: children,\r\n path,\r\n stateKey,\r\n pluginName: plugin.name,\r\n ...deconstructed,\r\n\r\n ...scopedMetadataContext,\r\n options,\r\n hookData,\r\n fieldType: typeInfo?.type,\r\n wrapperDepth,\r\n });\r\n});\r\n"],"names":["getInitialOptions","getShadowMetadata","setShadowMetadata","getShadowValue","registerComponent","unregisterComponent","notifyPathSubscribers","subscribeToPath","getGlobalStore","stateHandlers","notifyFormUpdate","pluginStore","ValidationWrapper","formOpts","path","stateKey","children","thisStateOpts","validationState","status","errors","err","errorMessages","warningMessages","message","primarySeverity","registeredPlugins","pluginsApi","plugin","pluginName","hookData","scopedMetadata","createScopedMetadataContext","jsx","Fragment","React","MemoizedCogsItemWrapper","memo","ListItemWrapper","prevProps","nextProps","itemComponentId","itemPath","localIndex","arraySetter","rebuildStateShape","renderFn","forceUpdate","useState","inViewRef","inView","useInView","elementRef","useRef","fullKey","useRegisterComponent","setRefs","useCallback","element","useEffect","unsubscribe","e","itemValue","itemSetter","node","existingRef","FormElementWrapper","setState","componentId","uuidv4","formElementRef","stateKeyPathKey","typeInfo","globalStateValue","localValue","setLocalValue","isCurrentlyDebouncing","debounceTimeoutRef","isDeepEqual","currentMeta","detectElementType","el","tagName","type","newValue","meta","debouncedUpdate","liveTypeInfo","runValidation","debounceTime","handleFocus","handleBlur","focusStartTime","baseState","stateWithInputProps","target","prop","initialElement","fullComponentId","useLayoutEffect","IsolatedComponentWrapper","dependencies","pathsToSubscribe","useMemo","dep","store","unsubs","fullPathKey","unsub","wrapperDepth","p","stateHandler","options","deconstructed","toDeconstructedMethods","scopedMetadataContext"],"mappings":"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"}
1
+ {"version":3,"file":"Components.js","sources":["../src/Components.tsx"],"sourcesContent":["import {\r\n FormElementParams,\r\n StateObject,\r\n UpdateTypeDetail,\r\n type FormOptsType,\r\n} from './CogsState';\r\nimport { pluginStore } from './pluginStore';\r\nimport {\r\n createMetadataContext,\r\n createScopedMetadataContext,\r\n PluginsApi,\r\n toDeconstructedMethods,\r\n} from './plugins';\r\nimport React, {\r\n memo,\r\n RefObject,\r\n useCallback,\r\n useEffect,\r\n useLayoutEffect,\r\n useRef,\r\n useState,\r\n useMemo,\r\n type ReactNode,\r\n} from 'react';\r\nimport { getGlobalStore, ValidationError, ValidationSeverity } from './store';\nimport { useInView } from 'react-intersection-observer';\r\nimport { v4 as uuidv4 } from 'uuid';\r\nimport { isDeepEqual } from './utility';\r\nimport { runValidation } from './validation';\r\n\r\nconst {\r\n getInitialOptions,\r\n\r\n getShadowMetadata,\r\n setShadowMetadata,\r\n getShadowValue,\r\n\r\n registerComponent,\r\n unregisterComponent,\r\n\r\n notifyPathSubscribers,\r\n subscribeToPath,\r\n} = getGlobalStore.getState();\r\nconst { stateHandlers, notifyFormUpdate } = pluginStore.getState();\r\n\r\nexport type ValidationWrapperProps = {\r\n formOpts?: FormOptsType;\r\n path: string[];\r\n stateKey: string;\r\n children: ReactNode;\r\n};\r\n\r\nexport function ValidationWrapper({\r\n formOpts,\r\n path,\r\n stateKey,\r\n children,\r\n}: ValidationWrapperProps) {\r\n const { getInitialOptions, getShadowMetadata, getShadowValue } =\r\n getGlobalStore.getState();\r\n const thisStateOpts = getInitialOptions(stateKey!);\r\n\r\n const shadowMeta = getShadowMetadata(stateKey!, path);\r\n const validationState = shadowMeta?.validation;\r\n\r\n const status = validationState?.status || 'NOT_VALIDATED';\r\n\r\n const errors = (validationState?.errors || []).map((err) => ({\r\n ...err,\r\n path: path,\r\n })) as ValidationError[];\r\n const errorMessages = errors\r\n .filter((err) => err.severity === 'error')\r\n .map((err) => err.message);\r\n const warningMessages = errors\r\n .filter((err) => err.severity === 'warning')\r\n .map((err) => err.message);\r\n\r\n // Use first error, or first warning if no errors\r\n const message = errorMessages[0] || warningMessages[0];\r\n const primarySeverity: ValidationSeverity =\r\n errorMessages.length > 0\r\n ? 'error'\r\n : warningMessages.length > 0\r\n ? 'warning'\r\n : undefined;\r\n const { registeredPlugins } = pluginStore.getState();\r\n const pluginsApi: PluginsApi = {};\r\n\r\n // We iterate over ALL registered plugins in the app.\r\n registeredPlugins.forEach((plugin) => {\r\n if (thisStateOpts && thisStateOpts.hasOwnProperty(plugin.name)) {\r\n const pluginName = plugin.name;\r\n\r\n const hookData = pluginStore\r\n .getState()\r\n .getHookResult(stateKey!, pluginName);\r\n\r\n const scopedMetadata = createScopedMetadataContext(\r\n stateKey!,\r\n pluginName,\r\n path\r\n );\r\n\r\n pluginsApi[pluginName] = {\r\n hookData,\r\n getFieldMetaData: scopedMetadata.getFieldMetaData,\r\n setFieldMetaData: scopedMetadata.setFieldMetaData,\r\n removeFieldMetaData: scopedMetadata.removeFieldMetaData,\r\n };\r\n }\r\n });\r\n\r\n return (\r\n <>\r\n {thisStateOpts?.formElements?.validation &&\r\n !formOpts?.validation?.disable ? (\r\n thisStateOpts.formElements!.validation!({\r\n children: (\r\n <React.Fragment key={path.toString()}>{children}</React.Fragment>\r\n ),\r\n status, // Now passes the new ValidationStatus type\r\n message: formOpts?.validation?.hideMessage\r\n ? ''\r\n : formOpts?.validation?.message || message || '',\r\n severity: primarySeverity,\r\n hasErrors: errorMessages.length > 0,\r\n hasWarnings: warningMessages.length > 0,\r\n allErrors: errors,\r\n path: path,\r\n getData: () => getShadowValue(stateKey!, path),\r\n plugins: pluginsApi,\r\n })\r\n ) : (\r\n <React.Fragment key={path.toString()}>{children}</React.Fragment>\r\n )}\r\n </>\r\n );\r\n}\r\nexport const 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\nexport function 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 rebuildStateShape: any;\r\n renderFn: any;\r\n}) {\r\n const [, forceUpdate] = useState({});\r\n const { ref: inViewRef, inView } = useInView();\r\n const elementRef = useRef<HTMLElement | null>(null); // Changed to HTMLElement to be generic\r\n\r\n const fullKey = [stateKey, ...itemPath].join('.');\r\n\r\n useRegisterComponent(stateKey, itemComponentId, forceUpdate);\r\n\r\n const setRefs = useCallback(\r\n (element: HTMLElement | null) => {\r\n elementRef.current = element;\r\n inViewRef(element);\r\n },\r\n [inViewRef]\r\n );\r\n\r\n useEffect(() => {\r\n const unsubscribe = subscribeToPath(fullKey, (e) => {\r\n forceUpdate({});\r\n });\r\n return () => unsubscribe();\r\n }, [fullKey]);\r\n\r\n const itemValue = getShadowValue(stateKey, itemPath);\r\n if (itemValue === undefined) return null;\r\n\r\n const itemSetter = rebuildStateShape({\r\n currentState: itemValue,\r\n path: itemPath,\r\n componentId: itemComponentId,\r\n });\r\n\r\n // 1. Render the user's content (e.g. the <tr>)\r\n const children = renderFn(itemSetter, localIndex, arraySetter);\r\n\r\n // 2. AUTO-DETECT: If it is a single valid element (<tr>, <div>, <li>), inject the ref.\r\n if (React.isValidElement(children)) {\r\n // We clone the element and force our ref onto it\r\n return React.cloneElement(children as React.ReactElement<any>, {\r\n ref: (node: any) => {\r\n // Apply our virtualization ref\r\n setRefs(node);\r\n\r\n // Preserve any ref the user might have put on the element themselves\r\n const { ref: existingRef } = children as any;\r\n if (typeof existingRef === 'function') {\r\n existingRef(node);\r\n } else if (existingRef && 'current' in existingRef) {\r\n (existingRef as any).current = node;\r\n }\r\n },\r\n });\r\n }\r\n\r\n // 3. Fallback: If they returned a Fragment or string, we MUST wrap it to measure it.\r\n // (Note: This specific fallback will still break inside a <tbody>, but\r\n // as long as you return a <tr> above, line 90 catches it).\r\n return <div ref={setRefs}>{children}</div>;\r\n}\r\n\r\nexport function 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>) => ReactNode;\r\n formOpts?: FormOptsType;\r\n setState: any;\r\n}) {\r\n const componentId = useRef(uuidv4()).current;\r\n\r\n const [, forceUpdate] = useState({});\r\n const formElementRef = useRef<any>(null);\r\n const stateKeyPathKey = [stateKey, ...path].join('.');\r\n useRegisterComponent(stateKey, componentId, forceUpdate);\r\n // Get the shadow node to access typeInfo and schema\r\n const shadowNode = getGlobalStore.getState().getShadowNode(stateKey, path);\r\n const typeInfo = shadowNode?._meta?.typeInfo;\r\n\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 { getShadowMetadata, setShadowMetadata } = getGlobalStore.getState();\r\n console.log('FormElementWrapper effect running for:', stateKey, path);\r\n\r\n // Initialize clientActivityState if needed\r\n const currentMeta = getShadowMetadata(stateKey, path) || {};\r\n if (!currentMeta.clientActivityState) {\r\n currentMeta.clientActivityState = { elements: new Map() };\r\n }\r\n\r\n // Detect element type from the ref\r\n const detectElementType = () => {\r\n const el = formElementRef.current;\r\n if (!el) return 'input';\r\n const tagName = el.tagName.toLowerCase();\r\n if (tagName === 'textarea') return 'textarea';\r\n if (tagName === 'select') return 'select';\r\n if (tagName === 'input') {\r\n const type = (el as HTMLInputElement).type;\r\n if (type === 'checkbox') return 'checkbox';\r\n if (type === 'radio') return 'radio';\r\n if (type === 'range') return 'range';\r\n if (type === 'file') return 'file';\r\n }\r\n return 'input';\r\n };\r\n\r\n // Add this element to the Map\r\n currentMeta.clientActivityState.elements.set(componentId, {\r\n domRef: formElementRef,\r\n elementType: detectElementType(),\r\n inputType: formElementRef.current?.type,\r\n mountedAt: Date.now(),\r\n });\r\n console.log('currentMeta', currentMeta);\r\n setShadowMetadata(stateKey, path, currentMeta);\r\n\r\n // Subscribe to path updates\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\r\n // Cleanup\r\n return () => {\r\n unsubscribe();\r\n\r\n if (debounceTimeoutRef.current) {\r\n clearTimeout(debounceTimeoutRef.current);\r\n isCurrentlyDebouncing.current = false;\r\n }\r\n\r\n // Remove element from Map\r\n const meta = getGlobalStore.getState().getShadowMetadata(stateKey, path);\r\n if (meta?.clientActivityState?.elements) {\r\n meta.clientActivityState.elements.delete(componentId);\r\n setShadowMetadata(stateKey, path, meta);\r\n }\r\n };\r\n }, []);\r\n\r\n const debouncedUpdate = useCallback(\r\n (newValue: any) => {\r\n const liveTypeInfo =\r\n getGlobalStore.getState().getShadowNode(stateKey, path)?._meta\r\n ?.typeInfo ?? typeInfo;\r\n\r\n // Type conversion logic (keep existing)\r\n if (liveTypeInfo) {\r\n if (liveTypeInfo.type === 'number' && typeof newValue === 'string') {\r\n newValue =\r\n newValue === ''\r\n ? liveTypeInfo.nullable\r\n ? null\r\n : (liveTypeInfo.default ?? 0)\r\n : Number(newValue);\r\n } else if (\r\n liveTypeInfo.type === 'boolean' &&\r\n typeof newValue === 'string'\r\n ) {\r\n newValue = newValue === 'true' || newValue === '1';\r\n } else if (\r\n liveTypeInfo.type === 'date' &&\r\n typeof newValue === 'string'\r\n ) {\r\n newValue = new Date(newValue);\r\n }\r\n } else {\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 }\r\n\r\n setLocalValue(newValue);\r\n\r\n // Update input activity details\r\n const { getShadowMetadata, setShadowMetadata } =\r\n getGlobalStore.getState();\r\n const meta = getShadowMetadata(stateKey, path);\r\n if (meta?.clientActivityState?.elements?.has(componentId)) {\r\n const element = meta.clientActivityState.elements.get(componentId);\r\n if (element && element.currentActivity?.type === 'focus') {\r\n element!.currentActivity.details = {\r\n ...element!.currentActivity.details,\r\n value: newValue,\r\n previousValue:\r\n element!.currentActivity.details?.value || globalStateValue,\r\n inputLength:\r\n typeof newValue === 'string' ? newValue.length : undefined,\r\n keystrokeCount:\r\n (element!.currentActivity.details?.keystrokeCount || 0) + 1,\r\n };\r\n setShadowMetadata(stateKey, path, meta);\r\n }\r\n }\r\n const element = meta?.clientActivityState?.elements?.get(componentId);\r\n\r\n // Notify plugins\r\n notifyFormUpdate({\r\n stateKey,\r\n activityType: 'input', // Changed from 'type'\r\n path,\r\n timestamp: Date.now(),\r\n details: {\r\n value: newValue,\r\n inputLength:\r\n typeof newValue === 'string' ? newValue.length : undefined,\r\n isComposing: false, // You'd need to track this from the actual input event\r\n isPasting: false, // You'd need to track this from paste events\r\n keystrokeCount:\r\n (element?.currentActivity?.details?.keystrokeCount || 0) + 1,\r\n },\r\n });\r\n // Validation (keep existing)\r\n const virtualOperation: UpdateTypeDetail = {\r\n stateKey,\r\n path,\r\n newValue: newValue,\r\n updateType: 'update',\r\n timeStamp: Date.now(),\r\n status: 'new',\r\n oldValue: globalStateValue,\r\n };\r\n runValidation(virtualOperation, 'onChange');\r\n\r\n // Debounce state update (keep existing)\r\n isCurrentlyDebouncing.current = true;\r\n if (debounceTimeoutRef.current) {\r\n clearTimeout(debounceTimeoutRef.current);\r\n }\r\n\r\n const debounceTime = formOpts?.debounceTime ?? 200;\r\n debounceTimeoutRef.current = setTimeout(() => {\r\n isCurrentlyDebouncing.current = false;\r\n setState(newValue, path, {\r\n updateType: 'update',\r\n validationTrigger: 'onChange',\r\n });\r\n }, debounceTime);\r\n },\r\n [\r\n setState,\r\n path,\r\n formOpts?.debounceTime,\r\n typeInfo,\r\n globalStateValue,\r\n stateKey,\r\n componentId,\r\n ]\r\n );\r\n\r\n const handleFocus = useCallback(() => {\r\n const { getShadowMetadata, setShadowMetadata } = getGlobalStore.getState();\r\n\r\n // Update element's current activity\r\n const meta = getShadowMetadata(stateKey, path);\r\n if (meta?.clientActivityState?.elements?.has(componentId)) {\r\n const element = meta.clientActivityState.elements.get(componentId)!;\r\n element.currentActivity = {\r\n type: 'focus',\r\n startTime: Date.now(),\r\n details: {\r\n value: localValue,\r\n inputLength:\r\n typeof localValue === 'string' ? localValue.length : undefined,\r\n },\r\n };\r\n setShadowMetadata(stateKey, path, meta);\r\n }\r\n\r\n // Notify plugins\r\n notifyFormUpdate({\r\n stateKey,\r\n activityType: 'focus', // Changed from 'type'\r\n path,\r\n timestamp: Date.now(),\r\n details: {\r\n cursorPosition: formElementRef.current?.selectionStart,\r\n },\r\n });\r\n }, [stateKey, path, componentId, localValue]);\r\n const handleBlur = useCallback(() => {\r\n const { getShadowMetadata, setShadowMetadata } = getGlobalStore.getState();\r\n\r\n // Clear debounce if active\r\n if (debounceTimeoutRef.current) {\r\n clearTimeout(debounceTimeoutRef.current);\r\n debounceTimeoutRef.current = null;\r\n isCurrentlyDebouncing.current = false;\r\n setState(localValue, path, { updateType: 'update' });\r\n }\r\n\r\n // Clear element's current activity\r\n const meta = getShadowMetadata(stateKey, path);\r\n if (meta?.clientActivityState?.elements?.has(componentId)) {\r\n const element = meta.clientActivityState.elements.get(componentId)!;\r\n element.currentActivity = undefined;\r\n setShadowMetadata(stateKey, path, meta);\r\n }\r\n const focusStartTime =\r\n meta?.clientActivityState?.elements?.get(componentId)?.currentActivity\r\n ?.startTime;\r\n\r\n const validationOptions = getInitialOptions(stateKey)?.validation;\r\n if (validationOptions?.onBlur) {\r\n runValidation(\r\n {\r\n stateKey,\r\n path,\r\n newValue: localValue,\r\n updateType: 'update',\r\n timeStamp: Date.now(),\r\n status: 'new',\r\n oldValue: globalStateValue,\r\n },\r\n 'onBlur'\r\n );\r\n }\r\n\r\n // Refine / plugin validation runs after field validation so it wins on conflict\r\n notifyFormUpdate({\r\n stateKey,\r\n activityType: 'blur',\r\n path,\r\n timestamp: Date.now(),\r\n duration: focusStartTime ? Date.now() - focusStartTime : undefined,\r\n details: {\r\n duration: focusStartTime ? Date.now() - focusStartTime : 0,\r\n },\r\n });\r\n }, [localValue, setState, path, stateKey, componentId, globalStateValue]);\r\n\r\n const baseState = rebuildStateShape({\n path: path,\n componentId: componentId,\n meta: undefined,\n });\n const validationState = getShadowMetadata(stateKey, path)?.validation;\n const validationStatus = validationState?.status || 'NOT_VALIDATED';\n const allErrors = (validationState?.errors || []).map((err) => ({\n ...err,\n path,\n })) as ValidationError[];\n const errorMessages = allErrors\n .filter((err) => err.severity === 'error')\n .map((err) => err.message);\n const warningMessages = allErrors\n .filter((err) => err.severity === 'warning')\n .map((err) => err.message);\n const validationMessage = errorMessages[0] || warningMessages[0] || '';\n const validationSeverity: ValidationSeverity =\n errorMessages.length > 0\n ? 'error'\n : warningMessages.length > 0\n ? 'warning'\n : undefined;\n\n const stateWithInputProps = new Proxy(baseState, {\n get(target, prop) {\n if (prop === '$inputProps') {\n return {\n value: localValue ?? '',\r\n onChange: (e: any) => {\r\n debouncedUpdate(e.target.value);\r\n },\r\n onFocus: handleFocus,\r\n onBlur: handleBlur,\r\n ref: formElementRef,\n };\n }\n if (prop === 'status') return validationStatus;\n if (prop === 'severity') return validationSeverity;\n if (prop === 'hasErrors') return errorMessages.length > 0;\n if (prop === 'hasWarnings') return warningMessages.length > 0;\n if (prop === 'allErrors') return allErrors;\n if (prop === 'message') return validationMessage;\n if (prop === 'getData') return () => getShadowValue(stateKey, path);\n\n return target[prop];\n },\n });\n\r\n const initialElement = renderFn(stateWithInputProps);\r\n\r\n return (\r\n <ValidationWrapper formOpts={formOpts} path={path} stateKey={stateKey}>\r\n {initialElement}\r\n </ValidationWrapper>\r\n );\r\n}\r\n\r\nexport function 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 registerComponent(stateKey, fullComponentId, {\r\n forceUpdate: () => forceUpdate({}),\r\n paths: new Set(),\r\n reactiveType: ['component'],\r\n });\r\n return () => {\r\n unregisterComponent(stateKey, fullComponentId);\r\n };\r\n }, [stateKey, fullComponentId]);\r\n}\r\n\r\nexport function IsolatedComponentWrapper({\r\n stateKey,\r\n path, // The path of the parent node (e.g. ['form'])\r\n dependencies, // NEW: Optional array of Proxy objects or path arrays\r\n rebuildStateShape,\r\n renderFn,\r\n}: {\r\n stateKey: string;\r\n path: string[];\r\n dependencies?: any[]; // The explicit list of dependencies\r\n rebuildStateShape: (options: any) => any;\r\n renderFn: (state: any) => React.ReactNode;\r\n}) {\r\n const [componentId] = useState(() => uuidv4());\r\n const [, forceUpdate] = useState({});\r\n\r\n useRegisterComponent(stateKey, componentId, forceUpdate);\r\n\r\n const pathsToSubscribe = useMemo(() => {\r\n if (dependencies && dependencies.length > 0) {\r\n return dependencies.map((dep) => {\r\n return [stateKey, ...dep.$_path].join('.');\r\n });\r\n }\r\n\r\n return [[stateKey, ...path].join('.')];\r\n }, [stateKey, path, dependencies]);\r\n\r\n // 2. Subscribe to ALL calculated paths\r\n useEffect(() => {\r\n const store = getGlobalStore.getState();\r\n\r\n // Create an array of unsubscribe functions\r\n const unsubs = pathsToSubscribe.map((fullPathKey) => {\r\n return store.subscribeToPath(fullPathKey, () => {\r\n forceUpdate({});\r\n });\r\n });\r\n\r\n return () => {\r\n unsubs.forEach((unsub) => unsub());\r\n };\r\n }, [pathsToSubscribe]);\r\n\r\n const baseState = rebuildStateShape({\r\n path: path,\r\n componentId: componentId,\r\n meta: undefined,\r\n });\r\n\r\n return <>{renderFn(baseState)}</>;\r\n}\r\n// 1. Define the MINIMAL props needed.\r\ntype PluginWrapperProps = {\r\n children: ReactNode;\r\n stateKey: string;\r\n path: string[];\r\n pluginName: string;\r\n wrapperDepth: number;\r\n};\r\n\r\nconst PluginWrapper = memo(function PluginWrapper({\r\n children,\r\n stateKey,\r\n path,\r\n pluginName,\r\n wrapperDepth,\r\n}: PluginWrapperProps) {\r\n const [, forceUpdate] = useState({});\r\n\r\n useEffect(() => {\r\n const fullPathKey = [stateKey, ...path].join('.');\r\n const unsubscribe = getGlobalStore\r\n .getState()\r\n .subscribeToPath(fullPathKey, () => {\r\n forceUpdate({});\r\n });\r\n return unsubscribe;\r\n }, [stateKey, path]);\r\n\r\n const plugin = pluginStore\r\n .getState()\r\n .registeredPlugins.find((p) => p.name === pluginName);\r\n\r\n const stateHandler: StateObject<any> | undefined = pluginStore\r\n .getState()\r\n .stateHandlers.get(stateKey);\r\n\r\n const typeInfo = getGlobalStore.getState().getShadowNode(stateKey, path)\r\n ?._meta?.typeInfo;\r\n\r\n const options = pluginStore\r\n .getState()\r\n .pluginOptions.get(stateKey)\r\n ?.get(pluginName);\r\n\r\n const hookData = pluginStore.getState().getHookResult(stateKey, pluginName);\r\n\r\n if (!plugin?.formWrapper || !stateHandler) {\r\n return <>{children}</>;\r\n }\r\n\r\n const deconstructed = toDeconstructedMethods(stateHandler);\r\n const scopedMetadataContext = createScopedMetadataContext(\r\n stateKey,\r\n plugin.name,\r\n path\r\n );\r\n return plugin.formWrapper({\r\n element: children,\r\n path,\r\n stateKey,\r\n pluginName: plugin.name,\r\n ...deconstructed,\r\n\r\n ...scopedMetadataContext,\r\n options,\r\n hookData,\r\n fieldType: typeInfo?.type,\r\n wrapperDepth,\r\n });\r\n});\r\n"],"names":["getInitialOptions","getShadowMetadata","setShadowMetadata","getShadowValue","registerComponent","unregisterComponent","notifyPathSubscribers","subscribeToPath","getGlobalStore","stateHandlers","notifyFormUpdate","pluginStore","ValidationWrapper","formOpts","path","stateKey","children","thisStateOpts","validationState","status","errors","err","errorMessages","warningMessages","message","primarySeverity","registeredPlugins","pluginsApi","plugin","pluginName","hookData","scopedMetadata","createScopedMetadataContext","jsx","Fragment","React","MemoizedCogsItemWrapper","memo","ListItemWrapper","prevProps","nextProps","itemComponentId","itemPath","localIndex","arraySetter","rebuildStateShape","renderFn","forceUpdate","useState","inViewRef","inView","useInView","elementRef","useRef","fullKey","useRegisterComponent","setRefs","useCallback","element","useEffect","unsubscribe","e","itemValue","itemSetter","node","existingRef","FormElementWrapper","setState","componentId","uuidv4","formElementRef","stateKeyPathKey","typeInfo","globalStateValue","localValue","setLocalValue","isCurrentlyDebouncing","debounceTimeoutRef","isDeepEqual","currentMeta","detectElementType","el","tagName","type","newValue","meta","debouncedUpdate","liveTypeInfo","runValidation","debounceTime","handleFocus","handleBlur","focusStartTime","baseState","validationStatus","allErrors","validationMessage","validationSeverity","stateWithInputProps","target","prop","initialElement","fullComponentId","useLayoutEffect","IsolatedComponentWrapper","dependencies","pathsToSubscribe","useMemo","dep","store","unsubs","fullPathKey","unsub","wrapperDepth","p","stateHandler","options","deconstructed","toDeconstructedMethods","scopedMetadataContext"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "cogsbox-state",
3
- "version": "0.5.485",
3
+ "version": "0.5.486",
4
4
  "description": "React state management library with form controls and server sync",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
package/src/CogsState.tsx CHANGED
@@ -63,11 +63,11 @@ export type SyncInfo = {
63
63
  userId: number;
64
64
  };
65
65
 
66
- export type FormElementParams<T> = StateObject<T> & {
67
- $inputProps: {
68
- ref?: RefObject<any>;
69
- value?: T extends boolean ? never : T;
70
- onChange?: (
66
+ export type FormElementParams<T> = StateObject<T> & {
67
+ $inputProps: {
68
+ ref?: RefObject<any>;
69
+ value?: T extends boolean ? never : T;
70
+ onChange?: (
71
71
  event: ChangeEvent<
72
72
  HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement
73
73
  >
@@ -75,10 +75,17 @@ export type FormElementParams<T> = StateObject<T> & {
75
75
  onBlur?: (
76
76
  event: FocusEvent<
77
77
  HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement
78
- >
79
- ) => void;
80
- };
81
- };
78
+ >
79
+ ) => void;
80
+ };
81
+ status: ValidationStatus;
82
+ severity: ValidationSeverity;
83
+ hasErrors: boolean;
84
+ hasWarnings: boolean;
85
+ allErrors: ValidationError[];
86
+ message: string;
87
+ getData: () => T;
88
+ };
82
89
 
83
90
  export type StateKeys = string;
84
91
 
@@ -22,7 +22,7 @@ import React, {
22
22
  useMemo,
23
23
  type ReactNode,
24
24
  } from 'react';
25
- import { getGlobalStore, ValidationError, ValidationSeverity } from './store';
25
+ import { getGlobalStore, ValidationError, ValidationSeverity } from './store';
26
26
  import { useInView } from 'react-intersection-observer';
27
27
  import { v4 as uuidv4 } from 'uuid';
28
28
  import { isDeepEqual } from './utility';
@@ -526,29 +526,55 @@ export function FormElementWrapper({
526
526
  });
527
527
  }, [localValue, setState, path, stateKey, componentId, globalStateValue]);
528
528
 
529
- const baseState = rebuildStateShape({
530
- path: path,
531
- componentId: componentId,
532
- meta: undefined,
533
- });
534
-
535
- const stateWithInputProps = new Proxy(baseState, {
536
- get(target, prop) {
537
- if (prop === '$inputProps') {
538
- return {
529
+ const baseState = rebuildStateShape({
530
+ path: path,
531
+ componentId: componentId,
532
+ meta: undefined,
533
+ });
534
+ const validationState = getShadowMetadata(stateKey, path)?.validation;
535
+ const validationStatus = validationState?.status || 'NOT_VALIDATED';
536
+ const allErrors = (validationState?.errors || []).map((err) => ({
537
+ ...err,
538
+ path,
539
+ })) as ValidationError[];
540
+ const errorMessages = allErrors
541
+ .filter((err) => err.severity === 'error')
542
+ .map((err) => err.message);
543
+ const warningMessages = allErrors
544
+ .filter((err) => err.severity === 'warning')
545
+ .map((err) => err.message);
546
+ const validationMessage = errorMessages[0] || warningMessages[0] || '';
547
+ const validationSeverity: ValidationSeverity =
548
+ errorMessages.length > 0
549
+ ? 'error'
550
+ : warningMessages.length > 0
551
+ ? 'warning'
552
+ : undefined;
553
+
554
+ const stateWithInputProps = new Proxy(baseState, {
555
+ get(target, prop) {
556
+ if (prop === '$inputProps') {
557
+ return {
539
558
  value: localValue ?? '',
540
559
  onChange: (e: any) => {
541
560
  debouncedUpdate(e.target.value);
542
561
  },
543
562
  onFocus: handleFocus,
544
563
  onBlur: handleBlur,
545
- ref: formElementRef,
546
- };
547
- }
548
-
549
- return target[prop];
550
- },
551
- });
564
+ ref: formElementRef,
565
+ };
566
+ }
567
+ if (prop === 'status') return validationStatus;
568
+ if (prop === 'severity') return validationSeverity;
569
+ if (prop === 'hasErrors') return errorMessages.length > 0;
570
+ if (prop === 'hasWarnings') return warningMessages.length > 0;
571
+ if (prop === 'allErrors') return allErrors;
572
+ if (prop === 'message') return validationMessage;
573
+ if (prop === 'getData') return () => getShadowValue(stateKey, path);
574
+
575
+ return target[prop];
576
+ },
577
+ });
552
578
 
553
579
  const initialElement = renderFn(stateWithInputProps);
554
580