UNPKG

@mantine/form

Version:

Mantine form management library

93 lines (92 loc) 3.06 kB
"use client"; import { getPath } from "../../paths/get-path.mjs"; import { setPath } from "../../paths/set-path.mjs"; import { useCallback, useRef, useState } from "react"; //#region packages/@mantine/form/src/hooks/use-form-values/use-form-values.ts function useFormValues({ initialValues, onValuesChange, mode }) { const initialized = useRef(false); const [stateValues, setStateValues] = useState(initialValues || {}); const refValues = useRef(stateValues); const valuesSnapshot = useRef(stateValues); const setValues = useCallback(({ values, subscribers, updateState = true, mergeWithPreviousValues = true }) => { const previousValues = refValues.current; const resolvedValues = values instanceof Function ? values(refValues.current) : values; const updatedValues = mergeWithPreviousValues ? { ...previousValues, ...resolvedValues } : resolvedValues; refValues.current = updatedValues; if (updateState) { setStateValues(updatedValues); if (mode === "uncontrolled") refValues.current = updatedValues; } onValuesChange?.(updatedValues, previousValues); subscribers?.filter(Boolean).forEach((subscriber) => subscriber({ updatedValues, previousValues })); }, [onValuesChange]); const setFieldValue = useCallback((payload) => { const currentValue = getPath(payload.path, refValues.current); const updatedValue = payload.value instanceof Function ? payload.value(currentValue) : payload.value; if (currentValue !== updatedValue) { const previousValues = refValues.current; const updatedValues = setPath(payload.path, updatedValue, refValues.current); setValues({ values: updatedValues, updateState: payload.updateState }); payload.subscribers?.filter(Boolean).forEach((subscriber) => subscriber({ path: payload.path, updatedValues, previousValues })); } }, [setValues]); const setValuesSnapshot = useCallback((payload) => { valuesSnapshot.current = payload; }, []); const initialize = useCallback((values, onInitialize) => { if (!initialized.current) { initialized.current = true; setValues({ values, updateState: mode === "controlled" }); setValuesSnapshot(values); onInitialize(); } }, [setValues]); return { initialized, stateValues, refValues, valuesSnapshot, setValues, setFieldValue, resetValues: useCallback(() => { setValues({ values: valuesSnapshot.current, updateState: true, mergeWithPreviousValues: false }); }, [setValues]), setValuesSnapshot, initialize, getValues: useCallback(() => refValues.current, []), getValuesSnapshot: useCallback(() => valuesSnapshot.current, []), resetField: useCallback((path, subscribers) => { const snapshotValue = getPath(path, valuesSnapshot.current); if (typeof snapshotValue === "undefined") return; setFieldValue({ path, value: snapshotValue, updateState: mode === "controlled", subscribers }); }, [setFieldValue, mode]) }; } //#endregion export { useFormValues }; //# sourceMappingURL=use-form-values.mjs.map