lobe-chat

Форк
0
/
useQueryRoute.ts 
46 строк · 1.2 Кб
1
import { useRouter } from 'next/navigation';
2
import qs, { type ParsedQuery } from 'query-string';
3
import { useMemo } from 'react';
4

5
import { useQuery } from '@/hooks/useQuery';
6
import { isOnServerSide } from '@/utils/env';
7

8
interface QueryRouteOptions {
9
  hash?: string;
10
  query?: ParsedQuery;
11
  replace?: boolean;
12
  replaceHash?: boolean;
13
  withHash?: boolean;
14
}
15

16
interface GenHrefOptions extends QueryRouteOptions {
17
  prevQuery?: ParsedQuery;
18
  url: string;
19
}
20

21
const genHref = ({ hash, replace, url, prevQuery = {}, query = {} }: GenHrefOptions): string => {
22
  let href = qs.stringifyUrl({ query: replace ? query : { ...prevQuery, ...query }, url });
23

24
  if (!isOnServerSide && hash) {
25
    href = [href, hash || location?.hash?.slice(1)].filter(Boolean).join('#');
26
  }
27

28
  return href;
29
};
30

31
export const useQueryRoute = () => {
32
  const router = useRouter();
33
  const prevQuery = useQuery();
34

35
  return useMemo(
36
    () => ({
37
      push: (url: string, options: QueryRouteOptions = {}) => {
38
        return router.push(genHref({ prevQuery, url, ...options }));
39
      },
40
      replace: (url: string, options: QueryRouteOptions = {}) => {
41
        return router.replace(genHref({ prevQuery, url, ...options }));
42
      },
43
    }),
44
    [prevQuery],
45
  );
46
};
47

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.