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
|
|
10
|
-
{ sortItems = sortItemsDefault, defaultOrder = '-country_order' }: { sortItems?: INavLinkItem[], defaultOrder?: string
|
|
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
|
|
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
|
-
/** Сортировки выдачи поиска: релевантность (
|
|
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
|
@@ -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:
|
|
37
|
+
useFetchVideos(VideosApiService.getSearchByNicheFiltered(slug.value), { sortItems: sortItemsSearch, defaultOrder: '-_score' }),
|
|
38
38
|
]);
|
|
39
39
|
|
|
40
40
|
useNoindexThinListing(() => videosData.value?.items?.length);
|