@ewb/reach-react
Version:
React Resource and Fetch stuff
41 lines (40 loc) • 1.65 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.useFields = void 0;
const react_1 = require("react");
const useCrud_1 = require("./useCrud");
function useFields(path, data, schema, props) {
const idKey = props.idKey;
const defaultData = react_1.useMemo(() => {
const newData = {};
for (const key in data) {
newData[key] = data[key];
}
for (const key in schema) {
if (!(key in newData) && schema[key]) {
newData[key] = schema[key].defaultValue;
}
}
return newData;
}, [schema, data]);
const [state, setField, save, setData, actions, setState] = useCrud_1.useCrud(path, defaultData, Object.assign({ disableAutoSave: false }, props));
const getField = react_1.useCallback((key) => {
if (!schema[key]) {
throw new Error(`useField was used with edit field that was not defined. Add ${key} to field object`);
}
const id = `${state.data[idKey]}-${key}`;
const edited = Boolean(state.edited[key]);
const meta = state.meta[key];
return Object.assign(Object.assign({}, schema[key]), { key, id, edited, value: state.data[key], meta });
}, [state, idKey, schema]);
return react_1.useMemo(() => ({
state: Object.assign(Object.assign({}, state), { schema, idKey }),
getField,
setField,
save,
setData,
actions,
setState,
}), [state, schema, idKey, getField, setField, save, setData, actions, setState]);
}
exports.useFields = useFields;