UNPKG

@dnb/eufemia

Version:

DNB Eufemia Design System UI Library

78 lines (77 loc) 2.55 kB
"use strict"; "use client"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = useQueryLocator; var _react = require("react"); var _useStep = _interopRequireDefault(require("./useStep.js")); var _useIsomorphicLayoutEffect = require("../../../../shared/helpers/useIsomorphicLayoutEffect.js"); function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; } function useQueryLocator(id = undefined) { const { setFormError } = (0, _useStep.default)(id); const name = id ? `${id}-step` : 'step'; const hasRouterStepRef = (0, _react.useRef)(false); const onStepChange = (0, _react.useCallback)(index => { try { const url = new URL(window.location.href); if (parseFloat(url.searchParams.get(name)) === index) { return; } hasRouterStepRef.current = true; url.searchParams.set(name, String(index)); window.history.pushState({}, '', url.toString()); } catch (error) { setFormError(error); } }, [name, setFormError]); const { setActiveIndex, onStepChangeEventsRef } = (0, _useStep.default)(id, { onStepChange }); (0, _useIsomorphicLayoutEffect.useIsomorphicLayoutEffect)(() => { return () => { onStepChangeEventsRef?.current?.delete(onStepChange); }; }, [onStepChange, onStepChangeEventsRef]); const getIndex = (0, _react.useCallback)(() => { try { const searchParams = new URLSearchParams(window.location.search); return parseFloat(searchParams.get(name)); } catch (error) { setFormError(error); } return undefined; }, [name, setFormError]); (0, _useIsomorphicLayoutEffect.useIsomorphicLayoutEffect)(() => { try { const popstateListener = () => { const routerIndex = getIndex(); const hasRouterIndex = !isNaN(routerIndex); if (hasRouterIndex) { hasRouterStepRef.current = true; } if (hasRouterIndex || hasRouterStepRef.current) { setActiveIndex?.(hasRouterIndex ? routerIndex : 0, { skipStepChangeCallFromHook: true, skipStepChangeCallBeforeMounted: true }); } }; popstateListener(); window.addEventListener('popstate', popstateListener); return () => window.removeEventListener('popstate', popstateListener); } catch (error) { setFormError(error); } return undefined; }, [getIndex, id, setActiveIndex, setFormError]); return { getIndex }; } //# sourceMappingURL=useQueryLocator.js.map