UNPKG

@ewb/reach-react

Version:
41 lines (40 loc) 1.61 kB
"use strict"; 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;