import { useMemo, useState } from 'react' import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query' import { Link } from 'react-router-dom' import { getSyncStatus, listCategories, listChannels, logout, syncSubscriptions } from '../api/client' import ChannelCard from '../components/ChannelCard' import CategoryNav, { type CategoryFilter } from '../components/CategoryNav' function Channels() { const [search, setSearch] = useState('') const [filter, setFilter] = useState('all') const queryClient = useQueryClient() const categoriesQuery = useQuery({ queryKey: ['categories'], queryFn: listCategories }) const channelsQuery = useQuery({ queryKey: ['channels', filter], queryFn: () => listChannels({ categoryId: typeof filter === 'number' ? filter : undefined, uncategorized: filter === 'uncategorized', }), }) const filteredChannels = useMemo(() => { const data = channelsQuery.data ?? [] if (!search.trim()) return data const needle = search.trim().toLowerCase() return data.filter((c) => c.title.toLowerCase().includes(needle)) }, [channelsQuery.data, search]) const syncStatusQuery = useQuery({ queryKey: ['sync-status'], queryFn: getSyncStatus, refetchInterval: (query) => (query.state.data?.subscriptions.running ? 1500 : false), }) const syncMutation = useMutation({ mutationFn: syncSubscriptions, onSuccess: () => { queryClient.invalidateQueries({ queryKey: ['channels'] }) queryClient.invalidateQueries({ queryKey: ['sync-status'] }) }, }) const logoutMutation = useMutation({ mutationFn: logout, onSuccess: () => { queryClient.invalidateQueries({ queryKey: ['auth-status'] }) }, }) const running = syncStatusQuery.data?.subscriptions.running const categories = categoriesQuery.data ?? [] return (

Каналы

Лента Категории
{syncMutation.isError &&

{(syncMutation.error as Error).message}

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

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

)}
setSearch(e.target.value)} /> {channelsQuery.isLoading &&

Загрузка...

} {channelsQuery.isError &&

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

}
    {filteredChannels.map((channel) => ( ))}
{channelsQuery.data && channelsQuery.data.length === 0 && (

Каналы не найдены{filter === 'all' ? '. Нажми "Обновить сейчас".' : ' в этой категории.'}

)} {channelsQuery.data && channelsQuery.data.length > 0 && filteredChannels.length === 0 && (

Ничего не найдено по запросу "{search}".

)}
) } export default Channels