@dnb/eufemia
Version:
DNB Eufemia Design System UI Library
114 lines (113 loc) • 6.38 kB
JavaScript
;
"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