@mantine/form 9.0.0-alpha.6 → 9.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/cjs/hooks/use-form-status/use-form-status.cjs.map +1 -1
- package/cjs/hooks/use-form-values/use-form-values.cjs.map +1 -1
- package/cjs/hooks/use-form-watch/use-form-watch.cjs +4 -2
- package/cjs/hooks/use-form-watch/use-form-watch.cjs.map +1 -1
- package/cjs/use-form.cjs +32 -11
- package/cjs/use-form.cjs.map +1 -1
- package/esm/hooks/use-form-status/use-form-status.mjs.map +1 -1
- package/esm/hooks/use-form-values/use-form-values.mjs.map +1 -1
- package/esm/hooks/use-form-watch/use-form-watch.mjs +4 -2
- package/esm/hooks/use-form-watch/use-form-watch.mjs.map +1 -1
- package/esm/use-form.mjs +32 -11
- package/esm/use-form.mjs.map +1 -1
- package/lib/hooks/use-form-status/use-form-status.d.ts +2 -2
- package/lib/hooks/use-form-values/use-form-values.d.ts +9 -9
- package/lib/hooks/use-form-watch/use-form-watch.d.ts +5 -5
- package/lib/types.d.ts +19 -18
- package/package.json +1 -1
|
@@ -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<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<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,oBAAA,GAAA,MAAA,UAA4B,eAAe;CAChE,MAAM,CAAC,YAAY,kBAAA,GAAA,MAAA,UAA0B,aAAa;CAE1D,MAAM,cAAA,GAAA,MAAA,QAAoB,eAAe;CACzC,MAAM,YAAA,GAAA,MAAA,QAAkB,aAAa;CAErC,MAAM,cAAA,GAAA,MAAA,cAA0B,WAA+D;EAC7F,MAAM,iBAAiB,OAAO,WAAW,aAAa,OAAO,WAAW,QAAQ,GAAG;AACnF,aAAW,UAAU;AAErB,MAAI,SAAS,aACX,iBAAgB,eAAe;IAEhC,EAAE,CAAC;CAEN,MAAM,YAAA,GAAA,MAAA,cACH,QAA4D,cAAc,UAAU;EACnF,MAAM,iBAAiB,OAAO,WAAW,aAAa,OAAO,SAAS,QAAQ,GAAG;AACjF,WAAS,UAAU;AAEnB,MAAI,SAAS,gBAAgB,YAC3B,eAAc,eAAe;IAGjC,EAAE,CACH;CAED,MAAM,gBAAA,GAAA,MAAA,mBAA8C,WAAW,EAAE,CAAC,EAAE,EAAE,CAAC;CAEvE,MAAM,cAAA,GAAA,MAAA,cAA8C,WAAW;EAC7D,MAAM,cAAc,SAChB;GAAE,GAAG,QAAQ,UAAU;GAAS,GAAG;GAAQ,GAC3C,QAAQ,UAAU;AACtB,UAAQ,kBAAkB,YAAY;AACtC,WAAS,EAAE,CAAC;IACX,EAAE,CAAC;CAEN,MAAM,mBAAA,GAAA,MAAA,cAAwD,MAAM,YAAY;AAC9E,cAAY,mBAAmB;AAC7B,OAAIA,mBAAAA,UAAU,gBAAgB,KAAK,KAAK,QACtC,QAAO;AAGT,UAAO;IAAE,GAAG;KAAiB,OAAO;IAAS;IAC7C;IACD,EAAE,CAAC;CAEN,MAAM,iBAAA,GAAA,MAAA,cAAoD,MAAM,OAAO,gBAAgB;AACrF,YAAU,iBAAiB;AACzB,OAAIA,mBAAAA,UAAU,cAAc,KAAK,KAAK,MACpC,QAAO;AAGT,UAAO;IAAE,GAAG;KAAe,OAAO;IAAO;KACxC,YAAY;IACd,EAAE,CAAC;CAEN,MAAM,2BAAA,GAAA,MAAA,cAAwE,MAAM,UAAU;EAC5F,MAAM,eAAeA,mBAAAA,UAAU,SAAS,SAAS,KAAK;EACtD,MAAM,QAAQ,EAAA,GAAA,gBAAA,SAASC,iBAAAA,QAAQ,MAAM,QAAQ,mBAAmB,CAAC,EAAE,MAAM;EACzE,MAAM,eAAeC,yBAAAA,eAAe,MAAM,SAAS,QAAQ;AAC3D,eAAa,QAAkB;AAC/B,WAAS,cAAc,iBAAiB,MAAM;IAC7C,EAAE,CAAC;AAiDN,QAAO;EACL;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,YAAA,GAAA,MAAA,cAvDC,SAASF,mBAAAA,UAAU,WAAW,SAAS,KAAK,EAC7C,EAAE,CACH;EAsDC;EACA;EACA;EACA;EACA,kBAAA,GAAA,MAAA,cAvDC,SACC,UAAU,YAAY;AACpB,OAAI,OAAO,SAAS,SAClB,QAAO;GAGT,MAAM,SAASE,yBAAAA,eAAe,MAAM,QAAQ;AAC5C,UAAO,OAAO;AAEd,QAAA,GAAA,gBAAA,SAAY,QAAQ,QAAQ,CAC1B,QAAO;AAGT,UAAO;IACP,EACJ,EAAE,CACH;EAwCC,UAAA,GAAA,MAAA,cAtCmD,SAAS;AAC5D,OAAI,MAAM;IACR,MAAM,kBAAkBD,iBAAAA,QAAQ,MAAM,SAAS,QAAQ;AACvD,QAAI,OAAO,oBAAoB,UAC7B,QAAO;AAKT,WAAO,EAAA,GAAA,gBAAA,SAFeA,iBAAAA,QAAQ,MAAM,QAAQ,UAAU,QAAQ,EACjCA,iBAAAA,QAAQ,MAAM,QAAQ,eAAe,QAAQ,CACtB;;AAItD,OADqB,OAAO,KAAK,SAAS,QAAQ,CAAC,SAAS,EAE1D,QAAOD,mBAAAA,UAAU,SAAS,QAAQ;AAGpC,UAAO,EAAA,GAAA,gBAAA,SAAS,QAAQ,UAAU,SAAS,QAAQ,eAAe,QAAQ;KACzE,EAAE,CAAC;EAqBJ,WAAA,GAAA,MAAA,mBAnBiC,SAAS,SAAS,EAAE,CAAC;EAoBtD,aAAA,GAAA,MAAA,mBAnBmC,WAAW,SAAS,EAAE,CAAC;EAoB1D;EACD"}
|
|
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 +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<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: (payload: SetValuesInput<
|
|
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,QAAqB,MAAM;CACjC,MAAM,CAAC,aAAa,mBAAA,GAAA,MAAA,UAAmC,iBAAkB,EAAE,CAAY;CACvF,MAAM,aAAA,GAAA,MAAA,QAAmB,YAAY;CACrC,MAAM,kBAAA,GAAA,MAAA,QAAwB,YAAY;CAE1C,MAAM,aAAA,GAAA,MAAA,cACH,EACC,QACA,aACA,cAAc,MACd,0BAA0B,WACE;EAC5B,MAAM,iBAAiB,UAAU;EACjC,MAAM,iBAAiB,kBAAkB,WAAW,OAAO,UAAU,QAAQ,GAAG;EAChF,MAAM,gBAAgB,0BAClB;GAAE,GAAG;GAAgB,GAAG;GAAgB,GACvC;AACL,YAAU,UAAU;AACpB,MAAI,aAAa;AACf,kBAAe,cAAc;AAC7B,OAAI,SAAS,eACX,WAAU,UAAU;;AAGxB,mBAAiB,eAAe,eAAe;AAC/C,eACI,OAAO,QAAQ,CAChB,SAAS,eAAe,WAAY;GAAE;GAAe;GAAgB,CAAC,CAAC;IAE5E,CAAC,eAAe,CACjB;CAED,MAAM,iBAAA,GAAA,MAAA,cACH,YAAwC;EACvC,MAAM,eAAeA,iBAAAA,QAAQ,QAAQ,MAAM,UAAU,QAAQ;EAC7D,MAAM,eACJ,QAAQ,iBAAiB,WAAW,QAAQ,MAAM,aAAa,GAAG,QAAQ;AAE5E,MAAI,iBAAiB,cAAc;GACjC,MAAM,iBAAiB,UAAU;GACjC,MAAM,gBAAgBC,iBAAAA,QAAQ,QAAQ,MAAM,cAAc,UAAU,QAAQ;AAC5E,aAAU;IAAE,QAAQ;IAAe,aAAa,QAAQ;IAAa,CAAC;AAEtE,WAAQ,aACJ,OAAO,QAAQ,CAChB,SAAS,eACR,WAAY;IAAE,MAAM,QAAQ;IAAM;IAAe;IAAgB,CAAC,CACnE;;IAGP,CAAC,UAAU,CACZ;CAED,MAAM,qBAAA,GAAA,MAAA,cAAiC,YAAoB;AACzD,iBAAe,UAAU;IACxB,EAAE,CAAC;CAEN,MAAM,cAAA,GAAA,MAAA,cACH,QAAgB,iBAA6B;AAC5C,MAAI,CAAC,YAAY,SAAS;AACxB,eAAY,UAAU;AACtB,aAAU;IAAE;IAAQ,aAAa,SAAS;IAAc,CAAC;AACzD,qBAAkB,OAAO;AACzB,iBAAc;;IAGlB,CAAC,UAAU,CACZ;AA6BD,QAAO;EACL;EACA;EACA;EACA;EACA;EACA;EACA,cAAA,GAAA,MAAA,mBAlCoC;AACpC,aAAU;IACR,QAAQ,eAAe;IACvB,aAAa;IACb,yBAAyB;IAC1B,CAAC;KACD,CAAC,UAAU,CAAC;EA6Bb;EACA;EACA,YAAA,GAAA,MAAA,mBA7BkC,UAAU,SAAS,EAAE,CAAC;EA8BxD,oBAAA,GAAA,MAAA,mBA7B0C,eAAe,SAAS,EAAE,CAAC;EA8BrE,aAAA,GAAA,MAAA,cA3BC,MAAmB,gBAAyE;GAC3F,MAAM,gBAAgBD,iBAAAA,QAAQ,MAAM,eAAe,QAAQ;AAC3D,OAAI,OAAO,kBAAkB,YAC3B;AAEF,iBAAc;IACZ;IACA,OAAO;IACP,aAAa,SAAS;IACtB;IACD,CAAC;KAEJ,CAAC,eAAe,KAAK,CACtB;EAeA"}
|
|
@@ -23,8 +23,10 @@ function useFormWatch({ $status, cascadeUpdates }) {
|
|
|
23
23
|
touched: $status.isTouched(path),
|
|
24
24
|
dirty: $status.isDirty(path)
|
|
25
25
|
})) ?? [];
|
|
26
|
-
|
|
27
|
-
|
|
26
|
+
for (const subscriptionKey in subscribers.current) {
|
|
27
|
+
const isParent = String(path).startsWith(`${subscriptionKey}.`);
|
|
28
|
+
const isChild = String(subscriptionKey).startsWith(`${path}.`);
|
|
29
|
+
if (isParent || cascadeUpdates && isChild) result.push(...subscribers.current[subscriptionKey].map((cb) => (input) => cb({
|
|
28
30
|
previousValue: require_get_path.getPath(subscriptionKey, input.previousValues),
|
|
29
31
|
value: require_get_path.getPath(subscriptionKey, input.updatedValues),
|
|
30
32
|
touched: $status.isTouched(subscriptionKey),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-form-watch.cjs","names":["getPath"],"sources":["../../../src/hooks/use-form-watch/use-form-watch.ts"],"sourcesContent":["import { useCallback, useEffect, useRef } from 'react';\nimport { getPath } from '../../paths';\nimport { LooseKeys } from '../../paths.types';\nimport { FormFieldSubscriber, Watch } from '../../types';\nimport { $FormStatus } from '../use-form-status/use-form-status';\nimport { SetValuesSubscriberPayload } from '../use-form-values/use-form-values';\n\ninterface UseFormWatchInput<Values extends Record<
|
|
1
|
+
{"version":3,"file":"use-form-watch.cjs","names":["getPath"],"sources":["../../../src/hooks/use-form-watch/use-form-watch.ts"],"sourcesContent":["import { useCallback, useEffect, useRef } from 'react';\nimport { getPath } from '../../paths';\nimport { LooseKeys } from '../../paths.types';\nimport { FormFieldSubscriber, Watch } from '../../types';\nimport { $FormStatus } from '../use-form-status/use-form-status';\nimport { SetValuesSubscriberPayload } from '../use-form-values/use-form-values';\n\ninterface UseFormWatchInput<out Values extends Record<PropertyKey, any>> {\n $status: $FormStatus<Values>;\n cascadeUpdates?: boolean;\n}\n\nexport function useFormWatch<\n Values extends Record<PropertyKey, any>,\n Field extends LooseKeys<Values> = LooseKeys<Values>,\n>({ $status, cascadeUpdates }: UseFormWatchInput<Values>) {\n const subscribers = useRef<Record<Field, FormFieldSubscriber<Values, Field>[]>>({} as any);\n\n const watch: Watch<Values, Field> = useCallback((path, callback) => {\n useEffect(() => {\n subscribers.current[path] = subscribers.current[path] || [];\n subscribers.current[path].push(callback);\n\n return () => {\n subscribers.current[path] = subscribers.current[path].filter((cb) => cb !== callback);\n };\n }, [callback]);\n }, []);\n\n const getFieldSubscribers = useCallback((path: Field) => {\n const result: ((input: SetValuesSubscriberPayload<Values>) => void)[] =\n subscribers.current[path]?.map(\n (callback) => (input: SetValuesSubscriberPayload<Values>) =>\n callback({\n previousValue: getPath(path, input.previousValues) as any,\n value: getPath(path, input.updatedValues) as any,\n touched: $status.isTouched(path),\n dirty: $status.isDirty(path),\n })\n ) ?? [];\n\n for (const subscriptionKey in subscribers.current) {\n const isParent = String(path).startsWith(`${subscriptionKey}.`);\n const isChild = String(subscriptionKey).startsWith(`${path}.`);\n\n if (isParent || (cascadeUpdates && isChild)) {\n result.push(\n ...subscribers.current[subscriptionKey].map(\n (cb) => (input: SetValuesSubscriberPayload<Values>) =>\n cb({\n previousValue: getPath(subscriptionKey, input.previousValues) as any,\n value: getPath(subscriptionKey, input.updatedValues) as any,\n touched: $status.isTouched(subscriptionKey),\n dirty: $status.isDirty(subscriptionKey),\n })\n )\n );\n }\n }\n\n return result;\n }, []);\n\n return {\n subscribers,\n watch,\n getFieldSubscribers,\n };\n}\n"],"mappings":";;;;;AAYA,SAAgB,aAGd,EAAE,SAAS,kBAA6C;CACxD,MAAM,eAAA,GAAA,MAAA,QAA0E,EAAE,CAAQ;AA+C1F,QAAO;EACL;EACA,QAAA,GAAA,MAAA,cA/C+C,MAAM,aAAa;AAClE,IAAA,GAAA,MAAA,iBAAgB;AACd,gBAAY,QAAQ,QAAQ,YAAY,QAAQ,SAAS,EAAE;AAC3D,gBAAY,QAAQ,MAAM,KAAK,SAAS;AAExC,iBAAa;AACX,iBAAY,QAAQ,QAAQ,YAAY,QAAQ,MAAM,QAAQ,OAAO,OAAO,SAAS;;MAEtF,CAAC,SAAS,CAAC;KACb,EAAE,CAAC;EAuCJ,sBAAA,GAAA,MAAA,cArCuC,SAAgB;GACvD,MAAM,SACJ,YAAY,QAAQ,OAAO,KACxB,cAAc,UACb,SAAS;IACP,eAAeA,iBAAAA,QAAQ,MAAM,MAAM,eAAe;IAClD,OAAOA,iBAAAA,QAAQ,MAAM,MAAM,cAAc;IACzC,SAAS,QAAQ,UAAU,KAAK;IAChC,OAAO,QAAQ,QAAQ,KAAK;IAC7B,CAAC,CACL,IAAI,EAAE;AAET,QAAK,MAAM,mBAAmB,YAAY,SAAS;IACjD,MAAM,WAAW,OAAO,KAAK,CAAC,WAAW,GAAG,gBAAgB,GAAG;IAC/D,MAAM,UAAU,OAAO,gBAAgB,CAAC,WAAW,GAAG,KAAK,GAAG;AAE9D,QAAI,YAAa,kBAAkB,QACjC,QAAO,KACL,GAAG,YAAY,QAAQ,iBAAiB,KACrC,QAAQ,UACP,GAAG;KACD,eAAeA,iBAAAA,QAAQ,iBAAiB,MAAM,eAAe;KAC7D,OAAOA,iBAAAA,QAAQ,iBAAiB,MAAM,cAAc;KACpD,SAAS,QAAQ,UAAU,gBAAgB;KAC3C,OAAO,QAAQ,QAAQ,gBAAgB;KACxC,CAAC,CACL,CACF;;AAIL,UAAO;KACN,EAAE,CAAC;EAML"}
|
package/cjs/use-form.cjs
CHANGED
|
@@ -50,16 +50,21 @@ function useForm({ name, mode = "controlled", initialValues, initialErrors = {},
|
|
|
50
50
|
$validating.clearValidating();
|
|
51
51
|
mode === "uncontrolled" && setFormKey((key) => key + 1);
|
|
52
52
|
}, []);
|
|
53
|
-
const
|
|
54
|
-
clearInputErrorOnChange && $errors.clearErrors();
|
|
55
|
-
mode === "uncontrolled" && setFormKey((key) => key + 1);
|
|
53
|
+
const notifyWatchSubscribers = (0, react.useCallback)((previousValues) => {
|
|
56
54
|
Object.keys($watch.subscribers.current).forEach((path) => {
|
|
57
|
-
if (require_get_path.getPath(path, $values.refValues.current) !== require_get_path.getPath(path, previousValues)) $watch.
|
|
58
|
-
previousValues,
|
|
59
|
-
|
|
55
|
+
if (require_get_path.getPath(path, $values.refValues.current) !== require_get_path.getPath(path, previousValues)) $watch.subscribers.current[path]?.forEach((cb) => cb({
|
|
56
|
+
previousValue: require_get_path.getPath(path, previousValues),
|
|
57
|
+
value: require_get_path.getPath(path, $values.refValues.current),
|
|
58
|
+
touched: $status.isTouched(path),
|
|
59
|
+
dirty: $status.isDirty(path)
|
|
60
60
|
}));
|
|
61
61
|
});
|
|
62
|
-
}, [
|
|
62
|
+
}, []);
|
|
63
|
+
const handleValuesChanges = (0, react.useCallback)((previousValues) => {
|
|
64
|
+
clearInputErrorOnChange && $errors.clearErrors();
|
|
65
|
+
mode === "uncontrolled" && setFormKey((key) => key + 1);
|
|
66
|
+
notifyWatchSubscribers(previousValues);
|
|
67
|
+
}, [clearInputErrorOnChange, notifyWatchSubscribers]);
|
|
63
68
|
const initialize = (0, react.useCallback)((values) => {
|
|
64
69
|
const previousValues = $values.refValues.current;
|
|
65
70
|
$values.initialize(values, () => mode === "uncontrolled" && setFormKey((key) => key + 1));
|
|
@@ -273,10 +278,26 @@ function useForm({ name, mode = "controlled", initialValues, initialErrors = {},
|
|
|
273
278
|
isDirty: $status.isDirty,
|
|
274
279
|
getTouched: $status.getTouched,
|
|
275
280
|
getDirty: $status.getDirty,
|
|
276
|
-
reorderListItem:
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
281
|
+
reorderListItem: ((path, payload) => {
|
|
282
|
+
const previousValues = $values.refValues.current;
|
|
283
|
+
$list.reorderListItem(path, payload);
|
|
284
|
+
notifyWatchSubscribers(previousValues);
|
|
285
|
+
}),
|
|
286
|
+
insertListItem: ((path, item, index) => {
|
|
287
|
+
const previousValues = $values.refValues.current;
|
|
288
|
+
$list.insertListItem(path, item, index);
|
|
289
|
+
notifyWatchSubscribers(previousValues);
|
|
290
|
+
}),
|
|
291
|
+
removeListItem: ((path, index) => {
|
|
292
|
+
const previousValues = $values.refValues.current;
|
|
293
|
+
$list.removeListItem(path, index);
|
|
294
|
+
notifyWatchSubscribers(previousValues);
|
|
295
|
+
}),
|
|
296
|
+
replaceListItem: ((path, index, item) => {
|
|
297
|
+
const previousValues = $values.refValues.current;
|
|
298
|
+
$list.replaceListItem(path, index, item);
|
|
299
|
+
notifyWatchSubscribers(previousValues);
|
|
300
|
+
}),
|
|
280
301
|
reset,
|
|
281
302
|
validate,
|
|
282
303
|
validateField,
|
package/cjs/use-form.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-form.cjs","names":["useFormErrors","useFormValues","useFormStatus","useFormList","useFormWatch","useFormValidating","getPath","validateFieldValue","shouldValidateOnChange","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\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<string, 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 = (err: unknown) => (err instanceof Error ? err.message : String(err)),\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 $list = useFormList<Values>({ $values, $errors, $status });\n const $watch = useFormWatch<Values>({ $status, cascadeUpdates });\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\n Object.keys($watch.subscribers.current).forEach((path) => {\n const value = getPath(path, $values.refValues.current);\n const previousValue = getPath(path, previousValues);\n\n if (value !== previousValue) {\n $watch\n .getFieldSubscribers(path)\n .forEach((cb) => cb({ previousValues, updatedValues: $values.refValues.current }));\n }\n });\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","useFormList","useFormWatch","useFormValidating","getPath","validateFieldValue","shouldValidateOnChange","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 type { FormPathValue, LooseKeys } from './paths.types';\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\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 = (err: unknown) => (err instanceof Error ? err.message : String(err)),\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 $list = useFormList<Values>({ $values, $errors, $status });\n const $watch = useFormWatch<Values>({ $status, cascadeUpdates });\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 notifyWatchSubscribers = useCallback((previousValues: Values) => {\n Object.keys($watch.subscribers.current).forEach((path) => {\n const value = getPath(path, $values.refValues.current);\n const previousValue = getPath(path, previousValues);\n\n if (value !== previousValue) {\n $watch.subscribers.current[path]?.forEach((cb) =>\n cb({\n previousValue: getPath(path, previousValues) as FormPathValue<\n Values,\n LooseKeys<Values>\n >,\n value: getPath(path, $values.refValues.current) as FormPathValue<\n Values,\n LooseKeys<Values>\n >,\n touched: $status.isTouched(path),\n dirty: $status.isDirty(path),\n })\n );\n }\n });\n }, []);\n\n const handleValuesChanges = useCallback(\n (previousValues: Values) => {\n clearInputErrorOnChange && $errors.clearErrors();\n mode === 'uncontrolled' && setFormKey((key) => key + 1);\n notifyWatchSubscribers(previousValues);\n },\n [clearInputErrorOnChange, notifyWatchSubscribers]\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: ((path, payload) => {\n const previousValues = $values.refValues.current;\n $list.reorderListItem(path, payload);\n notifyWatchSubscribers(previousValues);\n }) as typeof $list.reorderListItem,\n insertListItem: ((path, item, index) => {\n const previousValues = $values.refValues.current;\n $list.insertListItem(path, item, index);\n notifyWatchSubscribers(previousValues);\n }) as typeof $list.insertListItem,\n removeListItem: ((path, index) => {\n const previousValues = $values.refValues.current;\n $list.removeListItem(path, index);\n notifyWatchSubscribers(previousValues);\n }) as typeof $list.removeListItem,\n replaceListItem: ((path, index, item) => {\n const previousValues = $values.refValues.current;\n $list.replaceListItem(path, index, item);\n notifyWatchSubscribers(previousValues);\n }) as typeof $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 +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<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<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,eAAe;CAChE,MAAM,CAAC,YAAY,iBAAiB,SAAS,aAAa;CAE1D,MAAM,aAAa,OAAO,eAAe;CACzC,MAAM,WAAW,OAAO,aAAa;CAErC,MAAM,aAAa,aAAa,WAA+D;EAC7F,MAAM,iBAAiB,OAAO,WAAW,aAAa,OAAO,WAAW,QAAQ,GAAG;AACnF,aAAW,UAAU;AAErB,MAAI,SAAS,aACX,iBAAgB,eAAe;IAEhC,EAAE,CAAC;CAEN,MAAM,WAAW,aACd,QAA4D,cAAc,UAAU;EACnF,MAAM,iBAAiB,OAAO,WAAW,aAAa,OAAO,SAAS,QAAQ,GAAG;AACjF,WAAS,UAAU;AAEnB,MAAI,SAAS,gBAAgB,YAC3B,eAAc,eAAe;IAGjC,EAAE,CACH;CAED,MAAM,eAA4B,kBAAkB,WAAW,EAAE,CAAC,EAAE,EAAE,CAAC;CAEvE,MAAM,aAAiC,aAAa,WAAW;EAC7D,MAAM,cAAc,SAChB;GAAE,GAAG,QAAQ,UAAU;GAAS,GAAG;GAAQ,GAC3C,QAAQ,UAAU;AACtB,UAAQ,kBAAkB,YAAY;AACtC,WAAS,EAAE,CAAC;IACX,EAAE,CAAC;CAEN,MAAM,kBAA2C,aAAa,MAAM,YAAY;AAC9E,cAAY,mBAAmB;AAC7B,OAAI,UAAU,gBAAgB,KAAK,KAAK,QACtC,QAAO;AAGT,UAAO;IAAE,GAAG;KAAiB,OAAO;IAAS;IAC7C;IACD,EAAE,CAAC;CAEN,MAAM,gBAAuC,aAAa,MAAM,OAAO,gBAAgB;AACrF,YAAU,iBAAiB;AACzB,OAAI,UAAU,cAAc,KAAK,KAAK,MACpC,QAAO;AAGT,UAAO;IAAE,GAAG;KAAe,OAAO;IAAO;KACxC,YAAY;IACd,EAAE,CAAC;CAEN,MAAM,0BAA2D,aAAa,MAAM,UAAU;EAC5F,MAAM,eAAe,UAAU,SAAS,SAAS,KAAK;EACtD,MAAM,QAAQ,CAAC,QAAQ,QAAQ,MAAM,QAAQ,mBAAmB,CAAC,EAAE,MAAM;EACzE,MAAM,eAAe,eAAe,MAAM,SAAS,QAAQ;AAC3D,eAAa,QAAkB;AAC/B,WAAS,cAAc,iBAAiB,MAAM;IAC7C,EAAE,CAAC;AAiDN,QAAO;EACL;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,WAxDwC,aACvC,SAAS,UAAU,WAAW,SAAS,KAAK,EAC7C,EAAE,CACH;EAsDC;EACA;EACA;EACA;EACA,iBAxDuC,aACtC,SACC,UAAU,YAAY;AACpB,OAAI,OAAO,SAAS,SAClB,QAAO;GAGT,MAAM,SAAS,eAAe,MAAM,QAAQ;AAC5C,UAAO,OAAO;AAEd,OAAI,QAAQ,QAAQ,QAAQ,CAC1B,QAAO;AAGT,UAAO;IACP,EACJ,EAAE,CACH;EAwCC,SAtCsC,aAAa,SAAS;AAC5D,OAAI,MAAM;IACR,MAAM,kBAAkB,QAAQ,MAAM,SAAS,QAAQ;AACvD,QAAI,OAAO,oBAAoB,UAC7B,QAAO;AAKT,WAAO,CAAC,QAFc,QAAQ,MAAM,QAAQ,UAAU,QAAQ,EACjC,QAAQ,MAAM,QAAQ,eAAe,QAAQ,CACtB;;AAItD,OADqB,OAAO,KAAK,SAAS,QAAQ,CAAC,SAAS,EAE1D,QAAO,UAAU,SAAS,QAAQ;AAGpC,UAAO,CAAC,QAAQ,QAAQ,UAAU,SAAS,QAAQ,eAAe,QAAQ;KACzE,EAAE,CAAC;EAqBJ,UAnBe,kBAAkB,SAAS,SAAS,EAAE,CAAC;EAoBtD,YAnBiB,kBAAkB,WAAW,SAAS,EAAE,CAAC;EAoB1D;EACD"}
|
|
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,eAAe;CAChE,MAAM,CAAC,YAAY,iBAAiB,SAAS,aAAa;CAE1D,MAAM,aAAa,OAAO,eAAe;CACzC,MAAM,WAAW,OAAO,aAAa;CAErC,MAAM,aAAa,aAAa,WAA+D;EAC7F,MAAM,iBAAiB,OAAO,WAAW,aAAa,OAAO,WAAW,QAAQ,GAAG;AACnF,aAAW,UAAU;AAErB,MAAI,SAAS,aACX,iBAAgB,eAAe;IAEhC,EAAE,CAAC;CAEN,MAAM,WAAW,aACd,QAA4D,cAAc,UAAU;EACnF,MAAM,iBAAiB,OAAO,WAAW,aAAa,OAAO,SAAS,QAAQ,GAAG;AACjF,WAAS,UAAU;AAEnB,MAAI,SAAS,gBAAgB,YAC3B,eAAc,eAAe;IAGjC,EAAE,CACH;CAED,MAAM,eAA4B,kBAAkB,WAAW,EAAE,CAAC,EAAE,EAAE,CAAC;CAEvE,MAAM,aAAiC,aAAa,WAAW;EAC7D,MAAM,cAAc,SAChB;GAAE,GAAG,QAAQ,UAAU;GAAS,GAAG;GAAQ,GAC3C,QAAQ,UAAU;AACtB,UAAQ,kBAAkB,YAAY;AACtC,WAAS,EAAE,CAAC;IACX,EAAE,CAAC;CAEN,MAAM,kBAA2C,aAAa,MAAM,YAAY;AAC9E,cAAY,mBAAmB;AAC7B,OAAI,UAAU,gBAAgB,KAAK,KAAK,QACtC,QAAO;AAGT,UAAO;IAAE,GAAG;KAAiB,OAAO;IAAS;IAC7C;IACD,EAAE,CAAC;CAEN,MAAM,gBAAuC,aAAa,MAAM,OAAO,gBAAgB;AACrF,YAAU,iBAAiB;AACzB,OAAI,UAAU,cAAc,KAAK,KAAK,MACpC,QAAO;AAGT,UAAO;IAAE,GAAG;KAAe,OAAO;IAAO;KACxC,YAAY;IACd,EAAE,CAAC;CAEN,MAAM,0BAA2D,aAAa,MAAM,UAAU;EAC5F,MAAM,eAAe,UAAU,SAAS,SAAS,KAAK;EACtD,MAAM,QAAQ,CAAC,QAAQ,QAAQ,MAAM,QAAQ,mBAAmB,CAAC,EAAE,MAAM;EACzE,MAAM,eAAe,eAAe,MAAM,SAAS,QAAQ;AAC3D,eAAa,QAAkB;AAC/B,WAAS,cAAc,iBAAiB,MAAM;IAC7C,EAAE,CAAC;AAiDN,QAAO;EACL;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,WAxDwC,aACvC,SAAS,UAAU,WAAW,SAAS,KAAK,EAC7C,EAAE,CACH;EAsDC;EACA;EACA;EACA;EACA,iBAxDuC,aACtC,SACC,UAAU,YAAY;AACpB,OAAI,OAAO,SAAS,SAClB,QAAO;GAGT,MAAM,SAAS,eAAe,MAAM,QAAQ;AAC5C,UAAO,OAAO;AAEd,OAAI,QAAQ,QAAQ,QAAQ,CAC1B,QAAO;AAGT,UAAO;IACP,EACJ,EAAE,CACH;EAwCC,SAtCsC,aAAa,SAAS;AAC5D,OAAI,MAAM;IACR,MAAM,kBAAkB,QAAQ,MAAM,SAAS,QAAQ;AACvD,QAAI,OAAO,oBAAoB,UAC7B,QAAO;AAKT,WAAO,CAAC,QAFc,QAAQ,MAAM,QAAQ,UAAU,QAAQ,EACjC,QAAQ,MAAM,QAAQ,eAAe,QAAQ,CACtB;;AAItD,OADqB,OAAO,KAAK,SAAS,QAAQ,CAAC,SAAS,EAE1D,QAAO,UAAU,SAAS,QAAQ;AAGpC,UAAO,CAAC,QAAQ,QAAQ,UAAU,SAAS,QAAQ,eAAe,QAAQ;KACzE,EAAE,CAAC;EAqBJ,UAnBe,kBAAkB,SAAS,SAAS,EAAE,CAAC;EAoBtD,YAnBiB,kBAAkB,WAAW,SAAS,EAAE,CAAC;EAoB1D;EACD"}
|
|
@@ -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<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: (payload: SetValuesInput<
|
|
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,MAAM;CACjC,MAAM,CAAC,aAAa,kBAAkB,SAAiB,iBAAkB,EAAE,CAAY;CACvF,MAAM,YAAY,OAAO,YAAY;CACrC,MAAM,iBAAiB,OAAO,YAAY;CAE1C,MAAM,YAAY,aACf,EACC,QACA,aACA,cAAc,MACd,0BAA0B,WACE;EAC5B,MAAM,iBAAiB,UAAU;EACjC,MAAM,iBAAiB,kBAAkB,WAAW,OAAO,UAAU,QAAQ,GAAG;EAChF,MAAM,gBAAgB,0BAClB;GAAE,GAAG;GAAgB,GAAG;GAAgB,GACvC;AACL,YAAU,UAAU;AACpB,MAAI,aAAa;AACf,kBAAe,cAAc;AAC7B,OAAI,SAAS,eACX,WAAU,UAAU;;AAGxB,mBAAiB,eAAe,eAAe;AAC/C,eACI,OAAO,QAAQ,CAChB,SAAS,eAAe,WAAY;GAAE;GAAe;GAAgB,CAAC,CAAC;IAE5E,CAAC,eAAe,CACjB;CAED,MAAM,gBAAgB,aACnB,YAAwC;EACvC,MAAM,eAAe,QAAQ,QAAQ,MAAM,UAAU,QAAQ;EAC7D,MAAM,eACJ,QAAQ,iBAAiB,WAAW,QAAQ,MAAM,aAAa,GAAG,QAAQ;AAE5E,MAAI,iBAAiB,cAAc;GACjC,MAAM,iBAAiB,UAAU;GACjC,MAAM,gBAAgB,QAAQ,QAAQ,MAAM,cAAc,UAAU,QAAQ;AAC5E,aAAU;IAAE,QAAQ;IAAe,aAAa,QAAQ;IAAa,CAAC;AAEtE,WAAQ,aACJ,OAAO,QAAQ,CAChB,SAAS,eACR,WAAY;IAAE,MAAM,QAAQ;IAAM;IAAe;IAAgB,CAAC,CACnE;;IAGP,CAAC,UAAU,CACZ;CAED,MAAM,oBAAoB,aAAa,YAAoB;AACzD,iBAAe,UAAU;IACxB,EAAE,CAAC;CAEN,MAAM,aAAa,aAChB,QAAgB,iBAA6B;AAC5C,MAAI,CAAC,YAAY,SAAS;AACxB,eAAY,UAAU;AACtB,aAAU;IAAE;IAAQ,aAAa,SAAS;IAAc,CAAC;AACzD,qBAAkB,OAAO;AACzB,iBAAc;;IAGlB,CAAC,UAAU,CACZ;AA6BD,QAAO;EACL;EACA;EACA;EACA;EACA;EACA;EACA,aAlCkB,kBAAkB;AACpC,aAAU;IACR,QAAQ,eAAe;IACvB,aAAa;IACb,yBAAyB;IAC1B,CAAC;KACD,CAAC,UAAU,CAAC;EA6Bb;EACA;EACA,WA7BgB,kBAAkB,UAAU,SAAS,EAAE,CAAC;EA8BxD,mBA7BwB,kBAAkB,eAAe,SAAS,EAAE,CAAC;EA8BrE,YA5BiB,aAChB,MAAmB,gBAAyE;GAC3F,MAAM,gBAAgB,QAAQ,MAAM,eAAe,QAAQ;AAC3D,OAAI,OAAO,kBAAkB,YAC3B;AAEF,iBAAc;IACZ;IACA,OAAO;IACP,aAAa,SAAS;IACtB;IACD,CAAC;KAEJ,CAAC,eAAe,KAAK,CACtB;EAeA"}
|
|
@@ -22,8 +22,10 @@ function useFormWatch({ $status, cascadeUpdates }) {
|
|
|
22
22
|
touched: $status.isTouched(path),
|
|
23
23
|
dirty: $status.isDirty(path)
|
|
24
24
|
})) ?? [];
|
|
25
|
-
|
|
26
|
-
|
|
25
|
+
for (const subscriptionKey in subscribers.current) {
|
|
26
|
+
const isParent = String(path).startsWith(`${subscriptionKey}.`);
|
|
27
|
+
const isChild = String(subscriptionKey).startsWith(`${path}.`);
|
|
28
|
+
if (isParent || cascadeUpdates && isChild) result.push(...subscribers.current[subscriptionKey].map((cb) => (input) => cb({
|
|
27
29
|
previousValue: getPath(subscriptionKey, input.previousValues),
|
|
28
30
|
value: getPath(subscriptionKey, input.updatedValues),
|
|
29
31
|
touched: $status.isTouched(subscriptionKey),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-form-watch.mjs","names":[],"sources":["../../../src/hooks/use-form-watch/use-form-watch.ts"],"sourcesContent":["import { useCallback, useEffect, useRef } from 'react';\nimport { getPath } from '../../paths';\nimport { LooseKeys } from '../../paths.types';\nimport { FormFieldSubscriber, Watch } from '../../types';\nimport { $FormStatus } from '../use-form-status/use-form-status';\nimport { SetValuesSubscriberPayload } from '../use-form-values/use-form-values';\n\ninterface UseFormWatchInput<Values extends Record<
|
|
1
|
+
{"version":3,"file":"use-form-watch.mjs","names":[],"sources":["../../../src/hooks/use-form-watch/use-form-watch.ts"],"sourcesContent":["import { useCallback, useEffect, useRef } from 'react';\nimport { getPath } from '../../paths';\nimport { LooseKeys } from '../../paths.types';\nimport { FormFieldSubscriber, Watch } from '../../types';\nimport { $FormStatus } from '../use-form-status/use-form-status';\nimport { SetValuesSubscriberPayload } from '../use-form-values/use-form-values';\n\ninterface UseFormWatchInput<out Values extends Record<PropertyKey, any>> {\n $status: $FormStatus<Values>;\n cascadeUpdates?: boolean;\n}\n\nexport function useFormWatch<\n Values extends Record<PropertyKey, any>,\n Field extends LooseKeys<Values> = LooseKeys<Values>,\n>({ $status, cascadeUpdates }: UseFormWatchInput<Values>) {\n const subscribers = useRef<Record<Field, FormFieldSubscriber<Values, Field>[]>>({} as any);\n\n const watch: Watch<Values, Field> = useCallback((path, callback) => {\n useEffect(() => {\n subscribers.current[path] = subscribers.current[path] || [];\n subscribers.current[path].push(callback);\n\n return () => {\n subscribers.current[path] = subscribers.current[path].filter((cb) => cb !== callback);\n };\n }, [callback]);\n }, []);\n\n const getFieldSubscribers = useCallback((path: Field) => {\n const result: ((input: SetValuesSubscriberPayload<Values>) => void)[] =\n subscribers.current[path]?.map(\n (callback) => (input: SetValuesSubscriberPayload<Values>) =>\n callback({\n previousValue: getPath(path, input.previousValues) as any,\n value: getPath(path, input.updatedValues) as any,\n touched: $status.isTouched(path),\n dirty: $status.isDirty(path),\n })\n ) ?? [];\n\n for (const subscriptionKey in subscribers.current) {\n const isParent = String(path).startsWith(`${subscriptionKey}.`);\n const isChild = String(subscriptionKey).startsWith(`${path}.`);\n\n if (isParent || (cascadeUpdates && isChild)) {\n result.push(\n ...subscribers.current[subscriptionKey].map(\n (cb) => (input: SetValuesSubscriberPayload<Values>) =>\n cb({\n previousValue: getPath(subscriptionKey, input.previousValues) as any,\n value: getPath(subscriptionKey, input.updatedValues) as any,\n touched: $status.isTouched(subscriptionKey),\n dirty: $status.isDirty(subscriptionKey),\n })\n )\n );\n }\n }\n\n return result;\n }, []);\n\n return {\n subscribers,\n watch,\n getFieldSubscribers,\n };\n}\n"],"mappings":";;;;AAYA,SAAgB,aAGd,EAAE,SAAS,kBAA6C;CACxD,MAAM,cAAc,OAA4D,EAAE,CAAQ;AA+C1F,QAAO;EACL;EACA,OA/CkC,aAAa,MAAM,aAAa;AAClE,mBAAgB;AACd,gBAAY,QAAQ,QAAQ,YAAY,QAAQ,SAAS,EAAE;AAC3D,gBAAY,QAAQ,MAAM,KAAK,SAAS;AAExC,iBAAa;AACX,iBAAY,QAAQ,QAAQ,YAAY,QAAQ,MAAM,QAAQ,OAAO,OAAO,SAAS;;MAEtF,CAAC,SAAS,CAAC;KACb,EAAE,CAAC;EAuCJ,qBArC0B,aAAa,SAAgB;GACvD,MAAM,SACJ,YAAY,QAAQ,OAAO,KACxB,cAAc,UACb,SAAS;IACP,eAAe,QAAQ,MAAM,MAAM,eAAe;IAClD,OAAO,QAAQ,MAAM,MAAM,cAAc;IACzC,SAAS,QAAQ,UAAU,KAAK;IAChC,OAAO,QAAQ,QAAQ,KAAK;IAC7B,CAAC,CACL,IAAI,EAAE;AAET,QAAK,MAAM,mBAAmB,YAAY,SAAS;IACjD,MAAM,WAAW,OAAO,KAAK,CAAC,WAAW,GAAG,gBAAgB,GAAG;IAC/D,MAAM,UAAU,OAAO,gBAAgB,CAAC,WAAW,GAAG,KAAK,GAAG;AAE9D,QAAI,YAAa,kBAAkB,QACjC,QAAO,KACL,GAAG,YAAY,QAAQ,iBAAiB,KACrC,QAAQ,UACP,GAAG;KACD,eAAe,QAAQ,iBAAiB,MAAM,eAAe;KAC7D,OAAO,QAAQ,iBAAiB,MAAM,cAAc;KACpD,SAAS,QAAQ,UAAU,gBAAgB;KAC3C,OAAO,QAAQ,QAAQ,gBAAgB;KACxC,CAAC,CACL,CACF;;AAIL,UAAO;KACN,EAAE,CAAC;EAML"}
|
package/esm/use-form.mjs
CHANGED
|
@@ -49,16 +49,21 @@ function useForm({ name, mode = "controlled", initialValues, initialErrors = {},
|
|
|
49
49
|
$validating.clearValidating();
|
|
50
50
|
mode === "uncontrolled" && setFormKey((key) => key + 1);
|
|
51
51
|
}, []);
|
|
52
|
-
const
|
|
53
|
-
clearInputErrorOnChange && $errors.clearErrors();
|
|
54
|
-
mode === "uncontrolled" && setFormKey((key) => key + 1);
|
|
52
|
+
const notifyWatchSubscribers = useCallback((previousValues) => {
|
|
55
53
|
Object.keys($watch.subscribers.current).forEach((path) => {
|
|
56
|
-
if (getPath(path, $values.refValues.current) !== getPath(path, previousValues)) $watch.
|
|
57
|
-
previousValues,
|
|
58
|
-
|
|
54
|
+
if (getPath(path, $values.refValues.current) !== getPath(path, previousValues)) $watch.subscribers.current[path]?.forEach((cb) => cb({
|
|
55
|
+
previousValue: getPath(path, previousValues),
|
|
56
|
+
value: getPath(path, $values.refValues.current),
|
|
57
|
+
touched: $status.isTouched(path),
|
|
58
|
+
dirty: $status.isDirty(path)
|
|
59
59
|
}));
|
|
60
60
|
});
|
|
61
|
-
}, [
|
|
61
|
+
}, []);
|
|
62
|
+
const handleValuesChanges = useCallback((previousValues) => {
|
|
63
|
+
clearInputErrorOnChange && $errors.clearErrors();
|
|
64
|
+
mode === "uncontrolled" && setFormKey((key) => key + 1);
|
|
65
|
+
notifyWatchSubscribers(previousValues);
|
|
66
|
+
}, [clearInputErrorOnChange, notifyWatchSubscribers]);
|
|
62
67
|
const initialize = useCallback((values) => {
|
|
63
68
|
const previousValues = $values.refValues.current;
|
|
64
69
|
$values.initialize(values, () => mode === "uncontrolled" && setFormKey((key) => key + 1));
|
|
@@ -272,10 +277,26 @@ function useForm({ name, mode = "controlled", initialValues, initialErrors = {},
|
|
|
272
277
|
isDirty: $status.isDirty,
|
|
273
278
|
getTouched: $status.getTouched,
|
|
274
279
|
getDirty: $status.getDirty,
|
|
275
|
-
reorderListItem:
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
280
|
+
reorderListItem: ((path, payload) => {
|
|
281
|
+
const previousValues = $values.refValues.current;
|
|
282
|
+
$list.reorderListItem(path, payload);
|
|
283
|
+
notifyWatchSubscribers(previousValues);
|
|
284
|
+
}),
|
|
285
|
+
insertListItem: ((path, item, index) => {
|
|
286
|
+
const previousValues = $values.refValues.current;
|
|
287
|
+
$list.insertListItem(path, item, index);
|
|
288
|
+
notifyWatchSubscribers(previousValues);
|
|
289
|
+
}),
|
|
290
|
+
removeListItem: ((path, index) => {
|
|
291
|
+
const previousValues = $values.refValues.current;
|
|
292
|
+
$list.removeListItem(path, index);
|
|
293
|
+
notifyWatchSubscribers(previousValues);
|
|
294
|
+
}),
|
|
295
|
+
replaceListItem: ((path, index, item) => {
|
|
296
|
+
const previousValues = $values.refValues.current;
|
|
297
|
+
$list.replaceListItem(path, index, item);
|
|
298
|
+
notifyWatchSubscribers(previousValues);
|
|
299
|
+
}),
|
|
279
300
|
reset,
|
|
280
301
|
validate,
|
|
281
302
|
validateField,
|
package/esm/use-form.mjs.map
CHANGED
|
@@ -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\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<string, 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 = (err: unknown) => (err instanceof Error ? err.message : String(err)),\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 $list = useFormList<Values>({ $values, $errors, $status });\n const $watch = useFormWatch<Values>({ $status, cascadeUpdates });\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\n Object.keys($watch.subscribers.current).forEach((path) => {\n const value = getPath(path, $values.refValues.current);\n const previousValue = getPath(path, previousValues);\n\n if (value !== previousValue) {\n $watch\n .getFieldSubscribers(path)\n .forEach((cb) => cb({ previousValues, updatedValues: $values.refValues.current }));\n }\n });\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 type { FormPathValue, LooseKeys } from './paths.types';\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\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 = (err: unknown) => (err instanceof Error ? err.message : String(err)),\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 $list = useFormList<Values>({ $values, $errors, $status });\n const $watch = useFormWatch<Values>({ $status, cascadeUpdates });\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 notifyWatchSubscribers = useCallback((previousValues: Values) => {\n Object.keys($watch.subscribers.current).forEach((path) => {\n const value = getPath(path, $values.refValues.current);\n const previousValue = getPath(path, previousValues);\n\n if (value !== previousValue) {\n $watch.subscribers.current[path]?.forEach((cb) =>\n cb({\n previousValue: getPath(path, previousValues) as FormPathValue<\n Values,\n LooseKeys<Values>\n >,\n value: getPath(path, $values.refValues.current) as FormPathValue<\n Values,\n LooseKeys<Values>\n >,\n touched: $status.isTouched(path),\n dirty: $status.isDirty(path),\n })\n );\n }\n });\n }, []);\n\n const handleValuesChanges = useCallback(\n (previousValues: Values) => {\n clearInputErrorOnChange && $errors.clearErrors();\n mode === 'uncontrolled' && setFormKey((key) => key + 1);\n notifyWatchSubscribers(previousValues);\n },\n [clearInputErrorOnChange, notifyWatchSubscribers]\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: ((path, payload) => {\n const previousValues = $values.refValues.current;\n $list.reorderListItem(path, payload);\n notifyWatchSubscribers(previousValues);\n }) as typeof $list.reorderListItem,\n insertListItem: ((path, item, index) => {\n const previousValues = $values.refValues.current;\n $list.insertListItem(path, item, index);\n notifyWatchSubscribers(previousValues);\n }) as typeof $list.insertListItem,\n removeListItem: ((path, index) => {\n const previousValues = $values.refValues.current;\n $list.removeListItem(path, index);\n notifyWatchSubscribers(previousValues);\n }) as typeof $list.removeListItem,\n replaceListItem: ((path, index, item) => {\n const previousValues = $values.refValues.current;\n $list.replaceListItem(path, index, item);\n notifyWatchSubscribers(previousValues);\n }) as typeof $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,6 +1,6 @@
|
|
|
1
1
|
import { ClearFieldDirty, FormMode, FormStatus, GetFieldStatus, ResetStatus, SetCalculatedFieldDirty, SetFieldDirty, SetFieldTouched } from '../../types';
|
|
2
2
|
import type { $FormValues } from '../use-form-values/use-form-values';
|
|
3
|
-
export interface $FormStatus<Values extends Record<string, any>> {
|
|
3
|
+
export interface $FormStatus<out Values extends Record<string, any>> {
|
|
4
4
|
touchedState: FormStatus;
|
|
5
5
|
dirtyState: FormStatus;
|
|
6
6
|
touchedRef: React.RefObject<FormStatus>;
|
|
@@ -20,7 +20,7 @@ export interface $FormStatus<Values extends Record<string, any>> {
|
|
|
20
20
|
getTouched: () => FormStatus;
|
|
21
21
|
setCalculatedFieldDirty: SetCalculatedFieldDirty<Values>;
|
|
22
22
|
}
|
|
23
|
-
interface UseFormStatusInput<Values extends Record<string, any>> {
|
|
23
|
+
interface UseFormStatusInput<out Values extends Record<string, any>> {
|
|
24
24
|
initialDirty: FormStatus;
|
|
25
25
|
initialTouched: FormStatus;
|
|
26
26
|
mode: FormMode;
|
|
@@ -1,30 +1,30 @@
|
|
|
1
1
|
import { FormMode } from '../../types';
|
|
2
|
-
export interface $FormValues<Values extends Record<PropertyKey, any>> {
|
|
2
|
+
export interface $FormValues<out Values extends Record<PropertyKey, any>> {
|
|
3
3
|
initialized: React.RefObject<boolean>;
|
|
4
4
|
stateValues: Values;
|
|
5
5
|
refValues: React.RefObject<Values>;
|
|
6
6
|
valuesSnapshot: React.RefObject<Values>;
|
|
7
|
-
setValues: (payload: SetValuesInput<
|
|
8
|
-
setFieldValue: (payload: SetFieldValueInput<
|
|
7
|
+
setValues: <TValues extends Values>(payload: SetValuesInput<TValues>) => void;
|
|
8
|
+
setFieldValue: <TValues extends Values>(payload: SetFieldValueInput<TValues>) => void;
|
|
9
9
|
resetValues: () => void;
|
|
10
|
-
setValuesSnapshot: (payload:
|
|
11
|
-
initialize: (values:
|
|
10
|
+
setValuesSnapshot: <TValues extends Values>(payload: TValues) => void;
|
|
11
|
+
initialize: <TValues extends Values>(values: TValues, onInitialize: () => void) => void;
|
|
12
12
|
getValues: () => Values;
|
|
13
13
|
getValuesSnapshot: () => Values;
|
|
14
|
-
resetField: (path: PropertyKey, subscribers?: (SetFieldValueSubscriber<
|
|
14
|
+
resetField: <TValues extends Values>(path: PropertyKey, subscribers?: (SetFieldValueSubscriber<TValues> | null | undefined)[]) => void;
|
|
15
15
|
}
|
|
16
16
|
export interface SetValuesSubscriberPayload<Values> {
|
|
17
17
|
path?: PropertyKey;
|
|
18
18
|
updatedValues: Values;
|
|
19
19
|
previousValues: Values;
|
|
20
20
|
}
|
|
21
|
-
export interface SetValuesInput<Values
|
|
22
|
-
values: Partial<Values> | ((values:
|
|
21
|
+
export interface SetValuesInput<out Values = Record<string, any>> {
|
|
22
|
+
values: Partial<Values> | (<TValues extends Values>(values: TValues) => Partial<TValues>);
|
|
23
23
|
mergeWithPreviousValues?: boolean;
|
|
24
24
|
updateState?: boolean;
|
|
25
25
|
subscribers?: (SetFieldValueSubscriber<Values> | null | undefined)[];
|
|
26
26
|
}
|
|
27
|
-
export type SetFieldValueSubscriber<Values> = (payload: SetValuesSubscriberPayload<
|
|
27
|
+
export type SetFieldValueSubscriber<out Values> = <TValues extends Values>(payload: SetValuesSubscriberPayload<TValues>) => void;
|
|
28
28
|
export interface SetFieldValueInput<Values> {
|
|
29
29
|
path: PropertyKey;
|
|
30
30
|
value: any;
|
|
@@ -2,13 +2,13 @@ import { LooseKeys } from '../../paths.types';
|
|
|
2
2
|
import { FormFieldSubscriber, Watch } from '../../types';
|
|
3
3
|
import { $FormStatus } from '../use-form-status/use-form-status';
|
|
4
4
|
import { SetValuesSubscriberPayload } from '../use-form-values/use-form-values';
|
|
5
|
-
interface UseFormWatchInput<Values extends Record<
|
|
5
|
+
interface UseFormWatchInput<out Values extends Record<PropertyKey, any>> {
|
|
6
6
|
$status: $FormStatus<Values>;
|
|
7
7
|
cascadeUpdates?: boolean;
|
|
8
8
|
}
|
|
9
|
-
export declare function useFormWatch<Values extends Record<
|
|
10
|
-
subscribers: import("react").RefObject<Record<
|
|
11
|
-
watch: Watch<Values>;
|
|
12
|
-
getFieldSubscribers: (path:
|
|
9
|
+
export declare function useFormWatch<Values extends Record<PropertyKey, any>, Field extends LooseKeys<Values> = LooseKeys<Values>>({ $status, cascadeUpdates }: UseFormWatchInput<Values>): {
|
|
10
|
+
subscribers: import("react").RefObject<Record<Field, FormFieldSubscriber<Values, Field>[]>>;
|
|
11
|
+
watch: Watch<Values, Field>;
|
|
12
|
+
getFieldSubscribers: (path: Field) => ((input: SetValuesSubscriberPayload<Values>) => void)[];
|
|
13
13
|
};
|
|
14
14
|
export {};
|
package/lib/types.d.ts
CHANGED
|
@@ -29,13 +29,13 @@ export type FormRulesRecord<Values, InitValues = Values> = Partial<{
|
|
|
29
29
|
[formRootRule]?: Rule<Values, InitValues>;
|
|
30
30
|
};
|
|
31
31
|
export type FormValidateInput<Values> = FormRulesRecord<Values> | ((values: Values) => FormErrors | Promise<FormErrors>);
|
|
32
|
-
export type SetValues<Values> =
|
|
33
|
-
export type SetInitialValues<Values> = (values:
|
|
32
|
+
export type SetValues<out Values> = <TValues extends Values>(value: Partial<TValues> | ((prevState: Partial<TValues>) => Partial<TValues>)) => void;
|
|
33
|
+
export type SetInitialValues<out Values> = <TValues extends Values>(values: TValues) => void;
|
|
34
34
|
export type SetErrors = React.Dispatch<React.SetStateAction<FormErrors>>;
|
|
35
35
|
export type SetFormStatus = React.Dispatch<React.SetStateAction<FormStatus>>;
|
|
36
|
-
export type OnSubmit<Values, TransformedValues = Values> = (handleSubmit: (values: TransformedValues, event: React.
|
|
37
|
-
export type GetTransformedValues<Values, TransformedValues = Values> = (values?:
|
|
38
|
-
export type OnReset = (event: React.
|
|
36
|
+
export type OnSubmit<Values, TransformedValues = Values> = (handleSubmit: (values: TransformedValues, event: React.SyntheticEvent<HTMLFormElement> | undefined) => void | Promise<any>, handleValidationFailure?: (errors: FormErrors, values: Values, event: React.SyntheticEvent<HTMLFormElement> | undefined) => void) => (event?: React.SyntheticEvent<HTMLFormElement>) => void;
|
|
37
|
+
export type GetTransformedValues<out Values, TransformedValues = Values> = <TValues extends Values>(values?: TValues) => TransformedValues;
|
|
38
|
+
export type OnReset = (event: React.SyntheticEvent<HTMLFormElement>) => void;
|
|
39
39
|
export interface GetInputPropsOptions {
|
|
40
40
|
type?: GetInputPropsType;
|
|
41
41
|
withError?: boolean;
|
|
@@ -53,7 +53,7 @@ export interface GetInputPropsReturnType {
|
|
|
53
53
|
onBlur?: any;
|
|
54
54
|
}
|
|
55
55
|
export type GetInputProps<Values> = <Field extends LooseKeys<Values>>(path: Field, options?: GetInputPropsOptions) => GetInputPropsReturnType;
|
|
56
|
-
export type SetFieldValue<Values> = <Field extends LooseKeys<
|
|
56
|
+
export type SetFieldValue<out Values> = <TValues extends Values, Field extends LooseKeys<TValues>>(path: Field, value: FormPathValue<TValues, Field> | ((prevValue: FormPathValue<TValues, Field>) => FormPathValue<TValues, Field>), options?: {
|
|
57
57
|
forceUpdate: boolean;
|
|
58
58
|
}) => void;
|
|
59
59
|
export type ClearFieldError = (path: unknown) => void;
|
|
@@ -72,25 +72,25 @@ export type ValidateField<Values, Rules = any> = <Field extends LooseKeys<Values
|
|
|
72
72
|
export type SetFieldError<Values> = <Field extends LooseKeys<Values>>(path: Field, error: React.ReactNode) => void;
|
|
73
73
|
export type SetFieldTouched<Values> = <Field extends LooseKeys<Values>>(path: Field, touched: boolean) => void;
|
|
74
74
|
export type SetFieldDirty<Values> = <Field extends LooseKeys<Values>>(path: Field, dirty: boolean, forceUpdate?: boolean) => void;
|
|
75
|
-
export type SetCalculatedFieldDirty<Values> = <Field extends LooseKeys<Values>>(path: Field, value: FormPathValue<
|
|
76
|
-
export type ReorderListItem<Values> = <Field extends LooseKeys<Values>>(path: Field, payload: ReorderPayload) => void;
|
|
77
|
-
export type InsertListItem<Values> = <Field extends LooseKeys<Values>>(path: Field, item:
|
|
78
|
-
export type ReplaceListItem<Values> = <Field extends LooseKeys<Values>>(path: Field, index: number, item:
|
|
79
|
-
export type RemoveListItem<Values> = <Field extends LooseKeys<Values>>(path: Field, index: number) => void;
|
|
75
|
+
export type SetCalculatedFieldDirty<out Values> = <TValues extends Values, Field extends LooseKeys<Values>>(path: Field, value: FormPathValue<TValues, Field>) => void;
|
|
76
|
+
export type ReorderListItem<out Values> = <Field extends LooseKeys<Values>>(path: Field, payload: ReorderPayload) => void;
|
|
77
|
+
export type InsertListItem<out Values> = <Field extends LooseKeys<Values>, Element extends FormArrayElement<Values, Field>>(path: Field, item: Element, index?: number) => void;
|
|
78
|
+
export type ReplaceListItem<out Values> = <Field extends LooseKeys<Values>, Element extends FormArrayElement<Values, Field>>(path: Field, index: number, item: Element) => void;
|
|
79
|
+
export type RemoveListItem<out Values> = <Field extends LooseKeys<Values>>(path: Field, index: number) => void;
|
|
80
80
|
export type GetFieldStatus<Values> = <Field extends LooseKeys<Values>>(path?: Field) => boolean;
|
|
81
81
|
export type ResetStatus = () => void;
|
|
82
82
|
export type GetStatus = () => FormStatus;
|
|
83
|
-
export type ResetDirty<Values> = (values?:
|
|
83
|
+
export type ResetDirty<out Values> = <TValues extends Values>(values?: TValues) => void;
|
|
84
84
|
export type IsValid<Values, Rules = any> = <Field extends LooseKeys<Values>>(path?: Field) => [HasAsyncRules<Rules>] extends [true] ? Promise<boolean> : [HasAsyncRules<Rules>] extends [false] ? boolean : boolean | Promise<boolean>;
|
|
85
85
|
export type IsValidating<Values> = <Field extends LooseKeys<Values>>(path?: Field) => boolean;
|
|
86
|
-
export type Initialize<Values> = (values:
|
|
87
|
-
export type FormFieldSubscriber<Values, Field extends LooseKeys<Values>> = (input: {
|
|
88
|
-
previousValue: FormPathValue<
|
|
89
|
-
value: FormPathValue<
|
|
86
|
+
export type Initialize<out Values> = <TValues extends Values>(values: TValues) => void;
|
|
87
|
+
export type FormFieldSubscriber<out Values, out Field extends LooseKeys<Values>> = <TValues extends Values>(input: {
|
|
88
|
+
previousValue: FormPathValue<TValues, Field>;
|
|
89
|
+
value: FormPathValue<TValues, Field>;
|
|
90
90
|
touched: boolean;
|
|
91
91
|
dirty: boolean;
|
|
92
92
|
}) => void;
|
|
93
|
-
export type Watch<Values
|
|
93
|
+
export type Watch<out Values, out Field extends LooseKeys<Values> = LooseKeys<Values>> = <TValues extends Values, TField extends Field>(path: TField, subscriber: FormFieldSubscriber<TValues, TField>) => void;
|
|
94
94
|
export type Key<Values> = <Field extends LooseKeys<Values>>(path: Field) => string;
|
|
95
95
|
export type GetInputNode<Values> = <NodeType extends HTMLElement, Field extends LooseKeys<Values>>(path: Field) => NodeType | null;
|
|
96
96
|
export interface UseFormInput<Values, TransformedValues = Values> {
|
|
@@ -118,7 +118,7 @@ export interface UseFormInput<Values, TransformedValues = Values> {
|
|
|
118
118
|
validateDebounce?: number;
|
|
119
119
|
resolveValidationError?: (error: unknown) => React.ReactNode;
|
|
120
120
|
}
|
|
121
|
-
|
|
121
|
+
interface _UseFormReturnType<out Values, out TransformedValues = Values, Rules = any> {
|
|
122
122
|
values: Values;
|
|
123
123
|
submitting: boolean;
|
|
124
124
|
initialized: boolean;
|
|
@@ -161,6 +161,7 @@ export interface UseFormReturnType<Values, TransformedValues = Values, Rules = a
|
|
|
161
161
|
getInputNode: GetInputNode<Values>;
|
|
162
162
|
resetField: (path: PropertyKey) => void;
|
|
163
163
|
}
|
|
164
|
+
export type UseFormReturnType<Values, TransformedValues = Values, Rules = any> = _UseFormReturnType<Values, TransformedValues, Rules>;
|
|
164
165
|
export type UseForm<Values = Record<string, unknown>, TransformedValues = Values, Rules = any> = (input?: UseFormInput<Values, TransformedValues>) => UseFormReturnType<Values, TransformedValues, Rules>;
|
|
165
166
|
export type TransformedValues<Form extends UseFormReturnType<any, any, any>> = Parameters<Parameters<Form['onSubmit']>[0]>[0];
|
|
166
167
|
export {};
|