@offlegacy/nuqs-hash-router
Version:
nuqs adaptor for Hash Router (unofficial)
63 lines (60 loc) • 2 kB
JavaScript
import { unstable_createAdapterProvider } from "nuqs/adapters/custom";
import { useEffect, useState } from "react";
//#region src/utils.ts
function getCurrentURL() {
return new URL(window.location.hash.slice(1), window.location.origin);
}
//#endregion
//#region src/NuqsAdapter.tsx
function useHashAdapter() {
const url = getCurrentURL();
const [hashParams, setHashParams] = useState(new URLSearchParams(url.search));
function updateUrl(updated, options) {
const url$1 = getCurrentURL();
const currentParams = new URLSearchParams(url$1.search);
currentParams.forEach((_, key) => {
if (!updated.has(key)) currentParams.delete(key);
});
updated.forEach((value, key) => {
if (value) currentParams.set(key, value);
});
const updatedHashUrl = `#${url$1.pathname}${currentParams.toString() ? `?${currentParams.toString()}` : ""}`;
switch (options.history) {
case "push":
window.history.pushState(null, "", updatedHashUrl);
break;
case "replace":
window.history.replaceState(null, "", updatedHashUrl);
break;
default:
window.history.pushState(null, "", updatedHashUrl);
break;
}
setHashParams(updated);
}
function getSearchParamsSnapshot() {
const url$1 = getCurrentURL();
return new URLSearchParams(url$1.search);
}
useEffect(() => {
function handleHashChange() {
const url$1 = getCurrentURL();
setHashParams(new URLSearchParams(url$1.search));
}
window.addEventListener("hashchange", handleHashChange);
return () => window.removeEventListener("hashchange", handleHashChange);
}, []);
return {
searchParams: hashParams,
updateUrl,
getSearchParamsSnapshot
};
}
/**
* @see https://github.com/47ng/nuqs/issues/810#issuecomment-2863556483
* @see https://github.com/47ng/nuqs/blob/84ee9aa49d74f3a0782ae7bbe5646a3e42cb8e52/packages/nuqs/src/adapters/lib/react-router.ts#L43
*/
const NuqsAdapter = unstable_createAdapterProvider(useHashAdapter);
//#endregion
export { NuqsAdapter };
//# sourceMappingURL=index.js.map