itube-specs 0.0.785 → 0.0.787
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.
- package/composables/fetch/use-fetch-categories-by-letter.ts +12 -3
- package/composables/fetch/use-fetch-categories-by-name.ts +12 -3
- package/composables/fetch/use-fetch-categories-by-phrase.ts +12 -3
- package/composables/fetch/use-fetch-categories-related.ts +14 -5
- package/composables/fetch/use-fetch-channels-by-model.ts +11 -2
- package/composables/fetch/use-fetch-channels-by-name.ts +12 -3
- package/composables/fetch/use-fetch-channels-by-network-name.ts +10 -10
- package/composables/fetch/use-fetch-model-by-name.ts +12 -3
- package/composables/fetch/use-fetch-models-by-phrases.ts +10 -12
- package/composables/fetch/use-fetch-playlists-by-id.ts +9 -1
- package/composables/fetch/use-fetch-playlists-get-videos-by-id.ts +10 -2
- package/composables/fetch/use-fetch-popular-tags-by-channel-name.ts +14 -5
- package/composables/fetch/use-fetch-popular-tags-by-model-name.ts +14 -5
- package/composables/fetch/use-fetch-related-videos.ts +10 -5
- package/composables/fetch/use-fetch-video-referer-phrases.ts +11 -2
- package/composables/fetch/use-fetch-videos-by-categories.ts +16 -10
- package/composables/fetch/use-fetch-videos-by-channel.ts +10 -12
- package/composables/fetch/use-fetch-videos-by-model-and-channel.ts +10 -12
- package/composables/fetch/use-fetch-videos-by-model-and-tag.ts +10 -12
- package/composables/fetch/use-fetch-videos-by-model.ts +10 -12
- package/composables/fetch/use-fetch-videos-by-tag.ts +10 -12
- package/composables/fetch/use-fetch-videos-search-by-niche.ts +10 -12
- package/composables/fetch/use-fetch-videos.ts +4 -1
- package/package.json +1 -1
|
@@ -5,20 +5,29 @@ import type { ICategoryCard } from '../../types';
|
|
|
5
5
|
export const useFetchCategoriesByLetter = async (
|
|
6
6
|
apiMethod: (...args: any[]) => Promise<Array<ICategoryCard>>
|
|
7
7
|
) => {
|
|
8
|
+
const route = useRoute();
|
|
8
9
|
const key = AsyncData.CategoriesByLetter;
|
|
9
10
|
const lang = useLang() as Language;
|
|
10
11
|
const slug = useSlug();
|
|
11
12
|
const stateKey = computed(() => `data-${key}-${slug.value}-${lang}`);
|
|
12
13
|
|
|
13
|
-
const { data, status, error } = await useAsyncData<Array<ICategoryCard>>(
|
|
14
|
-
|
|
14
|
+
const { data, status, error, refresh } = await useAsyncData<Array<ICategoryCard>>(
|
|
15
|
+
stateKey.value,
|
|
15
16
|
() => useApiFetcher<Array<ICategoryCard>>(
|
|
16
17
|
stateKey.value,
|
|
17
18
|
apiMethod,
|
|
18
19
|
lang,
|
|
19
20
|
slug.value,
|
|
20
|
-
)()
|
|
21
|
+
)(),
|
|
21
22
|
);
|
|
22
23
|
|
|
24
|
+
// Рефетч при смене route-параметра в рамках ЭТОГО же роута (напр. категория→категория по
|
|
25
|
+
// ссылке): setup не перезапускается, поэтому нужен watch. Сверяемся с route.name — иначе при
|
|
26
|
+
// уходе на другой [slug]-роут (slug общий) watch дёрнул бы этот эндпоинт с чужим слагом.
|
|
27
|
+
const routeName = route.name;
|
|
28
|
+
watch(stateKey, () => {
|
|
29
|
+
if (route.name === routeName) refresh();
|
|
30
|
+
});
|
|
31
|
+
|
|
23
32
|
return { data, status, error };
|
|
24
33
|
};
|
|
@@ -5,20 +5,29 @@ import type { ICardInfo } from '../../types';
|
|
|
5
5
|
export const useFetchCategoriesByName = async (
|
|
6
6
|
apiMethod: (...args: any[]) => Promise<ICardInfo>
|
|
7
7
|
) => {
|
|
8
|
+
const route = useRoute();
|
|
8
9
|
const key = AsyncData.CategoriesByName;
|
|
9
10
|
const lang = useLang() as Language;
|
|
10
11
|
const slug = useSlug();
|
|
11
12
|
const stateKey = computed(() => `data-${key}-${slug.value}-${lang}`);
|
|
12
13
|
|
|
13
|
-
const { data, status, error } = await useAsyncData<ICardInfo>(
|
|
14
|
-
|
|
14
|
+
const { data, status, error, refresh } = await useAsyncData<ICardInfo>(
|
|
15
|
+
stateKey.value,
|
|
15
16
|
() => useApiFetcher<ICardInfo>(
|
|
16
17
|
stateKey.value,
|
|
17
18
|
apiMethod,
|
|
18
19
|
lang,
|
|
19
20
|
slug.value,
|
|
20
|
-
)()
|
|
21
|
+
)(),
|
|
21
22
|
);
|
|
22
23
|
|
|
24
|
+
// Рефетч при смене route-параметра в рамках ЭТОГО же роута (напр. категория→категория по
|
|
25
|
+
// ссылке): setup не перезапускается, поэтому нужен watch. Сверяемся с route.name — иначе при
|
|
26
|
+
// уходе на другой [slug]-роут (slug общий) watch дёрнул бы этот эндпоинт с чужим слагом.
|
|
27
|
+
const routeName = route.name;
|
|
28
|
+
watch(stateKey, () => {
|
|
29
|
+
if (route.name === routeName) refresh();
|
|
30
|
+
});
|
|
31
|
+
|
|
23
32
|
return { data, status, error };
|
|
24
33
|
};
|
|
@@ -5,13 +5,14 @@ import type { IChipsItem } from '../../types';
|
|
|
5
5
|
export const useFetchCategoriesByPhrase = async (
|
|
6
6
|
apiMethod: (...args: any[]) => Promise<Array<IChipsItem>>
|
|
7
7
|
) => {
|
|
8
|
+
const route = useRoute();
|
|
8
9
|
const key = AsyncData.CategoriesByPhrase;
|
|
9
10
|
const lang = useLang() as Language;
|
|
10
11
|
const slug = useSlug();
|
|
11
12
|
const stateKey = computed(() => `data-${key}-${slug.value}-${lang}`);
|
|
12
13
|
|
|
13
|
-
const { data, status, error } = await useAsyncData<Array<IChipsItem>>(
|
|
14
|
-
|
|
14
|
+
const { data, status, error, refresh } = await useAsyncData<Array<IChipsItem>>(
|
|
15
|
+
stateKey.value,
|
|
15
16
|
() => useApiFetcher<Array<IChipsItem>>(
|
|
16
17
|
stateKey.value,
|
|
17
18
|
apiMethod,
|
|
@@ -20,8 +21,16 @@ export const useFetchCategoriesByPhrase = async (
|
|
|
20
21
|
1,
|
|
21
22
|
1,
|
|
22
23
|
100
|
|
23
|
-
)()
|
|
24
|
+
)(),
|
|
24
25
|
);
|
|
25
26
|
|
|
27
|
+
// Рефетч при смене route-параметра в рамках ЭТОГО же роута (напр. категория→категория по
|
|
28
|
+
// ссылке): setup не перезапускается, поэтому нужен watch. Сверяемся с route.name — иначе при
|
|
29
|
+
// уходе на другой [slug]-роут (slug общий) watch дёрнул бы этот эндпоинт с чужим слагом.
|
|
30
|
+
const routeName = route.name;
|
|
31
|
+
watch(stateKey, () => {
|
|
32
|
+
if (route.name === routeName) refresh();
|
|
33
|
+
});
|
|
34
|
+
|
|
26
35
|
return { data, status, error };
|
|
27
36
|
};
|
|
@@ -5,20 +5,29 @@ import type { IRelatedPhrases } from '../../types';
|
|
|
5
5
|
export const useFetchCategoriesRelated = async (
|
|
6
6
|
apiMethod: (...args: any[]) => Promise<IRelatedPhrases>
|
|
7
7
|
) => {
|
|
8
|
+
const route = useRoute();
|
|
8
9
|
const lang = useLang() as Language;
|
|
9
10
|
const slug = useSlug();
|
|
10
11
|
const key = AsyncData.CategoriesRelated;
|
|
11
12
|
const stateKey = computed(() => `data-${key}-${slug.value}-${lang}`);
|
|
12
13
|
|
|
13
|
-
const { data, status, error } = await useAsyncData<IRelatedPhrases>(
|
|
14
|
-
|
|
15
|
-
|
|
14
|
+
const { data, status, error, refresh } = await useAsyncData<IRelatedPhrases>(
|
|
15
|
+
stateKey.value,
|
|
16
|
+
() => useApiFetcher<IRelatedPhrases>(
|
|
16
17
|
stateKey.value,
|
|
17
18
|
apiMethod,
|
|
18
19
|
lang,
|
|
19
20
|
slug.value,
|
|
20
|
-
)()
|
|
21
|
-
|
|
21
|
+
)(),
|
|
22
|
+
);
|
|
23
|
+
|
|
24
|
+
// Рефетч при смене route-параметра в рамках ЭТОГО же роута (напр. категория→категория по
|
|
25
|
+
// ссылке): setup не перезапускается, поэтому нужен watch. Сверяемся с route.name — иначе при
|
|
26
|
+
// уходе на другой [slug]-роут (slug общий) watch дёрнул бы этот эндпоинт с чужим слагом.
|
|
27
|
+
const routeName = route.name;
|
|
28
|
+
watch(stateKey, () => {
|
|
29
|
+
if (route.name === routeName) refresh();
|
|
30
|
+
});
|
|
22
31
|
|
|
23
32
|
return { data, status, error };
|
|
24
33
|
};
|
|
@@ -5,13 +5,14 @@ import type { IChannelCard, PaginatedResponse } from '../../types';
|
|
|
5
5
|
export const useFetchChannelsByModel = async (
|
|
6
6
|
apiMethod: (...args: any[]) => Promise<PaginatedResponse<IChannelCard>>
|
|
7
7
|
) => {
|
|
8
|
+
const route = useRoute();
|
|
8
9
|
const lang = useLang() as Language;
|
|
9
10
|
const slug = useSlug();
|
|
10
11
|
const key = AsyncData.ChannelsByModel;
|
|
11
12
|
const stateKey = computed(() => `data-${key}-${slug.value}-${lang}`);
|
|
12
13
|
|
|
13
|
-
const { data, status, error } = await useAsyncData<PaginatedResponse<IChannelCard>>(
|
|
14
|
-
|
|
14
|
+
const { data, status, error, refresh } = await useAsyncData<PaginatedResponse<IChannelCard>>(
|
|
15
|
+
stateKey.value,
|
|
15
16
|
() => useApiFetcher<PaginatedResponse<IChannelCard>>(
|
|
16
17
|
stateKey.value,
|
|
17
18
|
apiMethod,
|
|
@@ -23,5 +24,13 @@ export const useFetchChannelsByModel = async (
|
|
|
23
24
|
)(),
|
|
24
25
|
);
|
|
25
26
|
|
|
27
|
+
// Рефетч при смене route-параметра в рамках ЭТОГО же роута (напр. категория→категория по
|
|
28
|
+
// ссылке): setup не перезапускается, поэтому нужен watch. Сверяемся с route.name — иначе при
|
|
29
|
+
// уходе на другой [slug]-роут (slug общий) watch дёрнул бы этот эндпоинт с чужим слагом.
|
|
30
|
+
const routeName = route.name;
|
|
31
|
+
watch(stateKey, () => {
|
|
32
|
+
if (route.name === routeName) refresh();
|
|
33
|
+
});
|
|
34
|
+
|
|
26
35
|
return { data, status, error };
|
|
27
36
|
};
|
|
@@ -5,20 +5,29 @@ import type { ICardInfo } from '../../types';
|
|
|
5
5
|
export const useFetchChannelsByName = async (
|
|
6
6
|
apiMethod: (...args: any[]) => Promise<ICardInfo>
|
|
7
7
|
) => {
|
|
8
|
+
const route = useRoute();
|
|
8
9
|
const lang = useLang() as Language;
|
|
9
10
|
const slug = useSlug('channel');
|
|
10
11
|
const key = AsyncData.ChannelByName;
|
|
11
12
|
const stateKey = computed(() => `data-${key}-${slug.value}-${lang}`);
|
|
12
13
|
|
|
13
|
-
const { data, status, error } = await useAsyncData<ICardInfo>(
|
|
14
|
-
|
|
14
|
+
const { data, status, error, refresh } = await useAsyncData<ICardInfo>(
|
|
15
|
+
stateKey.value,
|
|
15
16
|
() => useApiFetcher<ICardInfo>(
|
|
16
17
|
stateKey.value,
|
|
17
18
|
apiMethod,
|
|
18
19
|
lang,
|
|
19
20
|
slug.value,
|
|
20
|
-
)()
|
|
21
|
+
)(),
|
|
21
22
|
);
|
|
22
23
|
|
|
24
|
+
// Рефетч при смене route-параметра в рамках ЭТОГО же роута (напр. категория→категория по
|
|
25
|
+
// ссылке): setup не перезапускается, поэтому нужен watch. Сверяемся с route.name — иначе при
|
|
26
|
+
// уходе на другой [slug]-роут (slug общий) watch дёрнул бы этот эндпоинт с чужим слагом.
|
|
27
|
+
const routeName = route.name;
|
|
28
|
+
watch(stateKey, () => {
|
|
29
|
+
if (route.name === routeName) refresh();
|
|
30
|
+
});
|
|
31
|
+
|
|
23
32
|
return { data, status, error };
|
|
24
33
|
};
|
|
@@ -14,8 +14,8 @@ export const useFetchChannelsByNetworkName = async (
|
|
|
14
14
|
const key = AsyncData.ChannelsByNetworkName;
|
|
15
15
|
const stateKey = computed(() => `data-${key}-${slug.value}-${lang}`);
|
|
16
16
|
|
|
17
|
-
const { data, status, error } = await useAsyncData<PaginatedResponse<IChannelCard>>(
|
|
18
|
-
|
|
17
|
+
const { data, status, error, refresh } = await useAsyncData<PaginatedResponse<IChannelCard>>(
|
|
18
|
+
stateKey.value,
|
|
19
19
|
() => useApiFetcher<PaginatedResponse<IChannelCard>>(
|
|
20
20
|
stateKey.value,
|
|
21
21
|
apiMethod,
|
|
@@ -26,15 +26,15 @@ export const useFetchChannelsByNetworkName = async (
|
|
|
26
26
|
},
|
|
27
27
|
slug.value,
|
|
28
28
|
)(),
|
|
29
|
-
{
|
|
30
|
-
watch: [
|
|
31
|
-
() => {
|
|
32
|
-
const currentQuery = route.query;
|
|
33
|
-
return JSON.stringify(currentQuery);
|
|
34
|
-
},
|
|
35
|
-
],
|
|
36
|
-
}
|
|
37
29
|
);
|
|
38
30
|
|
|
31
|
+
// Рефетч при смене route-параметра в рамках ЭТОГО же роута (напр. категория→категория по
|
|
32
|
+
// ссылке): setup не перезапускается, поэтому нужен watch. Сверяемся с route.name — иначе при
|
|
33
|
+
// уходе на другой [slug]-роут (slug общий) watch дёрнул бы этот эндпоинт с чужим слагом.
|
|
34
|
+
const routeName = route.name;
|
|
35
|
+
watch(stateKey, () => {
|
|
36
|
+
if (route.name === routeName) refresh();
|
|
37
|
+
});
|
|
38
|
+
|
|
39
39
|
return { data, status, error };
|
|
40
40
|
};
|
|
@@ -5,20 +5,29 @@ import type { ICardInfo } from '../../types';
|
|
|
5
5
|
export const useFetchModelByName = async (
|
|
6
6
|
apiMethod: (...args: any[]) => Promise<ICardInfo>
|
|
7
7
|
) => {
|
|
8
|
+
const route = useRoute();
|
|
8
9
|
const lang = useLang() as Language;
|
|
9
10
|
const slug = useSlug();
|
|
10
11
|
const key = AsyncData.ModelsByName;
|
|
11
12
|
const stateKey = computed(() => `data-${key}-${slug.value}-${lang}`);
|
|
12
13
|
|
|
13
|
-
const { data, status, error } = await useAsyncData<ICardInfo>(
|
|
14
|
-
|
|
14
|
+
const { data, status, error, refresh } = await useAsyncData<ICardInfo>(
|
|
15
|
+
stateKey.value,
|
|
15
16
|
() => useApiFetcher<ICardInfo>(
|
|
16
17
|
stateKey.value,
|
|
17
18
|
apiMethod,
|
|
18
19
|
lang,
|
|
19
20
|
slug.value,
|
|
20
|
-
)()
|
|
21
|
+
)(),
|
|
21
22
|
);
|
|
22
23
|
|
|
24
|
+
// Рефетч при смене route-параметра в рамках ЭТОГО же роута (напр. категория→категория по
|
|
25
|
+
// ссылке): setup не перезапускается, поэтому нужен watch. Сверяемся с route.name — иначе при
|
|
26
|
+
// уходе на другой [slug]-роут (slug общий) watch дёрнул бы этот эндпоинт с чужим слагом.
|
|
27
|
+
const routeName = route.name;
|
|
28
|
+
watch(stateKey, () => {
|
|
29
|
+
if (route.name === routeName) refresh();
|
|
30
|
+
});
|
|
31
|
+
|
|
23
32
|
return { data, status, error };
|
|
24
33
|
};
|
|
@@ -14,8 +14,8 @@ export const useFetchModelsByPhrases = async (
|
|
|
14
14
|
const key = AsyncData.ModelsByPhrases;
|
|
15
15
|
const stateKey = computed(() => `data-${key}-${slug.value}-${JSON.stringify(route.query)}-${lang}`);
|
|
16
16
|
|
|
17
|
-
const { data, status, error } = await useAsyncData<PaginatedResponse<IModelCard>>(
|
|
18
|
-
|
|
17
|
+
const { data, status, error, refresh } = await useAsyncData<PaginatedResponse<IModelCard>>(
|
|
18
|
+
stateKey.value,
|
|
19
19
|
() => useApiFetcher<PaginatedResponse<IModelCard>>(
|
|
20
20
|
stateKey.value,
|
|
21
21
|
apiMethod,
|
|
@@ -26,17 +26,15 @@ export const useFetchModelsByPhrases = async (
|
|
|
26
26
|
lang,
|
|
27
27
|
slug.value,
|
|
28
28
|
)(),
|
|
29
|
-
{
|
|
30
|
-
watch: [
|
|
31
|
-
() => {
|
|
32
|
-
if (route.query) {
|
|
33
|
-
const currentQuery = route.query;
|
|
34
|
-
return JSON.stringify(currentQuery);
|
|
35
|
-
}
|
|
36
|
-
},
|
|
37
|
-
],
|
|
38
|
-
}
|
|
39
29
|
);
|
|
40
30
|
|
|
31
|
+
// Рефетч при смене route-параметра в рамках ЭТОГО же роута (напр. категория→категория по
|
|
32
|
+
// ссылке): setup не перезапускается, поэтому нужен watch. Сверяемся с route.name — иначе при
|
|
33
|
+
// уходе на другой [slug]-роут (slug общий) watch дёрнул бы этот эндпоинт с чужим слагом.
|
|
34
|
+
const routeName = route.name;
|
|
35
|
+
watch(stateKey, () => {
|
|
36
|
+
if (route.name === routeName) refresh();
|
|
37
|
+
});
|
|
38
|
+
|
|
41
39
|
return { data, status, error };
|
|
42
40
|
};
|
|
@@ -10,7 +10,7 @@ export const useFetchPlaylistsById = async (apiMethod: (...args: any[]) => Promi
|
|
|
10
10
|
const lang = useLang() as Language;
|
|
11
11
|
|
|
12
12
|
const { data, status, error, refresh } = await useAsyncData<IPlaylistData>(
|
|
13
|
-
|
|
13
|
+
stateKey.value,
|
|
14
14
|
() => useApiFetcher<IPlaylistData>(
|
|
15
15
|
stateKey.value,
|
|
16
16
|
apiMethod,
|
|
@@ -19,5 +19,13 @@ export const useFetchPlaylistsById = async (apiMethod: (...args: any[]) => Promi
|
|
|
19
19
|
)(),
|
|
20
20
|
);
|
|
21
21
|
|
|
22
|
+
// Рефетч при смене route-параметра в рамках ЭТОГО же роута (напр. категория→категория по
|
|
23
|
+
// ссылке): setup не перезапускается, поэтому нужен watch. Сверяемся с route.name — иначе при
|
|
24
|
+
// уходе на другой [slug]-роут (slug общий) watch дёрнул бы этот эндпоинт с чужим слагом.
|
|
25
|
+
const routeName = route.name;
|
|
26
|
+
watch(stateKey, () => {
|
|
27
|
+
if (route.name === routeName) refresh();
|
|
28
|
+
});
|
|
29
|
+
|
|
22
30
|
return { data, status, error, refresh };
|
|
23
31
|
};
|
|
@@ -14,8 +14,8 @@ export const useFetchPlaylistsGetVideosById = async (
|
|
|
14
14
|
const stateKey = computed(() => `data-${key}-${id.value}`);
|
|
15
15
|
const lang = useLang() as Language;
|
|
16
16
|
|
|
17
|
-
const { data, status, error } = await useAsyncData<PaginatedResponse<IVideoCard>>(
|
|
18
|
-
|
|
17
|
+
const { data, status, error, refresh } = await useAsyncData<PaginatedResponse<IVideoCard>>(
|
|
18
|
+
stateKey.value,
|
|
19
19
|
() => useApiFetcherNoCache<PaginatedResponse<IVideoCard>>(
|
|
20
20
|
stateKey.value,
|
|
21
21
|
apiMethod,
|
|
@@ -30,6 +30,14 @@ export const useFetchPlaylistsGetVideosById = async (
|
|
|
30
30
|
)(),
|
|
31
31
|
);
|
|
32
32
|
|
|
33
|
+
// Рефетч при смене route-параметра в рамках ЭТОГО же роута (напр. категория→категория по
|
|
34
|
+
// ссылке): setup не перезапускается, поэтому нужен watch. Сверяемся с route.name — иначе при
|
|
35
|
+
// уходе на другой [slug]-роут (slug общий) watch дёрнул бы этот эндпоинт с чужим слагом.
|
|
36
|
+
const routeName = route.name;
|
|
37
|
+
watch(stateKey, () => {
|
|
38
|
+
if (route.name === routeName) refresh();
|
|
39
|
+
});
|
|
40
|
+
|
|
33
41
|
return {
|
|
34
42
|
error,
|
|
35
43
|
status,
|
|
@@ -5,20 +5,29 @@ import type { IPopularTags } from '../../types';
|
|
|
5
5
|
export const useFetchPopularTagsByChannelName = async (
|
|
6
6
|
apiMethod: (...args: any[]) => Promise<IPopularTags[]>
|
|
7
7
|
) => {
|
|
8
|
+
const route = useRoute();
|
|
8
9
|
const lang = useLang() as Language;
|
|
9
10
|
const slug = useSlug('channel');
|
|
10
11
|
const key = AsyncData.PopularTagsByChannel;
|
|
11
12
|
const stateKey = computed(() => `data-${key}-${slug.value}-${lang}`);
|
|
12
13
|
|
|
13
|
-
const { data, status, error } = await useAsyncData<IPopularTags[]>(
|
|
14
|
-
|
|
15
|
-
|
|
14
|
+
const { data, status, error, refresh } = await useAsyncData<IPopularTags[]>(
|
|
15
|
+
stateKey.value,
|
|
16
|
+
() => useApiFetcher<IPopularTags[]>(
|
|
16
17
|
stateKey.value,
|
|
17
18
|
apiMethod,
|
|
18
19
|
lang,
|
|
19
20
|
slug.value,
|
|
20
|
-
)()
|
|
21
|
-
|
|
21
|
+
)(),
|
|
22
|
+
);
|
|
23
|
+
|
|
24
|
+
// Рефетч при смене route-параметра в рамках ЭТОГО же роута (напр. категория→категория по
|
|
25
|
+
// ссылке): setup не перезапускается, поэтому нужен watch. Сверяемся с route.name — иначе при
|
|
26
|
+
// уходе на другой [slug]-роут (slug общий) watch дёрнул бы этот эндпоинт с чужим слагом.
|
|
27
|
+
const routeName = route.name;
|
|
28
|
+
watch(stateKey, () => {
|
|
29
|
+
if (route.name === routeName) refresh();
|
|
30
|
+
});
|
|
22
31
|
|
|
23
32
|
return { data, status, error };
|
|
24
33
|
};
|
|
@@ -5,20 +5,29 @@ import type { IPopularTags } from '../../types';
|
|
|
5
5
|
export const useFetchPopularTagsByModelName = async (
|
|
6
6
|
apiMethod: (...args: any[]) => Promise<IPopularTags[]>
|
|
7
7
|
) => {
|
|
8
|
+
const route = useRoute();
|
|
8
9
|
const lang = useLang() as Language;
|
|
9
10
|
const slug = useSlug();
|
|
10
11
|
const key = AsyncData.PopularTagsByModel;
|
|
11
12
|
const stateKey = computed(() => `data-${key}-${slug.value}-${lang}`);
|
|
12
13
|
|
|
13
|
-
const { data, status, error } = await useAsyncData<IPopularTags[]>(
|
|
14
|
-
|
|
15
|
-
|
|
14
|
+
const { data, status, error, refresh } = await useAsyncData<IPopularTags[]>(
|
|
15
|
+
stateKey.value,
|
|
16
|
+
() => useApiFetcher<IPopularTags[]>(
|
|
16
17
|
stateKey.value,
|
|
17
18
|
apiMethod,
|
|
18
19
|
lang,
|
|
19
20
|
slug.value,
|
|
20
|
-
)()
|
|
21
|
-
|
|
21
|
+
)(),
|
|
22
|
+
);
|
|
23
|
+
|
|
24
|
+
// Рефетч при смене route-параметра в рамках ЭТОГО же роута (напр. категория→категория по
|
|
25
|
+
// ссылке): setup не перезапускается, поэтому нужен watch. Сверяемся с route.name — иначе при
|
|
26
|
+
// уходе на другой [slug]-роут (slug общий) watch дёрнул бы этот эндпоинт с чужим слагом.
|
|
27
|
+
const routeName = route.name;
|
|
28
|
+
watch(stateKey, () => {
|
|
29
|
+
if (route.name === routeName) refresh();
|
|
30
|
+
});
|
|
22
31
|
|
|
23
32
|
return { data, status, error };
|
|
24
33
|
};
|
|
@@ -14,8 +14,8 @@ export const useFetchRelatedVideos = async (
|
|
|
14
14
|
const key = AsyncData.RelatedVideos;
|
|
15
15
|
const stateKey = computed(() => `data-${key}-${slug.value}-${JSON.stringify(route.query)}-${lang}`);
|
|
16
16
|
|
|
17
|
-
const { data, status, error } = await useAsyncData<PaginatedResponse<IVideoCard>>(
|
|
18
|
-
|
|
17
|
+
const { data, status, error, refresh } = await useAsyncData<PaginatedResponse<IVideoCard>>(
|
|
18
|
+
stateKey.value,
|
|
19
19
|
() => {
|
|
20
20
|
if (!slug.value) return Promise.resolve(null as unknown as PaginatedResponse<IVideoCard>);
|
|
21
21
|
|
|
@@ -30,10 +30,15 @@ export const useFetchRelatedVideos = async (
|
|
|
30
30
|
slug.value
|
|
31
31
|
)();
|
|
32
32
|
},
|
|
33
|
-
{
|
|
34
|
-
watch: [() => route.query.page],
|
|
35
|
-
}
|
|
36
33
|
);
|
|
37
34
|
|
|
35
|
+
// Рефетч при смене route-параметра в рамках ЭТОГО же роута (напр. категория→категория по
|
|
36
|
+
// ссылке): setup не перезапускается, поэтому нужен watch. Сверяемся с route.name — иначе при
|
|
37
|
+
// уходе на другой [slug]-роут (slug общий) watch дёрнул бы этот эндпоинт с чужим слагом.
|
|
38
|
+
const routeName = route.name;
|
|
39
|
+
watch(stateKey, () => {
|
|
40
|
+
if (route.name === routeName) refresh();
|
|
41
|
+
});
|
|
42
|
+
|
|
38
43
|
return { data, status, error };
|
|
39
44
|
};
|
|
@@ -3,13 +3,14 @@ import { AsyncData } from '../../runtime';
|
|
|
3
3
|
|
|
4
4
|
export const useFetchVideoRefererPhrases = async (
|
|
5
5
|
apiMethod: (...args: any[]) => Promise<string[]>) => {
|
|
6
|
+
const route = useRoute();
|
|
6
7
|
const lang = useLang() as Language;
|
|
7
8
|
const slug = useSlug();
|
|
8
9
|
const key = AsyncData.RefererPhrases;
|
|
9
10
|
const stateKey = computed(() => `data-${key}-${slug.value}-${lang}`);
|
|
10
11
|
|
|
11
|
-
const { data, status, error } = await useAsyncData<string[]>(
|
|
12
|
-
|
|
12
|
+
const { data, status, error, refresh } = await useAsyncData<string[]>(
|
|
13
|
+
stateKey.value,
|
|
13
14
|
() => useApiFetcher<string[]>(
|
|
14
15
|
stateKey.value,
|
|
15
16
|
apiMethod,
|
|
@@ -38,5 +39,13 @@ export const useFetchVideoRefererPhrases = async (
|
|
|
38
39
|
// }
|
|
39
40
|
// }
|
|
40
41
|
|
|
42
|
+
// Рефетч при смене route-параметра в рамках ЭТОГО же роута (напр. категория→категория по
|
|
43
|
+
// ссылке): setup не перезапускается, поэтому нужен watch. Сверяемся с route.name — иначе при
|
|
44
|
+
// уходе на другой [slug]-роут (slug общий) watch дёрнул бы этот эндпоинт с чужим слагом.
|
|
45
|
+
const routeName = route.name;
|
|
46
|
+
watch(stateKey, () => {
|
|
47
|
+
if (route.name === routeName) refresh();
|
|
48
|
+
});
|
|
49
|
+
|
|
41
50
|
return { data, status, error };
|
|
42
51
|
};
|
|
@@ -16,8 +16,14 @@ export const useFetchVideosByCategories = async (
|
|
|
16
16
|
const stateKey = computed(() => `data-${key}-${slug.value}-${JSON.stringify(route.query)}-${lang}`);
|
|
17
17
|
const filters = computed(() => useGetVideosFilterRequest(route, selectDurationItems, selectAddedItems));
|
|
18
18
|
|
|
19
|
-
|
|
20
|
-
|
|
19
|
+
// Ключ уникален на slug+query+lang (не константа AsyncData.VideosByCategory): иначе все
|
|
20
|
+
// категории делят один кэш-слот useAsyncData и при приходе на /categories/<slug>, когда
|
|
21
|
+
// слот уже заполнен другой категорией, отдаётся её кэш вместо свежего фетча (ролики «не
|
|
22
|
+
// подсасываются»). watch — только на query (page/sort/фильтры): следить за slug НЕЛЬЗЯ,
|
|
23
|
+
// т.к. route.params.slug общий для всех [slug]-роутов и при уходе на /videos/<id> и т.п.
|
|
24
|
+
// watch дёрнул бы этот эндпоинт с чужим слагом.
|
|
25
|
+
const { data, status, error, refresh } = await useAsyncData<PaginatedResponse<IVideoCard>>(
|
|
26
|
+
stateKey.value,
|
|
21
27
|
() => useApiFetcher<PaginatedResponse<IVideoCard>>(
|
|
22
28
|
stateKey.value,
|
|
23
29
|
apiMethod,
|
|
@@ -30,15 +36,15 @@ export const useFetchVideosByCategories = async (
|
|
|
30
36
|
slug.value,
|
|
31
37
|
getSelectedQuery(route, sortItemsDefault) || '-popularity'
|
|
32
38
|
)(),
|
|
33
|
-
{
|
|
34
|
-
watch: [() => {
|
|
35
|
-
if (route.query) {
|
|
36
|
-
const currentQuery = route.query;
|
|
37
|
-
return JSON.stringify(currentQuery);
|
|
38
|
-
}
|
|
39
|
-
}],
|
|
40
|
-
}
|
|
41
39
|
);
|
|
42
40
|
|
|
41
|
+
// Рефетч при смене route-параметра в рамках ЭТОГО же роута (напр. категория→категория по
|
|
42
|
+
// ссылке): setup не перезапускается, поэтому нужен watch. Сверяемся с route.name — иначе при
|
|
43
|
+
// уходе на другой [slug]-роут (slug общий) watch дёрнул бы этот эндпоинт с чужим слагом.
|
|
44
|
+
const routeName = route.name;
|
|
45
|
+
watch(stateKey, () => {
|
|
46
|
+
if (route.name === routeName) refresh();
|
|
47
|
+
});
|
|
48
|
+
|
|
43
49
|
return { data, status, error };
|
|
44
50
|
};
|
|
@@ -14,8 +14,8 @@ export const useFetchVideosByChannel = async (apiMethod: (...args: any[]) => Pro
|
|
|
14
14
|
const key = AsyncData.VideosByChannel;
|
|
15
15
|
const stateKey = computed(() => `data-${key}-${slug.value}-${JSON.stringify(route.query)}-${lang}`);
|
|
16
16
|
|
|
17
|
-
const { data, status, error } = await useAsyncData<PaginatedResponse<IVideoCard>>(
|
|
18
|
-
|
|
17
|
+
const { data, status, error, refresh } = await useAsyncData<PaginatedResponse<IVideoCard>>(
|
|
18
|
+
stateKey.value,
|
|
19
19
|
() => useApiFetcher<PaginatedResponse<IVideoCard>>(
|
|
20
20
|
stateKey.value,
|
|
21
21
|
apiMethod,
|
|
@@ -28,17 +28,15 @@ export const useFetchVideosByChannel = async (apiMethod: (...args: any[]) => Pro
|
|
|
28
28
|
lang,
|
|
29
29
|
getSelectedQuery(route, sortItemsDefault) || '-popularity'
|
|
30
30
|
)(),
|
|
31
|
-
{
|
|
32
|
-
watch: [
|
|
33
|
-
() => {
|
|
34
|
-
if (route.query) {
|
|
35
|
-
const currentQuery = route.query;
|
|
36
|
-
return JSON.stringify(currentQuery);
|
|
37
|
-
}
|
|
38
|
-
},
|
|
39
|
-
],
|
|
40
|
-
}
|
|
41
31
|
);
|
|
42
32
|
|
|
33
|
+
// Рефетч при смене route-параметра в рамках ЭТОГО же роута (напр. категория→категория по
|
|
34
|
+
// ссылке): setup не перезапускается, поэтому нужен watch. Сверяемся с route.name — иначе при
|
|
35
|
+
// уходе на другой [slug]-роут (slug общий) watch дёрнул бы этот эндпоинт с чужим слагом.
|
|
36
|
+
const routeName = route.name;
|
|
37
|
+
watch(stateKey, () => {
|
|
38
|
+
if (route.name === routeName) refresh();
|
|
39
|
+
});
|
|
40
|
+
|
|
43
41
|
return { data, status, error };
|
|
44
42
|
};
|
|
@@ -19,8 +19,8 @@ export const useFetchVideosByModelAndChannel = async (apiMethod: (...args: any[]
|
|
|
19
19
|
const key = AsyncData.VideosByModelAndChannel;
|
|
20
20
|
const stateKey = computed(() => `data-${key}-${slug.value}-${channel.value}-${JSON.stringify(route.query)}-${lang}`);
|
|
21
21
|
|
|
22
|
-
const { data, status, error } = await useAsyncData<PaginatedResponse<IVideoCard>>(
|
|
23
|
-
|
|
22
|
+
const { data, status, error, refresh } = await useAsyncData<PaginatedResponse<IVideoCard>>(
|
|
23
|
+
stateKey.value,
|
|
24
24
|
() => useApiFetcher<PaginatedResponse<IVideoCard>>(
|
|
25
25
|
stateKey.value,
|
|
26
26
|
apiMethod,
|
|
@@ -34,17 +34,15 @@ export const useFetchVideosByModelAndChannel = async (apiMethod: (...args: any[]
|
|
|
34
34
|
lang,
|
|
35
35
|
getSelectedQuery(route, sortItemsDefault) || '-popularity'
|
|
36
36
|
)(),
|
|
37
|
-
{
|
|
38
|
-
watch: [
|
|
39
|
-
() => {
|
|
40
|
-
if (route.query) {
|
|
41
|
-
const currentQuery = route.query;
|
|
42
|
-
return JSON.stringify(currentQuery);
|
|
43
|
-
}
|
|
44
|
-
},
|
|
45
|
-
],
|
|
46
|
-
}
|
|
47
37
|
);
|
|
48
38
|
|
|
39
|
+
// Рефетч при смене route-параметра в рамках ЭТОГО же роута (напр. категория→категория по
|
|
40
|
+
// ссылке): setup не перезапускается, поэтому нужен watch. Сверяемся с route.name — иначе при
|
|
41
|
+
// уходе на другой [slug]-роут (slug общий) watch дёрнул бы этот эндпоинт с чужим слагом.
|
|
42
|
+
const routeName = route.name;
|
|
43
|
+
watch(stateKey, () => {
|
|
44
|
+
if (route.name === routeName) refresh();
|
|
45
|
+
});
|
|
46
|
+
|
|
49
47
|
return { data, status, error };
|
|
50
48
|
};
|
|
@@ -19,8 +19,8 @@ export const useFetchVideosByModelAndTag = async (apiMethod: (...args: any[]) =>
|
|
|
19
19
|
const key = AsyncData.VideosByModelAndTag;
|
|
20
20
|
const stateKey = computed(() => `data-${key}-${slug.value}-${tag.value}-${JSON.stringify(route.query)}-${lang}`);
|
|
21
21
|
|
|
22
|
-
const { data, status, error } = await useAsyncData<PaginatedResponse<IVideoCard>>(
|
|
23
|
-
|
|
22
|
+
const { data, status, error, refresh } = await useAsyncData<PaginatedResponse<IVideoCard>>(
|
|
23
|
+
stateKey.value,
|
|
24
24
|
() => useApiFetcher<PaginatedResponse<IVideoCard>>(
|
|
25
25
|
stateKey.value,
|
|
26
26
|
apiMethod,
|
|
@@ -34,17 +34,15 @@ export const useFetchVideosByModelAndTag = async (apiMethod: (...args: any[]) =>
|
|
|
34
34
|
lang,
|
|
35
35
|
getSelectedQuery(route, sortItemsDefault) || '-popularity'
|
|
36
36
|
)(),
|
|
37
|
-
{
|
|
38
|
-
watch: [
|
|
39
|
-
() => {
|
|
40
|
-
if (route.query) {
|
|
41
|
-
const currentQuery = route.query;
|
|
42
|
-
return JSON.stringify(currentQuery);
|
|
43
|
-
}
|
|
44
|
-
},
|
|
45
|
-
],
|
|
46
|
-
}
|
|
47
37
|
);
|
|
48
38
|
|
|
39
|
+
// Рефетч при смене route-параметра в рамках ЭТОГО же роута (напр. категория→категория по
|
|
40
|
+
// ссылке): setup не перезапускается, поэтому нужен watch. Сверяемся с route.name — иначе при
|
|
41
|
+
// уходе на другой [slug]-роут (slug общий) watch дёрнул бы этот эндпоинт с чужим слагом.
|
|
42
|
+
const routeName = route.name;
|
|
43
|
+
watch(stateKey, () => {
|
|
44
|
+
if (route.name === routeName) refresh();
|
|
45
|
+
});
|
|
46
|
+
|
|
49
47
|
return { data, status, error };
|
|
50
48
|
};
|
|
@@ -14,8 +14,8 @@ export const useFetchVideosByModel = async (apiMethod: (...args: any[]) => Promi
|
|
|
14
14
|
const key = AsyncData.ModelsVideos;
|
|
15
15
|
const stateKey = computed(() => `data-${key}-${slug.value}-${JSON.stringify(route.query)}-${lang}`);
|
|
16
16
|
|
|
17
|
-
const { data, status, error } = await useAsyncData<PaginatedResponse<IVideoCard>>(
|
|
18
|
-
|
|
17
|
+
const { data, status, error, refresh } = await useAsyncData<PaginatedResponse<IVideoCard>>(
|
|
18
|
+
stateKey.value,
|
|
19
19
|
() => useApiFetcher<PaginatedResponse<IVideoCard>>(
|
|
20
20
|
stateKey.value,
|
|
21
21
|
apiMethod,
|
|
@@ -28,17 +28,15 @@ export const useFetchVideosByModel = async (apiMethod: (...args: any[]) => Promi
|
|
|
28
28
|
lang,
|
|
29
29
|
getSelectedQuery(route, sortItemsDefault) || '-popularity'
|
|
30
30
|
)(),
|
|
31
|
-
{
|
|
32
|
-
watch: [
|
|
33
|
-
() => {
|
|
34
|
-
if (route.query) {
|
|
35
|
-
const currentQuery = route.query;
|
|
36
|
-
return JSON.stringify(currentQuery);
|
|
37
|
-
}
|
|
38
|
-
},
|
|
39
|
-
],
|
|
40
|
-
}
|
|
41
31
|
);
|
|
42
32
|
|
|
33
|
+
// Рефетч при смене route-параметра в рамках ЭТОГО же роута (напр. категория→категория по
|
|
34
|
+
// ссылке): setup не перезапускается, поэтому нужен watch. Сверяемся с route.name — иначе при
|
|
35
|
+
// уходе на другой [slug]-роут (slug общий) watch дёрнул бы этот эндпоинт с чужим слагом.
|
|
36
|
+
const routeName = route.name;
|
|
37
|
+
watch(stateKey, () => {
|
|
38
|
+
if (route.name === routeName) refresh();
|
|
39
|
+
});
|
|
40
|
+
|
|
43
41
|
return { data, status, error };
|
|
44
42
|
};
|
|
@@ -14,8 +14,8 @@ export const useFetchVideosByTag = async (apiMethod: (...args: any[]) => Promise
|
|
|
14
14
|
const key = AsyncData.VideosByTag;
|
|
15
15
|
const stateKey = computed(() => `data-${key}-${slug.value}-${JSON.stringify(route.query)}-${lang}`);
|
|
16
16
|
|
|
17
|
-
const { data, status, error } = await useAsyncData<PaginatedResponse<IVideoCard>>(
|
|
18
|
-
|
|
17
|
+
const { data, status, error, refresh } = await useAsyncData<PaginatedResponse<IVideoCard>>(
|
|
18
|
+
stateKey.value,
|
|
19
19
|
() => useApiFetcher<PaginatedResponse<IVideoCard>>(
|
|
20
20
|
stateKey.value,
|
|
21
21
|
apiMethod,
|
|
@@ -28,17 +28,15 @@ export const useFetchVideosByTag = async (apiMethod: (...args: any[]) => Promise
|
|
|
28
28
|
lang,
|
|
29
29
|
getSelectedQuery(route, sortItemsDefault) || '-popularity'
|
|
30
30
|
)(),
|
|
31
|
-
{
|
|
32
|
-
watch: [
|
|
33
|
-
() => {
|
|
34
|
-
if (route.query) {
|
|
35
|
-
const currentQuery = route.query;
|
|
36
|
-
return JSON.stringify(currentQuery);
|
|
37
|
-
}
|
|
38
|
-
},
|
|
39
|
-
],
|
|
40
|
-
}
|
|
41
31
|
);
|
|
42
32
|
|
|
33
|
+
// Рефетч при смене route-параметра в рамках ЭТОГО же роута (напр. категория→категория по
|
|
34
|
+
// ссылке): setup не перезапускается, поэтому нужен watch. Сверяемся с route.name — иначе при
|
|
35
|
+
// уходе на другой [slug]-роут (slug общий) watch дёрнул бы этот эндпоинт с чужим слагом.
|
|
36
|
+
const routeName = route.name;
|
|
37
|
+
watch(stateKey, () => {
|
|
38
|
+
if (route.name === routeName) refresh();
|
|
39
|
+
});
|
|
40
|
+
|
|
43
41
|
return { data, status, error };
|
|
44
42
|
};
|
|
@@ -12,8 +12,8 @@ export const useFetchVideosSearchByNiche = async (apiMethod: (...args: any[]) =>
|
|
|
12
12
|
const key = AsyncData.VideosBySearch;
|
|
13
13
|
const stateKey = computed(() => `data-${key}-${slug.value}-${JSON.stringify(route.query)}-${lang}`);
|
|
14
14
|
|
|
15
|
-
const { data, status, error } = await useAsyncData<PaginatedResponse<IVideoCard>>(
|
|
16
|
-
|
|
15
|
+
const { data, status, error, refresh } = await useAsyncData<PaginatedResponse<IVideoCard>>(
|
|
16
|
+
stateKey.value,
|
|
17
17
|
() => useApiFetcher<PaginatedResponse<IVideoCard>>(
|
|
18
18
|
stateKey.value,
|
|
19
19
|
apiMethod,
|
|
@@ -24,17 +24,15 @@ export const useFetchVideosSearchByNiche = async (apiMethod: (...args: any[]) =>
|
|
|
24
24
|
lang,
|
|
25
25
|
slug.value,
|
|
26
26
|
)(),
|
|
27
|
-
{
|
|
28
|
-
watch: [
|
|
29
|
-
() => {
|
|
30
|
-
if (route.query) {
|
|
31
|
-
const currentQuery = route.query;
|
|
32
|
-
return JSON.stringify(currentQuery);
|
|
33
|
-
}
|
|
34
|
-
},
|
|
35
|
-
],
|
|
36
|
-
}
|
|
37
27
|
);
|
|
38
28
|
|
|
29
|
+
// Рефетч при смене route-параметра в рамках ЭТОГО же роута (напр. категория→категория по
|
|
30
|
+
// ссылке): setup не перезапускается, поэтому нужен watch. Сверяемся с route.name — иначе при
|
|
31
|
+
// уходе на другой [slug]-роут (slug общий) watch дёрнул бы этот эндпоинт с чужим слагом.
|
|
32
|
+
const routeName = route.name;
|
|
33
|
+
watch(stateKey, () => {
|
|
34
|
+
if (route.name === routeName) refresh();
|
|
35
|
+
});
|
|
36
|
+
|
|
39
37
|
return { data, status, error };
|
|
40
38
|
};
|
|
@@ -16,8 +16,11 @@ export const useFetchVideos = async (
|
|
|
16
16
|
const key = AsyncData.Videos;
|
|
17
17
|
const stateKey = computed(() => `data-${key}-${JSON.stringify(route.query)}-${lang}`);
|
|
18
18
|
|
|
19
|
+
// Ключ уникален на query+lang (не константа AsyncData.Videos): иначе главная делит один
|
|
20
|
+
// кэш-слот между разными query (page/sort/фильтры) и при возврате на неё отдаётся кэш от
|
|
21
|
+
// другого состояния вместо свежего фетча (мигает «нет данных»/пустой грид).
|
|
19
22
|
const { data, status, error } = await useAsyncData<PaginatedResponse<IVideoCard>>(
|
|
20
|
-
|
|
23
|
+
stateKey.value,
|
|
21
24
|
() => useApiFetcher<PaginatedResponse<IVideoCard>>(
|
|
22
25
|
stateKey.value,
|
|
23
26
|
apiMethod,
|