@mantine/form
Version:
Mantine form management library
94 lines (93 loc) • 3.3 kB
JavaScript
"use client";
require("../../_virtual/_rolldown/runtime.cjs");
const require_get_path = require("../../paths/get-path.cjs");
const require_set_path = require("../../paths/set-path.cjs");
let react = require("react");
//#region packages/@mantine/form/src/hooks/use-form-values/use-form-values.ts
function useFormValues({ initialValues, onValuesChange, mode }) {
const initialized = (0, react.useRef)(false);
const [stateValues, setStateValues] = (0, react.useState)(initialValues || {});
const refValues = (0, react.useRef)(stateValues);
const valuesSnapshot = (0, react.useRef)(stateValues);
const setValues = (0, react.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 = (0, react.useCallback)((payload) => {
const currentValue = require_get_path.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 = require_set_path.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 = (0, react.useCallback)((payload) => {
valuesSnapshot.current = payload;
}, []);
const initialize = (0, react.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: (0, react.useCallback)(() => {
setValues({
values: valuesSnapshot.current,
updateState: true,
mergeWithPreviousValues: false
});
}, [setValues]),
setValuesSnapshot,
initialize,
getValues: (0, react.useCallback)(() => refValues.current, []),
getValuesSnapshot: (0, react.useCallback)(() => valuesSnapshot.current, []),
resetField: (0, react.useCallback)((path, subscribers) => {
const snapshotValue = require_get_path.getPath(path, valuesSnapshot.current);
if (typeof snapshotValue === "undefined") return;
setFieldValue({
path,
value: snapshotValue,
updateState: mode === "controlled",
subscribers
});
}, [setFieldValue, mode])
};
}
//#endregion
exports.useFormValues = useFormValues;
//# sourceMappingURL=use-form-values.cjs.map