@dnb/eufemia
Version:
DNB Eufemia Design System UI Library
78 lines (77 loc) • 2.55 kB
JavaScript
;
"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