itube-specs 0.0.888 → 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.
|
@@ -1 +1 @@
|
|
|
1
|
-
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24"
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M12 6v6l4 2"/><circle cx="12" cy="12" r="10"/></svg>
|
|
@@ -1 +1 @@
|
|
|
1
|
-
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24"
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-heart w-5 h-5" aria-hidden="true"><path d="M2 9.5a5.5 5.5 0 0 1 9.591-3.676.56.56 0 0 0 .818 0A5.49 5.49 0 0 1 22 9.5c0 2.29-1.5 4-3 5.5l-5.492 5.313a2 2 0 0 1-3 .019L5 15c-1.5-1.5-3-3.2-3-5.5"></path></svg>
|
|
@@ -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
package/pages/library.vue
CHANGED
|
@@ -176,7 +176,7 @@ const newTotal = computed(() => libraryStub.newModels + libraryStub.newChannels
|
|
|
176
176
|
const collections = computed<LibraryLink[]>(() => [
|
|
177
177
|
{
|
|
178
178
|
to: generateLink('/favorites'),
|
|
179
|
-
icon: 'heart',
|
|
179
|
+
icon: 'heart-stroke',
|
|
180
180
|
title: t('favorites'),
|
|
181
181
|
subtitle: t('plural.videos', libraryStub.favorites),
|
|
182
182
|
},
|
|
@@ -206,7 +206,7 @@ const collections = computed<LibraryLink[]>(() => [
|
|
|
206
206
|
const following = computed<LibraryLink[]>(() => [
|
|
207
207
|
{
|
|
208
208
|
to: generateLink('/models'),
|
|
209
|
-
icon: 'user
|
|
209
|
+
icon: 'user',
|
|
210
210
|
title: t('models'),
|
|
211
211
|
subtitle: t('plural.models', libraryStub.models),
|
|
212
212
|
badge: t('library.new_count', { count: libraryStub.newModels }),
|
|
@@ -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);
|