import { useMutation, useInfiniteQuery, useQuery, useQueryClient } from '@tanstack/react-query' import { Link } from 'react-router-dom' import { getFeed, getSyncStatus, listCategories, logout, syncVideos } from '../api/client' import CategoryNav, { type CategoryFilter } from '../components/CategoryNav' import VideoCard from '../components/VideoCard' import { useState } from 'react' function Feed() { const [filter, setFilter] = useState('all') const queryClient = useQueryClient() const categoriesQuery = useQuery({ queryKey: ['categories'], queryFn: listCategories }) const categories = categoriesQuery.data ?? [] const feedQuery = useInfiniteQuery({ queryKey: ['feed', filter], queryFn: ({ pageParam }) => getFeed({ categoryId: typeof filter === 'number' ? filter : undefined, uncategorized: filter === 'uncategorized', cursor: pageParam, }), initialPageParam: undefined as string | undefined, getNextPageParam: (lastPage) => lastPage.next_cursor ?? undefined, }) const syncStatusQuery = useQuery({ queryKey: ['sync-status'], queryFn: getSyncStatus, refetchInterval: (query) => (query.state.data?.videos.running ? 1500 : false), }) const syncMutation = useMutation({ mutationFn: syncVideos, onSuccess: () => { queryClient.invalidateQueries({ queryKey: ['feed'] }) queryClient.invalidateQueries({ queryKey: ['sync-status'] }) }, }) const logoutMutation = useMutation({ mutationFn: logout, onSuccess: () => { queryClient.invalidateQueries({ queryKey: ['auth-status'] }) }, }) const running = syncStatusQuery.data?.videos.running const items = feedQuery.data?.pages.flatMap((page) => page.items) ?? [] return (

Лента

Сохранённые Каналы Категории
{syncMutation.isError &&

{(syncMutation.error as Error).message}

} {syncStatusQuery.data?.videos.status === 'failed' && (

Последняя синхронизация видео завершилась ошибкой: {syncStatusQuery.data.videos.error}

)}
{feedQuery.isLoading &&

Загрузка...

} {feedQuery.isError &&

Не удалось загрузить ленту

}
    {items.map((video) => ( ))}
{!feedQuery.isLoading && items.length === 0 && (

Видео пока нет. Нажми "Обновить сейчас" или проверь, есть ли каналы в этой категории.

)} {feedQuery.hasNextPage && ( )}
) } export default Feed