import { useQuery } from '@tanstack/react-query' import { ErrorPanel, LoadingPanel } from '@/components/query-state' import { Search } from 'lucide-react' import { FavoriteToggle } from '@/components/favorite-toggle' import { type Track, coverArtUrl, fetchFavorites, fetchTracks } from '@/lib/api' import { useNavigate } from 'react-router-dom' import { usePlayerStore } from '@/stores/player-store' export function TracksPage() { const navigate = useNavigate() const setQueue = usePlayerStore((state) => state.setQueue) const playTrack = usePlayerStore((state) => state.playTrack) const tracksQuery = useQuery({ queryKey: ['tracks'], queryFn: fetchTracks, }) const favoritesQuery = useQuery({ queryKey: ['favorites'], queryFn: fetchFavorites, }) const tracks = tracksQuery.data?.items ?? [] const favoriteTrackIds = new Set((favoritesQuery.data?.tracks ?? []).map((track) => track.id)) if (tracksQuery.isLoading) { return } if (tracksQuery.isError) { return void tracksQuery.refetch()} title="Не получилось загрузить треки" /> } return (
navigate('/search')} />
#
Название
Альбом
Прослушивания
Прослушано последний раз
Качество
{tracks.map((track, index) => ( ))}
) } function HeaderSearch({ onClick }: { onClick: () => void }) { return (
) } function formatDuration(durationSeconds: number) { if (!durationSeconds) { return '—' } const minutes = Math.floor(durationSeconds / 60) const seconds = durationSeconds % 60 return `${minutes}:${seconds.toString().padStart(2, '0')}` } function formatLastPlayed(value?: string) { if (!value) { return '—' } const playedAt = new Date(value) if (Number.isNaN(playedAt.getTime())) { return '—' } const diffMs = Date.now() - playedAt.getTime() const diffMinutes = Math.floor(diffMs / 60000) if (diffMinutes < 1) { return 'только что' } if (diffMinutes < 60) { return `${diffMinutes} мин назад` } const diffHours = Math.floor(diffMinutes / 60) if (diffHours < 24) { return `${diffHours} ч назад` } const diffDays = Math.floor(diffHours / 24) if (diffDays < 30) { return `${diffDays} дн назад` } const diffMonths = Math.floor(diffDays / 30) return `${diffMonths} мес назад` } function formatQuality(track: Track) { const contentType = (track.contentType ?? '').toLowerCase() if (contentType.includes('flac')) { return 'FLAC' } if (contentType.includes('mpeg')) { return 'MP3' } if (contentType.includes('mp4')) { return 'M4A' } if (contentType.includes('ogg')) { return 'OGG' } if (contentType.includes('wav')) { return 'WAV' } if (contentType.includes('aac')) { return 'AAC' } return 'AUDIO' }