import React, { memo } from 'react'; import { useNavigate } from 'react-router-dom'; import { Play, HardDriveDownload } from 'lucide-react'; import { SubsonicAlbum, buildCoverArtUrl, coverArtCacheKey } from '../api/subsonic'; import { usePlayerStore } from '../store/playerStore'; import { useOfflineStore } from '../store/offlineStore'; import { useAuthStore } from '../store/authStore'; import CachedImage from './CachedImage'; import { playAlbum } from '../utils/playAlbum'; interface AlbumCardProps { album: SubsonicAlbum; } function AlbumCard({ album }: AlbumCardProps) { const navigate = useNavigate(); const openContextMenu = usePlayerStore(s => s.openContextMenu); const serverId = useAuthStore(s => s.activeServerId ?? ''); const isOffline = useOfflineStore(s => { const meta = s.albums[`${serverId}:${album.id}`]; if (!meta || meta.trackIds.length === 0) return false; return meta.trackIds.every(tid => !!s.tracks[`${serverId}:${tid}`]); }); const coverUrl = album.coverArt ? buildCoverArtUrl(album.coverArt, 300) : ''; return (
navigate(`/album/${album.id}`)} role="button" tabIndex={0} aria-label={`${album.name} von ${album.artist}`} onKeyDown={e => e.key === 'Enter' && navigate(`/album/${album.id}`)} onContextMenu={(e) => { e.preventDefault(); openContextMenu(e.clientX, e.clientY, album, 'album'); }} draggable onDragStart={e => { e.dataTransfer.effectAllowed = 'copy'; e.dataTransfer.setData('text/plain', JSON.stringify({ type: 'album', id: album.id, name: album.name, })); }} >
{coverUrl ? ( ) : (
)} {isOffline && (
)}

{album.name}

{album.artist}

{album.year &&

{album.year}

}
); } export default memo(AlbumCard);