@roopakv/nuqs
Version:
Type-safe search params state manager for React - Like useState, but stored in the URL query string
46 lines (42 loc) • 1.37 kB
JavaScript
'use client';
import { patchHistory } from '../chunk-MPZ6OMIB.js';
import '../chunk-3RCMAOX7.js';
import { createAdapterProvider, renderQueryString } from '../chunk-DASHEO2X.js';
import mitt from 'mitt';
import { useState, useEffect } from 'react';
var emitter = mitt();
function updateUrl(search, options) {
const url = new URL(location.href);
url.search = renderQueryString(search);
const method = options.history === "push" ? history.pushState : history.replaceState;
method.call(history, history.state, "", url);
emitter.emit("update", search);
}
function useNuqsReactAdapter() {
const [searchParams, setSearchParams] = useState(() => {
if (typeof location === "undefined") {
return new URLSearchParams();
}
return new URLSearchParams(location.search);
});
useEffect(() => {
const onPopState = () => {
setSearchParams(new URLSearchParams(location.search));
};
emitter.on("update", setSearchParams);
window.addEventListener("popstate", onPopState);
return () => {
emitter.off("update", setSearchParams);
window.removeEventListener("popstate", onPopState);
};
}, []);
return {
searchParams,
updateUrl
};
}
var NuqsAdapter = createAdapterProvider(useNuqsReactAdapter);
function enableHistorySync() {
patchHistory(emitter, "react");
}
export { NuqsAdapter, enableHistorySync };