UNPKG

@dnb/eufemia

Version:

DNB Eufemia Design System UI Library

89 lines (88 loc) 2.81 kB
"use strict"; "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