@dnb/eufemia
Version:
DNB Eufemia Design System UI Library
89 lines (88 loc) • 2.81 kB
JavaScript
;
"use client";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = useSwitchContainerMode;
var _react = require("react");
var _FieldBoundaryContext = _interopRequireDefault(require("../../DataContext/FieldBoundary/FieldBoundaryContext.js"));
var _IterateItemContext = _interopRequireDefault(require("../IterateItemContext.js"));
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
const globalContainerModeRef = {
current: undefined
};
const globalCache = {};
function useSwitchContainerMode(path) {
const nextContainerModeRef = (0, _react.useRef)();
const {
hasError
} = (0, _react.useContext)(_FieldBoundaryContext.default) || {};
const iterateItemContext = (0, _react.useContext)(_IterateItemContext.default);
const id = iterateItemContext === null || iterateItemContext === void 0 ? void 0 : iterateItemContext.id;
const hash = (path || '') + 'useSwitchContainerMode';
(0, _react.useEffect)(() => {
nextContainerModeRef.current = globalContainerModeRef.current;
requestAnimationFrame(() => {
if (nextContainerModeRef.current) {
globalContainerModeRef.current = undefined;
}
});
});
(0, _react.useEffect)(() => {
if (hash && iterateItemContext) {
globalCache[hash] = globalCache[hash] || {};
const {
index,
arrayValue,
switchContainerMode
} = iterateItemContext;
globalCache[hash][id] = {
index,
hasError,
count: arrayValue === null || arrayValue === void 0 ? void 0 : arrayValue.length,
switchContainerMode
};
}
return () => {
if (id) {
globalCache[hash][id] = undefined;
}
};
}, [hasError, hash, id, iterateItemContext]);
const setNextContainerMode = (0, _react.useCallback)(mode => {
globalContainerModeRef.current = mode;
}, []);
const setContainerMode = (0, _react.useCallback)(fn => {
const data = globalCache[hash];
for (const id in data) {
const item = data[id];
const mode = item && (fn === null || fn === void 0 ? void 0 : fn(item));
if (mode) {
item.switchContainerMode(mode, {
omitFocusManagement: true
});
}
}
}, [hash]);
const setLastItemContainerMode = (0, _react.useCallback)(mode => {
setContainerMode(({
hasError,
index,
count
}) => {
if (!hasError && index === count - 2) {
return mode;
}
});
}, [setContainerMode]);
const getNextContainerMode = (0, _react.useCallback)(() => {
return nextContainerModeRef.current;
}, []);
return {
getNextContainerMode,
nextContainerModeRef,
setNextContainerMode,
setLastItemContainerMode
};
}
//# sourceMappingURL=useSwitchContainerMode.js.map