UNPKG

@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
'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 };