UNPKG

use-push-router

Version:

A custom hook that simplifies modifying the search params in Next.js

103 lines (98 loc) 2.91 kB
'use strict'; var navigation = require('next/navigation'); var react = require('react'); // src/use-push-route.ts // src/update-search-params.ts var updateSearchParams = (currentSearchParams) => (params) => { const newSearchParams = new URLSearchParams(currentSearchParams); if ("add" in params && params.add) { Object.entries(params.add).forEach(([key, value]) => { if (Array.isArray(value)) { value.forEach((v) => { newSearchParams.append(key, v); }); } else { newSearchParams.append(key, value); } }); } if ("remove" in params && params.remove) { Object.entries(params.remove).forEach(([key, value]) => { if (typeof value === "undefined") { newSearchParams.delete(key); } else if (Array.isArray(value)) { value.forEach((v) => { newSearchParams.delete(key, v); }); } else { newSearchParams.delete(key, value); } }); } if ("set" in params && params.set) { Object.entries(params.set).forEach(([key, value]) => { newSearchParams.delete(key); if (Array.isArray(value)) { value.forEach((v) => { newSearchParams.append(key, v); }); } else { newSearchParams.set(key, value); } }); } return newSearchParams; }; var useModifiableSearchParams = () => { const searchParams = navigation.useSearchParams(); const update = react.useCallback(updateSearchParams(searchParams), [searchParams]); return react.useMemo( () => ({ searchParams, updateSearchParams: update }), [searchParams, update] ); }; var usePushRoute = () => { const router = navigation.useRouter(); const pathname = navigation.usePathname(); const { updateSearchParams: updateSearchParams2, searchParams } = useModifiableSearchParams(); const pushSearchParams = react.useCallback( (params) => { const newSearchParams = updateSearchParams2(params); router.push(`${pathname}?${newSearchParams.toString()}`); }, [pathname, router, updateSearchParams2] ); return react.useMemo( () => ({ pushSearchParams, router, searchParams }), [pushSearchParams, router, searchParams] ); }; // src/url-search-params-to-object.ts function urlSearchParamsToObject(searchParams) { const result = {}; searchParams.forEach((value, key) => { if (key in result) { if (Array.isArray(result[key])) { result[key].push(value); } else { result[key] = [result[key], value]; } } else { result[key] = value; } }); return result; } exports.updateSearchParams = updateSearchParams; exports.urlSearchParamsToObject = urlSearchParamsToObject; exports.useModifiableSearchParams = useModifiableSearchParams; exports.usePushRoute = usePushRoute; //# sourceMappingURL=index.cjs.map //# sourceMappingURL=index.cjs.map