UNPKG

@dnb/eufemia

Version:

DNB Eufemia Design System UI Library

94 lines (93 loc) 3.3 kB
"use strict"; "use client"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = useReachRouter; 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 useReachRouter(id = null, { useLocation, navigate }) { const name = id ? `${id}-step` : 'step'; const { setFormError } = (0, _useStep.default)(id); const location = useLocation(); const locationRef = (0, _react.useRef)(location); locationRef.current = location; const navigateRef = (0, _react.useRef)(navigate); navigateRef.current = navigate; const routerStepChangeRef = (0, _react.useRef)(undefined); const hasRouterStepRef = (0, _react.useRef)(false); const onStepChange = (0, _react.useCallback)(index => { try { const locationUrl = new URL(locationRef.current.href); const url = typeof window !== 'undefined' ? new URL(window.location.href) : locationUrl; if (parseFloat(url.searchParams.get(name)) === index || routerStepChangeRef.current === index || routerStepChanges.get(name) === index) { return; } routerStepChangeRef.current = index; routerStepChanges.set(name, index); hasRouterStepRef.current = true; url.searchParams.set(name, String(index)); navigateRef.current(url.href); } catch (error) { routerStepChanges.delete(name); setFormError(error); } }, [name, setFormError]); 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)(() => { try { const searchParams = new URLSearchParams(location.search); return parseFloat(searchParams.get(name)); } catch (error) { setFormError(error); } return undefined; }, [location.search, name, setFormError]); (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, name, setActiveIndex]); return { getIndex }; } //# sourceMappingURL=useReachRouter.js.map