use-push-router
Version:
A custom hook that simplifies modifying the search params in Next.js
103 lines (98 loc) • 2.91 kB
JavaScript
;
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