UNPKG

nuqs

Version:

Type-safe search params state manager for React - Like useState, but stored in the URL query string

51 lines (48 loc) 1.71 kB
import { debug, renderQueryString } from './chunk-5WWTJYGR.js'; import { useRouter, useSearchParams } from 'next/navigation.js'; import { useOptimistic, useCallback, startTransition } from 'react'; function useNuqsNextAppRouterAdapter() { const router = useRouter(); const searchParams = useSearchParams(); const [optimisticSearchParams, setOptimisticSearchParams] = useOptimistic(searchParams); const updateUrl = useCallback((search, options) => { startTransition(() => { if (!options.shallow) { setOptimisticSearchParams(search); } const url = renderURL(location.origin + location.pathname, search); debug("[nuqs queue (app)] Updating url: %s", url); const updateMethod = options.history === "push" ? history.pushState : history.replaceState; updateMethod.call( history, // In next@14.1.0, useSearchParams becomes reactive to shallow updates, // but only if passing `null` as the history state. null, "", url ); if (options.scroll) { window.scrollTo(0, 0); } if (!options.shallow) { router.replace(url, { scroll: false }); } }); }, []); return { searchParams: optimisticSearchParams, updateUrl, // See: https://github.com/47ng/nuqs/issues/603#issuecomment-2317057128 // and https://github.com/47ng/nuqs/discussions/960#discussioncomment-12699171 rateLimitFactor: 3 }; } function renderURL(base, search) { const hashlessBase = base.split("#")[0] ?? ""; const query = renderQueryString(search); const hash = location.hash; return hashlessBase + query + hash; } export { useNuqsNextAppRouterAdapter };