1
import { useRouter } from 'next/navigation';
2
import qs, { type ParsedQuery } from 'query-string';
3
import { useMemo } from 'react';
5
import { useQuery } from '@/hooks/useQuery';
6
import { isOnServerSide } from '@/utils/env';
8
interface QueryRouteOptions {
12
replaceHash?: boolean;
16
interface GenHrefOptions extends QueryRouteOptions {
17
prevQuery?: ParsedQuery;
21
const genHref = ({ hash, replace, url, prevQuery = {}, query = {} }: GenHrefOptions): string => {
22
let href = qs.stringifyUrl({ query: replace ? query : { ...prevQuery, ...query }, url });
24
if (!isOnServerSide && hash) {
25
href = [href, hash || location?.hash?.slice(1)].filter(Boolean).join('#');
31
export const useQueryRoute = () => {
32
const router = useRouter();
33
const prevQuery = useQuery();
37
push: (url: string, options: QueryRouteOptions = {}) => {
38
return router.push(genHref({ prevQuery, url, ...options }));
40
replace: (url: string, options: QueryRouteOptions = {}) => {
41
return router.replace(genHref({ prevQuery, url, ...options }));