UNPKG

@offlegacy/nuqs-hash-router

Version:
63 lines (60 loc) 2 kB
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