UNPKG

@dnb/eufemia

Version:

DNB Eufemia Design System UI Library

77 lines (76 loc) 2.75 kB
"use client"; import { useCallback, useRef } from 'react'; import useStep from "./useStep.js"; import { useIsomorphicLayoutEffect as useLayoutEffect } from "../../../../shared/helpers/useIsomorphicLayoutEffect.js"; const routerStepChanges = new Map(); export default function useReactRouter(id = null, { useSearchParams }) { const name = id ? `${id}-step` : 'step'; const { setFormError } = useStep(id); const [searchParams, setSearchParams] = useSearchParams(); const searchParamsRef = useRef(searchParams); searchParamsRef.current = searchParams; const routerStepChangeRef = useRef(undefined); const hasRouterStepRef = useRef(false); const onStepChange = 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 } = useStep(id, { onStepChange }); useLayoutEffect(() => { return () => { if (routerStepChanges.get(name) === routerStepChangeRef.current) { routerStepChanges.delete(name); } }; }, [name]); useLayoutEffect(() => { return () => { onStepChangeEventsRef?.current?.delete(onStepChange); }; }, [onStepChange, onStepChangeEventsRef]); const getIndex = useCallback(() => parseFloat(searchParams.get(name)), [name, searchParams]); useLayoutEffect(() => { 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