@mantine/form
Version:
Mantine form management library
95 lines (94 loc) • 3.54 kB
JavaScript
"use client";
import { clearListState } from "../../lists/clear-list-state.mjs";
import { getPath } from "../../paths/get-path.mjs";
import { getStatus } from "../../get-status/get-status.mjs";
import { useCallback, useRef, useState } from "react";
import isEqual from "fast-deep-equal";
//#region packages/@mantine/form/src/hooks/use-form-status/use-form-status.ts
function useFormStatus({ initialDirty, initialTouched, mode, $values }) {
const [touchedState, setTouchedState] = useState(initialTouched);
const [dirtyState, setDirtyState] = useState(initialDirty);
const touchedRef = useRef(initialTouched);
const dirtyRef = useRef(initialDirty);
const setTouched = useCallback((values) => {
const resolvedValues = typeof values === "function" ? values(touchedRef.current) : values;
touchedRef.current = resolvedValues;
if (mode === "controlled") setTouchedState(resolvedValues);
}, []);
const setDirty = useCallback((values, forceUpdate = false) => {
const resolvedValues = typeof values === "function" ? values(dirtyRef.current) : values;
dirtyRef.current = resolvedValues;
if (mode === "controlled" || forceUpdate) setDirtyState(resolvedValues);
}, []);
const resetTouched = useCallback(() => setTouched({}), []);
const resetDirty = useCallback((values) => {
const newSnapshot = values ? {
...$values.refValues.current,
...values
} : $values.refValues.current;
$values.setValuesSnapshot(newSnapshot);
setDirty({});
}, []);
const setFieldTouched = useCallback((path, touched) => {
setTouched((currentTouched) => {
if (getStatus(currentTouched, path) === touched) return currentTouched;
return {
...currentTouched,
[path]: touched
};
});
}, []);
const setFieldDirty = useCallback((path, dirty, forceUpdate) => {
setDirty((currentDirty) => {
if (getStatus(currentDirty, path) === dirty) return currentDirty;
return {
...currentDirty,
[path]: dirty
};
}, forceUpdate);
}, []);
const setCalculatedFieldDirty = useCallback((path, value) => {
const currentDirty = getStatus(dirtyRef.current, path);
const dirty = !isEqual(getPath(path, $values.getValuesSnapshot()), value);
const clearedState = clearListState(path, dirtyRef.current);
clearedState[path] = dirty;
setDirty(clearedState, currentDirty !== dirty);
}, []);
return {
touchedState,
dirtyState,
touchedRef,
dirtyRef,
setTouched,
setDirty,
resetDirty,
resetTouched,
isTouched: useCallback((path) => getStatus(touchedRef.current, path), []),
setFieldTouched,
setFieldDirty,
setTouchedState,
setDirtyState,
clearFieldDirty: useCallback((path) => setDirty((current) => {
if (typeof path !== "string") return current;
const result = clearListState(path, current);
delete result[path];
if (isEqual(result, current)) return current;
return result;
}), []),
isDirty: useCallback((path) => {
if (path) {
const overriddenValue = getPath(path, dirtyRef.current);
if (typeof overriddenValue === "boolean") return overriddenValue;
return !isEqual(getPath(path, $values.refValues.current), getPath(path, $values.valuesSnapshot.current));
}
if (Object.keys(dirtyRef.current).length > 0) return getStatus(dirtyRef.current);
return !isEqual($values.refValues.current, $values.valuesSnapshot.current);
}, []),
getDirty: useCallback(() => dirtyRef.current, []),
getTouched: useCallback(() => touchedRef.current, []),
setCalculatedFieldDirty
};
}
//#endregion
export { useFormStatus };
//# sourceMappingURL=use-form-status.mjs.map