@mantine/form 9.4.0 → 9.4.1

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.
@@ -65,7 +65,7 @@ function useFormStatus({ initialDirty, initialTouched, mode, $values }) {
65
65
  setDirty,
66
66
  resetDirty,
67
67
  resetTouched,
68
- isTouched: (0, react.useCallback)((path) => require_get_status.getStatus(touchedRef.current, path), []),
68
+ isTouched: (0, react.useCallback)((path) => require_get_status.getStatus(touchedRef.current, path), [touchedRef.current]),
69
69
  setFieldTouched,
70
70
  setFieldDirty,
71
71
  setTouchedState,
@@ -85,9 +85,13 @@ function useFormStatus({ initialDirty, initialTouched, mode, $values }) {
85
85
  }
86
86
  if (Object.keys(dirtyRef.current).length > 0) return require_get_status.getStatus(dirtyRef.current);
87
87
  return !(0, fast_deep_equal.default)($values.refValues.current, $values.valuesSnapshot.current);
88
- }, []),
89
- getDirty: (0, react.useCallback)(() => dirtyRef.current, []),
90
- getTouched: (0, react.useCallback)(() => touchedRef.current, []),
88
+ }, [
89
+ dirtyRef.current,
90
+ $values.refValues.current,
91
+ $values.valuesSnapshot.current
92
+ ]),
93
+ getDirty: (0, react.useCallback)(() => dirtyRef.current, [dirtyRef.current]),
94
+ getTouched: (0, react.useCallback)(() => touchedRef.current, [touchedRef.current]),
91
95
  setCalculatedFieldDirty
92
96
  };
93
97
  }
