UNPKG

@dnb/eufemia

Version:

DNB Eufemia Design System UI Library

83 lines (82 loc) 3.14 kB
"use strict"; "use client"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = useReactRouter; 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 }; } const routerStepChanges = new Map(); function useReactRouter(id = null, { useSearchParams }) { const name = id ? `${id}-step` : 'step'; const { setFormError } = (0, _useStep.default)(id); const [searchParams, setSearchParams] = useSearchParams(); const searchParamsRef = (0, _react.useRef)(searchParams); searchParamsRef.current = searchParams; const routerStepChangeRef = (0, _react.useRef)(undefined); const hasRouterStepRef = (0, _react.useRef)(false); const onStepChange = (0, _react.useCallback)(index => { try { const searchParams = searchParamsRef.current; const currentSearchParams = new URLSearchParams(typeof window !== 'undefined' ? window.location.search : searchParams.toString()); if (parseFloat(currentSearchParams.get(name)) === index || routerStepChangeRef.current === index || routerStepChanges.get(name) === index) { return; } routerStepChangeRef.current = index; routerStepChanges.set(name, index); hasRouterStepRef.current = true; searchParams.set(name, String(index)); setSearchParams(searchParams); } catch (error) { routerStepChanges.delete(name); setFormError(error); } }, [name, setFormError, setSearchParams]); const { setActiveIndex, onStepChangeEventsRef } = (0, _useStep.default)(id, { onStepChange }); (0, _useIsomorphicLayoutEffect.useIsomorphicLayoutEffect)(() => { return () => { if (routerStepChanges.get(name) === routerStepChangeRef.current) { routerStepChanges.delete(name); } }; }, [name]); (0, _useIsomorphicLayoutEffect.useIsomorphicLayoutEffect)(() => { return () => { onStepChangeEventsRef?.current?.delete(onStepChange); }; }, [onStepChange, onStepChangeEventsRef]); const getIndex = (0, _react.useCallback)(() => parseFloat(searchParams.get(name)), [name, searchParams]); (0, _useIsomorphicLayoutEffect.useIsomorphicLayoutEffect)(() => { const routerIndex = getIndex(); const hasRouterIndex = !isNaN(routerIndex); if (hasRouterIndex) { hasRouterStepRef.current = true; } if (hasRouterIndex || hasRouterStepRef.current) { const activeIndex = hasRouterIndex ? routerIndex : 0; const skipStepChangeCall = hasRouterIndex && activeIndex === routerStepChangeRef.current; routerStepChangeRef.current = undefined; routerStepChanges.delete(name); setActiveIndex?.(activeIndex, { skipStepChangeCall, skipStepChangeCallFromHook: true, skipStepChangeCallBeforeMounted: true }); } }, [getIndex, id, name, searchParams, setActiveIndex, setFormError]); return { getIndex }; } //# sourceMappingURL=useReactRouter.js.map