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" fill="none" viewBox="0 0 24 24"><path fill="currentColor" fill-rule="evenodd" d="M2 12C2 6.477 6.477 2 12 2s10 4.477 10 10-4.477 10-10 10S2 17.523 2 12m11-4a1 1 0 1 0-2 0v4a1 1 0 0 0 .293.707l3 3a1 1 0 0 0 1.414-1.414L13 11.586z" clip-rule="evenodd"/></svg>
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" fill="none" viewBox="0 0 24 24"><path fill="currentColor" d="m18.271 13.77 1.813-1.813a4.121 4.121 0 1 0-5.828-5.829l-1.722 1.696zM3.946 12.403c-1.65-1.712-1.65-4.487 0-6.198a4.116 4.116 0 0 1 5.973 0l7.832 8.128-3.583 3.719a3.29 3.29 0 0 1-4.778 0z"/></svg>
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: 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.888",
4
+ "version": "0.0.890",
5
5
  "main": "./nuxt.config.ts",
6
6
  "types": "./types/index.d.ts",
7
7
  "scripts": {
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-group',
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: null }),
37
+ useFetchVideos(VideosApiService.getSearchByNicheFiltered(slug.value), { sortItems: sortItemsSearch, defaultOrder: '-_score' }),
38
38
  ]);
39
39
 
40
40
  useNoindexThinListing(() => videosData.value?.items?.length);