import type { ReactNode } from 'react'; import { Badge, Button } from '@olly/modern-sk'; import { useTranslation } from 'react-i18next'; import { Link, useNavigate } from 'react-router'; import { skipToken } from '@reduxjs/toolkit/query'; import { Icon } from '../common/Icon'; import { ArtTile } from '../common/ArtTile'; import { AvailabilityBadge } from './AvailabilityBadge'; import { MetadataStatusBadge } from './MetadataStatusBadge'; import { LoadingSkeleton } from '../common/LoadingSkeleton'; import { ErrorState } from '../common/ErrorState'; import { EmptyState } from '../common/EmptyState'; import { useAppDispatch, useAppSelector } from '../../hooks/useAppDispatch'; import { closeTrackInfo } from '../../store/slices/ui'; import { play } from '../../store/slices/player'; import { addToQueue } from '../../store/slices/queue'; import { useGetTrackQuery, useGetAlbumQuery, } from '../../api/endpoints/library'; import { getTrackCoverUrl } from '../../api/endpoints/streaming'; import { formatDuration, formatFileSize, formatDateTime, } from '../../lib/format'; import type { Track } from '../../api/types'; /** * Right-side "Get Info"-style drawer for a single track. Rendered after the * QueuePanel in AppShell so it sits to the *right* of the queue when both are * open. Open state lives in `ui.trackInfoId`; it reads the live Track (and its * album) from the RTKQ cache so enrichment updates stay in sync. */ export function TrackInfoDrawer() { const trackId = useAppSelector((s) => s.ui.trackInfoId); const isOpen = trackId !== null; return ( ); } function TrackInfoContent({ trackId }: { trackId: string }) { const { t } = useTranslation(); const dispatch = useAppDispatch(); const navigate = useNavigate(); const token = useAppSelector((s) => s.auth.accessToken); const { data: track, isLoading, isError, refetch, } = useGetTrackQuery(trackId); // Album record fills in fields the lean TrackOut omits (year especially). const { data: album } = useGetAlbumQuery(track?.albumId ?? skipToken); const close = () => dispatch(closeTrackInfo()); return ( <>
{track.metadataError}
)}