UNPKG

@dnb/eufemia

Version:

DNB Eufemia Design System UI Library

114 lines (113 loc) 6.38 kB
"use strict"; "use client"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = useData; require("core-js/modules/web.dom-collections.iterator.js"); var _react = require("react"); var _jsonPointer = _interopRequireDefault(require("../../utils/json-pointer")); var _useSharedState = require("../../../../shared/helpers/useSharedState"); var _useMountEffect = _interopRequireDefault(require("../../../../shared/helpers/useMountEffect")); var _Context = _interopRequireDefault(require("../../DataContext/Context")); var _structuredClone = _interopRequireDefault(require("@ungap/structured-clone")); function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; } function useData() { let id = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : undefined; let initialData = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : undefined; const sharedDataRef = (0, _react.useRef)(null); const sharedAttachmentsRef = (0, _react.useRef)(null); const [, forceUpdate] = (0, _react.useReducer)(() => ({}), {}); sharedDataRef.current = (0, _useSharedState.useSharedState)(id, initialData, forceUpdate); sharedAttachmentsRef.current = (0, _useSharedState.useSharedState)((0, _useSharedState.createReferenceKey)(id, 'attachments'), { rerenderUseDataHook: forceUpdate }); const dataContext = (0, _react.useContext)(_Context.default); if (!id) { if (!dataContext.hasContext) { throw new Error('useData needs to run inside DataContext (Form.Handler) or have a valid id'); } sharedDataRef.current.data = dataContext.data; sharedAttachmentsRef.current.data.filterDataHandler = dataContext.filterDataHandler; } const updateDataValue = dataContext === null || dataContext === void 0 ? void 0 : dataContext.updateDataValue; const setData = dataContext === null || dataContext === void 0 ? void 0 : dataContext.setData; const getExistingData = (0, _react.useCallback)(() => { var _sharedAttachmentsRef, _sharedAttachmentsRef2, _sharedAttachmentsRef3; return (0, _structuredClone.default)(((_sharedAttachmentsRef = sharedAttachmentsRef.current) === null || _sharedAttachmentsRef === void 0 ? void 0 : (_sharedAttachmentsRef2 = _sharedAttachmentsRef.data) === null || _sharedAttachmentsRef2 === void 0 ? void 0 : (_sharedAttachmentsRef3 = _sharedAttachmentsRef2.internalDataRef) === null || _sharedAttachmentsRef3 === void 0 ? void 0 : _sharedAttachmentsRef3.current) || sharedDataRef.current.data || {}); }, []); const set = (0, _react.useCallback)(newData => { if (id) { sharedDataRef.current.update(newData); } else { setData === null || setData === void 0 ? void 0 : setData(newData); } }, [id, setData]); const update = (0, _react.useCallback)(function (path) { let value = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : undefined; const existingData = getExistingData(); const existingValue = _jsonPointer.default.has(existingData, path) ? _jsonPointer.default.get(existingData, path) : undefined; const newValue = typeof value === 'function' ? value(existingValue) : value; if (newValue !== existingValue) { _jsonPointer.default.set(existingData, path, newValue); if (id) { sharedDataRef.current.extend(existingData); } else { updateDataValue === null || updateDataValue === void 0 ? void 0 : updateDataValue(path, newValue); } } }, [getExistingData, id, updateDataValue]); const remove = (0, _react.useCallback)(path => { const existingData = getExistingData(); if (_jsonPointer.default.has(existingData, path)) { _jsonPointer.default.remove(existingData, path); if (id) { sharedDataRef.current.set(existingData); } else { setData === null || setData === void 0 ? void 0 : setData(existingData); } } }, [getExistingData, id, setData]); const reduceToVisibleFields = (0, _react.useCallback)(function (data) { var _dataContext$visibleD; let options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; if (id) { var _sharedAttachmentsRef4, _sharedAttachmentsRef5; return (_sharedAttachmentsRef4 = sharedAttachmentsRef.current.data) === null || _sharedAttachmentsRef4 === void 0 ? void 0 : (_sharedAttachmentsRef5 = _sharedAttachmentsRef4.visibleDataHandler) === null || _sharedAttachmentsRef5 === void 0 ? void 0 : _sharedAttachmentsRef5.call(_sharedAttachmentsRef4, data, options); } return dataContext === null || dataContext === void 0 ? void 0 : (_dataContext$visibleD = dataContext.visibleDataHandler) === null || _dataContext$visibleD === void 0 ? void 0 : _dataContext$visibleD.call(dataContext, data, options); }, [dataContext, id]); const filterData = (0, _react.useCallback)(function (filter) { var _dataContext$filterDa; let data = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : sharedDataRef.current.data; if (id) { var _sharedAttachmentsRef6, _sharedAttachmentsRef7; return (_sharedAttachmentsRef6 = sharedAttachmentsRef.current.data) === null || _sharedAttachmentsRef6 === void 0 ? void 0 : (_sharedAttachmentsRef7 = _sharedAttachmentsRef6.filterDataHandler) === null || _sharedAttachmentsRef7 === void 0 ? void 0 : _sharedAttachmentsRef7.call(_sharedAttachmentsRef6, data, filter); } return dataContext === null || dataContext === void 0 ? void 0 : (_dataContext$filterDa = dataContext.filterDataHandler) === null || _dataContext$filterDa === void 0 ? void 0 : _dataContext$filterDa.call(dataContext, data, filter); }, [dataContext, id]); const getValue = (0, _react.useCallback)(path => { if (_jsonPointer.default.has(sharedDataRef.current.data, path)) { return _jsonPointer.default.get(sharedDataRef.current.data, path); } return undefined; }, []); (0, _useMountEffect.default)(() => { if (id && !sharedDataRef.current.hadInitialData && initialData) { sharedDataRef.current.extend(initialData); } }); const { data } = sharedDataRef.current; return (0, _react.useMemo)(() => ({ data, remove, update, set, getValue, reduceToVisibleFields, filterData }), [data, remove, update, set, getValue, reduceToVisibleFields, filterData]); } //# sourceMappingURL=useData.js.map