@@ -1 +1 @@
1
- {"version":3,"file":"use-form-status.cjs","names":["getStatus","getPath","clearListState"],"sources":["../../../src/hooks/use-form-status/use-form-status.ts"],"sourcesContent":["import { useCallback, useRef, useState } from 'react';\nimport isEqual from 'fast-deep-equal';\nimport { getStatus } from '../../get-status';\nimport { clearListState } from '../../lists';\nimport { getPath } from '../../paths';\nimport {\n ClearFieldDirty,\n FormMode,\n FormStatus,\n GetFieldStatus,\n ResetDirty,\n ResetStatus,\n SetCalculatedFieldDirty,\n SetFieldDirty,\n SetFieldTouched,\n} from '../../types';\nimport type { $FormValues } from '../use-form-values/use-form-values';\n\nexport interface $FormStatus<out Values extends Record<string, any>> {\n touchedState: FormStatus;\n dirtyState: FormStatus;\n touchedRef: React.RefObject<FormStatus>;\n dirtyRef: React.RefObject<FormStatus>;\n setTouched: React.Dispatch<React.SetStateAction<FormStatus>>;\n setDirty: React.Dispatch<React.SetStateAction<FormStatus>>;\n resetDirty: ResetStatus;\n resetTouched: ResetStatus;\n isTouched: GetFieldStatus<Values>;\n setFieldTouched: SetFieldTouched<Values>;\n setFieldDirty: SetFieldDirty<Values>;\n setTouchedState: React.Dispatch<React.SetStateAction<FormStatus>>;\n setDirtyState: React.Dispatch<React.SetStateAction<FormStatus>>;\n clearFieldDirty: ClearFieldDirty;\n isDirty: GetFieldStatus<Values>;\n getDirty: () => FormStatus;\n getTouched: () => FormStatus;\n setCalculatedFieldDirty: SetCalculatedFieldDirty<Values>;\n}\n\ninterface UseFormStatusInput<out Values extends Record<string, any>> {\n initialDirty: FormStatus;\n initialTouched: FormStatus;\n mode: FormMode;\n $values: $FormValues<Values>;\n}\n\nexport function useFormStatus<Values extends Record<string, any>>({\n initialDirty,\n initialTouched,\n mode,\n $values,\n}: UseFormStatusInput<Values>): $FormStatus<Values> {\n const [touchedState, setTouchedState] = useState(initialTouched);\n const [dirtyState, setDirtyState] = useState(initialDirty);\n\n const touchedRef = useRef(initialTouched);\n const dirtyRef = useRef(initialDirty);\n\n const setTouched = useCallback((values: FormStatus | ((current: FormStatus) => FormStatus)) => {\n const resolvedValues = typeof values === 'function' ? values(touchedRef.current) : values;\n touchedRef.current = resolvedValues;\n\n if (mode === 'controlled') {\n setTouchedState(resolvedValues);\n }\n }, []);\n\n const setDirty = useCallback(\n (values: FormStatus | ((current: FormStatus) => FormStatus), forceUpdate = false) => {\n const resolvedValues = typeof values === 'function' ? values(dirtyRef.current) : values;\n dirtyRef.current = resolvedValues;\n\n if (mode === 'controlled' || forceUpdate) {\n setDirtyState(resolvedValues);\n }\n },\n []\n );\n\n const resetTouched: ResetStatus = useCallback(() => setTouched({}), []);\n\n const resetDirty: ResetDirty<Values> = useCallback((values) => {\n const newSnapshot = values\n ? { ...$values.refValues.current, ...values }\n : $values.refValues.current;\n $values.setValuesSnapshot(newSnapshot);\n setDirty({});\n }, []);\n\n const setFieldTouched: SetFieldTouched<Values> = useCallback((path, touched) => {\n setTouched((currentTouched) => {\n if (getStatus(currentTouched, path) === touched) {\n return currentTouched;\n }\n\n return { ...currentTouched, [path]: touched };\n });\n }, []);\n\n const setFieldDirty: SetFieldDirty<Values> = useCallback((path, dirty, forceUpdate) => {\n setDirty((currentDirty) => {\n if (getStatus(currentDirty, path) === dirty) {\n return currentDirty;\n }\n\n return { ...currentDirty, [path]: dirty };\n }, forceUpdate);\n }, []);\n\n const setCalculatedFieldDirty: SetCalculatedFieldDirty<Values> = useCallback((path, value) => {\n const currentDirty = getStatus(dirtyRef.current, path);\n const dirty = !isEqual(getPath(path, $values.getValuesSnapshot()), value);\n const clearedState = clearListState(path, dirtyRef.current);\n clearedState[path as string] = dirty;\n setDirty(clearedState, currentDirty !== dirty);\n }, []);\n\n const isTouched: GetFieldStatus<Values> = useCallback(\n (path) => getStatus(touchedRef.current, path),\n []\n );\n\n const clearFieldDirty: ClearFieldDirty = useCallback(\n (path) =>\n setDirty((current) => {\n if (typeof path !== 'string') {\n return current;\n }\n\n const result = clearListState(path, current);\n delete result[path];\n\n if (isEqual(result, current)) {\n return current;\n }\n\n return result;\n }),\n []\n );\n\n const isDirty: GetFieldStatus<Values> = useCallback((path) => {\n if (path) {\n const overriddenValue = getPath(path, dirtyRef.current);\n if (typeof overriddenValue === 'boolean') {\n return overriddenValue;\n }\n\n const sliceOfValues = getPath(path, $values.refValues.current);\n const sliceOfInitialValues = getPath(path, $values.valuesSnapshot.current);\n return !isEqual(sliceOfValues, sliceOfInitialValues);\n }\n\n const isOverridden = Object.keys(dirtyRef.current).length > 0;\n if (isOverridden) {\n return getStatus(dirtyRef.current);\n }\n\n return !isEqual($values.refValues.current, $values.valuesSnapshot.current);\n }, []);\n\n const getDirty = useCallback(() => dirtyRef.current, []);\n const getTouched = useCallback(() => touchedRef.current, []);\n\n return {\n touchedState,\n dirtyState,\n touchedRef,\n dirtyRef,\n setTouched,\n setDirty,\n resetDirty,\n resetTouched,\n isTouched,\n setFieldTouched,\n setFieldDirty,\n setTouchedState,\n setDirtyState,\n clearFieldDirty,\n isDirty,\n getDirty,\n getTouched,\n setCalculatedFieldDirty,\n };\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"use-form-status.cjs","names":["getStatus","getPath","clearListState"],"sources":["../../../src/hooks/use-form-status/use-form-status.ts"],"sourcesContent":["import { useCallback, useRef, useState } from 'react';\nimport isEqual from 'fast-deep-equal';\nimport { getStatus } from '../../get-status';\nimport { clearListState } from '../../lists';\nimport { getPath } from '../../paths';\nimport {\n ClearFieldDirty,\n FormMode,\n FormStatus,\n GetFieldStatus,\n ResetDirty,\n ResetStatus,\n SetCalculatedFieldDirty,\n SetFieldDirty,\n SetFieldTouched,\n} from '../../types';\nimport type { $FormValues } from '../use-form-values/use-form-values';\n\nexport interface $FormStatus<out Values extends Record<string, any>> {\n touchedState: FormStatus;\n dirtyState: FormStatus;\n touchedRef: React.RefObject<FormStatus>;\n dirtyRef: React.RefObject<FormStatus>;\n setTouched: React.Dispatch<React.SetStateAction<FormStatus>>;\n setDirty: React.Dispatch<React.SetStateAction<FormStatus>>;\n resetDirty: ResetStatus;\n resetTouched: ResetStatus;\n isTouched: GetFieldStatus<Values>;\n setFieldTouched: SetFieldTouched<Values>;\n setFieldDirty: SetFieldDirty<Values>;\n setTouchedState: React.Dispatch<React.SetStateAction<FormStatus>>;\n setDirtyState: React.Dispatch<React.SetStateAction<FormStatus>>;\n clearFieldDirty: ClearFieldDirty;\n isDirty: GetFieldStatus<Values>;\n getDirty: () => FormStatus;\n getTouched: () => FormStatus;\n setCalculatedFieldDirty: SetCalculatedFieldDirty<Values>;\n}\n\ninterface UseFormStatusInput<out Values extends Record<string, any>> {\n initialDirty: FormStatus;\n initialTouched: FormStatus;\n mode: FormMode;\n $values: $FormValues<Values>;\n}\n\nexport function useFormStatus<Values extends Record<string, any>>({\n initialDirty,\n initialTouched,\n mode,\n $values,\n}: UseFormStatusInput<Values>): $FormStatus<Values> {\n const [touchedState, setTouchedState] = useState(initialTouched);\n const [dirtyState, setDirtyState] = useState(initialDirty);\n\n const touchedRef = useRef(initialTouched);\n const dirtyRef = useRef(initialDirty);\n\n const setTouched = useCallback((values: FormStatus | ((current: FormStatus) => FormStatus)) => {\n const resolvedValues = typeof values === 'function' ? values(touchedRef.current) : values;\n touchedRef.current = resolvedValues;\n\n if (mode === 'controlled') {\n setTouchedState(resolvedValues);\n }\n }, []);\n\n const setDirty = useCallback(\n (values: FormStatus | ((current: FormStatus) => FormStatus), forceUpdate = false) => {\n const resolvedValues = typeof values === 'function' ? values(dirtyRef.current) : values;\n dirtyRef.current = resolvedValues;\n\n if (mode === 'controlled' || forceUpdate) {\n setDirtyState(resolvedValues);\n }\n },\n []\n );\n\n const resetTouched: ResetStatus = useCallback(() => setTouched({}), []);\n\n const resetDirty: ResetDirty<Values> = useCallback((values) => {\n const newSnapshot = values\n ? { ...$values.refValues.current, ...values }\n : $values.refValues.current;\n $values.setValuesSnapshot(newSnapshot);\n setDirty({});\n }, []);\n\n const setFieldTouched: SetFieldTouched<Values> = useCallback((path, touched) => {\n setTouched((currentTouched) => {\n if (getStatus(currentTouched, path) === touched) {\n return currentTouched;\n }\n\n return { ...currentTouched, [path]: touched };\n });\n }, []);\n\n const setFieldDirty: SetFieldDirty<Values> = useCallback((path, dirty, forceUpdate) => {\n setDirty((currentDirty) => {\n if (getStatus(currentDirty, path) === dirty) {\n return currentDirty;\n }\n\n return { ...currentDirty, [path]: dirty };\n }, forceUpdate);\n }, []);\n\n const setCalculatedFieldDirty: SetCalculatedFieldDirty<Values> = useCallback((path, value) => {\n const currentDirty = getStatus(dirtyRef.current, path);\n const dirty = !isEqual(getPath(path, $values.getValuesSnapshot()), value);\n const clearedState = clearListState(path, dirtyRef.current);\n clearedState[path as string] = dirty;\n setDirty(clearedState, currentDirty !== dirty);\n }, []);\n\n const isTouched: GetFieldStatus<Values> = useCallback(\n (path) => getStatus(touchedRef.current, path),\n [touchedRef.current]\n );\n\n const clearFieldDirty: ClearFieldDirty = useCallback(\n (path) =>\n setDirty((current) => {\n if (typeof path !== 'string') {\n return current;\n }\n\n const result = clearListState(path, current);\n delete result[path];\n\n if (isEqual(result, current)) {\n return current;\n }\n\n return result;\n }),\n []\n );\n\n const isDirty: GetFieldStatus<Values> = useCallback(\n (path) => {\n if (path) {\n const overriddenValue = getPath(path, dirtyRef.current);\n if (typeof overriddenValue === 'boolean') {\n return overriddenValue;\n }\n\n const sliceOfValues = getPath(path, $values.refValues.current);\n const sliceOfInitialValues = getPath(path, $values.valuesSnapshot.current);\n return !isEqual(sliceOfValues, sliceOfInitialValues);\n }\n\n const isOverridden = Object.keys(dirtyRef.current).length > 0;\n if (isOverridden) {\n return getStatus(dirtyRef.current);\n }\n\n return !isEqual($values.refValues.current, $values.valuesSnapshot.current);\n },\n [dirtyRef.current, $values.refValues.current, $values.valuesSnapshot.current]\n );\n\n const getDirty = useCallback(() => dirtyRef.current, [dirtyRef.current]);\n const getTouched = useCallback(() => touchedRef.current, [touchedRef.current]);\n\n return {\n touchedState,\n dirtyState,\n touchedRef,\n dirtyRef,\n setTouched,\n setDirty,\n resetDirty,\n resetTouched,\n isTouched,\n setFieldTouched,\n setFieldDirty,\n setTouchedState,\n setDirtyState,\n clearFieldDirty,\n isDirty,\n getDirty,\n getTouched,\n setCalculatedFieldDirty,\n };\n}\n"],"mappings":"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"}
@@ -22,7 +22,7 @@ function useFormValidating() {
22
22
  if (path) return !!validatingRef.current[path];
23
23
  if (formValidatingRef.current) return true;
24
24
  return Object.values(validatingRef.current).some(Boolean);
25
- }, []);
25
+ }, [validatingRef.current, formValidatingRef.current]);
26
26
  const getAbortSignal = (0, react.useCallback)((path) => {
27
27
  abortControllers.current[path]?.abort();
28
28
  abortControllers.current[path] = new AbortController();
@@ -1 +1 @@
1
- {"version":3,"file":"use-form-validating.cjs","names":[],"sources":["../../../src/hooks/use-form-validating/use-form-validating.ts"],"sourcesContent":["import { useCallback, useRef, useState } from 'react';\n\nexport interface $FormValidating {\n validating: boolean;\n isValidating: (path?: string) => boolean;\n setFieldValidating: (path: string, validating: boolean) => void;\n setFormValidating: (validating: boolean) => void;\n getAbortSignal: (path: string) => AbortSignal;\n clearValidating: () => void;\n}\n\nexport function useFormValidating(): $FormValidating {\n const [validatingFields, setValidatingFields] = useState<Record<string, boolean>>({});\n const [formValidating, setFormValidatingState] = useState(false);\n const validatingRef = useRef<Record<string, boolean>>({});\n const formValidatingRef = useRef(false);\n const abortControllers = useRef<Record<string, AbortController>>({});\n\n const setFieldValidating = useCallback((path: string, value: boolean) => {\n validatingRef.current = { ...validatingRef.current, [path]: value };\n setValidatingFields({ ...validatingRef.current });\n }, []);\n\n const setFormValidating = useCallback((value: boolean) => {\n formValidatingRef.current = value;\n setFormValidatingState(value);\n }, []);\n\n const isValidating = useCallback((path?: string) => {\n if (path) {\n return !!validatingRef.current[path];\n }\n if (formValidatingRef.current) {\n return true;\n }\n return Object.values(validatingRef.current).some(Boolean);\n }, []);\n\n const getAbortSignal = useCallback((path: string) => {\n abortControllers.current[path]?.abort();\n abortControllers.current[path] = new AbortController();\n return abortControllers.current[path].signal;\n }, []);\n\n const clearValidating = useCallback(() => {\n validatingRef.current = {};\n setValidatingFields({});\n formValidatingRef.current = false;\n setFormValidatingState(false);\n Object.values(abortControllers.current).forEach((c) => c.abort());\n abortControllers.current = {};\n }, []);\n\n const validating = formValidating || Object.values(validatingFields).some(Boolean);\n\n return {\n validating,\n isValidating,\n setFieldValidating,\n setFormValidating,\n getAbortSignal,\n clearValidating,\n };\n}\n"],"mappings":";;;AAWA,SAAgB,oBAAqC;CACnD,MAAM,CAAC,kBAAkB,wBAAA,GAAA,MAAA,SAAA,CAAyD,CAAC,CAAC;CACpF,MAAM,CAAC,gBAAgB,2BAAA,GAAA,MAAA,SAAA,CAAmC,KAAK;CAC/D,MAAM,iBAAA,GAAA,MAAA,OAAA,CAAgD,CAAC,CAAC;CACxD,MAAM,qBAAA,GAAA,MAAA,OAAA,CAA2B,KAAK;CACtC,MAAM,oBAAA,GAAA,MAAA,OAAA,CAA2D,CAAC,CAAC;CAEnE,MAAM,sBAAA,GAAA,MAAA,YAAA,EAAkC,MAAc,UAAmB;EACvE,cAAc,UAAU;GAAE,GAAG,cAAc;IAAU,OAAO;EAAM;EAClE,oBAAoB,EAAE,GAAG,cAAc,QAAQ,CAAC;CAClD,GAAG,CAAC,CAAC;CAEL,MAAM,qBAAA,GAAA,MAAA,YAAA,EAAiC,UAAmB;EACxD,kBAAkB,UAAU;EAC5B,uBAAuB,KAAK;CAC9B,GAAG,CAAC,CAAC;CAEL,MAAM,gBAAA,GAAA,MAAA,YAAA,EAA4B,SAAkB;EAClD,IAAI,MACF,OAAO,CAAC,CAAC,cAAc,QAAQ;EAEjC,IAAI,kBAAkB,SACpB,OAAO;EAET,OAAO,OAAO,OAAO,cAAc,OAAO,CAAC,CAAC,KAAK,OAAO;CAC1D,GAAG,CAAC,CAAC;CAEL,MAAM,kBAAA,GAAA,MAAA,YAAA,EAA8B,SAAiB;EACnD,iBAAiB,QAAQ,KAAK,EAAE,MAAM;EACtC,iBAAiB,QAAQ,QAAQ,IAAI,gBAAgB;EACrD,OAAO,iBAAiB,QAAQ,KAAK,CAAC;CACxC,GAAG,CAAC,CAAC;CAEL,MAAM,mBAAA,GAAA,MAAA,YAAA,OAAoC;EACxC,cAAc,UAAU,CAAC;EACzB,oBAAoB,CAAC,CAAC;EACtB,kBAAkB,UAAU;EAC5B,uBAAuB,KAAK;EAC5B,OAAO,OAAO,iBAAiB,OAAO,CAAC,CAAC,SAAS,MAAM,EAAE,MAAM,CAAC;EAChE,iBAAiB,UAAU,CAAC;CAC9B,GAAG,CAAC,CAAC;CAIL,OAAO;EACL,YAHiB,kBAAkB,OAAO,OAAO,gBAAgB,CAAC,CAAC,KAAK,OAAO;EAI/E;EACA;EACA;EACA;EACA;CACF;AACF"}
1
+ {"version":3,"file":"use-form-validating.cjs","names":[],"sources":["../../../src/hooks/use-form-validating/use-form-validating.ts"],"sourcesContent":["import { useCallback, useRef, useState } from 'react';\n\nexport interface $FormValidating {\n validating: boolean;\n isValidating: (path?: string) => boolean;\n setFieldValidating: (path: string, validating: boolean) => void;\n setFormValidating: (validating: boolean) => void;\n getAbortSignal: (path: string) => AbortSignal;\n clearValidating: () => void;\n}\n\nexport function useFormValidating(): $FormValidating {\n const [validatingFields, setValidatingFields] = useState<Record<string, boolean>>({});\n const [formValidating, setFormValidatingState] = useState(false);\n const validatingRef = useRef<Record<string, boolean>>({});\n const formValidatingRef = useRef(false);\n const abortControllers = useRef<Record<string, AbortController>>({});\n\n const setFieldValidating = useCallback((path: string, value: boolean) => {\n validatingRef.current = { ...validatingRef.current, [path]: value };\n setValidatingFields({ ...validatingRef.current });\n }, []);\n\n const setFormValidating = useCallback((value: boolean) => {\n formValidatingRef.current = value;\n setFormValidatingState(value);\n }, []);\n\n const isValidating = useCallback(\n (path?: string) => {\n if (path) {\n return !!validatingRef.current[path];\n }\n if (formValidatingRef.current) {\n return true;\n }\n return Object.values(validatingRef.current).some(Boolean);\n },\n [validatingRef.current, formValidatingRef.current]\n );\n\n const getAbortSignal = useCallback((path: string) => {\n abortControllers.current[path]?.abort();\n abortControllers.current[path] = new AbortController();\n return abortControllers.current[path].signal;\n }, []);\n\n const clearValidating = useCallback(() => {\n validatingRef.current = {};\n setValidatingFields({});\n formValidatingRef.current = false;\n setFormValidatingState(false);\n Object.values(abortControllers.current).forEach((c) => c.abort());\n abortControllers.current = {};\n }, []);\n\n const validating = formValidating || Object.values(validatingFields).some(Boolean);\n\n return {\n validating,\n isValidating,\n setFieldValidating,\n setFormValidating,\n getAbortSignal,\n clearValidating,\n };\n}\n"],"mappings":";;;AAWA,SAAgB,oBAAqC;CACnD,MAAM,CAAC,kBAAkB,wBAAA,GAAA,MAAA,SAAA,CAAyD,CAAC,CAAC;CACpF,MAAM,CAAC,gBAAgB,2BAAA,GAAA,MAAA,SAAA,CAAmC,KAAK;CAC/D,MAAM,iBAAA,GAAA,MAAA,OAAA,CAAgD,CAAC,CAAC;CACxD,MAAM,qBAAA,GAAA,MAAA,OAAA,CAA2B,KAAK;CACtC,MAAM,oBAAA,GAAA,MAAA,OAAA,CAA2D,CAAC,CAAC;CAEnE,MAAM,sBAAA,GAAA,MAAA,YAAA,EAAkC,MAAc,UAAmB;EACvE,cAAc,UAAU;GAAE,GAAG,cAAc;IAAU,OAAO;EAAM;EAClE,oBAAoB,EAAE,GAAG,cAAc,QAAQ,CAAC;CAClD,GAAG,CAAC,CAAC;CAEL,MAAM,qBAAA,GAAA,MAAA,YAAA,EAAiC,UAAmB;EACxD,kBAAkB,UAAU;EAC5B,uBAAuB,KAAK;CAC9B,GAAG,CAAC,CAAC;CAEL,MAAM,gBAAA,GAAA,MAAA,YAAA,EACH,SAAkB;EACjB,IAAI,MACF,OAAO,CAAC,CAAC,cAAc,QAAQ;EAEjC,IAAI,kBAAkB,SACpB,OAAO;EAET,OAAO,OAAO,OAAO,cAAc,OAAO,CAAC,CAAC,KAAK,OAAO;CAC1D,GACA,CAAC,cAAc,SAAS,kBAAkB,OAAO,CACnD;CAEA,MAAM,kBAAA,GAAA,MAAA,YAAA,EAA8B,SAAiB;EACnD,iBAAiB,QAAQ,KAAK,EAAE,MAAM;EACtC,iBAAiB,QAAQ,QAAQ,IAAI,gBAAgB;EACrD,OAAO,iBAAiB,QAAQ,KAAK,CAAC;CACxC,GAAG,CAAC,CAAC;CAEL,MAAM,mBAAA,GAAA,MAAA,YAAA,OAAoC;EACxC,cAAc,UAAU,CAAC;EACzB,oBAAoB,CAAC,CAAC;EACtB,kBAAkB,UAAU;EAC5B,uBAAuB,KAAK;EAC5B,OAAO,OAAO,iBAAiB,OAAO,CAAC,CAAC,SAAS,MAAM,EAAE,MAAM,CAAC;EAChE,iBAAiB,UAAU,CAAC;CAC9B,GAAG,CAAC,CAAC;CAIL,OAAO;EACL,YAHiB,kBAAkB,OAAO,OAAO,gBAAgB,CAAC,CAAC,KAAK,OAAO;EAI/E;EACA;EACA;EACA;EACA;CACF;AACF"}
@@ -73,8 +73,8 @@ function useFormValues({ initialValues, onValuesChange, mode }) {
73
73
  }, [setValues]),
74
74
  setValuesSnapshot,
75
75
  initialize,
76
- getValues: (0, react.useCallback)(() => refValues.current, []),
77
- getValuesSnapshot: (0, react.useCallback)(() => valuesSnapshot.current, []),
76
+ getValues: (0, react.useCallback)(() => refValues.current, [refValues.current]),
77
+ getValuesSnapshot: (0, react.useCallback)(() => valuesSnapshot.current, [valuesSnapshot.current]),
78
78
  resetField: (0, react.useCallback)((path, subscribers) => {
79
79
  const snapshotValue = require_get_path.getPath(path, valuesSnapshot.current);
80
80
  if (typeof snapshotValue === "undefined") return;
@@ -1 +1 @@
1
- {"version":3,"file":"use-form-values.cjs","names":["getPath","setPath"],"sources":["../../../src/hooks/use-form-values/use-form-values.ts"],"sourcesContent":["import { useCallback, useRef, useState } from 'react';\nimport { getPath, setPath } from '../../paths';\nimport { FormMode } from '../../types';\n\nexport interface $FormValues<out Values extends Record<PropertyKey, any>> {\n initialized: React.RefObject<boolean>;\n stateValues: Values;\n refValues: React.RefObject<Values>;\n valuesSnapshot: React.RefObject<Values>;\n setValues: <TValues extends Values>(payload: SetValuesInput<TValues>) => void;\n setFieldValue: <TValues extends Values>(payload: SetFieldValueInput<TValues>) => void;\n resetValues: () => void;\n setValuesSnapshot: <TValues extends Values>(payload: TValues) => void;\n initialize: <TValues extends Values>(values: TValues, onInitialize: () => void) => void;\n getValues: () => Values;\n getValuesSnapshot: () => Values;\n resetField: <TValues extends Values>(\n path: PropertyKey,\n subscribers?: (SetFieldValueSubscriber<TValues> | null | undefined)[]\n ) => void;\n}\n\nexport interface SetValuesSubscriberPayload<Values> {\n path?: PropertyKey;\n updatedValues: Values;\n previousValues: Values;\n}\n\nexport interface SetValuesInput<out Values = Record<string, any>> {\n values: Partial<Values> | (<TValues extends Values>(values: TValues) => Partial<TValues>);\n mergeWithPreviousValues?: boolean;\n updateState?: boolean;\n subscribers?: (SetFieldValueSubscriber<Values> | null | undefined)[];\n}\n\nexport type SetFieldValueSubscriber<out Values> = <TValues extends Values>(\n payload: SetValuesSubscriberPayload<TValues>\n) => void;\n\nexport interface SetFieldValueInput<Values> {\n path: PropertyKey;\n value: any;\n updateState?: boolean;\n subscribers?: (SetFieldValueSubscriber<Values> | null | undefined)[];\n}\n\ninterface UseFormValuesInput<Values extends Record<PropertyKey, any>> {\n initialValues: Values | undefined;\n mode: FormMode;\n onValuesChange?: ((values: Values, previousValues: Values) => void) | undefined;\n}\n\nexport function useFormValues<Values extends Record<PropertyKey, any>>({\n initialValues,\n onValuesChange,\n mode,\n}: UseFormValuesInput<Values>): $FormValues<Values> {\n const initialized = useRef(false);\n const [stateValues, setStateValues] = useState<Values>(initialValues || ({} as Values));\n const refValues = useRef(stateValues);\n const valuesSnapshot = useRef(stateValues);\n\n const setValues = useCallback(\n ({\n values,\n subscribers,\n updateState = true,\n mergeWithPreviousValues = true,\n }: SetValuesInput<Values>) => {\n const previousValues = refValues.current;\n const resolvedValues = values instanceof Function ? values(refValues.current) : values;\n const updatedValues = mergeWithPreviousValues\n ? { ...previousValues, ...resolvedValues }\n : (resolvedValues as Values);\n refValues.current = updatedValues;\n if (updateState) {\n setStateValues(updatedValues);\n if (mode === 'uncontrolled') {\n refValues.current = updatedValues;\n }\n }\n onValuesChange?.(updatedValues, previousValues);\n subscribers\n ?.filter(Boolean)\n .forEach((subscriber) => subscriber!({ updatedValues, previousValues }));\n },\n [onValuesChange]\n );\n\n const setFieldValue = useCallback(\n (payload: SetFieldValueInput<Values>) => {\n const currentValue = getPath(payload.path, refValues.current);\n const updatedValue =\n payload.value instanceof Function ? payload.value(currentValue) : payload.value;\n\n if (currentValue !== updatedValue) {\n const previousValues = refValues.current;\n const updatedValues = setPath(payload.path, updatedValue, refValues.current);\n setValues({ values: updatedValues, updateState: payload.updateState });\n\n payload.subscribers\n ?.filter(Boolean)\n .forEach((subscriber) =>\n subscriber!({ path: payload.path, updatedValues, previousValues })\n );\n }\n },\n [setValues]\n );\n\n const setValuesSnapshot = useCallback((payload: Values) => {\n valuesSnapshot.current = payload;\n }, []);\n\n const initialize = useCallback(\n (values: Values, onInitialize: () => void) => {\n if (!initialized.current) {\n initialized.current = true;\n setValues({ values, updateState: mode === 'controlled' });\n setValuesSnapshot(values);\n onInitialize();\n }\n },\n [setValues]\n );\n\n const resetValues = useCallback(() => {\n setValues({\n values: valuesSnapshot.current,\n updateState: true,\n mergeWithPreviousValues: false,\n });\n }, [setValues]);\n\n const getValues = useCallback(() => refValues.current, []);\n const getValuesSnapshot = useCallback(() => valuesSnapshot.current, []);\n\n const resetField = useCallback(\n (path: PropertyKey, subscribers?: (SetFieldValueSubscriber<Values> | null | undefined)[]) => {\n const snapshotValue = getPath(path, valuesSnapshot.current);\n if (typeof snapshotValue === 'undefined') {\n return;\n }\n setFieldValue({\n path,\n value: snapshotValue,\n updateState: mode === 'controlled',\n subscribers,\n });\n },\n [setFieldValue, mode]\n );\n\n return {\n initialized,\n stateValues,\n refValues,\n valuesSnapshot,\n setValues,\n setFieldValue,\n resetValues,\n setValuesSnapshot,\n initialize,\n getValues,\n getValuesSnapshot,\n resetField,\n };\n}\n"],"mappings":";;;;;AAoDA,SAAgB,cAAuD,EACrE,eACA,gBACA,QACkD;CAClD,MAAM,eAAA,GAAA,MAAA,OAAA,CAAqB,KAAK;CAChC,MAAM,CAAC,aAAa,mBAAA,GAAA,MAAA,SAAA,CAAmC,iBAAkB,CAAC,CAAY;CACtF,MAAM,aAAA,GAAA,MAAA,OAAA,CAAmB,WAAW;CACpC,MAAM,kBAAA,GAAA,MAAA,OAAA,CAAwB,WAAW;CAEzC,MAAM,aAAA,GAAA,MAAA,YAAA,EACH,EACC,QACA,aACA,cAAc,MACd,0BAA0B,WACE;EAC5B,MAAM,iBAAiB,UAAU;EACjC,MAAM,iBAAiB,kBAAkB,WAAW,OAAO,UAAU,OAAO,IAAI;EAChF,MAAM,gBAAgB,0BAClB;GAAE,GAAG;GAAgB,GAAG;EAAe,IACtC;EACL,UAAU,UAAU;EACpB,IAAI,aAAa;GACf,eAAe,aAAa;GAC5B,IAAI,SAAS,gBACX,UAAU,UAAU;EAExB;EACA,iBAAiB,eAAe,cAAc;EAC9C,aACI,OAAO,OAAO,CAAC,CAChB,SAAS,eAAe,WAAY;GAAE;GAAe;EAAe,CAAC,CAAC;CAC3E,GACA,CAAC,cAAc,CACjB;CAEA,MAAM,iBAAA,GAAA,MAAA,YAAA,EACH,YAAwC;EACvC,MAAM,eAAeA,iBAAAA,QAAQ,QAAQ,MAAM,UAAU,OAAO;EAC5D,MAAM,eACJ,QAAQ,iBAAiB,WAAW,QAAQ,MAAM,YAAY,IAAI,QAAQ;EAE5E,IAAI,iBAAiB,cAAc;GACjC,MAAM,iBAAiB,UAAU;GACjC,MAAM,gBAAgBC,iBAAAA,QAAQ,QAAQ,MAAM,cAAc,UAAU,OAAO;GAC3E,UAAU;IAAE,QAAQ;IAAe,aAAa,QAAQ;GAAY,CAAC;GAErE,QAAQ,aACJ,OAAO,OAAO,CAAC,CAChB,SAAS,eACR,WAAY;IAAE,MAAM,QAAQ;IAAM;IAAe;GAAe,CAAC,CACnE;EACJ;CACF,GACA,CAAC,SAAS,CACZ;CAEA,MAAM,qBAAA,GAAA,MAAA,YAAA,EAAiC,YAAoB;EACzD,eAAe,UAAU;CAC3B,GAAG,CAAC,CAAC;CAEL,MAAM,cAAA,GAAA,MAAA,YAAA,EACH,QAAgB,iBAA6B;EAC5C,IAAI,CAAC,YAAY,SAAS;GACxB,YAAY,UAAU;GACtB,UAAU;IAAE;IAAQ,aAAa,SAAS;GAAa,CAAC;GACxD,kBAAkB,MAAM;GACxB,aAAa;EACf;CACF,GACA,CAAC,SAAS,CACZ;CA6BA,OAAO;EACL;EACA;EACA;EACA;EACA;EACA;EACA,cAAA,GAAA,MAAA,YAAA,OAlCoC;GACpC,UAAU;IACR,QAAQ,eAAe;IACvB,aAAa;IACb,yBAAyB;GAC3B,CAAC;EACH,GAAG,CAAC,SAAS,CA4BD;EACV;EACA;EACA,YAAA,GAAA,MAAA,YAAA,OA7BkC,UAAU,SAAS,CAAC,CA6B9C;EACR,oBAAA,GAAA,MAAA,YAAA,OA7B0C,eAAe,SAAS,CAAC,CA6BnD;EAChB,aAAA,GAAA,MAAA,YAAA,EA3BC,MAAmB,gBAAyE;GAC3F,MAAM,gBAAgBD,iBAAAA,QAAQ,MAAM,eAAe,OAAO;GAC1D,IAAI,OAAO,kBAAkB,aAC3B;GAEF,cAAc;IACZ;IACA,OAAO;IACP,aAAa,SAAS;IACtB;GACF,CAAC;EACH,GACA,CAAC,eAAe,IAAI,CAeX;CACX;AACF"}
1
+ {"version":3,"file":"use-form-values.cjs","names":["getPath","setPath"],"sources":["../../../src/hooks/use-form-values/use-form-values.ts"],"sourcesContent":["import { useCallback, useRef, useState } from 'react';\nimport { getPath, setPath } from '../../paths';\nimport { FormMode } from '../../types';\n\nexport interface $FormValues<out Values extends Record<PropertyKey, any>> {\n initialized: React.RefObject<boolean>;\n stateValues: Values;\n refValues: React.RefObject<Values>;\n valuesSnapshot: React.RefObject<Values>;\n setValues: <TValues extends Values>(payload: SetValuesInput<TValues>) => void;\n setFieldValue: <TValues extends Values>(payload: SetFieldValueInput<TValues>) => void;\n resetValues: () => void;\n setValuesSnapshot: <TValues extends Values>(payload: TValues) => void;\n initialize: <TValues extends Values>(values: TValues, onInitialize: () => void) => void;\n getValues: () => Values;\n getValuesSnapshot: () => Values;\n resetField: <TValues extends Values>(\n path: PropertyKey,\n subscribers?: (SetFieldValueSubscriber<TValues> | null | undefined)[]\n ) => void;\n}\n\nexport interface SetValuesSubscriberPayload<Values> {\n path?: PropertyKey;\n updatedValues: Values;\n previousValues: Values;\n}\n\nexport interface SetValuesInput<out Values = Record<string, any>> {\n values: Partial<Values> | (<TValues extends Values>(values: TValues) => Partial<TValues>);\n mergeWithPreviousValues?: boolean;\n updateState?: boolean;\n subscribers?: (SetFieldValueSubscriber<Values> | null | undefined)[];\n}\n\nexport type SetFieldValueSubscriber<out Values> = <TValues extends Values>(\n payload: SetValuesSubscriberPayload<TValues>\n) => void;\n\nexport interface SetFieldValueInput<Values> {\n path: PropertyKey;\n value: any;\n updateState?: boolean;\n subscribers?: (SetFieldValueSubscriber<Values> | null | undefined)[];\n}\n\ninterface UseFormValuesInput<Values extends Record<PropertyKey, any>> {\n initialValues: Values | undefined;\n mode: FormMode;\n onValuesChange?: ((values: Values, previousValues: Values) => void) | undefined;\n}\n\nexport function useFormValues<Values extends Record<PropertyKey, any>>({\n initialValues,\n onValuesChange,\n mode,\n}: UseFormValuesInput<Values>): $FormValues<Values> {\n const initialized = useRef(false);\n const [stateValues, setStateValues] = useState<Values>(initialValues || ({} as Values));\n const refValues = useRef(stateValues);\n const valuesSnapshot = useRef(stateValues);\n\n const setValues = useCallback(\n ({\n values,\n subscribers,\n updateState = true,\n mergeWithPreviousValues = true,\n }: SetValuesInput<Values>) => {\n const previousValues = refValues.current;\n const resolvedValues = values instanceof Function ? values(refValues.current) : values;\n const updatedValues = mergeWithPreviousValues\n ? { ...previousValues, ...resolvedValues }\n : (resolvedValues as Values);\n refValues.current = updatedValues;\n if (updateState) {\n setStateValues(updatedValues);\n if (mode === 'uncontrolled') {\n refValues.current = updatedValues;\n }\n }\n onValuesChange?.(updatedValues, previousValues);\n subscribers\n ?.filter(Boolean)\n .forEach((subscriber) => subscriber!({ updatedValues, previousValues }));\n },\n [onValuesChange]\n );\n\n const setFieldValue = useCallback(\n (payload: SetFieldValueInput<Values>) => {\n const currentValue = getPath(payload.path, refValues.current);\n const updatedValue =\n payload.value instanceof Function ? payload.value(currentValue) : payload.value;\n\n if (currentValue !== updatedValue) {\n const previousValues = refValues.current;\n const updatedValues = setPath(payload.path, updatedValue, refValues.current);\n setValues({ values: updatedValues, updateState: payload.updateState });\n\n payload.subscribers\n ?.filter(Boolean)\n .forEach((subscriber) =>\n subscriber!({ path: payload.path, updatedValues, previousValues })\n );\n }\n },\n [setValues]\n );\n\n const setValuesSnapshot = useCallback((payload: Values) => {\n valuesSnapshot.current = payload;\n }, []);\n\n const initialize = useCallback(\n (values: Values, onInitialize: () => void) => {\n if (!initialized.current) {\n initialized.current = true;\n setValues({ values, updateState: mode === 'controlled' });\n setValuesSnapshot(values);\n onInitialize();\n }\n },\n [setValues]\n );\n\n const resetValues = useCallback(() => {\n setValues({\n values: valuesSnapshot.current,\n updateState: true,\n mergeWithPreviousValues: false,\n });\n }, [setValues]);\n\n const getValues = useCallback(() => refValues.current, [refValues.current]);\n const getValuesSnapshot = useCallback(() => valuesSnapshot.current, [valuesSnapshot.current]);\n\n const resetField = useCallback(\n (path: PropertyKey, subscribers?: (SetFieldValueSubscriber<Values> | null | undefined)[]) => {\n const snapshotValue = getPath(path, valuesSnapshot.current);\n if (typeof snapshotValue === 'undefined') {\n return;\n }\n setFieldValue({\n path,\n value: snapshotValue,\n updateState: mode === 'controlled',\n subscribers,\n });\n },\n [setFieldValue, mode]\n );\n\n return {\n initialized,\n stateValues,\n refValues,\n valuesSnapshot,\n setValues,\n setFieldValue,\n resetValues,\n setValuesSnapshot,\n initialize,\n getValues,\n getValuesSnapshot,\n resetField,\n };\n}\n"],"mappings":";;;;;AAoDA,SAAgB,cAAuD,EACrE,eACA,gBACA,QACkD;CAClD,MAAM,eAAA,GAAA,MAAA,OAAA,CAAqB,KAAK;CAChC,MAAM,CAAC,aAAa,mBAAA,GAAA,MAAA,SAAA,CAAmC,iBAAkB,CAAC,CAAY;CACtF,MAAM,aAAA,GAAA,MAAA,OAAA,CAAmB,WAAW;CACpC,MAAM,kBAAA,GAAA,MAAA,OAAA,CAAwB,WAAW;CAEzC,MAAM,aAAA,GAAA,MAAA,YAAA,EACH,EACC,QACA,aACA,cAAc,MACd,0BAA0B,WACE;EAC5B,MAAM,iBAAiB,UAAU;EACjC,MAAM,iBAAiB,kBAAkB,WAAW,OAAO,UAAU,OAAO,IAAI;EAChF,MAAM,gBAAgB,0BAClB;GAAE,GAAG;GAAgB,GAAG;EAAe,IACtC;EACL,UAAU,UAAU;EACpB,IAAI,aAAa;GACf,eAAe,aAAa;GAC5B,IAAI,SAAS,gBACX,UAAU,UAAU;EAExB;EACA,iBAAiB,eAAe,cAAc;EAC9C,aACI,OAAO,OAAO,CAAC,CAChB,SAAS,eAAe,WAAY;GAAE;GAAe;EAAe,CAAC,CAAC;CAC3E,GACA,CAAC,cAAc,CACjB;CAEA,MAAM,iBAAA,GAAA,MAAA,YAAA,EACH,YAAwC;EACvC,MAAM,eAAeA,iBAAAA,QAAQ,QAAQ,MAAM,UAAU,OAAO;EAC5D,MAAM,eACJ,QAAQ,iBAAiB,WAAW,QAAQ,MAAM,YAAY,IAAI,QAAQ;EAE5E,IAAI,iBAAiB,cAAc;GACjC,MAAM,iBAAiB,UAAU;GACjC,MAAM,gBAAgBC,iBAAAA,QAAQ,QAAQ,MAAM,cAAc,UAAU,OAAO;GAC3E,UAAU;IAAE,QAAQ;IAAe,aAAa,QAAQ;GAAY,CAAC;GAErE,QAAQ,aACJ,OAAO,OAAO,CAAC,CAChB,SAAS,eACR,WAAY;IAAE,MAAM,QAAQ;IAAM;IAAe;GAAe,CAAC,CACnE;EACJ;CACF,GACA,CAAC,SAAS,CACZ;CAEA,MAAM,qBAAA,GAAA,MAAA,YAAA,EAAiC,YAAoB;EACzD,eAAe,UAAU;CAC3B,GAAG,CAAC,CAAC;CAEL,MAAM,cAAA,GAAA,MAAA,YAAA,EACH,QAAgB,iBAA6B;EAC5C,IAAI,CAAC,YAAY,SAAS;GACxB,YAAY,UAAU;GACtB,UAAU;IAAE;IAAQ,aAAa,SAAS;GAAa,CAAC;GACxD,kBAAkB,MAAM;GACxB,aAAa;EACf;CACF,GACA,CAAC,SAAS,CACZ;CA6BA,OAAO;EACL;EACA;EACA;EACA;EACA;EACA;EACA,cAAA,GAAA,MAAA,YAAA,OAlCoC;GACpC,UAAU;IACR,QAAQ,eAAe;IACvB,aAAa;IACb,yBAAyB;GAC3B,CAAC;EACH,GAAG,CAAC,SAAS,CA4BD;EACV;EACA;EACA,YAAA,GAAA,MAAA,YAAA,OA7BkC,UAAU,SAAS,CAAC,UAAU,OAAO,CA6B/D;EACR,oBAAA,GAAA,MAAA,YAAA,OA7B0C,eAAe,SAAS,CAAC,eAAe,OAAO,CA6BzE;EAChB,aAAA,GAAA,MAAA,YAAA,EA3BC,MAAmB,gBAAyE;GAC3F,MAAM,gBAAgBD,iBAAAA,QAAQ,MAAM,eAAe,OAAO;GAC1D,IAAI,OAAO,kBAAkB,aAC3B;GAEF,cAAc;IACZ;IACA,OAAO;IACP,aAAa,SAAS;IACtB;GACF,CAAC;EACH,GACA,CAAC,eAAe,IAAI,CAeX;CACX;AACF"}
package/cjs/use-field.cjs CHANGED
@@ -34,9 +34,9 @@ function useField({ mode = "controlled", clearErrorOnChange = true, initialValue
34
34
  setError(null);
35
35
  setTouched(false);
36
36
  }, [initialValue]);
37
- const getValue = (0, react.useCallback)(() => valueRef.current, []);
38
- const isTouched = (0, react.useCallback)(() => touchedRef.current, []);
39
- const isDirty = (0, react.useCallback)(() => valueRef.current !== initialValue, [initialValue]);
37
+ const getValue = (0, react.useCallback)(() => valueRef.current, [valueRef.current]);
38
+ const isTouched = (0, react.useCallback)(() => touchedRef.current, [touchedRef.current]);
39
+ const isDirty = (0, react.useCallback)(() => valueRef.current !== initialValue, [valueRef.current, initialValue]);
40
40
  const _validate = (0, react.useCallback)(async () => {
41
41
  const validationResult = validate?.(valueRef.current);
42
42
  if (validationResult instanceof Promise) {
@@ -1 +1 @@
1
- {"version":3,"file":"use-field.cjs","names":["getInputOnChange","shouldValidateOnChange"],"sources":["../src/use-field.ts"],"sourcesContent":["import { useCallback, useMemo, useRef, useState } from 'react';\nimport { getInputOnChange } from './get-input-on-change';\nimport { FormMode, GetInputPropsType } from './types';\nimport { shouldValidateOnChange } from './validate';\n\ntype UseFieldErrorResolver = (error: unknown) => React.ReactNode;\n\nexport interface UseFieldInput<\n T,\n FieldType extends GetInputPropsType = 'input',\n Mode extends FormMode = 'controlled',\n> {\n /** Field mode, controlled by default */\n mode?: Mode;\n\n /** Initial field value */\n initialValue: T;\n\n /** Initial touched value */\n initialTouched?: boolean;\n\n /** Initial field error message */\n initialError?: React.ReactNode;\n\n /** Called with updated value when the field value changes */\n onValueChange?: (value: T) => void;\n\n /** Determines whether the field should be validated when value changes, false by default */\n validateOnChange?: boolean;\n\n /** Determines whether the field should be validated when it loses focus, false by default */\n validateOnBlur?: boolean;\n\n /** Determines whether the field should clear error message when value changes, true by default */\n clearErrorOnChange?: boolean;\n\n /** A function to validate field value, can be sync or async */\n validate?: (value: T) => React.ReactNode | Promise<React.ReactNode>;\n\n /** Field type, input by default */\n type?: FieldType;\n\n /** A function to resolve validation error from the result returned from validate function, should return react node */\n resolveValidationError?: UseFieldErrorResolver;\n}\n\ninterface SetValueOptions {\n updateState?: boolean;\n updateKey?: boolean;\n}\n\ninterface GetInputPropsOptions {\n withError?: boolean;\n withFocus?: boolean;\n [key: string]: any;\n}\n\ninterface GetInputPropsSharedReturn {\n error?: React.ReactNode;\n onFocus?: () => void;\n onBlur: () => void;\n onChange: (value: any) => void;\n}\n\ntype GetInputPropsTypeValue<\n T,\n FieldType extends GetInputPropsType,\n Mode extends FormMode,\n> = FieldType extends 'checkbox'\n ? Mode extends 'controlled'\n ? { checked: boolean }\n : { defaultChecked: boolean }\n : FieldType extends 'radio'\n ? Mode extends 'controlled'\n ? { checked: boolean; value: T }\n : { defaultChecked: boolean; value: T }\n : Mode extends 'controlled'\n ? { value: T }\n : { defaultValue: T };\n\ntype GetInputPropsReturnType<\n T,\n FieldType extends GetInputPropsType,\n Mode extends FormMode,\n> = GetInputPropsSharedReturn & GetInputPropsTypeValue<T, FieldType, Mode>;\n\nexport interface UseFieldReturnType<\n T,\n FieldType extends GetInputPropsType = 'input',\n Mode extends FormMode = 'controlled',\n> {\n /** Returns props to pass to the input element */\n getInputProps: (options?: GetInputPropsOptions) => GetInputPropsReturnType<T, FieldType, Mode>;\n\n /** Returns current input value */\n getValue: () => T;\n\n /** Sets input value to the given value */\n setValue: (value: T) => void;\n\n /** Resets field value to initial state, sets touched state to false, sets error to null */\n reset: () => void;\n\n /** Validates current input value when called */\n validate: () => Promise<React.ReactNode | void>;\n\n /** Set to true when async validate function is called, stays true until the returned promise resolves */\n isValidating: boolean;\n\n /** Current error message */\n error: React.ReactNode;\n\n /** Sets error message to the given react node */\n setError: (error: React.ReactNode) => void;\n\n /** Returns true if the input has been focused at least once */\n isTouched: () => boolean;\n\n /** Returns true if input value is different from the initial value */\n isDirty: () => boolean;\n\n /** Resets touched state to false */\n resetTouched: () => void;\n\n /** Key that should be added to the input when mode is uncontrolled */\n key: number;\n}\n\nexport function useField<\n T,\n Mode extends FormMode = 'controlled',\n FieldType extends GetInputPropsType = 'input',\n>({\n mode = 'controlled' as Mode,\n clearErrorOnChange = true,\n initialValue,\n initialError = null,\n initialTouched = false,\n onValueChange,\n validateOnChange = false,\n validateOnBlur = false,\n validate,\n resolveValidationError,\n type = 'input' as FieldType,\n}: UseFieldInput<T, FieldType, Mode>): UseFieldReturnType<T, FieldType, Mode> {\n const [valueState, setValueState] = useState(initialValue);\n const valueRef = useRef(valueState);\n const [key, setKey] = useState(0);\n const [error, setError] = useState<React.ReactNode>(initialError || null);\n const touchedRef = useRef(initialTouched || false);\n const [, setTouchedState] = useState(touchedRef.current);\n const [isValidating, setIsValidating] = useState(false);\n const errorResolver: UseFieldErrorResolver = useMemo(\n () => resolveValidationError || ((err) => err as React.ReactNode),\n [resolveValidationError]\n );\n\n const setTouched = useCallback((val: boolean, { updateState = mode === 'controlled' } = {}) => {\n touchedRef.current = val;\n updateState && setTouchedState(val);\n }, []);\n\n const setValue = useCallback(\n (\n value: T,\n {\n updateKey = mode === 'uncontrolled',\n updateState = mode === 'controlled',\n }: SetValueOptions = {}\n ) => {\n if (valueRef.current === value) {\n return;\n }\n\n valueRef.current = value;\n\n onValueChange?.(value);\n\n if (clearErrorOnChange && error !== null) {\n setError(null);\n }\n\n if (updateState) {\n setValueState(value);\n }\n\n if (updateKey) {\n setKey((currentKey) => currentKey + 1);\n }\n\n if (validateOnChange) {\n _validate();\n }\n },\n [error, clearErrorOnChange, onValueChange]\n );\n\n const reset = useCallback(() => {\n setValue(initialValue);\n setError(null);\n setTouched(false);\n }, [initialValue]);\n\n const getValue = useCallback(() => valueRef.current, []);\n\n const isTouched = useCallback(() => touchedRef.current, []);\n\n const isDirty = useCallback(() => valueRef.current !== initialValue, [initialValue]);\n\n const _validate = useCallback(async () => {\n const validationResult = validate?.(valueRef.current);\n\n if (validationResult instanceof Promise) {\n setIsValidating(true);\n try {\n const result = await validationResult;\n setIsValidating(false);\n setError(result);\n } catch (err) {\n setIsValidating(false);\n const resolvedError = errorResolver(err);\n setError(resolvedError);\n return resolvedError;\n }\n } else {\n setError(validationResult);\n return validationResult;\n }\n }, []);\n\n const getInputProps = ({ withError = true, withFocus = true, ...otherOptions }: any = {}) => {\n const onChange = getInputOnChange<T>((val) => setValue(val as any, { updateKey: false }));\n\n const payload: any = { onChange };\n\n if (withError) {\n payload.error = error;\n }\n\n if (type === 'checkbox') {\n payload[mode === 'controlled' ? 'checked' : 'defaultChecked'] = valueRef.current;\n } else if (type === 'radio') {\n payload[mode === 'controlled' ? 'checked' : 'defaultChecked'] =\n valueRef.current === otherOptions.value;\n payload.value = otherOptions.value;\n } else {\n payload[mode === 'controlled' ? 'value' : 'defaultValue'] = valueRef.current;\n }\n\n if (withFocus) {\n payload.onFocus = () => {\n setTouched(true);\n };\n\n payload.onBlur = () => {\n if (shouldValidateOnChange('', !!validateOnBlur)) {\n _validate();\n }\n };\n }\n\n return payload;\n };\n\n const resetTouched = useCallback(() => setTouched(false), []);\n\n return {\n key,\n getValue,\n setValue,\n reset,\n getInputProps,\n\n isValidating,\n validate: _validate,\n\n error,\n setError,\n\n isTouched,\n isDirty,\n resetTouched,\n };\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"use-field.cjs","names":["getInputOnChange","shouldValidateOnChange"],"sources":["../src/use-field.ts"],"sourcesContent":["import { useCallback, useMemo, useRef, useState } from 'react';\nimport { getInputOnChange } from './get-input-on-change';\nimport { FormMode, GetInputPropsType } from './types';\nimport { shouldValidateOnChange } from './validate';\n\ntype UseFieldErrorResolver = (error: unknown) => React.ReactNode;\n\nexport interface UseFieldInput<\n T,\n FieldType extends GetInputPropsType = 'input',\n Mode extends FormMode = 'controlled',\n> {\n /** Field mode, controlled by default */\n mode?: Mode;\n\n /** Initial field value */\n initialValue: T;\n\n /** Initial touched value */\n initialTouched?: boolean;\n\n /** Initial field error message */\n initialError?: React.ReactNode;\n\n /** Called with updated value when the field value changes */\n onValueChange?: (value: T) => void;\n\n /** Determines whether the field should be validated when value changes, false by default */\n validateOnChange?: boolean;\n\n /** Determines whether the field should be validated when it loses focus, false by default */\n validateOnBlur?: boolean;\n\n /** Determines whether the field should clear error message when value changes, true by default */\n clearErrorOnChange?: boolean;\n\n /** A function to validate field value, can be sync or async */\n validate?: (value: T) => React.ReactNode | Promise<React.ReactNode>;\n\n /** Field type, input by default */\n type?: FieldType;\n\n /** A function to resolve validation error from the result returned from validate function, should return react node */\n resolveValidationError?: UseFieldErrorResolver;\n}\n\ninterface SetValueOptions {\n updateState?: boolean;\n updateKey?: boolean;\n}\n\ninterface GetInputPropsOptions {\n withError?: boolean;\n withFocus?: boolean;\n [key: string]: any;\n}\n\ninterface GetInputPropsSharedReturn {\n error?: React.ReactNode;\n onFocus?: () => void;\n onBlur: () => void;\n onChange: (value: any) => void;\n}\n\ntype GetInputPropsTypeValue<\n T,\n FieldType extends GetInputPropsType,\n Mode extends FormMode,\n> = FieldType extends 'checkbox'\n ? Mode extends 'controlled'\n ? { checked: boolean }\n : { defaultChecked: boolean }\n : FieldType extends 'radio'\n ? Mode extends 'controlled'\n ? { checked: boolean; value: T }\n : { defaultChecked: boolean; value: T }\n : Mode extends 'controlled'\n ? { value: T }\n : { defaultValue: T };\n\ntype GetInputPropsReturnType<\n T,\n FieldType extends GetInputPropsType,\n Mode extends FormMode,\n> = GetInputPropsSharedReturn & GetInputPropsTypeValue<T, FieldType, Mode>;\n\nexport interface UseFieldReturnType<\n T,\n FieldType extends GetInputPropsType = 'input',\n Mode extends FormMode = 'controlled',\n> {\n /** Returns props to pass to the input element */\n getInputProps: (options?: GetInputPropsOptions) => GetInputPropsReturnType<T, FieldType, Mode>;\n\n /** Returns current input value */\n getValue: () => T;\n\n /** Sets input value to the given value */\n setValue: (value: T) => void;\n\n /** Resets field value to initial state, sets touched state to false, sets error to null */\n reset: () => void;\n\n /** Validates current input value when called */\n validate: () => Promise<React.ReactNode | void>;\n\n /** Set to true when async validate function is called, stays true until the returned promise resolves */\n isValidating: boolean;\n\n /** Current error message */\n error: React.ReactNode;\n\n /** Sets error message to the given react node */\n setError: (error: React.ReactNode) => void;\n\n /** Returns true if the input has been focused at least once */\n isTouched: () => boolean;\n\n /** Returns true if input value is different from the initial value */\n isDirty: () => boolean;\n\n /** Resets touched state to false */\n resetTouched: () => void;\n\n /** Key that should be added to the input when mode is uncontrolled */\n key: number;\n}\n\nexport function useField<\n T,\n Mode extends FormMode = 'controlled',\n FieldType extends GetInputPropsType = 'input',\n>({\n mode = 'controlled' as Mode,\n clearErrorOnChange = true,\n initialValue,\n initialError = null,\n initialTouched = false,\n onValueChange,\n validateOnChange = false,\n validateOnBlur = false,\n validate,\n resolveValidationError,\n type = 'input' as FieldType,\n}: UseFieldInput<T, FieldType, Mode>): UseFieldReturnType<T, FieldType, Mode> {\n const [valueState, setValueState] = useState(initialValue);\n const valueRef = useRef(valueState);\n const [key, setKey] = useState(0);\n const [error, setError] = useState<React.ReactNode>(initialError || null);\n const touchedRef = useRef(initialTouched || false);\n const [, setTouchedState] = useState(touchedRef.current);\n const [isValidating, setIsValidating] = useState(false);\n const errorResolver: UseFieldErrorResolver = useMemo(\n () => resolveValidationError || ((err) => err as React.ReactNode),\n [resolveValidationError]\n );\n\n const setTouched = useCallback((val: boolean, { updateState = mode === 'controlled' } = {}) => {\n touchedRef.current = val;\n updateState && setTouchedState(val);\n }, []);\n\n const setValue = useCallback(\n (\n value: T,\n {\n updateKey = mode === 'uncontrolled',\n updateState = mode === 'controlled',\n }: SetValueOptions = {}\n ) => {\n if (valueRef.current === value) {\n return;\n }\n\n valueRef.current = value;\n\n onValueChange?.(value);\n\n if (clearErrorOnChange && error !== null) {\n setError(null);\n }\n\n if (updateState) {\n setValueState(value);\n }\n\n if (updateKey) {\n setKey((currentKey) => currentKey + 1);\n }\n\n if (validateOnChange) {\n _validate();\n }\n },\n [error, clearErrorOnChange, onValueChange]\n );\n\n const reset = useCallback(() => {\n setValue(initialValue);\n setError(null);\n setTouched(false);\n }, [initialValue]);\n\n const getValue = useCallback(() => valueRef.current, [valueRef.current]);\n\n const isTouched = useCallback(() => touchedRef.current, [touchedRef.current]);\n\n const isDirty = useCallback(\n () => valueRef.current !== initialValue,\n [valueRef.current, initialValue]\n );\n\n const _validate = useCallback(async () => {\n const validationResult = validate?.(valueRef.current);\n\n if (validationResult instanceof Promise) {\n setIsValidating(true);\n try {\n const result = await validationResult;\n setIsValidating(false);\n setError(result);\n } catch (err) {\n setIsValidating(false);\n const resolvedError = errorResolver(err);\n setError(resolvedError);\n return resolvedError;\n }\n } else {\n setError(validationResult);\n return validationResult;\n }\n }, []);\n\n const getInputProps = ({ withError = true, withFocus = true, ...otherOptions }: any = {}) => {\n const onChange = getInputOnChange<T>((val) => setValue(val as any, { updateKey: false }));\n\n const payload: any = { onChange };\n\n if (withError) {\n payload.error = error;\n }\n\n if (type === 'checkbox') {\n payload[mode === 'controlled' ? 'checked' : 'defaultChecked'] = valueRef.current;\n } else if (type === 'radio') {\n payload[mode === 'controlled' ? 'checked' : 'defaultChecked'] =\n valueRef.current === otherOptions.value;\n payload.value = otherOptions.value;\n } else {\n payload[mode === 'controlled' ? 'value' : 'defaultValue'] = valueRef.current;\n }\n\n if (withFocus) {\n payload.onFocus = () => {\n setTouched(true);\n };\n\n payload.onBlur = () => {\n if (shouldValidateOnChange('', !!validateOnBlur)) {\n _validate();\n }\n };\n }\n\n return payload;\n };\n\n const resetTouched = useCallback(() => setTouched(false), []);\n\n return {\n key,\n getValue,\n setValue,\n reset,\n getInputProps,\n\n isValidating,\n validate: _validate,\n\n error,\n setError,\n\n isTouched,\n isDirty,\n resetTouched,\n };\n}\n"],"mappings":"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"}
package/cjs/use-form.cjs CHANGED
@@ -229,9 +229,13 @@ function useForm({ name, mode = "controlled", initialValues, initialErrors = {},
229
229
  const result = require_validate_values.validateValues(rules, $values.refValues.current, resolveValidationError, signal);
230
230
  if (result instanceof Promise) return result.then((r) => !r.hasErrors);
231
231
  return !result.hasErrors;
232
- }, [rules, resolveValidationError]);
232
+ }, [
233
+ rules,
234
+ resolveValidationError,
235
+ $values.refValues.current
236
+ ]);
233
237
  const key = (path) => `${formKey}-${String(path)}-${fieldKeys[String(path)] || 0}`;
234
- const getInputNode = (0, react.useCallback)((path) => document.querySelector(`[data-path="${require_get_data_path.getDataPath(name, path)}"]`), []);
238
+ const getInputNode = (path) => document.querySelector(`[data-path="${require_get_data_path.getDataPath(name, path)}"]`);
235
239
  const resetField = (0, react.useCallback)((path) => {
236
240
  $values.resetField(path, [mode !== "controlled" ? () => setFieldKeys((keys) => ({
237
241
  ...keys,
@@ -1 +1 @@
1
- {"version":3,"file":"use-form.cjs","names":["useFormErrors","useFormValues","useFormStatus","useFormWatch","useFormList","useFormValidating","validateFieldValue","shouldValidateOnChange","getPath","validateValues","getInputOnChange","getDataPath"],"sources":["../src/use-form.ts"],"sourcesContent":["import { useCallback, useMemo, useRef, useState } from 'react';\nimport { useFormActions } from './actions';\nimport { getInputOnChange } from './get-input-on-change';\nimport { useFormErrors } from './hooks/use-form-errors/use-form-errors';\nimport { useFormList } from './hooks/use-form-list/use-form-list';\nimport { useFormStatus } from './hooks/use-form-status/use-form-status';\nimport { useFormValidating } from './hooks/use-form-validating/use-form-validating';\nimport { useFormValues } from './hooks/use-form-values/use-form-values';\nimport { useFormWatch } from './hooks/use-form-watch/use-form-watch';\nimport { getDataPath, getPath } from './paths';\nimport {\n FormErrors,\n FormRulesRecord,\n GetInputNode,\n GetInputProps,\n GetTransformedValues,\n Initialize,\n IsValidating,\n Key,\n OnReset,\n OnSubmit,\n Reset,\n SetFieldValue,\n SetValues,\n UseFormInput,\n UseFormReturnType,\n} from './types';\nimport { shouldValidateOnChange, validateFieldValue, validateValues } from './validate';\n\nconst defaultResolveValidationError = (err: unknown) =>\n err instanceof Error ? err.message : String(err);\n\nexport function useForm<\n Values extends Record<string, any>,\n TransformedValues = Values,\n R extends FormErrors | Promise<FormErrors> = FormErrors,\n>(\n input: UseFormInput<Values, TransformedValues> & { validate: (values: Values) => R }\n): UseFormReturnType<Values, TransformedValues, (values: Values) => R>;\n\nexport function useForm<\n Values extends Record<string, any>,\n TransformedValues = Values,\n Rules extends FormRulesRecord<Values> = FormRulesRecord<Values>,\n>(\n input: UseFormInput<Values, TransformedValues> & { validate: Rules }\n): UseFormReturnType<Values, TransformedValues, Rules>;\n\nexport function useForm<\n Values extends Record<string, any> = Record<string, any>,\n TransformedValues = Values,\n>(\n input?: UseFormInput<Values, TransformedValues>\n): UseFormReturnType<Values, TransformedValues, undefined>;\n\nexport function useForm<\n Values extends Record<PropertyKey, any> = Record<string, any>,\n TransformedValues = Values,\n>({\n name,\n mode = 'controlled',\n initialValues,\n initialErrors = {},\n initialDirty = {},\n initialTouched = {},\n clearInputErrorOnChange = true,\n validateInputOnChange = false,\n validateInputOnBlur = false,\n onValuesChange,\n transformValues = ((values: Values) => values) as any,\n enhanceGetInputProps,\n validate: rules,\n onSubmitPreventDefault = 'always',\n touchTrigger = 'change',\n cascadeUpdates = false,\n validateDebounce = 0,\n resolveValidationError = defaultResolveValidationError,\n}: UseFormInput<Values, TransformedValues> = {}): UseFormReturnType<Values, TransformedValues> {\n const $errors = useFormErrors<Values>(initialErrors);\n const $values = useFormValues<Values>({ initialValues, onValuesChange, mode });\n const $status = useFormStatus<Values>({ initialDirty, initialTouched, $values, mode });\n const $watch = useFormWatch<Values>({ $values, $status, cascadeUpdates });\n const $list = useFormList<Values>({ $values, $errors, $status, $watch });\n const $validating = useFormValidating();\n const [formKey, setFormKey] = useState(0);\n const [fieldKeys, setFieldKeys] = useState<Record<string, number>>({});\n const [submitting, setSubmitting] = useState(false);\n const validateGeneration = useRef(0);\n\n const reset: Reset = useCallback(() => {\n $values.resetValues();\n $errors.clearErrors();\n $status.resetDirty();\n $status.resetTouched();\n $validating.clearValidating();\n mode === 'uncontrolled' && setFormKey((key) => key + 1);\n }, []);\n\n const handleValuesChanges = useCallback(\n (previousValues: Values) => {\n clearInputErrorOnChange && $errors.clearErrors();\n mode === 'uncontrolled' && setFormKey((key) => key + 1);\n $watch.notifyWatchSubscribers(previousValues);\n },\n [clearInputErrorOnChange]\n );\n\n const initialize: Initialize<Values> = useCallback(\n (values) => {\n const previousValues = $values.refValues.current;\n $values.initialize(values, () => mode === 'uncontrolled' && setFormKey((key) => key + 1));\n handleValuesChanges(previousValues);\n },\n [handleValuesChanges]\n );\n\n const debouncedValidateField = useMemo(() => {\n const timers: Record<string, ReturnType<typeof setTimeout>> = {};\n\n const handleValidation = (path: string) => {\n const signal = $validating.getAbortSignal(path);\n const result = validateFieldValue(\n path,\n rules,\n $values.refValues.current,\n resolveValidationError,\n signal\n );\n\n const applyResult = (results: { hasError: boolean; error: React.ReactNode }) => {\n if (signal.aborted) {\n return;\n }\n if (results.hasError) {\n $errors.setFieldError(path as any, results.error);\n } else {\n $errors.clearFieldError(path);\n }\n };\n\n const cleanup = () => {\n if (!signal.aborted) {\n $validating.setFieldValidating(path, false);\n }\n };\n\n if (result instanceof Promise) {\n $validating.setFieldValidating(path, true);\n result.then(applyResult).finally(cleanup);\n } else {\n applyResult(result);\n }\n };\n\n return (path: string) => {\n clearTimeout(timers[path]);\n if (validateDebounce > 0) {\n timers[path] = setTimeout(() => handleValidation(path), validateDebounce);\n } else {\n handleValidation(path);\n }\n };\n }, [validateDebounce, rules, resolveValidationError]);\n\n const setFieldValue: SetFieldValue<Values> = useCallback(\n (path, value, options) => {\n const shouldValidate = shouldValidateOnChange(path, validateInputOnChange);\n const resolvedValue =\n value instanceof Function ? value(getPath(path, $values.refValues.current) as any) : value;\n\n $status.setCalculatedFieldDirty(path, resolvedValue);\n touchTrigger === 'change' && $status.setFieldTouched(path, true);\n !shouldValidate && clearInputErrorOnChange && $errors.clearFieldError(path);\n\n $values.setFieldValue({\n path,\n value,\n updateState: mode === 'controlled',\n subscribers: [\n ...$watch.getFieldSubscribers(path),\n shouldValidate ? () => debouncedValidateField(String(path)) : null,\n options?.forceUpdate !== false && mode !== 'controlled'\n ? () =>\n setFieldKeys((keys) => ({\n ...keys,\n [path as string]: (keys[path as string] || 0) + 1,\n }))\n : null,\n ],\n });\n },\n [onValuesChange, rules, debouncedValidateField]\n );\n\n const setValues: SetValues<Values> = useCallback(\n (values) => {\n const previousValues = $values.refValues.current;\n $values.setValues({ values, updateState: mode === 'controlled' });\n handleValuesChanges(previousValues);\n },\n [onValuesChange, handleValuesChanges]\n );\n\n const validate = useCallback(() => {\n const generation = ++validateGeneration.current;\n const signal = $validating.getAbortSignal('__form__');\n\n const handleResult = (results: { hasErrors: boolean; errors: Record<string, any> }) => {\n if (generation !== validateGeneration.current) {\n return { hasErrors: false, errors: {} };\n }\n $errors.setErrors(results.errors);\n return results;\n };\n\n const cleanup = () => {\n if (generation === validateGeneration.current) {\n $validating.setFormValidating(false);\n }\n };\n\n const result = validateValues(rules, $values.refValues.current, resolveValidationError, signal);\n\n if (result instanceof Promise) {\n $validating.setFormValidating(true);\n return result.then(handleResult).finally(cleanup);\n }\n\n return handleResult(result);\n }, [rules, resolveValidationError]);\n\n const validateField = useCallback(\n (path: string) => {\n const signal = $validating.getAbortSignal(String(path));\n\n const applyResult = (results: { hasError: boolean; error: React.ReactNode }) => {\n if (signal.aborted) {\n return { hasError: false, error: null };\n }\n if (results.hasError) {\n $errors.setFieldError(path, results.error);\n } else {\n $errors.clearFieldError(path);\n }\n return results;\n };\n\n const cleanup = () => {\n if (!signal.aborted) {\n $validating.setFieldValidating(String(path), false);\n }\n };\n\n const result = validateFieldValue(\n path,\n rules,\n $values.refValues.current,\n resolveValidationError,\n signal\n );\n\n if (result instanceof Promise) {\n $validating.setFieldValidating(String(path), true);\n return result.then(applyResult).finally(cleanup);\n }\n\n return applyResult(result);\n },\n [rules, resolveValidationError]\n );\n\n const getInputProps: GetInputProps<Values> = (\n path,\n { type = 'input', withError = true, withFocus, ...otherOptions } = {}\n ) => {\n const _withFocus = withFocus ?? type !== 'radio';\n const onChange = getInputOnChange((value) =>\n setFieldValue(path, value as any, { forceUpdate: false })\n );\n\n const payload: any = { onChange, 'data-path': getDataPath(name, path) };\n\n if (withError) {\n payload.error = $errors.errorsState[path];\n }\n\n if (type === 'checkbox') {\n payload[mode === 'controlled' ? 'checked' : 'defaultChecked'] = getPath(\n path,\n $values.refValues.current\n );\n } else if (type === 'radio') {\n payload[mode === 'controlled' ? 'checked' : 'defaultChecked'] =\n getPath(path, $values.refValues.current) === otherOptions.value;\n payload.value = otherOptions.value;\n } else {\n payload[mode === 'controlled' ? 'value' : 'defaultValue'] = getPath(\n path,\n $values.refValues.current\n );\n }\n\n if (_withFocus) {\n payload.onFocus = () => $status.setFieldTouched(path, true);\n payload.onBlur = () => {\n if (shouldValidateOnChange(path, validateInputOnBlur)) {\n debouncedValidateField(String(path));\n }\n };\n }\n\n return Object.assign(\n payload,\n enhanceGetInputProps?.({\n inputProps: payload,\n field: path,\n options: { type, withError, withFocus: _withFocus, ...otherOptions },\n form: form as any,\n })\n );\n };\n\n const onSubmit: OnSubmit<Values, TransformedValues> =\n (handleSubmit, handleValidationFailure) => (event) => {\n if (onSubmitPreventDefault === 'always') {\n event?.preventDefault();\n }\n\n setSubmitting(true);\n\n const handleValidation = (results: { hasErrors: boolean; errors: Record<string, any> }) => {\n if (results.hasErrors) {\n if (onSubmitPreventDefault === 'validation-failed') {\n event?.preventDefault();\n }\n\n handleValidationFailure?.(results.errors, $values.refValues.current, event);\n setSubmitting(false);\n } else {\n const submitResult = handleSubmit?.(\n transformValues($values.refValues.current) as any,\n event\n );\n\n if (submitResult instanceof Promise) {\n submitResult.finally(() => setSubmitting(false));\n } else {\n setSubmitting(false);\n }\n }\n };\n\n const result = validate();\n if (result instanceof Promise) {\n result.then(handleValidation).catch(() => {\n setSubmitting(false);\n });\n } else {\n handleValidation(result);\n }\n };\n\n const getTransformedValues: GetTransformedValues<Values, TransformedValues> = (input) =>\n (transformValues as any)(input || $values.refValues.current);\n\n const onReset: OnReset = useCallback((event) => {\n event.preventDefault();\n reset();\n }, []);\n\n const isValid = useCallback(\n (path?: string) => {\n const signal = new AbortController().signal;\n if (path) {\n const result = validateFieldValue(\n path,\n rules,\n $values.refValues.current,\n resolveValidationError,\n signal\n );\n if (result instanceof Promise) {\n return result.then((r) => !r.hasError);\n }\n return !result.hasError;\n }\n const result = validateValues(\n rules,\n $values.refValues.current,\n resolveValidationError,\n signal\n );\n if (result instanceof Promise) {\n return result.then((r) => !r.hasErrors);\n }\n return !result.hasErrors;\n },\n [rules, resolveValidationError]\n );\n\n const key: Key<Values> = (path) => `${formKey}-${String(path)}-${fieldKeys[String(path)] || 0}`;\n\n const getInputNode: GetInputNode<Values> = useCallback(\n (path) => document.querySelector(`[data-path=\"${getDataPath(name, path)}\"]`),\n []\n );\n\n const resetField = useCallback(\n (path: PropertyKey) => {\n $values.resetField(path, [\n mode !== 'controlled'\n ? () =>\n setFieldKeys((keys) => ({\n ...keys,\n [path as string]: (keys[path as string] || 0) + 1,\n }))\n : null,\n ]);\n },\n [$values.resetField, mode, setFieldKeys]\n );\n\n const form = {\n watch: $watch.watch,\n\n initialized: $values.initialized.current,\n values: mode === 'uncontrolled' ? $values.refValues.current : $values.stateValues,\n getValues: $values.getValues,\n getInitialValues: $values.getValuesSnapshot,\n setInitialValues: $values.setValuesSnapshot,\n resetField,\n initialize,\n setValues,\n setFieldValue,\n\n submitting,\n setSubmitting,\n\n validating: $validating.validating,\n isValidating: $validating.isValidating as IsValidating<Values>,\n\n errors: $errors.errorsState,\n setErrors: $errors.setErrors,\n setFieldError: $errors.setFieldError,\n clearFieldError: $errors.clearFieldError,\n clearErrors: $errors.clearErrors,\n\n resetDirty: $status.resetDirty,\n setTouched: $status.setTouched,\n setDirty: $status.setDirty,\n isTouched: $status.isTouched,\n resetTouched: $status.resetTouched,\n isDirty: $status.isDirty,\n getTouched: $status.getTouched,\n getDirty: $status.getDirty,\n\n reorderListItem: $list.reorderListItem,\n insertListItem: $list.insertListItem,\n removeListItem: $list.removeListItem,\n replaceListItem: $list.replaceListItem,\n\n reset,\n validate,\n validateField,\n getInputProps,\n onSubmit,\n onReset,\n isValid,\n getTransformedValues,\n key,\n\n getInputNode,\n };\n\n useFormActions(name, form as any);\n\n return form as any;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"use-form.cjs","names":["useFormErrors","useFormValues","useFormStatus","useFormWatch","useFormList","useFormValidating","validateFieldValue","shouldValidateOnChange","getPath","validateValues","getInputOnChange","getDataPath"],"sources":["../src/use-form.ts"],"sourcesContent":["import { useCallback, useMemo, useRef, useState } from 'react';\nimport { useFormActions } from './actions';\nimport { getInputOnChange } from './get-input-on-change';\nimport { useFormErrors } from './hooks/use-form-errors/use-form-errors';\nimport { useFormList } from './hooks/use-form-list/use-form-list';\nimport { useFormStatus } from './hooks/use-form-status/use-form-status';\nimport { useFormValidating } from './hooks/use-form-validating/use-form-validating';\nimport { useFormValues } from './hooks/use-form-values/use-form-values';\nimport { useFormWatch } from './hooks/use-form-watch/use-form-watch';\nimport { getDataPath, getPath } from './paths';\nimport {\n FormErrors,\n FormRulesRecord,\n GetInputNode,\n GetInputProps,\n GetTransformedValues,\n Initialize,\n IsValidating,\n Key,\n OnReset,\n OnSubmit,\n Reset,\n SetFieldValue,\n SetValues,\n UseFormInput,\n UseFormReturnType,\n} from './types';\nimport { shouldValidateOnChange, validateFieldValue, validateValues } from './validate';\n\nconst defaultResolveValidationError = (err: unknown) =>\n err instanceof Error ? err.message : String(err);\n\nexport function useForm<\n Values extends Record<string, any>,\n TransformedValues = Values,\n R extends FormErrors | Promise<FormErrors> = FormErrors,\n>(\n input: UseFormInput<Values, TransformedValues> & { validate: (values: Values) => R }\n): UseFormReturnType<Values, TransformedValues, (values: Values) => R>;\n\nexport function useForm<\n Values extends Record<string, any>,\n TransformedValues = Values,\n Rules extends FormRulesRecord<Values> = FormRulesRecord<Values>,\n>(\n input: UseFormInput<Values, TransformedValues> & { validate: Rules }\n): UseFormReturnType<Values, TransformedValues, Rules>;\n\nexport function useForm<\n Values extends Record<string, any> = Record<string, any>,\n TransformedValues = Values,\n>(\n input?: UseFormInput<Values, TransformedValues>\n): UseFormReturnType<Values, TransformedValues, undefined>;\n\nexport function useForm<\n Values extends Record<PropertyKey, any> = Record<string, any>,\n TransformedValues = Values,\n>({\n name,\n mode = 'controlled',\n initialValues,\n initialErrors = {},\n initialDirty = {},\n initialTouched = {},\n clearInputErrorOnChange = true,\n validateInputOnChange = false,\n validateInputOnBlur = false,\n onValuesChange,\n transformValues = ((values: Values) => values) as any,\n enhanceGetInputProps,\n validate: rules,\n onSubmitPreventDefault = 'always',\n touchTrigger = 'change',\n cascadeUpdates = false,\n validateDebounce = 0,\n resolveValidationError = defaultResolveValidationError,\n}: UseFormInput<Values, TransformedValues> = {}): UseFormReturnType<Values, TransformedValues> {\n const $errors = useFormErrors<Values>(initialErrors);\n const $values = useFormValues<Values>({ initialValues, onValuesChange, mode });\n const $status = useFormStatus<Values>({ initialDirty, initialTouched, $values, mode });\n const $watch = useFormWatch<Values>({ $values, $status, cascadeUpdates });\n const $list = useFormList<Values>({ $values, $errors, $status, $watch });\n const $validating = useFormValidating();\n const [formKey, setFormKey] = useState(0);\n const [fieldKeys, setFieldKeys] = useState<Record<string, number>>({});\n const [submitting, setSubmitting] = useState(false);\n const validateGeneration = useRef(0);\n\n const reset: Reset = useCallback(() => {\n $values.resetValues();\n $errors.clearErrors();\n $status.resetDirty();\n $status.resetTouched();\n $validating.clearValidating();\n mode === 'uncontrolled' && setFormKey((key) => key + 1);\n }, []);\n\n const handleValuesChanges = useCallback(\n (previousValues: Values) => {\n clearInputErrorOnChange && $errors.clearErrors();\n mode === 'uncontrolled' && setFormKey((key) => key + 1);\n $watch.notifyWatchSubscribers(previousValues);\n },\n [clearInputErrorOnChange]\n );\n\n const initialize: Initialize<Values> = useCallback(\n (values) => {\n const previousValues = $values.refValues.current;\n $values.initialize(values, () => mode === 'uncontrolled' && setFormKey((key) => key + 1));\n handleValuesChanges(previousValues);\n },\n [handleValuesChanges]\n );\n\n const debouncedValidateField = useMemo(() => {\n const timers: Record<string, ReturnType<typeof setTimeout>> = {};\n\n const handleValidation = (path: string) => {\n const signal = $validating.getAbortSignal(path);\n const result = validateFieldValue(\n path,\n rules,\n $values.refValues.current,\n resolveValidationError,\n signal\n );\n\n const applyResult = (results: { hasError: boolean; error: React.ReactNode }) => {\n if (signal.aborted) {\n return;\n }\n if (results.hasError) {\n $errors.setFieldError(path as any, results.error);\n } else {\n $errors.clearFieldError(path);\n }\n };\n\n const cleanup = () => {\n if (!signal.aborted) {\n $validating.setFieldValidating(path, false);\n }\n };\n\n if (result instanceof Promise) {\n $validating.setFieldValidating(path, true);\n result.then(applyResult).finally(cleanup);\n } else {\n applyResult(result);\n }\n };\n\n return (path: string) => {\n clearTimeout(timers[path]);\n if (validateDebounce > 0) {\n timers[path] = setTimeout(() => handleValidation(path), validateDebounce);\n } else {\n handleValidation(path);\n }\n };\n }, [validateDebounce, rules, resolveValidationError]);\n\n const setFieldValue: SetFieldValue<Values> = useCallback(\n (path, value, options) => {\n const shouldValidate = shouldValidateOnChange(path, validateInputOnChange);\n const resolvedValue =\n value instanceof Function ? value(getPath(path, $values.refValues.current) as any) : value;\n\n $status.setCalculatedFieldDirty(path, resolvedValue);\n touchTrigger === 'change' && $status.setFieldTouched(path, true);\n !shouldValidate && clearInputErrorOnChange && $errors.clearFieldError(path);\n\n $values.setFieldValue({\n path,\n value,\n updateState: mode === 'controlled',\n subscribers: [\n ...$watch.getFieldSubscribers(path),\n shouldValidate ? () => debouncedValidateField(String(path)) : null,\n options?.forceUpdate !== false && mode !== 'controlled'\n ? () =>\n setFieldKeys((keys) => ({\n ...keys,\n [path as string]: (keys[path as string] || 0) + 1,\n }))\n : null,\n ],\n });\n },\n [onValuesChange, rules, debouncedValidateField]\n );\n\n const setValues: SetValues<Values> = useCallback(\n (values) => {\n const previousValues = $values.refValues.current;\n $values.setValues({ values, updateState: mode === 'controlled' });\n handleValuesChanges(previousValues);\n },\n [onValuesChange, handleValuesChanges]\n );\n\n const validate = useCallback(() => {\n const generation = ++validateGeneration.current;\n const signal = $validating.getAbortSignal('__form__');\n\n const handleResult = (results: { hasErrors: boolean; errors: Record<string, any> }) => {\n if (generation !== validateGeneration.current) {\n return { hasErrors: false, errors: {} };\n }\n $errors.setErrors(results.errors);\n return results;\n };\n\n const cleanup = () => {\n if (generation === validateGeneration.current) {\n $validating.setFormValidating(false);\n }\n };\n\n const result = validateValues(rules, $values.refValues.current, resolveValidationError, signal);\n\n if (result instanceof Promise) {\n $validating.setFormValidating(true);\n return result.then(handleResult).finally(cleanup);\n }\n\n return handleResult(result);\n }, [rules, resolveValidationError]);\n\n const validateField = useCallback(\n (path: string) => {\n const signal = $validating.getAbortSignal(String(path));\n\n const applyResult = (results: { hasError: boolean; error: React.ReactNode }) => {\n if (signal.aborted) {\n return { hasError: false, error: null };\n }\n if (results.hasError) {\n $errors.setFieldError(path, results.error);\n } else {\n $errors.clearFieldError(path);\n }\n return results;\n };\n\n const cleanup = () => {\n if (!signal.aborted) {\n $validating.setFieldValidating(String(path), false);\n }\n };\n\n const result = validateFieldValue(\n path,\n rules,\n $values.refValues.current,\n resolveValidationError,\n signal\n );\n\n if (result instanceof Promise) {\n $validating.setFieldValidating(String(path), true);\n return result.then(applyResult).finally(cleanup);\n }\n\n return applyResult(result);\n },\n [rules, resolveValidationError]\n );\n\n const getInputProps: GetInputProps<Values> = (\n path,\n { type = 'input', withError = true, withFocus, ...otherOptions } = {}\n ) => {\n const _withFocus = withFocus ?? type !== 'radio';\n const onChange = getInputOnChange((value) =>\n setFieldValue(path, value as any, { forceUpdate: false })\n );\n\n const payload: any = { onChange, 'data-path': getDataPath(name, path) };\n\n if (withError) {\n payload.error = $errors.errorsState[path];\n }\n\n if (type === 'checkbox') {\n payload[mode === 'controlled' ? 'checked' : 'defaultChecked'] = getPath(\n path,\n $values.refValues.current\n );\n } else if (type === 'radio') {\n payload[mode === 'controlled' ? 'checked' : 'defaultChecked'] =\n getPath(path, $values.refValues.current) === otherOptions.value;\n payload.value = otherOptions.value;\n } else {\n payload[mode === 'controlled' ? 'value' : 'defaultValue'] = getPath(\n path,\n $values.refValues.current\n );\n }\n\n if (_withFocus) {\n payload.onFocus = () => $status.setFieldTouched(path, true);\n payload.onBlur = () => {\n if (shouldValidateOnChange(path, validateInputOnBlur)) {\n debouncedValidateField(String(path));\n }\n };\n }\n\n return Object.assign(\n payload,\n enhanceGetInputProps?.({\n inputProps: payload,\n field: path,\n options: { type, withError, withFocus: _withFocus, ...otherOptions },\n form: form as any,\n })\n );\n };\n\n const onSubmit: OnSubmit<Values, TransformedValues> =\n (handleSubmit, handleValidationFailure) => (event) => {\n if (onSubmitPreventDefault === 'always') {\n event?.preventDefault();\n }\n\n setSubmitting(true);\n\n const handleValidation = (results: { hasErrors: boolean; errors: Record<string, any> }) => {\n if (results.hasErrors) {\n if (onSubmitPreventDefault === 'validation-failed') {\n event?.preventDefault();\n }\n\n handleValidationFailure?.(results.errors, $values.refValues.current, event);\n setSubmitting(false);\n } else {\n const submitResult = handleSubmit?.(\n transformValues($values.refValues.current) as any,\n event\n );\n\n if (submitResult instanceof Promise) {\n submitResult.finally(() => setSubmitting(false));\n } else {\n setSubmitting(false);\n }\n }\n };\n\n const result = validate();\n if (result instanceof Promise) {\n result.then(handleValidation).catch(() => {\n setSubmitting(false);\n });\n } else {\n handleValidation(result);\n }\n };\n\n const getTransformedValues: GetTransformedValues<Values, TransformedValues> = (input) =>\n (transformValues as any)(input || $values.refValues.current);\n\n const onReset: OnReset = useCallback((event) => {\n event.preventDefault();\n reset();\n }, []);\n\n const isValid = useCallback(\n (path?: string) => {\n const signal = new AbortController().signal;\n if (path) {\n const result = validateFieldValue(\n path,\n rules,\n $values.refValues.current,\n resolveValidationError,\n signal\n );\n if (result instanceof Promise) {\n return result.then((r) => !r.hasError);\n }\n return !result.hasError;\n }\n const result = validateValues(\n rules,\n $values.refValues.current,\n resolveValidationError,\n signal\n );\n if (result instanceof Promise) {\n return result.then((r) => !r.hasErrors);\n }\n return !result.hasErrors;\n },\n [rules, resolveValidationError, $values.refValues.current]\n );\n\n const key: Key<Values> = (path) => `${formKey}-${String(path)}-${fieldKeys[String(path)] || 0}`;\n\n const getInputNode: GetInputNode<Values> = (path) =>\n document.querySelector(`[data-path=\"${getDataPath(name, path)}\"]`);\n\n const resetField = useCallback(\n (path: PropertyKey) => {\n $values.resetField(path, [\n mode !== 'controlled'\n ? () =>\n setFieldKeys((keys) => ({\n ...keys,\n [path as string]: (keys[path as string] || 0) + 1,\n }))\n : null,\n ]);\n },\n [$values.resetField, mode, setFieldKeys]\n );\n\n const form = {\n watch: $watch.watch,\n\n initialized: $values.initialized.current,\n values: mode === 'uncontrolled' ? $values.refValues.current : $values.stateValues,\n getValues: $values.getValues,\n getInitialValues: $values.getValuesSnapshot,\n setInitialValues: $values.setValuesSnapshot,\n resetField,\n initialize,\n setValues,\n setFieldValue,\n\n submitting,\n setSubmitting,\n\n validating: $validating.validating,\n isValidating: $validating.isValidating as IsValidating<Values>,\n\n errors: $errors.errorsState,\n setErrors: $errors.setErrors,\n setFieldError: $errors.setFieldError,\n clearFieldError: $errors.clearFieldError,\n clearErrors: $errors.clearErrors,\n\n resetDirty: $status.resetDirty,\n setTouched: $status.setTouched,\n setDirty: $status.setDirty,\n isTouched: $status.isTouched,\n resetTouched: $status.resetTouched,\n isDirty: $status.isDirty,\n getTouched: $status.getTouched,\n getDirty: $status.getDirty,\n\n reorderListItem: $list.reorderListItem,\n insertListItem: $list.insertListItem,\n removeListItem: $list.removeListItem,\n replaceListItem: $list.replaceListItem,\n\n reset,\n validate,\n validateField,\n getInputProps,\n onSubmit,\n onReset,\n isValid,\n getTransformedValues,\n key,\n\n getInputNode,\n };\n\n useFormActions(name, form as any);\n\n return form as any;\n}\n"],"mappings":"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"}
@@ -63,7 +63,7 @@ function useFormStatus({ initialDirty, initialTouched, mode, $values }) {
63
63
  setDirty,
64
64
  resetDirty,
65
65
  resetTouched,
66
- isTouched: useCallback((path) => getStatus(touchedRef.current, path), []),
66
+ isTouched: useCallback((path) => getStatus(touchedRef.current, path), [touchedRef.current]),
67
67
  setFieldTouched,
68
68
  setFieldDirty,
69
69
  setTouchedState,
@@ -83,9 +83,13 @@ function useFormStatus({ initialDirty, initialTouched, mode, $values }) {
83
83
  }
84
84
  if (Object.keys(dirtyRef.current).length > 0) return getStatus(dirtyRef.current);
85
85
  return !isEqual($values.refValues.current, $values.valuesSnapshot.current);
86
- }, []),
87
- getDirty: useCallback(() => dirtyRef.current, []),
88
- getTouched: useCallback(() => touchedRef.current, []),
86
+ }, [
87
+ dirtyRef.current,
88
+ $values.refValues.current,
89
+ $values.valuesSnapshot.current
90
+ ]),
91
+ getDirty: useCallback(() => dirtyRef.current, [dirtyRef.current]),
92
+ getTouched: useCallback(() => touchedRef.current, [touchedRef.current]),
89
93
  setCalculatedFieldDirty
90
94
  };
91
95
  }
@@ -1 +1 @@
1
- {"version":3,"file":"use-form-status.mjs","names":[],"sources":["../../../src/hooks/use-form-status/use-form-status.ts"],"sourcesContent":["import { useCallback, useRef, useState } from 'react';\nimport isEqual from 'fast-deep-equal';\nimport { getStatus } from '../../get-status';\nimport { clearListState } from '../../lists';\nimport { getPath } from '../../paths';\nimport {\n ClearFieldDirty,\n FormMode,\n FormStatus,\n GetFieldStatus,\n ResetDirty,\n ResetStatus,\n SetCalculatedFieldDirty,\n SetFieldDirty,\n SetFieldTouched,\n} from '../../types';\nimport type { $FormValues } from '../use-form-values/use-form-values';\n\nexport interface $FormStatus<out Values extends Record<string, any>> {\n touchedState: FormStatus;\n dirtyState: FormStatus;\n touchedRef: React.RefObject<FormStatus>;\n dirtyRef: React.RefObject<FormStatus>;\n setTouched: React.Dispatch<React.SetStateAction<FormStatus>>;\n setDirty: React.Dispatch<React.SetStateAction<FormStatus>>;\n resetDirty: ResetStatus;\n resetTouched: ResetStatus;\n isTouched: GetFieldStatus<Values>;\n setFieldTouched: SetFieldTouched<Values>;\n setFieldDirty: SetFieldDirty<Values>;\n setTouchedState: React.Dispatch<React.SetStateAction<FormStatus>>;\n setDirtyState: React.Dispatch<React.SetStateAction<FormStatus>>;\n clearFieldDirty: ClearFieldDirty;\n isDirty: GetFieldStatus<Values>;\n getDirty: () => FormStatus;\n getTouched: () => FormStatus;\n setCalculatedFieldDirty: SetCalculatedFieldDirty<Values>;\n}\n\ninterface UseFormStatusInput<out Values extends Record<string, any>> {\n initialDirty: FormStatus;\n initialTouched: FormStatus;\n mode: FormMode;\n $values: $FormValues<Values>;\n}\n\nexport function useFormStatus<Values extends Record<string, any>>({\n initialDirty,\n initialTouched,\n mode,\n $values,\n}: UseFormStatusInput<Values>): $FormStatus<Values> {\n const [touchedState, setTouchedState] = useState(initialTouched);\n const [dirtyState, setDirtyState] = useState(initialDirty);\n\n const touchedRef = useRef(initialTouched);\n const dirtyRef = useRef(initialDirty);\n\n const setTouched = useCallback((values: FormStatus | ((current: FormStatus) => FormStatus)) => {\n const resolvedValues = typeof values === 'function' ? values(touchedRef.current) : values;\n touchedRef.current = resolvedValues;\n\n if (mode === 'controlled') {\n setTouchedState(resolvedValues);\n }\n }, []);\n\n const setDirty = useCallback(\n (values: FormStatus | ((current: FormStatus) => FormStatus), forceUpdate = false) => {\n const resolvedValues = typeof values === 'function' ? values(dirtyRef.current) : values;\n dirtyRef.current = resolvedValues;\n\n if (mode === 'controlled' || forceUpdate) {\n setDirtyState(resolvedValues);\n }\n },\n []\n );\n\n const resetTouched: ResetStatus = useCallback(() => setTouched({}), []);\n\n const resetDirty: ResetDirty<Values> = useCallback((values) => {\n const newSnapshot = values\n ? { ...$values.refValues.current, ...values }\n : $values.refValues.current;\n $values.setValuesSnapshot(newSnapshot);\n setDirty({});\n }, []);\n\n const setFieldTouched: SetFieldTouched<Values> = useCallback((path, touched) => {\n setTouched((currentTouched) => {\n if (getStatus(currentTouched, path) === touched) {\n return currentTouched;\n }\n\n return { ...currentTouched, [path]: touched };\n });\n }, []);\n\n const setFieldDirty: SetFieldDirty<Values> = useCallback((path, dirty, forceUpdate) => {\n setDirty((currentDirty) => {\n if (getStatus(currentDirty, path) === dirty) {\n return currentDirty;\n }\n\n return { ...currentDirty, [path]: dirty };\n }, forceUpdate);\n }, []);\n\n const setCalculatedFieldDirty: SetCalculatedFieldDirty<Values> = useCallback((path, value) => {\n const currentDirty = getStatus(dirtyRef.current, path);\n const dirty = !isEqual(getPath(path, $values.getValuesSnapshot()), value);\n const clearedState = clearListState(path, dirtyRef.current);\n clearedState[path as string] = dirty;\n setDirty(clearedState, currentDirty !== dirty);\n }, []);\n\n const isTouched: GetFieldStatus<Values> = useCallback(\n (path) => getStatus(touchedRef.current, path),\n []\n );\n\n const clearFieldDirty: ClearFieldDirty = useCallback(\n (path) =>\n setDirty((current) => {\n if (typeof path !== 'string') {\n return current;\n }\n\n const result = clearListState(path, current);\n delete result[path];\n\n if (isEqual(result, current)) {\n return current;\n }\n\n return result;\n }),\n []\n );\n\n const isDirty: GetFieldStatus<Values> = useCallback((path) => {\n if (path) {\n const overriddenValue = getPath(path, dirtyRef.current);\n if (typeof overriddenValue === 'boolean') {\n return overriddenValue;\n }\n\n const sliceOfValues = getPath(path, $values.refValues.current);\n const sliceOfInitialValues = getPath(path, $values.valuesSnapshot.current);\n return !isEqual(sliceOfValues, sliceOfInitialValues);\n }\n\n const isOverridden = Object.keys(dirtyRef.current).length > 0;\n if (isOverridden) {\n return getStatus(dirtyRef.current);\n }\n\n return !isEqual($values.refValues.current, $values.valuesSnapshot.current);\n }, []);\n\n const getDirty = useCallback(() => dirtyRef.current, []);\n const getTouched = useCallback(() => touchedRef.current, []);\n\n return {\n touchedState,\n dirtyState,\n touchedRef,\n dirtyRef,\n setTouched,\n setDirty,\n resetDirty,\n resetTouched,\n isTouched,\n setFieldTouched,\n setFieldDirty,\n setTouchedState,\n setDirtyState,\n clearFieldDirty,\n isDirty,\n getDirty,\n getTouched,\n setCalculatedFieldDirty,\n };\n}\n"],"mappings":";;;;;;;AA8CA,SAAgB,cAAkD,EAChE,cACA,gBACA,MACA,WACkD;CAClD,MAAM,CAAC,cAAc,mBAAmB,SAAS,cAAc;CAC/D,MAAM,CAAC,YAAY,iBAAiB,SAAS,YAAY;CAEzD,MAAM,aAAa,OAAO,cAAc;CACxC,MAAM,WAAW,OAAO,YAAY;CAEpC,MAAM,aAAa,aAAa,WAA+D;EAC7F,MAAM,iBAAiB,OAAO,WAAW,aAAa,OAAO,WAAW,OAAO,IAAI;EACnF,WAAW,UAAU;EAErB,IAAI,SAAS,cACX,gBAAgB,cAAc;CAElC,GAAG,CAAC,CAAC;CAEL,MAAM,WAAW,aACd,QAA4D,cAAc,UAAU;EACnF,MAAM,iBAAiB,OAAO,WAAW,aAAa,OAAO,SAAS,OAAO,IAAI;EACjF,SAAS,UAAU;EAEnB,IAAI,SAAS,gBAAgB,aAC3B,cAAc,cAAc;CAEhC,GACA,CAAC,CACH;CAEA,MAAM,eAA4B,kBAAkB,WAAW,CAAC,CAAC,GAAG,CAAC,CAAC;CAEtE,MAAM,aAAiC,aAAa,WAAW;EAC7D,MAAM,cAAc,SAChB;GAAE,GAAG,QAAQ,UAAU;GAAS,GAAG;EAAO,IAC1C,QAAQ,UAAU;EACtB,QAAQ,kBAAkB,WAAW;EACrC,SAAS,CAAC,CAAC;CACb,GAAG,CAAC,CAAC;CAEL,MAAM,kBAA2C,aAAa,MAAM,YAAY;EAC9E,YAAY,mBAAmB;GAC7B,IAAI,UAAU,gBAAgB,IAAI,MAAM,SACtC,OAAO;GAGT,OAAO;IAAE,GAAG;KAAiB,OAAO;GAAQ;EAC9C,CAAC;CACH,GAAG,CAAC,CAAC;CAEL,MAAM,gBAAuC,aAAa,MAAM,OAAO,gBAAgB;EACrF,UAAU,iBAAiB;GACzB,IAAI,UAAU,cAAc,IAAI,MAAM,OACpC,OAAO;GAGT,OAAO;IAAE,GAAG;KAAe,OAAO;GAAM;EAC1C,GAAG,WAAW;CAChB,GAAG,CAAC,CAAC;CAEL,MAAM,0BAA2D,aAAa,MAAM,UAAU;EAC5F,MAAM,eAAe,UAAU,SAAS,SAAS,IAAI;EACrD,MAAM,QAAQ,CAAC,QAAQ,QAAQ,MAAM,QAAQ,kBAAkB,CAAC,GAAG,KAAK;EACxE,MAAM,eAAe,eAAe,MAAM,SAAS,OAAO;EAC1D,aAAa,QAAkB;EAC/B,SAAS,cAAc,iBAAiB,KAAK;CAC/C,GAAG,CAAC,CAAC;CAiDL,OAAO;EACL;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,WAxDwC,aACvC,SAAS,UAAU,WAAW,SAAS,IAAI,GAC5C,CAAC,CAsDO;EACR;EACA;EACA;EACA;EACA,iBAxDuC,aACtC,SACC,UAAU,YAAY;GACpB,IAAI,OAAO,SAAS,UAClB,OAAO;GAGT,MAAM,SAAS,eAAe,MAAM,OAAO;GAC3C,OAAO,OAAO;GAEd,IAAI,QAAQ,QAAQ,OAAO,GACzB,OAAO;GAGT,OAAO;EACT,CAAC,GACH,CAAC,CAwCa;EACd,SAtCsC,aAAa,SAAS;GAC5D,IAAI,MAAM;IACR,MAAM,kBAAkB,QAAQ,MAAM,SAAS,OAAO;IACtD,IAAI,OAAO,oBAAoB,WAC7B,OAAO;IAKT,OAAO,CAAC,QAFc,QAAQ,MAAM,QAAQ,UAAU,OAE1B,GADC,QAAQ,MAAM,QAAQ,eAAe,OAChB,CAAC;GACrD;GAGA,IADqB,OAAO,KAAK,SAAS,OAAO,CAAC,CAAC,SAAS,GAE1D,OAAO,UAAU,SAAS,OAAO;GAGnC,OAAO,CAAC,QAAQ,QAAQ,UAAU,SAAS,QAAQ,eAAe,OAAO;EAC3E,GAAG,CAAC,CAoBI;EACN,UAnBe,kBAAkB,SAAS,SAAS,CAAC,CAmB7C;EACP,YAnBiB,kBAAkB,WAAW,SAAS,CAAC,CAmB/C;EACT;CACF;AACF"}
1
+ {"version":3,"file":"use-form-status.mjs","names":[],"sources":["../../../src/hooks/use-form-status/use-form-status.ts"],"sourcesContent":["import { useCallback, useRef, useState } from 'react';\nimport isEqual from 'fast-deep-equal';\nimport { getStatus } from '../../get-status';\nimport { clearListState } from '../../lists';\nimport { getPath } from '../../paths';\nimport {\n ClearFieldDirty,\n FormMode,\n FormStatus,\n GetFieldStatus,\n ResetDirty,\n ResetStatus,\n SetCalculatedFieldDirty,\n SetFieldDirty,\n SetFieldTouched,\n} from '../../types';\nimport type { $FormValues } from '../use-form-values/use-form-values';\n\nexport interface $FormStatus<out Values extends Record<string, any>> {\n touchedState: FormStatus;\n dirtyState: FormStatus;\n touchedRef: React.RefObject<FormStatus>;\n dirtyRef: React.RefObject<FormStatus>;\n setTouched: React.Dispatch<React.SetStateAction<FormStatus>>;\n setDirty: React.Dispatch<React.SetStateAction<FormStatus>>;\n resetDirty: ResetStatus;\n resetTouched: ResetStatus;\n isTouched: GetFieldStatus<Values>;\n setFieldTouched: SetFieldTouched<Values>;\n setFieldDirty: SetFieldDirty<Values>;\n setTouchedState: React.Dispatch<React.SetStateAction<FormStatus>>;\n setDirtyState: React.Dispatch<React.SetStateAction<FormStatus>>;\n clearFieldDirty: ClearFieldDirty;\n isDirty: GetFieldStatus<Values>;\n getDirty: () => FormStatus;\n getTouched: () => FormStatus;\n setCalculatedFieldDirty: SetCalculatedFieldDirty<Values>;\n}\n\ninterface UseFormStatusInput<out Values extends Record<string, any>> {\n initialDirty: FormStatus;\n initialTouched: FormStatus;\n mode: FormMode;\n $values: $FormValues<Values>;\n}\n\nexport function useFormStatus<Values extends Record<string, any>>({\n initialDirty,\n initialTouched,\n mode,\n $values,\n}: UseFormStatusInput<Values>): $FormStatus<Values> {\n const [touchedState, setTouchedState] = useState(initialTouched);\n const [dirtyState, setDirtyState] = useState(initialDirty);\n\n const touchedRef = useRef(initialTouched);\n const dirtyRef = useRef(initialDirty);\n\n const setTouched = useCallback((values: FormStatus | ((current: FormStatus) => FormStatus)) => {\n const resolvedValues = typeof values === 'function' ? values(touchedRef.current) : values;\n touchedRef.current = resolvedValues;\n\n if (mode === 'controlled') {\n setTouchedState(resolvedValues);\n }\n }, []);\n\n const setDirty = useCallback(\n (values: FormStatus | ((current: FormStatus) => FormStatus), forceUpdate = false) => {\n const resolvedValues = typeof values === 'function' ? values(dirtyRef.current) : values;\n dirtyRef.current = resolvedValues;\n\n if (mode === 'controlled' || forceUpdate) {\n setDirtyState(resolvedValues);\n }\n },\n []\n );\n\n const resetTouched: ResetStatus = useCallback(() => setTouched({}), []);\n\n const resetDirty: ResetDirty<Values> = useCallback((values) => {\n const newSnapshot = values\n ? { ...$values.refValues.current, ...values }\n : $values.refValues.current;\n $values.setValuesSnapshot(newSnapshot);\n setDirty({});\n }, []);\n\n const setFieldTouched: SetFieldTouched<Values> = useCallback((path, touched) => {\n setTouched((currentTouched) => {\n if (getStatus(currentTouched, path) === touched) {\n return currentTouched;\n }\n\n return { ...currentTouched, [path]: touched };\n });\n }, []);\n\n const setFieldDirty: SetFieldDirty<Values> = useCallback((path, dirty, forceUpdate) => {\n setDirty((currentDirty) => {\n if (getStatus(currentDirty, path) === dirty) {\n return currentDirty;\n }\n\n return { ...currentDirty, [path]: dirty };\n }, forceUpdate);\n }, []);\n\n const setCalculatedFieldDirty: SetCalculatedFieldDirty<Values> = useCallback((path, value) => {\n const currentDirty = getStatus(dirtyRef.current, path);\n const dirty = !isEqual(getPath(path, $values.getValuesSnapshot()), value);\n const clearedState = clearListState(path, dirtyRef.current);\n clearedState[path as string] = dirty;\n setDirty(clearedState, currentDirty !== dirty);\n }, []);\n\n const isTouched: GetFieldStatus<Values> = useCallback(\n (path) => getStatus(touchedRef.current, path),\n [touchedRef.current]\n );\n\n const clearFieldDirty: ClearFieldDirty = useCallback(\n (path) =>\n setDirty((current) => {\n if (typeof path !== 'string') {\n return current;\n }\n\n const result = clearListState(path, current);\n delete result[path];\n\n if (isEqual(result, current)) {\n return current;\n }\n\n return result;\n }),\n []\n );\n\n const isDirty: GetFieldStatus<Values> = useCallback(\n (path) => {\n if (path) {\n const overriddenValue = getPath(path, dirtyRef.current);\n if (typeof overriddenValue === 'boolean') {\n return overriddenValue;\n }\n\n const sliceOfValues = getPath(path, $values.refValues.current);\n const sliceOfInitialValues = getPath(path, $values.valuesSnapshot.current);\n return !isEqual(sliceOfValues, sliceOfInitialValues);\n }\n\n const isOverridden = Object.keys(dirtyRef.current).length > 0;\n if (isOverridden) {\n return getStatus(dirtyRef.current);\n }\n\n return !isEqual($values.refValues.current, $values.valuesSnapshot.current);\n },\n [dirtyRef.current, $values.refValues.current, $values.valuesSnapshot.current]\n );\n\n const getDirty = useCallback(() => dirtyRef.current, [dirtyRef.current]);\n const getTouched = useCallback(() => touchedRef.current, [touchedRef.current]);\n\n return {\n touchedState,\n dirtyState,\n touchedRef,\n dirtyRef,\n setTouched,\n setDirty,\n resetDirty,\n resetTouched,\n isTouched,\n setFieldTouched,\n setFieldDirty,\n setTouchedState,\n setDirtyState,\n clearFieldDirty,\n isDirty,\n getDirty,\n getTouched,\n setCalculatedFieldDirty,\n };\n}\n"],"mappings":"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"}
@@ -22,7 +22,7 @@ function useFormValidating() {
22
22
  if (path) return !!validatingRef.current[path];
23
23
  if (formValidatingRef.current) return true;
24
24
  return Object.values(validatingRef.current).some(Boolean);
25
- }, []);
25
+ }, [validatingRef.current, formValidatingRef.current]);
26
26
  const getAbortSignal = useCallback((path) => {
27
27
  abortControllers.current[path]?.abort();
28
28
  abortControllers.current[path] = new AbortController();
@@ -1 +1 @@
1
- {"version":3,"file":"use-form-validating.mjs","names":[],"sources":["../../../src/hooks/use-form-validating/use-form-validating.ts"],"sourcesContent":["import { useCallback, useRef, useState } from 'react';\n\nexport interface $FormValidating {\n validating: boolean;\n isValidating: (path?: string) => boolean;\n setFieldValidating: (path: string, validating: boolean) => void;\n setFormValidating: (validating: boolean) => void;\n getAbortSignal: (path: string) => AbortSignal;\n clearValidating: () => void;\n}\n\nexport function useFormValidating(): $FormValidating {\n const [validatingFields, setValidatingFields] = useState<Record<string, boolean>>({});\n const [formValidating, setFormValidatingState] = useState(false);\n const validatingRef = useRef<Record<string, boolean>>({});\n const formValidatingRef = useRef(false);\n const abortControllers = useRef<Record<string, AbortController>>({});\n\n const setFieldValidating = useCallback((path: string, value: boolean) => {\n validatingRef.current = { ...validatingRef.current, [path]: value };\n setValidatingFields({ ...validatingRef.current });\n }, []);\n\n const setFormValidating = useCallback((value: boolean) => {\n formValidatingRef.current = value;\n setFormValidatingState(value);\n }, []);\n\n const isValidating = useCallback((path?: string) => {\n if (path) {\n return !!validatingRef.current[path];\n }\n if (formValidatingRef.current) {\n return true;\n }\n return Object.values(validatingRef.current).some(Boolean);\n }, []);\n\n const getAbortSignal = useCallback((path: string) => {\n abortControllers.current[path]?.abort();\n abortControllers.current[path] = new AbortController();\n return abortControllers.current[path].signal;\n }, []);\n\n const clearValidating = useCallback(() => {\n validatingRef.current = {};\n setValidatingFields({});\n formValidatingRef.current = false;\n setFormValidatingState(false);\n Object.values(abortControllers.current).forEach((c) => c.abort());\n abortControllers.current = {};\n }, []);\n\n const validating = formValidating || Object.values(validatingFields).some(Boolean);\n\n return {\n validating,\n isValidating,\n setFieldValidating,\n setFormValidating,\n getAbortSignal,\n clearValidating,\n };\n}\n"],"mappings":";;;AAWA,SAAgB,oBAAqC;CACnD,MAAM,CAAC,kBAAkB,uBAAuB,SAAkC,CAAC,CAAC;CACpF,MAAM,CAAC,gBAAgB,0BAA0B,SAAS,KAAK;CAC/D,MAAM,gBAAgB,OAAgC,CAAC,CAAC;CACxD,MAAM,oBAAoB,OAAO,KAAK;CACtC,MAAM,mBAAmB,OAAwC,CAAC,CAAC;CAEnE,MAAM,qBAAqB,aAAa,MAAc,UAAmB;EACvE,cAAc,UAAU;GAAE,GAAG,cAAc;IAAU,OAAO;EAAM;EAClE,oBAAoB,EAAE,GAAG,cAAc,QAAQ,CAAC;CAClD,GAAG,CAAC,CAAC;CAEL,MAAM,oBAAoB,aAAa,UAAmB;EACxD,kBAAkB,UAAU;EAC5B,uBAAuB,KAAK;CAC9B,GAAG,CAAC,CAAC;CAEL,MAAM,eAAe,aAAa,SAAkB;EAClD,IAAI,MACF,OAAO,CAAC,CAAC,cAAc,QAAQ;EAEjC,IAAI,kBAAkB,SACpB,OAAO;EAET,OAAO,OAAO,OAAO,cAAc,OAAO,CAAC,CAAC,KAAK,OAAO;CAC1D,GAAG,CAAC,CAAC;CAEL,MAAM,iBAAiB,aAAa,SAAiB;EACnD,iBAAiB,QAAQ,KAAK,EAAE,MAAM;EACtC,iBAAiB,QAAQ,QAAQ,IAAI,gBAAgB;EACrD,OAAO,iBAAiB,QAAQ,KAAK,CAAC;CACxC,GAAG,CAAC,CAAC;CAEL,MAAM,kBAAkB,kBAAkB;EACxC,cAAc,UAAU,CAAC;EACzB,oBAAoB,CAAC,CAAC;EACtB,kBAAkB,UAAU;EAC5B,uBAAuB,KAAK;EAC5B,OAAO,OAAO,iBAAiB,OAAO,CAAC,CAAC,SAAS,MAAM,EAAE,MAAM,CAAC;EAChE,iBAAiB,UAAU,CAAC;CAC9B,GAAG,CAAC,CAAC;CAIL,OAAO;EACL,YAHiB,kBAAkB,OAAO,OAAO,gBAAgB,CAAC,CAAC,KAAK,OAAO;EAI/E;EACA;EACA;EACA;EACA;CACF;AACF"}
1
+ {"version":3,"file":"use-form-validating.mjs","names":[],"sources":["../../../src/hooks/use-form-validating/use-form-validating.ts"],"sourcesContent":["import { useCallback, useRef, useState } from 'react';\n\nexport interface $FormValidating {\n validating: boolean;\n isValidating: (path?: string) => boolean;\n setFieldValidating: (path: string, validating: boolean) => void;\n setFormValidating: (validating: boolean) => void;\n getAbortSignal: (path: string) => AbortSignal;\n clearValidating: () => void;\n}\n\nexport function useFormValidating(): $FormValidating {\n const [validatingFields, setValidatingFields] = useState<Record<string, boolean>>({});\n const [formValidating, setFormValidatingState] = useState(false);\n const validatingRef = useRef<Record<string, boolean>>({});\n const formValidatingRef = useRef(false);\n const abortControllers = useRef<Record<string, AbortController>>({});\n\n const setFieldValidating = useCallback((path: string, value: boolean) => {\n validatingRef.current = { ...validatingRef.current, [path]: value };\n setValidatingFields({ ...validatingRef.current });\n }, []);\n\n const setFormValidating = useCallback((value: boolean) => {\n formValidatingRef.current = value;\n setFormValidatingState(value);\n }, []);\n\n const isValidating = useCallback(\n (path?: string) => {\n if (path) {\n return !!validatingRef.current[path];\n }\n if (formValidatingRef.current) {\n return true;\n }\n return Object.values(validatingRef.current).some(Boolean);\n },\n [validatingRef.current, formValidatingRef.current]\n );\n\n const getAbortSignal = useCallback((path: string) => {\n abortControllers.current[path]?.abort();\n abortControllers.current[path] = new AbortController();\n return abortControllers.current[path].signal;\n }, []);\n\n const clearValidating = useCallback(() => {\n validatingRef.current = {};\n setValidatingFields({});\n formValidatingRef.current = false;\n setFormValidatingState(false);\n Object.values(abortControllers.current).forEach((c) => c.abort());\n abortControllers.current = {};\n }, []);\n\n const validating = formValidating || Object.values(validatingFields).some(Boolean);\n\n return {\n validating,\n isValidating,\n setFieldValidating,\n setFormValidating,\n getAbortSignal,\n clearValidating,\n };\n}\n"],"mappings":";;;AAWA,SAAgB,oBAAqC;CACnD,MAAM,CAAC,kBAAkB,uBAAuB,SAAkC,CAAC,CAAC;CACpF,MAAM,CAAC,gBAAgB,0BAA0B,SAAS,KAAK;CAC/D,MAAM,gBAAgB,OAAgC,CAAC,CAAC;CACxD,MAAM,oBAAoB,OAAO,KAAK;CACtC,MAAM,mBAAmB,OAAwC,CAAC,CAAC;CAEnE,MAAM,qBAAqB,aAAa,MAAc,UAAmB;EACvE,cAAc,UAAU;GAAE,GAAG,cAAc;IAAU,OAAO;EAAM;EAClE,oBAAoB,EAAE,GAAG,cAAc,QAAQ,CAAC;CAClD,GAAG,CAAC,CAAC;CAEL,MAAM,oBAAoB,aAAa,UAAmB;EACxD,kBAAkB,UAAU;EAC5B,uBAAuB,KAAK;CAC9B,GAAG,CAAC,CAAC;CAEL,MAAM,eAAe,aAClB,SAAkB;EACjB,IAAI,MACF,OAAO,CAAC,CAAC,cAAc,QAAQ;EAEjC,IAAI,kBAAkB,SACpB,OAAO;EAET,OAAO,OAAO,OAAO,cAAc,OAAO,CAAC,CAAC,KAAK,OAAO;CAC1D,GACA,CAAC,cAAc,SAAS,kBAAkB,OAAO,CACnD;CAEA,MAAM,iBAAiB,aAAa,SAAiB;EACnD,iBAAiB,QAAQ,KAAK,EAAE,MAAM;EACtC,iBAAiB,QAAQ,QAAQ,IAAI,gBAAgB;EACrD,OAAO,iBAAiB,QAAQ,KAAK,CAAC;CACxC,GAAG,CAAC,CAAC;CAEL,MAAM,kBAAkB,kBAAkB;EACxC,cAAc,UAAU,CAAC;EACzB,oBAAoB,CAAC,CAAC;EACtB,kBAAkB,UAAU;EAC5B,uBAAuB,KAAK;EAC5B,OAAO,OAAO,iBAAiB,OAAO,CAAC,CAAC,SAAS,MAAM,EAAE,MAAM,CAAC;EAChE,iBAAiB,UAAU,CAAC;CAC9B,GAAG,CAAC,CAAC;CAIL,OAAO;EACL,YAHiB,kBAAkB,OAAO,OAAO,gBAAgB,CAAC,CAAC,KAAK,OAAO;EAI/E;EACA;EACA;EACA;EACA;CACF;AACF"}
@@ -73,8 +73,8 @@ function useFormValues({ initialValues, onValuesChange, mode }) {
73
73
  }, [setValues]),
74
74
  setValuesSnapshot,
75
75
  initialize,
76
- getValues: useCallback(() => refValues.current, []),
77
- getValuesSnapshot: useCallback(() => valuesSnapshot.current, []),
76
+ getValues: useCallback(() => refValues.current, [refValues.current]),
77
+ getValuesSnapshot: useCallback(() => valuesSnapshot.current, [valuesSnapshot.current]),
78
78
  resetField: useCallback((path, subscribers) => {
79
79
  const snapshotValue = getPath(path, valuesSnapshot.current);
80
80
  if (typeof snapshotValue === "undefined") return;
@@ -1 +1 @@
1
- {"version":3,"file":"use-form-values.mjs","names":[],"sources":["../../../src/hooks/use-form-values/use-form-values.ts"],"sourcesContent":["import { useCallback, useRef, useState } from 'react';\nimport { getPath, setPath } from '../../paths';\nimport { FormMode } from '../../types';\n\nexport interface $FormValues<out Values extends Record<PropertyKey, any>> {\n initialized: React.RefObject<boolean>;\n stateValues: Values;\n refValues: React.RefObject<Values>;\n valuesSnapshot: React.RefObject<Values>;\n setValues: <TValues extends Values>(payload: SetValuesInput<TValues>) => void;\n setFieldValue: <TValues extends Values>(payload: SetFieldValueInput<TValues>) => void;\n resetValues: () => void;\n setValuesSnapshot: <TValues extends Values>(payload: TValues) => void;\n initialize: <TValues extends Values>(values: TValues, onInitialize: () => void) => void;\n getValues: () => Values;\n getValuesSnapshot: () => Values;\n resetField: <TValues extends Values>(\n path: PropertyKey,\n subscribers?: (SetFieldValueSubscriber<TValues> | null | undefined)[]\n ) => void;\n}\n\nexport interface SetValuesSubscriberPayload<Values> {\n path?: PropertyKey;\n updatedValues: Values;\n previousValues: Values;\n}\n\nexport interface SetValuesInput<out Values = Record<string, any>> {\n values: Partial<Values> | (<TValues extends Values>(values: TValues) => Partial<TValues>);\n mergeWithPreviousValues?: boolean;\n updateState?: boolean;\n subscribers?: (SetFieldValueSubscriber<Values> | null | undefined)[];\n}\n\nexport type SetFieldValueSubscriber<out Values> = <TValues extends Values>(\n payload: SetValuesSubscriberPayload<TValues>\n) => void;\n\nexport interface SetFieldValueInput<Values> {\n path: PropertyKey;\n value: any;\n updateState?: boolean;\n subscribers?: (SetFieldValueSubscriber<Values> | null | undefined)[];\n}\n\ninterface UseFormValuesInput<Values extends Record<PropertyKey, any>> {\n initialValues: Values | undefined;\n mode: FormMode;\n onValuesChange?: ((values: Values, previousValues: Values) => void) | undefined;\n}\n\nexport function useFormValues<Values extends Record<PropertyKey, any>>({\n initialValues,\n onValuesChange,\n mode,\n}: UseFormValuesInput<Values>): $FormValues<Values> {\n const initialized = useRef(false);\n const [stateValues, setStateValues] = useState<Values>(initialValues || ({} as Values));\n const refValues = useRef(stateValues);\n const valuesSnapshot = useRef(stateValues);\n\n const setValues = useCallback(\n ({\n values,\n subscribers,\n updateState = true,\n mergeWithPreviousValues = true,\n }: SetValuesInput<Values>) => {\n const previousValues = refValues.current;\n const resolvedValues = values instanceof Function ? values(refValues.current) : values;\n const updatedValues = mergeWithPreviousValues\n ? { ...previousValues, ...resolvedValues }\n : (resolvedValues as Values);\n refValues.current = updatedValues;\n if (updateState) {\n setStateValues(updatedValues);\n if (mode === 'uncontrolled') {\n refValues.current = updatedValues;\n }\n }\n onValuesChange?.(updatedValues, previousValues);\n subscribers\n ?.filter(Boolean)\n .forEach((subscriber) => subscriber!({ updatedValues, previousValues }));\n },\n [onValuesChange]\n );\n\n const setFieldValue = useCallback(\n (payload: SetFieldValueInput<Values>) => {\n const currentValue = getPath(payload.path, refValues.current);\n const updatedValue =\n payload.value instanceof Function ? payload.value(currentValue) : payload.value;\n\n if (currentValue !== updatedValue) {\n const previousValues = refValues.current;\n const updatedValues = setPath(payload.path, updatedValue, refValues.current);\n setValues({ values: updatedValues, updateState: payload.updateState });\n\n payload.subscribers\n ?.filter(Boolean)\n .forEach((subscriber) =>\n subscriber!({ path: payload.path, updatedValues, previousValues })\n );\n }\n },\n [setValues]\n );\n\n const setValuesSnapshot = useCallback((payload: Values) => {\n valuesSnapshot.current = payload;\n }, []);\n\n const initialize = useCallback(\n (values: Values, onInitialize: () => void) => {\n if (!initialized.current) {\n initialized.current = true;\n setValues({ values, updateState: mode === 'controlled' });\n setValuesSnapshot(values);\n onInitialize();\n }\n },\n [setValues]\n );\n\n const resetValues = useCallback(() => {\n setValues({\n values: valuesSnapshot.current,\n updateState: true,\n mergeWithPreviousValues: false,\n });\n }, [setValues]);\n\n const getValues = useCallback(() => refValues.current, []);\n const getValuesSnapshot = useCallback(() => valuesSnapshot.current, []);\n\n const resetField = useCallback(\n (path: PropertyKey, subscribers?: (SetFieldValueSubscriber<Values> | null | undefined)[]) => {\n const snapshotValue = getPath(path, valuesSnapshot.current);\n if (typeof snapshotValue === 'undefined') {\n return;\n }\n setFieldValue({\n path,\n value: snapshotValue,\n updateState: mode === 'controlled',\n subscribers,\n });\n },\n [setFieldValue, mode]\n );\n\n return {\n initialized,\n stateValues,\n refValues,\n valuesSnapshot,\n setValues,\n setFieldValue,\n resetValues,\n setValuesSnapshot,\n initialize,\n getValues,\n getValuesSnapshot,\n resetField,\n };\n}\n"],"mappings":";;;;;AAoDA,SAAgB,cAAuD,EACrE,eACA,gBACA,QACkD;CAClD,MAAM,cAAc,OAAO,KAAK;CAChC,MAAM,CAAC,aAAa,kBAAkB,SAAiB,iBAAkB,CAAC,CAAY;CACtF,MAAM,YAAY,OAAO,WAAW;CACpC,MAAM,iBAAiB,OAAO,WAAW;CAEzC,MAAM,YAAY,aACf,EACC,QACA,aACA,cAAc,MACd,0BAA0B,WACE;EAC5B,MAAM,iBAAiB,UAAU;EACjC,MAAM,iBAAiB,kBAAkB,WAAW,OAAO,UAAU,OAAO,IAAI;EAChF,MAAM,gBAAgB,0BAClB;GAAE,GAAG;GAAgB,GAAG;EAAe,IACtC;EACL,UAAU,UAAU;EACpB,IAAI,aAAa;GACf,eAAe,aAAa;GAC5B,IAAI,SAAS,gBACX,UAAU,UAAU;EAExB;EACA,iBAAiB,eAAe,cAAc;EAC9C,aACI,OAAO,OAAO,CAAC,CAChB,SAAS,eAAe,WAAY;GAAE;GAAe;EAAe,CAAC,CAAC;CAC3E,GACA,CAAC,cAAc,CACjB;CAEA,MAAM,gBAAgB,aACnB,YAAwC;EACvC,MAAM,eAAe,QAAQ,QAAQ,MAAM,UAAU,OAAO;EAC5D,MAAM,eACJ,QAAQ,iBAAiB,WAAW,QAAQ,MAAM,YAAY,IAAI,QAAQ;EAE5E,IAAI,iBAAiB,cAAc;GACjC,MAAM,iBAAiB,UAAU;GACjC,MAAM,gBAAgB,QAAQ,QAAQ,MAAM,cAAc,UAAU,OAAO;GAC3E,UAAU;IAAE,QAAQ;IAAe,aAAa,QAAQ;GAAY,CAAC;GAErE,QAAQ,aACJ,OAAO,OAAO,CAAC,CAChB,SAAS,eACR,WAAY;IAAE,MAAM,QAAQ;IAAM;IAAe;GAAe,CAAC,CACnE;EACJ;CACF,GACA,CAAC,SAAS,CACZ;CAEA,MAAM,oBAAoB,aAAa,YAAoB;EACzD,eAAe,UAAU;CAC3B,GAAG,CAAC,CAAC;CAEL,MAAM,aAAa,aAChB,QAAgB,iBAA6B;EAC5C,IAAI,CAAC,YAAY,SAAS;GACxB,YAAY,UAAU;GACtB,UAAU;IAAE;IAAQ,aAAa,SAAS;GAAa,CAAC;GACxD,kBAAkB,MAAM;GACxB,aAAa;EACf;CACF,GACA,CAAC,SAAS,CACZ;CA6BA,OAAO;EACL;EACA;EACA;EACA;EACA;EACA;EACA,aAlCkB,kBAAkB;GACpC,UAAU;IACR,QAAQ,eAAe;IACvB,aAAa;IACb,yBAAyB;GAC3B,CAAC;EACH,GAAG,CAAC,SAAS,CA4BD;EACV;EACA;EACA,WA7BgB,kBAAkB,UAAU,SAAS,CAAC,CA6B9C;EACR,mBA7BwB,kBAAkB,eAAe,SAAS,CAAC,CA6BnD;EAChB,YA5BiB,aAChB,MAAmB,gBAAyE;GAC3F,MAAM,gBAAgB,QAAQ,MAAM,eAAe,OAAO;GAC1D,IAAI,OAAO,kBAAkB,aAC3B;GAEF,cAAc;IACZ;IACA,OAAO;IACP,aAAa,SAAS;IACtB;GACF,CAAC;EACH,GACA,CAAC,eAAe,IAAI,CAeX;CACX;AACF"}
1
+ {"version":3,"file":"use-form-values.mjs","names":[],"sources":["../../../src/hooks/use-form-values/use-form-values.ts"],"sourcesContent":["import { useCallback, useRef, useState } from 'react';\nimport { getPath, setPath } from '../../paths';\nimport { FormMode } from '../../types';\n\nexport interface $FormValues<out Values extends Record<PropertyKey, any>> {\n initialized: React.RefObject<boolean>;\n stateValues: Values;\n refValues: React.RefObject<Values>;\n valuesSnapshot: React.RefObject<Values>;\n setValues: <TValues extends Values>(payload: SetValuesInput<TValues>) => void;\n setFieldValue: <TValues extends Values>(payload: SetFieldValueInput<TValues>) => void;\n resetValues: () => void;\n setValuesSnapshot: <TValues extends Values>(payload: TValues) => void;\n initialize: <TValues extends Values>(values: TValues, onInitialize: () => void) => void;\n getValues: () => Values;\n getValuesSnapshot: () => Values;\n resetField: <TValues extends Values>(\n path: PropertyKey,\n subscribers?: (SetFieldValueSubscriber<TValues> | null | undefined)[]\n ) => void;\n}\n\nexport interface SetValuesSubscriberPayload<Values> {\n path?: PropertyKey;\n updatedValues: Values;\n previousValues: Values;\n}\n\nexport interface SetValuesInput<out Values = Record<string, any>> {\n values: Partial<Values> | (<TValues extends Values>(values: TValues) => Partial<TValues>);\n mergeWithPreviousValues?: boolean;\n updateState?: boolean;\n subscribers?: (SetFieldValueSubscriber<Values> | null | undefined)[];\n}\n\nexport type SetFieldValueSubscriber<out Values> = <TValues extends Values>(\n payload: SetValuesSubscriberPayload<TValues>\n) => void;\n\nexport interface SetFieldValueInput<Values> {\n path: PropertyKey;\n value: any;\n updateState?: boolean;\n subscribers?: (SetFieldValueSubscriber<Values> | null | undefined)[];\n}\n\ninterface UseFormValuesInput<Values extends Record<PropertyKey, any>> {\n initialValues: Values | undefined;\n mode: FormMode;\n onValuesChange?: ((values: Values, previousValues: Values) => void) | undefined;\n}\n\nexport function useFormValues<Values extends Record<PropertyKey, any>>({\n initialValues,\n onValuesChange,\n mode,\n}: UseFormValuesInput<Values>): $FormValues<Values> {\n const initialized = useRef(false);\n const [stateValues, setStateValues] = useState<Values>(initialValues || ({} as Values));\n const refValues = useRef(stateValues);\n const valuesSnapshot = useRef(stateValues);\n\n const setValues = useCallback(\n ({\n values,\n subscribers,\n updateState = true,\n mergeWithPreviousValues = true,\n }: SetValuesInput<Values>) => {\n const previousValues = refValues.current;\n const resolvedValues = values instanceof Function ? values(refValues.current) : values;\n const updatedValues = mergeWithPreviousValues\n ? { ...previousValues, ...resolvedValues }\n : (resolvedValues as Values);\n refValues.current = updatedValues;\n if (updateState) {\n setStateValues(updatedValues);\n if (mode === 'uncontrolled') {\n refValues.current = updatedValues;\n }\n }\n onValuesChange?.(updatedValues, previousValues);\n subscribers\n ?.filter(Boolean)\n .forEach((subscriber) => subscriber!({ updatedValues, previousValues }));\n },\n [onValuesChange]\n );\n\n const setFieldValue = useCallback(\n (payload: SetFieldValueInput<Values>) => {\n const currentValue = getPath(payload.path, refValues.current);\n const updatedValue =\n payload.value instanceof Function ? payload.value(currentValue) : payload.value;\n\n if (currentValue !== updatedValue) {\n const previousValues = refValues.current;\n const updatedValues = setPath(payload.path, updatedValue, refValues.current);\n setValues({ values: updatedValues, updateState: payload.updateState });\n\n payload.subscribers\n ?.filter(Boolean)\n .forEach((subscriber) =>\n subscriber!({ path: payload.path, updatedValues, previousValues })\n );\n }\n },\n [setValues]\n );\n\n const setValuesSnapshot = useCallback((payload: Values) => {\n valuesSnapshot.current = payload;\n }, []);\n\n const initialize = useCallback(\n (values: Values, onInitialize: () => void) => {\n if (!initialized.current) {\n initialized.current = true;\n setValues({ values, updateState: mode === 'controlled' });\n setValuesSnapshot(values);\n onInitialize();\n }\n },\n [setValues]\n );\n\n const resetValues = useCallback(() => {\n setValues({\n values: valuesSnapshot.current,\n updateState: true,\n mergeWithPreviousValues: false,\n });\n }, [setValues]);\n\n const getValues = useCallback(() => refValues.current, [refValues.current]);\n const getValuesSnapshot = useCallback(() => valuesSnapshot.current, [valuesSnapshot.current]);\n\n const resetField = useCallback(\n (path: PropertyKey, subscribers?: (SetFieldValueSubscriber<Values> | null | undefined)[]) => {\n const snapshotValue = getPath(path, valuesSnapshot.current);\n if (typeof snapshotValue === 'undefined') {\n return;\n }\n setFieldValue({\n path,\n value: snapshotValue,\n updateState: mode === 'controlled',\n subscribers,\n });\n },\n [setFieldValue, mode]\n );\n\n return {\n initialized,\n stateValues,\n refValues,\n valuesSnapshot,\n setValues,\n setFieldValue,\n resetValues,\n setValuesSnapshot,\n initialize,\n getValues,\n getValuesSnapshot,\n resetField,\n };\n}\n"],"mappings":";;;;;AAoDA,SAAgB,cAAuD,EACrE,eACA,gBACA,QACkD;CAClD,MAAM,cAAc,OAAO,KAAK;CAChC,MAAM,CAAC,aAAa,kBAAkB,SAAiB,iBAAkB,CAAC,CAAY;CACtF,MAAM,YAAY,OAAO,WAAW;CACpC,MAAM,iBAAiB,OAAO,WAAW;CAEzC,MAAM,YAAY,aACf,EACC,QACA,aACA,cAAc,MACd,0BAA0B,WACE;EAC5B,MAAM,iBAAiB,UAAU;EACjC,MAAM,iBAAiB,kBAAkB,WAAW,OAAO,UAAU,OAAO,IAAI;EAChF,MAAM,gBAAgB,0BAClB;GAAE,GAAG;GAAgB,GAAG;EAAe,IACtC;EACL,UAAU,UAAU;EACpB,IAAI,aAAa;GACf,eAAe,aAAa;GAC5B,IAAI,SAAS,gBACX,UAAU,UAAU;EAExB;EACA,iBAAiB,eAAe,cAAc;EAC9C,aACI,OAAO,OAAO,CAAC,CAChB,SAAS,eAAe,WAAY;GAAE;GAAe;EAAe,CAAC,CAAC;CAC3E,GACA,CAAC,cAAc,CACjB;CAEA,MAAM,gBAAgB,aACnB,YAAwC;EACvC,MAAM,eAAe,QAAQ,QAAQ,MAAM,UAAU,OAAO;EAC5D,MAAM,eACJ,QAAQ,iBAAiB,WAAW,QAAQ,MAAM,YAAY,IAAI,QAAQ;EAE5E,IAAI,iBAAiB,cAAc;GACjC,MAAM,iBAAiB,UAAU;GACjC,MAAM,gBAAgB,QAAQ,QAAQ,MAAM,cAAc,UAAU,OAAO;GAC3E,UAAU;IAAE,QAAQ;IAAe,aAAa,QAAQ;GAAY,CAAC;GAErE,QAAQ,aACJ,OAAO,OAAO,CAAC,CAChB,SAAS,eACR,WAAY;IAAE,MAAM,QAAQ;IAAM;IAAe;GAAe,CAAC,CACnE;EACJ;CACF,GACA,CAAC,SAAS,CACZ;CAEA,MAAM,oBAAoB,aAAa,YAAoB;EACzD,eAAe,UAAU;CAC3B,GAAG,CAAC,CAAC;CAEL,MAAM,aAAa,aAChB,QAAgB,iBAA6B;EAC5C,IAAI,CAAC,YAAY,SAAS;GACxB,YAAY,UAAU;GACtB,UAAU;IAAE;IAAQ,aAAa,SAAS;GAAa,CAAC;GACxD,kBAAkB,MAAM;GACxB,aAAa;EACf;CACF,GACA,CAAC,SAAS,CACZ;CA6BA,OAAO;EACL;EACA;EACA;EACA;EACA;EACA;EACA,aAlCkB,kBAAkB;GACpC,UAAU;IACR,QAAQ,eAAe;IACvB,aAAa;IACb,yBAAyB;GAC3B,CAAC;EACH,GAAG,CAAC,SAAS,CA4BD;EACV;EACA;EACA,WA7BgB,kBAAkB,UAAU,SAAS,CAAC,UAAU,OAAO,CA6B/D;EACR,mBA7BwB,kBAAkB,eAAe,SAAS,CAAC,eAAe,OAAO,CA6BzE;EAChB,YA5BiB,aAChB,MAAmB,gBAAyE;GAC3F,MAAM,gBAAgB,QAAQ,MAAM,eAAe,OAAO;GAC1D,IAAI,OAAO,kBAAkB,aAC3B;GAEF,cAAc;IACZ;IACA,OAAO;IACP,aAAa,SAAS;IACtB;GACF,CAAC;EACH,GACA,CAAC,eAAe,IAAI,CAeX;CACX;AACF"}
package/esm/use-field.mjs CHANGED
@@ -34,9 +34,9 @@ function useField({ mode = "controlled", clearErrorOnChange = true, initialValue
34
34
  setError(null);
35
35
  setTouched(false);
36
36
  }, [initialValue]);
37
- const getValue = useCallback(() => valueRef.current, []);
38
- const isTouched = useCallback(() => touchedRef.current, []);
39
- const isDirty = useCallback(() => valueRef.current !== initialValue, [initialValue]);
37
+ const getValue = useCallback(() => valueRef.current, [valueRef.current]);
38
+ const isTouched = useCallback(() => touchedRef.current, [touchedRef.current]);
39
+ const isDirty = useCallback(() => valueRef.current !== initialValue, [valueRef.current, initialValue]);
40
40
  const _validate = useCallback(async () => {
41
41
  const validationResult = validate?.(valueRef.current);
42
42
  if (validationResult instanceof Promise) {
@@ -1 +1 @@
1
- {"version":3,"file":"use-field.mjs","names":[],"sources":["../src/use-field.ts"],"sourcesContent":["import { useCallback, useMemo, useRef, useState } from 'react';\nimport { getInputOnChange } from './get-input-on-change';\nimport { FormMode, GetInputPropsType } from './types';\nimport { shouldValidateOnChange } from './validate';\n\ntype UseFieldErrorResolver = (error: unknown) => React.ReactNode;\n\nexport interface UseFieldInput<\n T,\n FieldType extends GetInputPropsType = 'input',\n Mode extends FormMode = 'controlled',\n> {\n /** Field mode, controlled by default */\n mode?: Mode;\n\n /** Initial field value */\n initialValue: T;\n\n /** Initial touched value */\n initialTouched?: boolean;\n\n /** Initial field error message */\n initialError?: React.ReactNode;\n\n /** Called with updated value when the field value changes */\n onValueChange?: (value: T) => void;\n\n /** Determines whether the field should be validated when value changes, false by default */\n validateOnChange?: boolean;\n\n /** Determines whether the field should be validated when it loses focus, false by default */\n validateOnBlur?: boolean;\n\n /** Determines whether the field should clear error message when value changes, true by default */\n clearErrorOnChange?: boolean;\n\n /** A function to validate field value, can be sync or async */\n validate?: (value: T) => React.ReactNode | Promise<React.ReactNode>;\n\n /** Field type, input by default */\n type?: FieldType;\n\n /** A function to resolve validation error from the result returned from validate function, should return react node */\n resolveValidationError?: UseFieldErrorResolver;\n}\n\ninterface SetValueOptions {\n updateState?: boolean;\n updateKey?: boolean;\n}\n\ninterface GetInputPropsOptions {\n withError?: boolean;\n withFocus?: boolean;\n [key: string]: any;\n}\n\ninterface GetInputPropsSharedReturn {\n error?: React.ReactNode;\n onFocus?: () => void;\n onBlur: () => void;\n onChange: (value: any) => void;\n}\n\ntype GetInputPropsTypeValue<\n T,\n FieldType extends GetInputPropsType,\n Mode extends FormMode,\n> = FieldType extends 'checkbox'\n ? Mode extends 'controlled'\n ? { checked: boolean }\n : { defaultChecked: boolean }\n : FieldType extends 'radio'\n ? Mode extends 'controlled'\n ? { checked: boolean; value: T }\n : { defaultChecked: boolean; value: T }\n : Mode extends 'controlled'\n ? { value: T }\n : { defaultValue: T };\n\ntype GetInputPropsReturnType<\n T,\n FieldType extends GetInputPropsType,\n Mode extends FormMode,\n> = GetInputPropsSharedReturn & GetInputPropsTypeValue<T, FieldType, Mode>;\n\nexport interface UseFieldReturnType<\n T,\n FieldType extends GetInputPropsType = 'input',\n Mode extends FormMode = 'controlled',\n> {\n /** Returns props to pass to the input element */\n getInputProps: (options?: GetInputPropsOptions) => GetInputPropsReturnType<T, FieldType, Mode>;\n\n /** Returns current input value */\n getValue: () => T;\n\n /** Sets input value to the given value */\n setValue: (value: T) => void;\n\n /** Resets field value to initial state, sets touched state to false, sets error to null */\n reset: () => void;\n\n /** Validates current input value when called */\n validate: () => Promise<React.ReactNode | void>;\n\n /** Set to true when async validate function is called, stays true until the returned promise resolves */\n isValidating: boolean;\n\n /** Current error message */\n error: React.ReactNode;\n\n /** Sets error message to the given react node */\n setError: (error: React.ReactNode) => void;\n\n /** Returns true if the input has been focused at least once */\n isTouched: () => boolean;\n\n /** Returns true if input value is different from the initial value */\n isDirty: () => boolean;\n\n /** Resets touched state to false */\n resetTouched: () => void;\n\n /** Key that should be added to the input when mode is uncontrolled */\n key: number;\n}\n\nexport function useField<\n T,\n Mode extends FormMode = 'controlled',\n FieldType extends GetInputPropsType = 'input',\n>({\n mode = 'controlled' as Mode,\n clearErrorOnChange = true,\n initialValue,\n initialError = null,\n initialTouched = false,\n onValueChange,\n validateOnChange = false,\n validateOnBlur = false,\n validate,\n resolveValidationError,\n type = 'input' as FieldType,\n}: UseFieldInput<T, FieldType, Mode>): UseFieldReturnType<T, FieldType, Mode> {\n const [valueState, setValueState] = useState(initialValue);\n const valueRef = useRef(valueState);\n const [key, setKey] = useState(0);\n const [error, setError] = useState<React.ReactNode>(initialError || null);\n const touchedRef = useRef(initialTouched || false);\n const [, setTouchedState] = useState(touchedRef.current);\n const [isValidating, setIsValidating] = useState(false);\n const errorResolver: UseFieldErrorResolver = useMemo(\n () => resolveValidationError || ((err) => err as React.ReactNode),\n [resolveValidationError]\n );\n\n const setTouched = useCallback((val: boolean, { updateState = mode === 'controlled' } = {}) => {\n touchedRef.current = val;\n updateState && setTouchedState(val);\n }, []);\n\n const setValue = useCallback(\n (\n value: T,\n {\n updateKey = mode === 'uncontrolled',\n updateState = mode === 'controlled',\n }: SetValueOptions = {}\n ) => {\n if (valueRef.current === value) {\n return;\n }\n\n valueRef.current = value;\n\n onValueChange?.(value);\n\n if (clearErrorOnChange && error !== null) {\n setError(null);\n }\n\n if (updateState) {\n setValueState(value);\n }\n\n if (updateKey) {\n setKey((currentKey) => currentKey + 1);\n }\n\n if (validateOnChange) {\n _validate();\n }\n },\n [error, clearErrorOnChange, onValueChange]\n );\n\n const reset = useCallback(() => {\n setValue(initialValue);\n setError(null);\n setTouched(false);\n }, [initialValue]);\n\n const getValue = useCallback(() => valueRef.current, []);\n\n const isTouched = useCallback(() => touchedRef.current, []);\n\n const isDirty = useCallback(() => valueRef.current !== initialValue, [initialValue]);\n\n const _validate = useCallback(async () => {\n const validationResult = validate?.(valueRef.current);\n\n if (validationResult instanceof Promise) {\n setIsValidating(true);\n try {\n const result = await validationResult;\n setIsValidating(false);\n setError(result);\n } catch (err) {\n setIsValidating(false);\n const resolvedError = errorResolver(err);\n setError(resolvedError);\n return resolvedError;\n }\n } else {\n setError(validationResult);\n return validationResult;\n }\n }, []);\n\n const getInputProps = ({ withError = true, withFocus = true, ...otherOptions }: any = {}) => {\n const onChange = getInputOnChange<T>((val) => setValue(val as any, { updateKey: false }));\n\n const payload: any = { onChange };\n\n if (withError) {\n payload.error = error;\n }\n\n if (type === 'checkbox') {\n payload[mode === 'controlled' ? 'checked' : 'defaultChecked'] = valueRef.current;\n } else if (type === 'radio') {\n payload[mode === 'controlled' ? 'checked' : 'defaultChecked'] =\n valueRef.current === otherOptions.value;\n payload.value = otherOptions.value;\n } else {\n payload[mode === 'controlled' ? 'value' : 'defaultValue'] = valueRef.current;\n }\n\n if (withFocus) {\n payload.onFocus = () => {\n setTouched(true);\n };\n\n payload.onBlur = () => {\n if (shouldValidateOnChange('', !!validateOnBlur)) {\n _validate();\n }\n };\n }\n\n return payload;\n };\n\n const resetTouched = useCallback(() => setTouched(false), []);\n\n return {\n key,\n getValue,\n setValue,\n reset,\n getInputProps,\n\n isValidating,\n validate: _validate,\n\n error,\n setError,\n\n isTouched,\n isDirty,\n resetTouched,\n };\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"use-field.mjs","names":[],"sources":["../src/use-field.ts"],"sourcesContent":["import { useCallback, useMemo, useRef, useState } from 'react';\nimport { getInputOnChange } from './get-input-on-change';\nimport { FormMode, GetInputPropsType } from './types';\nimport { shouldValidateOnChange } from './validate';\n\ntype UseFieldErrorResolver = (error: unknown) => React.ReactNode;\n\nexport interface UseFieldInput<\n T,\n FieldType extends GetInputPropsType = 'input',\n Mode extends FormMode = 'controlled',\n> {\n /** Field mode, controlled by default */\n mode?: Mode;\n\n /** Initial field value */\n initialValue: T;\n\n /** Initial touched value */\n initialTouched?: boolean;\n\n /** Initial field error message */\n initialError?: React.ReactNode;\n\n /** Called with updated value when the field value changes */\n onValueChange?: (value: T) => void;\n\n /** Determines whether the field should be validated when value changes, false by default */\n validateOnChange?: boolean;\n\n /** Determines whether the field should be validated when it loses focus, false by default */\n validateOnBlur?: boolean;\n\n /** Determines whether the field should clear error message when value changes, true by default */\n clearErrorOnChange?: boolean;\n\n /** A function to validate field value, can be sync or async */\n validate?: (value: T) => React.ReactNode | Promise<React.ReactNode>;\n\n /** Field type, input by default */\n type?: FieldType;\n\n /** A function to resolve validation error from the result returned from validate function, should return react node */\n resolveValidationError?: UseFieldErrorResolver;\n}\n\ninterface SetValueOptions {\n updateState?: boolean;\n updateKey?: boolean;\n}\n\ninterface GetInputPropsOptions {\n withError?: boolean;\n withFocus?: boolean;\n [key: string]: any;\n}\n\ninterface GetInputPropsSharedReturn {\n error?: React.ReactNode;\n onFocus?: () => void;\n onBlur: () => void;\n onChange: (value: any) => void;\n}\n\ntype GetInputPropsTypeValue<\n T,\n FieldType extends GetInputPropsType,\n Mode extends FormMode,\n> = FieldType extends 'checkbox'\n ? Mode extends 'controlled'\n ? { checked: boolean }\n : { defaultChecked: boolean }\n : FieldType extends 'radio'\n ? Mode extends 'controlled'\n ? { checked: boolean; value: T }\n : { defaultChecked: boolean; value: T }\n : Mode extends 'controlled'\n ? { value: T }\n : { defaultValue: T };\n\ntype GetInputPropsReturnType<\n T,\n FieldType extends GetInputPropsType,\n Mode extends FormMode,\n> = GetInputPropsSharedReturn & GetInputPropsTypeValue<T, FieldType, Mode>;\n\nexport interface UseFieldReturnType<\n T,\n FieldType extends GetInputPropsType = 'input',\n Mode extends FormMode = 'controlled',\n> {\n /** Returns props to pass to the input element */\n getInputProps: (options?: GetInputPropsOptions) => GetInputPropsReturnType<T, FieldType, Mode>;\n\n /** Returns current input value */\n getValue: () => T;\n\n /** Sets input value to the given value */\n setValue: (value: T) => void;\n\n /** Resets field value to initial state, sets touched state to false, sets error to null */\n reset: () => void;\n\n /** Validates current input value when called */\n validate: () => Promise<React.ReactNode | void>;\n\n /** Set to true when async validate function is called, stays true until the returned promise resolves */\n isValidating: boolean;\n\n /** Current error message */\n error: React.ReactNode;\n\n /** Sets error message to the given react node */\n setError: (error: React.ReactNode) => void;\n\n /** Returns true if the input has been focused at least once */\n isTouched: () => boolean;\n\n /** Returns true if input value is different from the initial value */\n isDirty: () => boolean;\n\n /** Resets touched state to false */\n resetTouched: () => void;\n\n /** Key that should be added to the input when mode is uncontrolled */\n key: number;\n}\n\nexport function useField<\n T,\n Mode extends FormMode = 'controlled',\n FieldType extends GetInputPropsType = 'input',\n>({\n mode = 'controlled' as Mode,\n clearErrorOnChange = true,\n initialValue,\n initialError = null,\n initialTouched = false,\n onValueChange,\n validateOnChange = false,\n validateOnBlur = false,\n validate,\n resolveValidationError,\n type = 'input' as FieldType,\n}: UseFieldInput<T, FieldType, Mode>): UseFieldReturnType<T, FieldType, Mode> {\n const [valueState, setValueState] = useState(initialValue);\n const valueRef = useRef(valueState);\n const [key, setKey] = useState(0);\n const [error, setError] = useState<React.ReactNode>(initialError || null);\n const touchedRef = useRef(initialTouched || false);\n const [, setTouchedState] = useState(touchedRef.current);\n const [isValidating, setIsValidating] = useState(false);\n const errorResolver: UseFieldErrorResolver = useMemo(\n () => resolveValidationError || ((err) => err as React.ReactNode),\n [resolveValidationError]\n );\n\n const setTouched = useCallback((val: boolean, { updateState = mode === 'controlled' } = {}) => {\n touchedRef.current = val;\n updateState && setTouchedState(val);\n }, []);\n\n const setValue = useCallback(\n (\n value: T,\n {\n updateKey = mode === 'uncontrolled',\n updateState = mode === 'controlled',\n }: SetValueOptions = {}\n ) => {\n if (valueRef.current === value) {\n return;\n }\n\n valueRef.current = value;\n\n onValueChange?.(value);\n\n if (clearErrorOnChange && error !== null) {\n setError(null);\n }\n\n if (updateState) {\n setValueState(value);\n }\n\n if (updateKey) {\n setKey((currentKey) => currentKey + 1);\n }\n\n if (validateOnChange) {\n _validate();\n }\n },\n [error, clearErrorOnChange, onValueChange]\n );\n\n const reset = useCallback(() => {\n setValue(initialValue);\n setError(null);\n setTouched(false);\n }, [initialValue]);\n\n const getValue = useCallback(() => valueRef.current, [valueRef.current]);\n\n const isTouched = useCallback(() => touchedRef.current, [touchedRef.current]);\n\n const isDirty = useCallback(\n () => valueRef.current !== initialValue,\n [valueRef.current, initialValue]\n );\n\n const _validate = useCallback(async () => {\n const validationResult = validate?.(valueRef.current);\n\n if (validationResult instanceof Promise) {\n setIsValidating(true);\n try {\n const result = await validationResult;\n setIsValidating(false);\n setError(result);\n } catch (err) {\n setIsValidating(false);\n const resolvedError = errorResolver(err);\n setError(resolvedError);\n return resolvedError;\n }\n } else {\n setError(validationResult);\n return validationResult;\n }\n }, []);\n\n const getInputProps = ({ withError = true, withFocus = true, ...otherOptions }: any = {}) => {\n const onChange = getInputOnChange<T>((val) => setValue(val as any, { updateKey: false }));\n\n const payload: any = { onChange };\n\n if (withError) {\n payload.error = error;\n }\n\n if (type === 'checkbox') {\n payload[mode === 'controlled' ? 'checked' : 'defaultChecked'] = valueRef.current;\n } else if (type === 'radio') {\n payload[mode === 'controlled' ? 'checked' : 'defaultChecked'] =\n valueRef.current === otherOptions.value;\n payload.value = otherOptions.value;\n } else {\n payload[mode === 'controlled' ? 'value' : 'defaultValue'] = valueRef.current;\n }\n\n if (withFocus) {\n payload.onFocus = () => {\n setTouched(true);\n };\n\n payload.onBlur = () => {\n if (shouldValidateOnChange('', !!validateOnBlur)) {\n _validate();\n }\n };\n }\n\n return payload;\n };\n\n const resetTouched = useCallback(() => setTouched(false), []);\n\n return {\n key,\n getValue,\n setValue,\n reset,\n getInputProps,\n\n isValidating,\n validate: _validate,\n\n error,\n setError,\n\n isTouched,\n isDirty,\n resetTouched,\n };\n}\n"],"mappings":";;;;;AAgIA,SAAgB,SAId,EACA,OAAO,cACP,qBAAqB,MACrB,cACA,eAAe,MACf,iBAAiB,OACjB,eACA,mBAAmB,OACnB,iBAAiB,OACjB,UACA,wBACA,OAAO,WACqE;CAC5E,MAAM,CAAC,YAAY,iBAAiB,SAAS,YAAY;CACzD,MAAM,WAAW,OAAO,UAAU;CAClC,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC;CAChC,MAAM,CAAC,OAAO,YAAY,SAA0B,gBAAgB,IAAI;CACxE,MAAM,aAAa,OAAO,kBAAkB,KAAK;CACjD,MAAM,GAAG,mBAAmB,SAAS,WAAW,OAAO;CACvD,MAAM,CAAC,cAAc,mBAAmB,SAAS,KAAK;CACtD,MAAM,gBAAuC,cACrC,4BAA4B,QAAQ,MAC1C,CAAC,sBAAsB,CACzB;CAEA,MAAM,aAAa,aAAa,KAAc,EAAE,cAAc,SAAS,iBAAiB,CAAC,MAAM;EAC7F,WAAW,UAAU;EACrB,eAAe,gBAAgB,GAAG;CACpC,GAAG,CAAC,CAAC;CAEL,MAAM,WAAW,aAEb,OACA,EACE,YAAY,SAAS,gBACrB,cAAc,SAAS,iBACJ,CAAC,MACnB;EACH,IAAI,SAAS,YAAY,OACvB;EAGF,SAAS,UAAU;EAEnB,gBAAgB,KAAK;EAErB,IAAI,sBAAsB,UAAU,MAClC,SAAS,IAAI;EAGf,IAAI,aACF,cAAc,KAAK;EAGrB,IAAI,WACF,QAAQ,eAAe,aAAa,CAAC;EAGvC,IAAI,kBACF,UAAU;CAEd,GACA;EAAC;EAAO;EAAoB;CAAa,CAC3C;CAEA,MAAM,QAAQ,kBAAkB;EAC9B,SAAS,YAAY;EACrB,SAAS,IAAI;EACb,WAAW,KAAK;CAClB,GAAG,CAAC,YAAY,CAAC;CAEjB,MAAM,WAAW,kBAAkB,SAAS,SAAS,CAAC,SAAS,OAAO,CAAC;CAEvE,MAAM,YAAY,kBAAkB,WAAW,SAAS,CAAC,WAAW,OAAO,CAAC;CAE5E,MAAM,UAAU,kBACR,SAAS,YAAY,cAC3B,CAAC,SAAS,SAAS,YAAY,CACjC;CAEA,MAAM,YAAY,YAAY,YAAY;EACxC,MAAM,mBAAmB,WAAW,SAAS,OAAO;EAEpD,IAAI,4BAA4B,SAAS;GACvC,gBAAgB,IAAI;GACpB,IAAI;IACF,MAAM,SAAS,MAAM;IACrB,gBAAgB,KAAK;IACrB,SAAS,MAAM;GACjB,SAAS,KAAK;IACZ,gBAAgB,KAAK;IACrB,MAAM,gBAAgB,cAAc,GAAG;IACvC,SAAS,aAAa;IACtB,OAAO;GACT;EACF,OAAO;GACL,SAAS,gBAAgB;GACzB,OAAO;EACT;CACF,GAAG,CAAC,CAAC;CAEL,MAAM,iBAAiB,EAAE,YAAY,MAAM,YAAY,MAAM,GAAG,iBAAsB,CAAC,MAAM;EAG3F,MAAM,UAAe,EAAE,UAFN,kBAAqB,QAAQ,SAAS,KAAY,EAAE,WAAW,MAAM,CAAC,CAEzD,EAAE;EAEhC,IAAI,WACF,QAAQ,QAAQ;EAGlB,IAAI,SAAS,YACX,QAAQ,SAAS,eAAe,YAAY,oBAAoB,SAAS;OACpE,IAAI,SAAS,SAAS;GAC3B,QAAQ,SAAS,eAAe,YAAY,oBAC1C,SAAS,YAAY,aAAa;GACpC,QAAQ,QAAQ,aAAa;EAC/B,OACE,QAAQ,SAAS,eAAe,UAAU,kBAAkB,SAAS;EAGvE,IAAI,WAAW;GACb,QAAQ,gBAAgB;IACtB,WAAW,IAAI;GACjB;GAEA,QAAQ,eAAe;IACrB,IAAI,uBAAuB,IAAI,CAAC,CAAC,cAAc,GAC7C,UAAU;GAEd;EACF;EAEA,OAAO;CACT;CAIA,OAAO;EACL;EACA;EACA;EACA;EACA;EAEA;EACA,UAAU;EAEV;EACA;EAEA;EACA;EACA,cAjBmB,kBAAkB,WAAW,KAAK,GAAG,CAAC,CAiB9C;CACb;AACF"}
package/esm/use-form.mjs CHANGED
@@ -229,9 +229,13 @@ function useForm({ name, mode = "controlled", initialValues, initialErrors = {},
229
229
  const result = validateValues(rules, $values.refValues.current, resolveValidationError, signal);
230
230
  if (result instanceof Promise) return result.then((r) => !r.hasErrors);
231
231
  return !result.hasErrors;
232
- }, [rules, resolveValidationError]);
232
+ }, [
233
+ rules,
234
+ resolveValidationError,
235
+ $values.refValues.current
236
+ ]);
233
237
  const key = (path) => `${formKey}-${String(path)}-${fieldKeys[String(path)] || 0}`;
234
- const getInputNode = useCallback((path) => document.querySelector(`[data-path="${getDataPath(name, path)}"]`), []);
238
+ const getInputNode = (path) => document.querySelector(`[data-path="${getDataPath(name, path)}"]`);
235
239
  const resetField = useCallback((path) => {
236
240
  $values.resetField(path, [mode !== "controlled" ? () => setFieldKeys((keys) => ({
237
241
  ...keys,
@@ -1 +1 @@
1
- {"version":3,"file":"use-form.mjs","names":[],"sources":["../src/use-form.ts"],"sourcesContent":["import { useCallback, useMemo, useRef, useState } from 'react';\nimport { useFormActions } from './actions';\nimport { getInputOnChange } from './get-input-on-change';\nimport { useFormErrors } from './hooks/use-form-errors/use-form-errors';\nimport { useFormList } from './hooks/use-form-list/use-form-list';\nimport { useFormStatus } from './hooks/use-form-status/use-form-status';\nimport { useFormValidating } from './hooks/use-form-validating/use-form-validating';\nimport { useFormValues } from './hooks/use-form-values/use-form-values';\nimport { useFormWatch } from './hooks/use-form-watch/use-form-watch';\nimport { getDataPath, getPath } from './paths';\nimport {\n FormErrors,\n FormRulesRecord,\n GetInputNode,\n GetInputProps,\n GetTransformedValues,\n Initialize,\n IsValidating,\n Key,\n OnReset,\n OnSubmit,\n Reset,\n SetFieldValue,\n SetValues,\n UseFormInput,\n UseFormReturnType,\n} from './types';\nimport { shouldValidateOnChange, validateFieldValue, validateValues } from './validate';\n\nconst defaultResolveValidationError = (err: unknown) =>\n err instanceof Error ? err.message : String(err);\n\nexport function useForm<\n Values extends Record<string, any>,\n TransformedValues = Values,\n R extends FormErrors | Promise<FormErrors> = FormErrors,\n>(\n input: UseFormInput<Values, TransformedValues> & { validate: (values: Values) => R }\n): UseFormReturnType<Values, TransformedValues, (values: Values) => R>;\n\nexport function useForm<\n Values extends Record<string, any>,\n TransformedValues = Values,\n Rules extends FormRulesRecord<Values> = FormRulesRecord<Values>,\n>(\n input: UseFormInput<Values, TransformedValues> & { validate: Rules }\n): UseFormReturnType<Values, TransformedValues, Rules>;\n\nexport function useForm<\n Values extends Record<string, any> = Record<string, any>,\n TransformedValues = Values,\n>(\n input?: UseFormInput<Values, TransformedValues>\n): UseFormReturnType<Values, TransformedValues, undefined>;\n\nexport function useForm<\n Values extends Record<PropertyKey, any> = Record<string, any>,\n TransformedValues = Values,\n>({\n name,\n mode = 'controlled',\n initialValues,\n initialErrors = {},\n initialDirty = {},\n initialTouched = {},\n clearInputErrorOnChange = true,\n validateInputOnChange = false,\n validateInputOnBlur = false,\n onValuesChange,\n transformValues = ((values: Values) => values) as any,\n enhanceGetInputProps,\n validate: rules,\n onSubmitPreventDefault = 'always',\n touchTrigger = 'change',\n cascadeUpdates = false,\n validateDebounce = 0,\n resolveValidationError = defaultResolveValidationError,\n}: UseFormInput<Values, TransformedValues> = {}): UseFormReturnType<Values, TransformedValues> {\n const $errors = useFormErrors<Values>(initialErrors);\n const $values = useFormValues<Values>({ initialValues, onValuesChange, mode });\n const $status = useFormStatus<Values>({ initialDirty, initialTouched, $values, mode });\n const $watch = useFormWatch<Values>({ $values, $status, cascadeUpdates });\n const $list = useFormList<Values>({ $values, $errors, $status, $watch });\n const $validating = useFormValidating();\n const [formKey, setFormKey] = useState(0);\n const [fieldKeys, setFieldKeys] = useState<Record<string, number>>({});\n const [submitting, setSubmitting] = useState(false);\n const validateGeneration = useRef(0);\n\n const reset: Reset = useCallback(() => {\n $values.resetValues();\n $errors.clearErrors();\n $status.resetDirty();\n $status.resetTouched();\n $validating.clearValidating();\n mode === 'uncontrolled' && setFormKey((key) => key + 1);\n }, []);\n\n const handleValuesChanges = useCallback(\n (previousValues: Values) => {\n clearInputErrorOnChange && $errors.clearErrors();\n mode === 'uncontrolled' && setFormKey((key) => key + 1);\n $watch.notifyWatchSubscribers(previousValues);\n },\n [clearInputErrorOnChange]\n );\n\n const initialize: Initialize<Values> = useCallback(\n (values) => {\n const previousValues = $values.refValues.current;\n $values.initialize(values, () => mode === 'uncontrolled' && setFormKey((key) => key + 1));\n handleValuesChanges(previousValues);\n },\n [handleValuesChanges]\n );\n\n const debouncedValidateField = useMemo(() => {\n const timers: Record<string, ReturnType<typeof setTimeout>> = {};\n\n const handleValidation = (path: string) => {\n const signal = $validating.getAbortSignal(path);\n const result = validateFieldValue(\n path,\n rules,\n $values.refValues.current,\n resolveValidationError,\n signal\n );\n\n const applyResult = (results: { hasError: boolean; error: React.ReactNode }) => {\n if (signal.aborted) {\n return;\n }\n if (results.hasError) {\n $errors.setFieldError(path as any, results.error);\n } else {\n $errors.clearFieldError(path);\n }\n };\n\n const cleanup = () => {\n if (!signal.aborted) {\n $validating.setFieldValidating(path, false);\n }\n };\n\n if (result instanceof Promise) {\n $validating.setFieldValidating(path, true);\n result.then(applyResult).finally(cleanup);\n } else {\n applyResult(result);\n }\n };\n\n return (path: string) => {\n clearTimeout(timers[path]);\n if (validateDebounce > 0) {\n timers[path] = setTimeout(() => handleValidation(path), validateDebounce);\n } else {\n handleValidation(path);\n }\n };\n }, [validateDebounce, rules, resolveValidationError]);\n\n const setFieldValue: SetFieldValue<Values> = useCallback(\n (path, value, options) => {\n const shouldValidate = shouldValidateOnChange(path, validateInputOnChange);\n const resolvedValue =\n value instanceof Function ? value(getPath(path, $values.refValues.current) as any) : value;\n\n $status.setCalculatedFieldDirty(path, resolvedValue);\n touchTrigger === 'change' && $status.setFieldTouched(path, true);\n !shouldValidate && clearInputErrorOnChange && $errors.clearFieldError(path);\n\n $values.setFieldValue({\n path,\n value,\n updateState: mode === 'controlled',\n subscribers: [\n ...$watch.getFieldSubscribers(path),\n shouldValidate ? () => debouncedValidateField(String(path)) : null,\n options?.forceUpdate !== false && mode !== 'controlled'\n ? () =>\n setFieldKeys((keys) => ({\n ...keys,\n [path as string]: (keys[path as string] || 0) + 1,\n }))\n : null,\n ],\n });\n },\n [onValuesChange, rules, debouncedValidateField]\n );\n\n const setValues: SetValues<Values> = useCallback(\n (values) => {\n const previousValues = $values.refValues.current;\n $values.setValues({ values, updateState: mode === 'controlled' });\n handleValuesChanges(previousValues);\n },\n [onValuesChange, handleValuesChanges]\n );\n\n const validate = useCallback(() => {\n const generation = ++validateGeneration.current;\n const signal = $validating.getAbortSignal('__form__');\n\n const handleResult = (results: { hasErrors: boolean; errors: Record<string, any> }) => {\n if (generation !== validateGeneration.current) {\n return { hasErrors: false, errors: {} };\n }\n $errors.setErrors(results.errors);\n return results;\n };\n\n const cleanup = () => {\n if (generation === validateGeneration.current) {\n $validating.setFormValidating(false);\n }\n };\n\n const result = validateValues(rules, $values.refValues.current, resolveValidationError, signal);\n\n if (result instanceof Promise) {\n $validating.setFormValidating(true);\n return result.then(handleResult).finally(cleanup);\n }\n\n return handleResult(result);\n }, [rules, resolveValidationError]);\n\n const validateField = useCallback(\n (path: string) => {\n const signal = $validating.getAbortSignal(String(path));\n\n const applyResult = (results: { hasError: boolean; error: React.ReactNode }) => {\n if (signal.aborted) {\n return { hasError: false, error: null };\n }\n if (results.hasError) {\n $errors.setFieldError(path, results.error);\n } else {\n $errors.clearFieldError(path);\n }\n return results;\n };\n\n const cleanup = () => {\n if (!signal.aborted) {\n $validating.setFieldValidating(String(path), false);\n }\n };\n\n const result = validateFieldValue(\n path,\n rules,\n $values.refValues.current,\n resolveValidationError,\n signal\n );\n\n if (result instanceof Promise) {\n $validating.setFieldValidating(String(path), true);\n return result.then(applyResult).finally(cleanup);\n }\n\n return applyResult(result);\n },\n [rules, resolveValidationError]\n );\n\n const getInputProps: GetInputProps<Values> = (\n path,\n { type = 'input', withError = true, withFocus, ...otherOptions } = {}\n ) => {\n const _withFocus = withFocus ?? type !== 'radio';\n const onChange = getInputOnChange((value) =>\n setFieldValue(path, value as any, { forceUpdate: false })\n );\n\n const payload: any = { onChange, 'data-path': getDataPath(name, path) };\n\n if (withError) {\n payload.error = $errors.errorsState[path];\n }\n\n if (type === 'checkbox') {\n payload[mode === 'controlled' ? 'checked' : 'defaultChecked'] = getPath(\n path,\n $values.refValues.current\n );\n } else if (type === 'radio') {\n payload[mode === 'controlled' ? 'checked' : 'defaultChecked'] =\n getPath(path, $values.refValues.current) === otherOptions.value;\n payload.value = otherOptions.value;\n } else {\n payload[mode === 'controlled' ? 'value' : 'defaultValue'] = getPath(\n path,\n $values.refValues.current\n );\n }\n\n if (_withFocus) {\n payload.onFocus = () => $status.setFieldTouched(path, true);\n payload.onBlur = () => {\n if (shouldValidateOnChange(path, validateInputOnBlur)) {\n debouncedValidateField(String(path));\n }\n };\n }\n\n return Object.assign(\n payload,\n enhanceGetInputProps?.({\n inputProps: payload,\n field: path,\n options: { type, withError, withFocus: _withFocus, ...otherOptions },\n form: form as any,\n })\n );\n };\n\n const onSubmit: OnSubmit<Values, TransformedValues> =\n (handleSubmit, handleValidationFailure) => (event) => {\n if (onSubmitPreventDefault === 'always') {\n event?.preventDefault();\n }\n\n setSubmitting(true);\n\n const handleValidation = (results: { hasErrors: boolean; errors: Record<string, any> }) => {\n if (results.hasErrors) {\n if (onSubmitPreventDefault === 'validation-failed') {\n event?.preventDefault();\n }\n\n handleValidationFailure?.(results.errors, $values.refValues.current, event);\n setSubmitting(false);\n } else {\n const submitResult = handleSubmit?.(\n transformValues($values.refValues.current) as any,\n event\n );\n\n if (submitResult instanceof Promise) {\n submitResult.finally(() => setSubmitting(false));\n } else {\n setSubmitting(false);\n }\n }\n };\n\n const result = validate();\n if (result instanceof Promise) {\n result.then(handleValidation).catch(() => {\n setSubmitting(false);\n });\n } else {\n handleValidation(result);\n }\n };\n\n const getTransformedValues: GetTransformedValues<Values, TransformedValues> = (input) =>\n (transformValues as any)(input || $values.refValues.current);\n\n const onReset: OnReset = useCallback((event) => {\n event.preventDefault();\n reset();\n }, []);\n\n const isValid = useCallback(\n (path?: string) => {\n const signal = new AbortController().signal;\n if (path) {\n const result = validateFieldValue(\n path,\n rules,\n $values.refValues.current,\n resolveValidationError,\n signal\n );\n if (result instanceof Promise) {\n return result.then((r) => !r.hasError);\n }\n return !result.hasError;\n }\n const result = validateValues(\n rules,\n $values.refValues.current,\n resolveValidationError,\n signal\n );\n if (result instanceof Promise) {\n return result.then((r) => !r.hasErrors);\n }\n return !result.hasErrors;\n },\n [rules, resolveValidationError]\n );\n\n const key: Key<Values> = (path) => `${formKey}-${String(path)}-${fieldKeys[String(path)] || 0}`;\n\n const getInputNode: GetInputNode<Values> = useCallback(\n (path) => document.querySelector(`[data-path=\"${getDataPath(name, path)}\"]`),\n []\n );\n\n const resetField = useCallback(\n (path: PropertyKey) => {\n $values.resetField(path, [\n mode !== 'controlled'\n ? () =>\n setFieldKeys((keys) => ({\n ...keys,\n [path as string]: (keys[path as string] || 0) + 1,\n }))\n : null,\n ]);\n },\n [$values.resetField, mode, setFieldKeys]\n );\n\n const form = {\n watch: $watch.watch,\n\n initialized: $values.initialized.current,\n values: mode === 'uncontrolled' ? $values.refValues.current : $values.stateValues,\n getValues: $values.getValues,\n getInitialValues: $values.getValuesSnapshot,\n setInitialValues: $values.setValuesSnapshot,\n resetField,\n initialize,\n setValues,\n setFieldValue,\n\n submitting,\n setSubmitting,\n\n validating: $validating.validating,\n isValidating: $validating.isValidating as IsValidating<Values>,\n\n errors: $errors.errorsState,\n setErrors: $errors.setErrors,\n setFieldError: $errors.setFieldError,\n clearFieldError: $errors.clearFieldError,\n clearErrors: $errors.clearErrors,\n\n resetDirty: $status.resetDirty,\n setTouched: $status.setTouched,\n setDirty: $status.setDirty,\n isTouched: $status.isTouched,\n resetTouched: $status.resetTouched,\n isDirty: $status.isDirty,\n getTouched: $status.getTouched,\n getDirty: $status.getDirty,\n\n reorderListItem: $list.reorderListItem,\n insertListItem: $list.insertListItem,\n removeListItem: $list.removeListItem,\n replaceListItem: $list.replaceListItem,\n\n reset,\n validate,\n validateField,\n getInputProps,\n onSubmit,\n onReset,\n isValid,\n getTransformedValues,\n key,\n\n getInputNode,\n };\n\n useFormActions(name, form as any);\n\n return form as any;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"use-form.mjs","names":[],"sources":["../src/use-form.ts"],"sourcesContent":["import { useCallback, useMemo, useRef, useState } from 'react';\nimport { useFormActions } from './actions';\nimport { getInputOnChange } from './get-input-on-change';\nimport { useFormErrors } from './hooks/use-form-errors/use-form-errors';\nimport { useFormList } from './hooks/use-form-list/use-form-list';\nimport { useFormStatus } from './hooks/use-form-status/use-form-status';\nimport { useFormValidating } from './hooks/use-form-validating/use-form-validating';\nimport { useFormValues } from './hooks/use-form-values/use-form-values';\nimport { useFormWatch } from './hooks/use-form-watch/use-form-watch';\nimport { getDataPath, getPath } from './paths';\nimport {\n FormErrors,\n FormRulesRecord,\n GetInputNode,\n GetInputProps,\n GetTransformedValues,\n Initialize,\n IsValidating,\n Key,\n OnReset,\n OnSubmit,\n Reset,\n SetFieldValue,\n SetValues,\n UseFormInput,\n UseFormReturnType,\n} from './types';\nimport { shouldValidateOnChange, validateFieldValue, validateValues } from './validate';\n\nconst defaultResolveValidationError = (err: unknown) =>\n err instanceof Error ? err.message : String(err);\n\nexport function useForm<\n Values extends Record<string, any>,\n TransformedValues = Values,\n R extends FormErrors | Promise<FormErrors> = FormErrors,\n>(\n input: UseFormInput<Values, TransformedValues> & { validate: (values: Values) => R }\n): UseFormReturnType<Values, TransformedValues, (values: Values) => R>;\n\nexport function useForm<\n Values extends Record<string, any>,\n TransformedValues = Values,\n Rules extends FormRulesRecord<Values> = FormRulesRecord<Values>,\n>(\n input: UseFormInput<Values, TransformedValues> & { validate: Rules }\n): UseFormReturnType<Values, TransformedValues, Rules>;\n\nexport function useForm<\n Values extends Record<string, any> = Record<string, any>,\n TransformedValues = Values,\n>(\n input?: UseFormInput<Values, TransformedValues>\n): UseFormReturnType<Values, TransformedValues, undefined>;\n\nexport function useForm<\n Values extends Record<PropertyKey, any> = Record<string, any>,\n TransformedValues = Values,\n>({\n name,\n mode = 'controlled',\n initialValues,\n initialErrors = {},\n initialDirty = {},\n initialTouched = {},\n clearInputErrorOnChange = true,\n validateInputOnChange = false,\n validateInputOnBlur = false,\n onValuesChange,\n transformValues = ((values: Values) => values) as any,\n enhanceGetInputProps,\n validate: rules,\n onSubmitPreventDefault = 'always',\n touchTrigger = 'change',\n cascadeUpdates = false,\n validateDebounce = 0,\n resolveValidationError = defaultResolveValidationError,\n}: UseFormInput<Values, TransformedValues> = {}): UseFormReturnType<Values, TransformedValues> {\n const $errors = useFormErrors<Values>(initialErrors);\n const $values = useFormValues<Values>({ initialValues, onValuesChange, mode });\n const $status = useFormStatus<Values>({ initialDirty, initialTouched, $values, mode });\n const $watch = useFormWatch<Values>({ $values, $status, cascadeUpdates });\n const $list = useFormList<Values>({ $values, $errors, $status, $watch });\n const $validating = useFormValidating();\n const [formKey, setFormKey] = useState(0);\n const [fieldKeys, setFieldKeys] = useState<Record<string, number>>({});\n const [submitting, setSubmitting] = useState(false);\n const validateGeneration = useRef(0);\n\n const reset: Reset = useCallback(() => {\n $values.resetValues();\n $errors.clearErrors();\n $status.resetDirty();\n $status.resetTouched();\n $validating.clearValidating();\n mode === 'uncontrolled' && setFormKey((key) => key + 1);\n }, []);\n\n const handleValuesChanges = useCallback(\n (previousValues: Values) => {\n clearInputErrorOnChange && $errors.clearErrors();\n mode === 'uncontrolled' && setFormKey((key) => key + 1);\n $watch.notifyWatchSubscribers(previousValues);\n },\n [clearInputErrorOnChange]\n );\n\n const initialize: Initialize<Values> = useCallback(\n (values) => {\n const previousValues = $values.refValues.current;\n $values.initialize(values, () => mode === 'uncontrolled' && setFormKey((key) => key + 1));\n handleValuesChanges(previousValues);\n },\n [handleValuesChanges]\n );\n\n const debouncedValidateField = useMemo(() => {\n const timers: Record<string, ReturnType<typeof setTimeout>> = {};\n\n const handleValidation = (path: string) => {\n const signal = $validating.getAbortSignal(path);\n const result = validateFieldValue(\n path,\n rules,\n $values.refValues.current,\n resolveValidationError,\n signal\n );\n\n const applyResult = (results: { hasError: boolean; error: React.ReactNode }) => {\n if (signal.aborted) {\n return;\n }\n if (results.hasError) {\n $errors.setFieldError(path as any, results.error);\n } else {\n $errors.clearFieldError(path);\n }\n };\n\n const cleanup = () => {\n if (!signal.aborted) {\n $validating.setFieldValidating(path, false);\n }\n };\n\n if (result instanceof Promise) {\n $validating.setFieldValidating(path, true);\n result.then(applyResult).finally(cleanup);\n } else {\n applyResult(result);\n }\n };\n\n return (path: string) => {\n clearTimeout(timers[path]);\n if (validateDebounce > 0) {\n timers[path] = setTimeout(() => handleValidation(path), validateDebounce);\n } else {\n handleValidation(path);\n }\n };\n }, [validateDebounce, rules, resolveValidationError]);\n\n const setFieldValue: SetFieldValue<Values> = useCallback(\n (path, value, options) => {\n const shouldValidate = shouldValidateOnChange(path, validateInputOnChange);\n const resolvedValue =\n value instanceof Function ? value(getPath(path, $values.refValues.current) as any) : value;\n\n $status.setCalculatedFieldDirty(path, resolvedValue);\n touchTrigger === 'change' && $status.setFieldTouched(path, true);\n !shouldValidate && clearInputErrorOnChange && $errors.clearFieldError(path);\n\n $values.setFieldValue({\n path,\n value,\n updateState: mode === 'controlled',\n subscribers: [\n ...$watch.getFieldSubscribers(path),\n shouldValidate ? () => debouncedValidateField(String(path)) : null,\n options?.forceUpdate !== false && mode !== 'controlled'\n ? () =>\n setFieldKeys((keys) => ({\n ...keys,\n [path as string]: (keys[path as string] || 0) + 1,\n }))\n : null,\n ],\n });\n },\n [onValuesChange, rules, debouncedValidateField]\n );\n\n const setValues: SetValues<Values> = useCallback(\n (values) => {\n const previousValues = $values.refValues.current;\n $values.setValues({ values, updateState: mode === 'controlled' });\n handleValuesChanges(previousValues);\n },\n [onValuesChange, handleValuesChanges]\n );\n\n const validate = useCallback(() => {\n const generation = ++validateGeneration.current;\n const signal = $validating.getAbortSignal('__form__');\n\n const handleResult = (results: { hasErrors: boolean; errors: Record<string, any> }) => {\n if (generation !== validateGeneration.current) {\n return { hasErrors: false, errors: {} };\n }\n $errors.setErrors(results.errors);\n return results;\n };\n\n const cleanup = () => {\n if (generation === validateGeneration.current) {\n $validating.setFormValidating(false);\n }\n };\n\n const result = validateValues(rules, $values.refValues.current, resolveValidationError, signal);\n\n if (result instanceof Promise) {\n $validating.setFormValidating(true);\n return result.then(handleResult).finally(cleanup);\n }\n\n return handleResult(result);\n }, [rules, resolveValidationError]);\n\n const validateField = useCallback(\n (path: string) => {\n const signal = $validating.getAbortSignal(String(path));\n\n const applyResult = (results: { hasError: boolean; error: React.ReactNode }) => {\n if (signal.aborted) {\n return { hasError: false, error: null };\n }\n if (results.hasError) {\n $errors.setFieldError(path, results.error);\n } else {\n $errors.clearFieldError(path);\n }\n return results;\n };\n\n const cleanup = () => {\n if (!signal.aborted) {\n $validating.setFieldValidating(String(path), false);\n }\n };\n\n const result = validateFieldValue(\n path,\n rules,\n $values.refValues.current,\n resolveValidationError,\n signal\n );\n\n if (result instanceof Promise) {\n $validating.setFieldValidating(String(path), true);\n return result.then(applyResult).finally(cleanup);\n }\n\n return applyResult(result);\n },\n [rules, resolveValidationError]\n );\n\n const getInputProps: GetInputProps<Values> = (\n path,\n { type = 'input', withError = true, withFocus, ...otherOptions } = {}\n ) => {\n const _withFocus = withFocus ?? type !== 'radio';\n const onChange = getInputOnChange((value) =>\n setFieldValue(path, value as any, { forceUpdate: false })\n );\n\n const payload: any = { onChange, 'data-path': getDataPath(name, path) };\n\n if (withError) {\n payload.error = $errors.errorsState[path];\n }\n\n if (type === 'checkbox') {\n payload[mode === 'controlled' ? 'checked' : 'defaultChecked'] = getPath(\n path,\n $values.refValues.current\n );\n } else if (type === 'radio') {\n payload[mode === 'controlled' ? 'checked' : 'defaultChecked'] =\n getPath(path, $values.refValues.current) === otherOptions.value;\n payload.value = otherOptions.value;\n } else {\n payload[mode === 'controlled' ? 'value' : 'defaultValue'] = getPath(\n path,\n $values.refValues.current\n );\n }\n\n if (_withFocus) {\n payload.onFocus = () => $status.setFieldTouched(path, true);\n payload.onBlur = () => {\n if (shouldValidateOnChange(path, validateInputOnBlur)) {\n debouncedValidateField(String(path));\n }\n };\n }\n\n return Object.assign(\n payload,\n enhanceGetInputProps?.({\n inputProps: payload,\n field: path,\n options: { type, withError, withFocus: _withFocus, ...otherOptions },\n form: form as any,\n })\n );\n };\n\n const onSubmit: OnSubmit<Values, TransformedValues> =\n (handleSubmit, handleValidationFailure) => (event) => {\n if (onSubmitPreventDefault === 'always') {\n event?.preventDefault();\n }\n\n setSubmitting(true);\n\n const handleValidation = (results: { hasErrors: boolean; errors: Record<string, any> }) => {\n if (results.hasErrors) {\n if (onSubmitPreventDefault === 'validation-failed') {\n event?.preventDefault();\n }\n\n handleValidationFailure?.(results.errors, $values.refValues.current, event);\n setSubmitting(false);\n } else {\n const submitResult = handleSubmit?.(\n transformValues($values.refValues.current) as any,\n event\n );\n\n if (submitResult instanceof Promise) {\n submitResult.finally(() => setSubmitting(false));\n } else {\n setSubmitting(false);\n }\n }\n };\n\n const result = validate();\n if (result instanceof Promise) {\n result.then(handleValidation).catch(() => {\n setSubmitting(false);\n });\n } else {\n handleValidation(result);\n }\n };\n\n const getTransformedValues: GetTransformedValues<Values, TransformedValues> = (input) =>\n (transformValues as any)(input || $values.refValues.current);\n\n const onReset: OnReset = useCallback((event) => {\n event.preventDefault();\n reset();\n }, []);\n\n const isValid = useCallback(\n (path?: string) => {\n const signal = new AbortController().signal;\n if (path) {\n const result = validateFieldValue(\n path,\n rules,\n $values.refValues.current,\n resolveValidationError,\n signal\n );\n if (result instanceof Promise) {\n return result.then((r) => !r.hasError);\n }\n return !result.hasError;\n }\n const result = validateValues(\n rules,\n $values.refValues.current,\n resolveValidationError,\n signal\n );\n if (result instanceof Promise) {\n return result.then((r) => !r.hasErrors);\n }\n return !result.hasErrors;\n },\n [rules, resolveValidationError, $values.refValues.current]\n );\n\n const key: Key<Values> = (path) => `${formKey}-${String(path)}-${fieldKeys[String(path)] || 0}`;\n\n const getInputNode: GetInputNode<Values> = (path) =>\n document.querySelector(`[data-path=\"${getDataPath(name, path)}\"]`);\n\n const resetField = useCallback(\n (path: PropertyKey) => {\n $values.resetField(path, [\n mode !== 'controlled'\n ? () =>\n setFieldKeys((keys) => ({\n ...keys,\n [path as string]: (keys[path as string] || 0) + 1,\n }))\n : null,\n ]);\n },\n [$values.resetField, mode, setFieldKeys]\n );\n\n const form = {\n watch: $watch.watch,\n\n initialized: $values.initialized.current,\n values: mode === 'uncontrolled' ? $values.refValues.current : $values.stateValues,\n getValues: $values.getValues,\n getInitialValues: $values.getValuesSnapshot,\n setInitialValues: $values.setValuesSnapshot,\n resetField,\n initialize,\n setValues,\n setFieldValue,\n\n submitting,\n setSubmitting,\n\n validating: $validating.validating,\n isValidating: $validating.isValidating as IsValidating<Values>,\n\n errors: $errors.errorsState,\n setErrors: $errors.setErrors,\n setFieldError: $errors.setFieldError,\n clearFieldError: $errors.clearFieldError,\n clearErrors: $errors.clearErrors,\n\n resetDirty: $status.resetDirty,\n setTouched: $status.setTouched,\n setDirty: $status.setDirty,\n isTouched: $status.isTouched,\n resetTouched: $status.resetTouched,\n isDirty: $status.isDirty,\n getTouched: $status.getTouched,\n getDirty: $status.getDirty,\n\n reorderListItem: $list.reorderListItem,\n insertListItem: $list.insertListItem,\n removeListItem: $list.removeListItem,\n replaceListItem: $list.replaceListItem,\n\n reset,\n validate,\n validateField,\n getInputProps,\n onSubmit,\n onReset,\n isValid,\n getTransformedValues,\n key,\n\n getInputNode,\n };\n\n useFormActions(name, form as any);\n\n return form as any;\n}\n"],"mappings":"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"}
package/lib/index.d.mts CHANGED
@@ -9,3 +9,4 @@ export { formRootRule } from './validate/validate-values.js';
9
9
  export type * from './types';
10
10
  export type { UseFieldInput, UseFieldReturnType } from './use-field';
11
11
  export type { FormArrayElement, LooseKeys } from './paths.types.js';
12
+ export type { FormProviderProps } from './FormProvider/FormProvider.js';
package/lib/index.d.ts CHANGED
@@ -9,3 +9,4 @@ export { formRootRule } from './validate/validate-values.js';
9
9
  export type * from './types';
10
10
  export type { UseFieldInput, UseFieldReturnType } from './use-field';
11
11
  export type { FormArrayElement, LooseKeys } from './paths.types.js';
12
+ export type { FormProviderProps } from './FormProvider/FormProvider.js';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mantine/form",
3
- "version": "9.4.0",
3
+ "version": "9.4.1",
4
4
  "description": "Mantine form management library",
5
5
  "homepage": "https://mantine.dev",
6
6
  "license": "MIT",