UNPKG

el-form-react

Version:

React form components and hooks powered by Zod validation

1 lines 23.7 kB
{"version":3,"sources":["../src/hooks.ts","../src/useForm.ts","../src/utils/index.ts"],"sourcesContent":["// Re-export everything from core for convenience\nexport * from \"el-form-core\";\n\n// Export React-specific hooks only\nexport { useForm } from \"./useForm\";\nexport type { UseFormOptions, UseFormReturn } from \"./types\";\n","import { useState, useCallback, useRef } from \"react\";\nimport { z } from \"zod\";\nimport {\n FormState,\n UseFormOptions,\n UseFormReturn,\n FieldState,\n ResetOptions,\n SetFocusOptions,\n} from \"./types\";\nimport {\n parseZodErrors,\n setNestedValue,\n getNestedValue,\n removeArrayItem,\n} from \"el-form-core\";\nimport { addArrayItemReact } from \"./utils\";\n\nexport function useForm<T extends Record<string, any>>(\n options: UseFormOptions<T>\n): UseFormReturn<T> {\n const {\n schema,\n initialValues = {},\n validateOnChange = false,\n validateOnBlur = false,\n } = options;\n\n // Ref to store field refs for focus management\n const fieldRefs = useRef<\n Map<keyof T, HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement>\n >(new Map());\n\n const [formState, setFormState] = useState<FormState<T>>({\n values: initialValues,\n errors: {},\n touched: {},\n isSubmitting: false,\n isValid: false,\n isDirty: false,\n });\n\n const validate = useCallback(\n (\n values: Partial<T>\n ): { isValid: boolean; errors: Record<keyof T, string> } => {\n try {\n schema.parse(values);\n return { isValid: true, errors: {} as Record<keyof T, string> };\n } catch (error) {\n if (error instanceof z.ZodError) {\n return {\n isValid: false,\n errors: parseZodErrors(error) as Record<keyof T, string>,\n };\n }\n return { isValid: false, errors: {} as Record<keyof T, string> };\n }\n },\n [schema]\n );\n\n // Helper function to check if form is dirty\n const checkIsDirty = useCallback(\n (currentValues: Partial<T>): boolean => {\n // Simple JSON comparison for now - can be optimized later\n return (\n JSON.stringify(initialValues || {}) !==\n JSON.stringify(currentValues || {})\n );\n },\n [initialValues]\n );\n\n // Helper function to check if specific field is dirty\n const checkFieldIsDirty = useCallback(\n (fieldName: keyof T): boolean => {\n const initialValue = (initialValues as any)[fieldName];\n const currentValue = (formState.values as any)[fieldName];\n return JSON.stringify(initialValue) !== JSON.stringify(currentValue);\n },\n [initialValues, formState.values]\n );\n\n const register = useCallback(\n (name: string) => {\n // Get field value using nested path support\n const fieldValue = name.includes(\".\")\n ? getNestedValue(formState.values, name)\n : formState.values[name as keyof T];\n\n const isCheckbox = typeof fieldValue === \"boolean\";\n\n const baseProps = {\n name,\n onChange: (e: React.ChangeEvent<any>) => {\n const target = e.target;\n const value =\n target.type === \"checkbox\"\n ? target.checked\n : target.type === \"number\"\n ? target.value\n ? Number(target.value)\n : undefined\n : target.value;\n\n setFormState((prev) => {\n // Use setNestedValue for nested paths, direct assignment for top-level\n const newValues = name.includes(\".\")\n ? setNestedValue(prev.values, name, value)\n : { ...prev.values, [name]: value };\n\n let newErrors = { ...prev.errors };\n\n // Clear error for this field (handle nested paths)\n if (name.includes(\".\")) {\n // For nested paths, we might need more sophisticated error clearing\n // For now, just clear the specific nested error if it exists\n const nestedError = getNestedValue(newErrors, name);\n if (nestedError) {\n newErrors = setNestedValue(newErrors, name, undefined);\n }\n } else {\n delete newErrors[name as keyof T];\n }\n\n // Run validation if validateOnChange is enabled\n if (validateOnChange) {\n const { errors } = validate(newValues);\n newErrors = errors;\n }\n\n return {\n ...prev,\n values: newValues,\n errors: newErrors,\n isDirty: checkIsDirty(newValues),\n };\n });\n },\n onBlur: (_e: React.FocusEvent<any>) => {\n setFormState((prev) => {\n // Handle touched state for nested paths\n const newTouched = name.includes(\".\")\n ? setNestedValue(prev.touched, name, true)\n : { ...prev.touched, [name]: true };\n\n let newErrors = prev.errors;\n\n // Run validation if validateOnBlur is enabled\n if (validateOnBlur) {\n const { errors } = validate(prev.values);\n newErrors = errors;\n }\n\n return {\n ...prev,\n touched: newTouched,\n errors: newErrors,\n isDirty: checkIsDirty(prev.values),\n };\n });\n },\n };\n\n // For checkboxes, use 'checked' instead of 'value'\n if (isCheckbox) {\n return {\n ...baseProps,\n checked: Boolean(fieldValue),\n };\n }\n\n // For other inputs, use 'value'\n return {\n ...baseProps,\n value: fieldValue || \"\",\n };\n },\n [formState.values, validateOnChange, validateOnBlur, validate, checkIsDirty]\n );\n\n const handleSubmit = useCallback(\n (\n onValid: (data: T) => void,\n onError?: (errors: Record<keyof T, string>) => void\n ) => {\n return (e: React.FormEvent) => {\n e.preventDefault();\n\n setFormState((prev) => ({ ...prev, isSubmitting: true }));\n\n const { isValid, errors } = validate(formState.values);\n\n setFormState((prev) => ({\n ...prev,\n errors,\n isValid,\n isSubmitting: false,\n isDirty: checkIsDirty(formState.values),\n }));\n\n if (isValid) {\n onValid(formState.values as T);\n } else {\n if (onError) {\n onError(errors);\n }\n }\n };\n },\n [formState.values, validate, checkIsDirty]\n );\n\n const reset = useCallback(\n (options?: ResetOptions<T>) => {\n const newValues = options?.values ?? initialValues;\n\n setFormState({\n values: newValues,\n errors: options?.keepErrors ? formState.errors : {},\n touched: options?.keepTouched ? formState.touched : {},\n isSubmitting: false,\n isValid: false,\n isDirty: options?.keepDirty ? formState.isDirty : false,\n });\n },\n [initialValues, formState]\n );\n\n // Enhanced setValue for nested paths\n const setValue = useCallback(\n (path: string, value: any) => {\n setFormState((prev) => {\n const newValues = setNestedValue(prev.values, path, value);\n const { errors } = validate(newValues);\n\n return {\n ...prev,\n values: newValues,\n errors,\n isDirty: checkIsDirty(newValues),\n };\n });\n },\n [validate, checkIsDirty]\n );\n\n // Add item to array at path\n const addArrayItemHandler = useCallback(\n (path: string, item: any) => {\n setFormState((prev) => {\n const newValues = addArrayItemReact(prev.values, path, item);\n const { errors } = validate(newValues);\n\n return {\n ...prev,\n values: newValues,\n errors,\n isDirty: checkIsDirty(newValues),\n };\n });\n },\n [validate, checkIsDirty]\n );\n\n // Remove item from array at path\n const removeArrayItemHandler = useCallback(\n (path: string, index: number) => {\n setFormState((prev) => {\n const newValues = removeArrayItem(prev.values, path, index);\n const { errors } = validate(newValues);\n\n return {\n ...prev,\n values: newValues,\n errors,\n isDirty: checkIsDirty(newValues),\n };\n });\n },\n [validate, checkIsDirty]\n );\n\n // Watch system - overloaded function\n const watch = useCallback(\n ((nameOrNames?: keyof T | (keyof T)[]) => {\n if (!nameOrNames) {\n // Watch all values\n return formState.values;\n }\n\n if (Array.isArray(nameOrNames)) {\n // Watch multiple fields\n const result: Partial<T> = {};\n nameOrNames.forEach((name) => {\n result[name] = formState.values[name];\n });\n return result;\n }\n\n // Watch single field\n return formState.values[nameOrNames];\n }) as UseFormReturn<T>[\"watch\"],\n [formState.values]\n );\n\n // Field state queries\n const isDirty = useCallback(\n <Name extends keyof T>(name?: Name): boolean => {\n if (name) {\n return checkFieldIsDirty(name);\n }\n // Check if form is dirty\n return formState.isDirty;\n },\n [formState.isDirty, checkFieldIsDirty]\n );\n\n const getFieldState = useCallback(\n <Name extends keyof T>(name: Name): FieldState => {\n return {\n isDirty: checkFieldIsDirty(name),\n isTouched: !!formState.touched[name],\n error: formState.errors[name],\n };\n },\n [formState, checkFieldIsDirty]\n );\n\n const getDirtyFields = useCallback((): Partial<Record<keyof T, boolean>> => {\n const dirtyFields: Partial<Record<keyof T, boolean>> = {};\n Object.keys(formState.values).forEach((key) => {\n const fieldName = key as keyof T;\n if (checkFieldIsDirty(fieldName)) {\n dirtyFields[fieldName] = true;\n }\n });\n return dirtyFields;\n }, [formState.values, checkFieldIsDirty]);\n\n const getTouchedFields = useCallback((): Partial<\n Record<keyof T, boolean>\n > => {\n return { ...formState.touched };\n }, [formState.touched]);\n\n // Validation control\n const trigger = useCallback(\n (async (nameOrNames?: keyof T | (keyof T)[]) => {\n if (!nameOrNames) {\n // Validate all fields\n const { isValid } = validate(formState.values);\n return isValid;\n }\n\n if (Array.isArray(nameOrNames)) {\n // Validate multiple fields\n const fieldsToValidate: Partial<T> = {};\n nameOrNames.forEach((name) => {\n fieldsToValidate[name] = formState.values[name];\n });\n const { isValid } = validate(fieldsToValidate);\n return isValid;\n }\n\n // Validate single field - create object with computed property\n const fieldToValidate = {} as Partial<T>;\n (fieldToValidate as any)[nameOrNames] = formState.values[nameOrNames];\n const { isValid } = validate(fieldToValidate);\n return isValid;\n }) as UseFormReturn<T>[\"trigger\"],\n [formState.values, validate]\n );\n\n const clearErrors = useCallback((name?: keyof T) => {\n setFormState((prev) => {\n if (name) {\n // Clear specific field error\n const newErrors = { ...prev.errors };\n delete newErrors[name];\n return { ...prev, errors: newErrors };\n }\n // Clear all errors\n return { ...prev, errors: {} };\n });\n }, []);\n\n const setError = useCallback(\n <Name extends keyof T>(name: Name, error: string) => {\n setFormState((prev) => ({\n ...prev,\n errors: { ...prev.errors, [name]: error },\n }));\n },\n []\n );\n\n // Focus management\n const setFocus = useCallback(\n <Name extends keyof T>(name: Name, options?: SetFocusOptions) => {\n const fieldRef = fieldRefs.current.get(name);\n if (fieldRef) {\n fieldRef.focus();\n if (options?.shouldSelect && \"select\" in fieldRef) {\n fieldRef.select();\n }\n }\n },\n []\n );\n\n const resetField = useCallback(\n <Name extends keyof T>(name: Name) => {\n setFormState((prev) => {\n const newValues = { ...prev.values };\n (newValues as any)[name] = (initialValues as any)[name];\n\n const newErrors = { ...prev.errors };\n delete newErrors[name];\n\n const newTouched = { ...prev.touched };\n delete newTouched[name];\n\n return {\n ...prev,\n values: newValues,\n errors: newErrors,\n touched: newTouched,\n isDirty: checkIsDirty(newValues),\n };\n });\n },\n [initialValues, checkIsDirty]\n );\n\n return {\n register,\n handleSubmit,\n formState,\n reset,\n setValue,\n watch,\n getFieldState,\n isDirty,\n getDirtyFields,\n getTouchedFields,\n trigger,\n clearErrors,\n setError,\n setFocus,\n addArrayItem: addArrayItemHandler,\n removeArrayItem: removeArrayItemHandler,\n resetField,\n };\n}\n","// React-specific utility functions\nimport {\n setNestedValue,\n getNestedValue,\n removeArrayItem,\n parseZodErrors,\n} from \"el-form-core\";\n\n// Re-export core utilities for convenience\nexport { setNestedValue, getNestedValue, removeArrayItem, parseZodErrors };\n\n// React-specific array manipulation (different name to avoid conflicts)\nexport function addArrayItemReact(obj: any, path: string, item: any): any {\n const result = { ...obj };\n\n // Handle array notation like employees[0].friends\n const normalizedPath = path.replace(/\\[(\\d+)\\]/g, \".$1\");\n const keys = normalizedPath.split(\".\").filter((key) => key !== \"\");\n let current = result;\n\n // Navigate to the parent object\n for (let i = 0; i < keys.length - 1; i++) {\n const key = keys[i];\n\n if (!isNaN(Number(key))) {\n // Array index\n if (Array.isArray(current)) {\n current[Number(key)] = Array.isArray(current[Number(key)])\n ? [...current[Number(key)]]\n : { ...current[Number(key)] };\n current = current[Number(key)];\n }\n } else {\n // Object key\n if (typeof current[key] !== \"object\" || current[key] === null) {\n current[key] = {};\n } else {\n current[key] = Array.isArray(current[key])\n ? [...current[key]]\n : { ...current[key] };\n }\n current = current[key];\n }\n }\n\n const arrayKey = keys[keys.length - 1];\n\n if (!isNaN(Number(arrayKey))) {\n // Adding to an array at a numeric index (shouldn't happen with this function)\n if (Array.isArray(current)) {\n current = [...current];\n current[Number(arrayKey)] = item;\n }\n } else {\n // Adding to an array property\n if (!Array.isArray(current[arrayKey])) {\n current[arrayKey] = [];\n } else {\n current[arrayKey] = [...current[arrayKey]]; // Create new array\n }\n current[arrayKey].push(item); // Now safe to push to the new array\n }\n\n return result;\n}\n"],"mappings":"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","names":["parseZodErrors","setNestedValue","getNestedValue","removeArrayItem","parseZodErrors","getNestedValue","setNestedValue","options","removeArrayItem","isValid"]}