import type { Language } from '../../runtime'; import { AsyncData, getSelectedQuery } from '../../runtime'; import type { IVideoCard, PaginatedResponse } from '../../types'; import { selectAddedItems, selectDurationItems, sortItemsDefault } from '../../lib'; import { useRoute } from 'vue-router'; export const useFetchVideosByModel = async (apiMethod: (...args: any[]) => Promise>) => { const route = useRoute(); const lang = useLang() as Language; const mobile = !!useState('isMobile').value; const perPage = mobile ? 12 : 48; const slug = useSlug(); const filters = computed(() => useGetVideosFilterRequest(route, selectDurationItems, selectAddedItems)); const key = AsyncData.ModelsVideos; const stateKey = computed(() => `data-${key}-${slug.value}-${JSON.stringify(route.query)}-${lang}`); const { data, status, error } = await useAsyncData>( stateKey.value, () => useApiFetcher>( stateKey.value, apiMethod, { page: Number(route.query['page']) || 1, 'per-page': perPage, }, filters.value, slug.value, lang, getSelectedQuery(route, sortItemsDefault) || '-popularity' )(), { watch: [ () => { if (route.query) { const currentQuery = route.query; return JSON.stringify(currentQuery); } }, ], } ); return { data, status, error }; };