itube-specs 0.0.889 → 0.0.890

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -6,8 +6,8 @@ import { useRoute } from 'vue-router';
6
6
 
7
7
  export const useFetchVideos = async (
8
8
  apiMethod: (...args: any[]) => Promise<PaginatedResponse<IVideoCard>>,
9
- // defaultOrder: null — сортировка не уходит в запрос, пока её не выбрали явно (выдача поиска)
10
- { sortItems = sortItemsDefault, defaultOrder = '-country_order' }: { sortItems?: INavLinkItem[], defaultOrder?: string | null } = {}
9
+ // defaultOrder всегда непустой: в запрос уходит либо выбранная сортировка, либо дефолтная
10
+ { sortItems = sortItemsDefault, defaultOrder = '-country_order' }: { sortItems?: INavLinkItem[], defaultOrder?: string } = {}
11
11
  ) => {
12
12
  const route = useRoute();
13
13
 
@@ -16,11 +16,14 @@ export const useFetchVideos = async (
16
16
  const lang = useLang() as Language;
17
17
  const filters = computed(() => useGetVideosFilterRequest(route, selectDurationItems, selectAddedItems));
18
18
  const key = AsyncData.Videos;
19
- const stateKey = computed(() => `data-${key}-${JSON.stringify(route.query)}-${lang}`);
19
+ const stateKey = computed(() => `data-${key}-${route.path}-${JSON.stringify(route.query)}-${lang}`);
20
20
 
21
- // Ключ уникален на query+lang (не константа AsyncData.Videos): иначе главная делит один
22
- // кэш-слот между разными query (page/sort/фильтры) и при возврате на неё отдаётся кэш от
23
- // другого состояния вместо свежего фетча (мигает «нет данных»/пустой грид).
21
+ // Ключ уникален на path+query+lang (не константа AsyncData.Videos): иначе, во-первых, главная
22
+ // делит один кэш-слот между разными query (page/sort/фильтры) и при возврате на неё отдаётся
23
+ // кэш от другого состояния вместо свежего фетча (мигает «нет данных»/пустой грид); во-вторых,
24
+ // главная и /search/{slug}/videos (обе на useFetchVideos, но с разными apiMethod) сходятся в
25
+ // один ключ — Nuxt оставляет обработчик, зарегистрированный первым, и на главную приходит
26
+ // выдача video-search-by-niche.
24
27
  const { data, status, error } = await useAsyncData<PaginatedResponse<IVideoCard>>(
25
28
  stateKey.value,
26
29
  () => useApiFetcher<PaginatedResponse<IVideoCard>>(
@@ -32,7 +35,7 @@ export const useFetchVideos = async (
32
35
  ['per-page']: perPage,
33
36
  },
34
37
  filters.value,
35
- getSelectedQuery(route, sortItems) || defaultOrder || undefined
38
+ getSelectedQuery(route, sortItems) || defaultOrder
36
39
  )(),
37
40
  {
38
41
  watch: [
@@ -1,11 +1,12 @@
1
1
  import type { INavLinkItem } from '../../types';
2
2
 
3
- /** Сортировки выдачи поиска: релевантность (без order — порядок отдаёт бэкенд) + те же new/longest. */
3
+ /** Сортировки выдачи поиска: релевантность (-_score) + те же new/longest. */
4
4
  export const sortItemsSearch: Array<INavLinkItem> = [
5
5
  {
6
6
  title: 'sort.relevant',
7
7
  value: 'relevant',
8
8
  key: 'sort',
9
+ query: '-_score',
9
10
  },
10
11
  {
11
12
  title: 'sort.new',
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "itube-specs",
3
3
  "type": "module",
4
- "version": "0.0.889",
4
+ "version": "0.0.890",
5
5
  "main": "./nuxt.config.ts",
6
6
  "types": "./types/index.d.ts",
7
7
  "scripts": {
@@ -34,7 +34,7 @@ const { t } = useI18n();
34
34
  const [
35
35
  { data: videosData, status: videosStatus },
36
36
  ] = await Promise.all([
37
- useFetchVideos(VideosApiService.getSearchByNicheFiltered(slug.value), { sortItems: sortItemsSearch, defaultOrder: null }),
37
+ useFetchVideos(VideosApiService.getSearchByNicheFiltered(slug.value), { sortItems: sortItemsSearch, defaultOrder: '-_score' }),
38
38
  ]);
39
39
 
40
40
  useNoindexThinListing(() => videosData.value?.items?.length);