import { useParams, useNavigate } from 'react-router'; import { useTranslation } from 'react-i18next'; import { ScrollArea, IconButton, Button } from '@olly/modern-sk'; import { useGetPlaylistQuery, useGetPlaylistTracksQuery, } from '../../api/endpoints/playlists'; import { TrackRow } from '../../components/track/TrackRow'; import { LoadingSkeleton } from '../../components/common/LoadingSkeleton'; import { ErrorState } from '../../components/common/ErrorState'; import { EmptyState } from '../../components/common/EmptyState'; import { useAppDispatch } from '../../hooks/useAppDispatch'; import { setQueue } from '../../store/slices/queue'; import { formatDuration } from '../../lib/format'; export function PlaylistDetailPage() { const { t } = useTranslation(); const { playlistId } = useParams<{ playlistId: string }>(); const navigate = useNavigate(); const dispatch = useAppDispatch(); const playlistQuery = useGetPlaylistQuery(playlistId ?? '', { skip: !playlistId, }); const tracksQuery = useGetPlaylistTracksQuery(playlistId ?? '', { skip: !playlistId, }); if (playlistQuery.isLoading) { return (
); } if (playlistQuery.isError) { return ( playlistQuery.refetch()} /> ); } const playlist = playlistQuery.data; const tracks = tracksQuery.data ?? []; const handlePlayAll = () => { if (!tracks.length || !playlist) return; dispatch( setQueue({ entries: tracks.map((t) => ({ trackId: t.id, title: t.title, artistName: t.artistName, albumTitle: t.albumTitle, durationMs: t.durationMs, albumArtUrl: t.albumArtUrl, })), source: 'playlist', sourceId: playlist.id, sourceName: playlist.name, }), ); }; return (
navigate(-1)} aria-label={t('common.back')} > ←

{t('playlist.type')}

{playlist?.name}

{playlist?.description && (

{playlist.description}

)}

{playlist && `${playlist.trackCount} · ${formatDuration(playlist.totalDurationMs)}`}

{tracksQuery.isLoading && } {tracksQuery.isError && ( tracksQuery.refetch()} /> )} {!tracksQuery.isLoading && !tracksQuery.isError && tracks.length === 0 && ( )} {tracks.map((track, i) => ( ))}
); }