import React, { memo } from 'react'; import { useNavigate } from 'react-router-dom'; import { Play, ListPlus, HardDriveDownload, Check } from 'lucide-react'; import { useTranslation } from 'react-i18next'; import { SubsonicAlbum, buildCoverArtUrl, coverArtCacheKey, getAlbum } from '../api/subsonic'; import { usePlayerStore, songToTrack } from '../store/playerStore'; import { useOfflineStore } from '../store/offlineStore'; import { useAuthStore } from '../store/authStore'; import CachedImage from './CachedImage'; import { playAlbum } from '../utils/playAlbum'; import { useDragDrop } from '../contexts/DragDropContext'; interface AlbumCardProps { album: SubsonicAlbum; selected?: boolean; selectionMode?: boolean; onToggleSelect?: (id: string) => void; showRating?: boolean; selectedAlbums?: SubsonicAlbum[]; } function AlbumCard({ album, selected, selectionMode, onToggleSelect, showRating = false, selectedAlbums = [] }: AlbumCardProps) { const { t } = useTranslation(); const navigate = useNavigate(); const openContextMenu = usePlayerStore(s => s.openContextMenu); const enqueue = usePlayerStore(s => s.enqueue); 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) : ''; const psyDrag = useDragDrop(); const handleClick = () => { if (selectionMode) { onToggleSelect?.(album.id); return; } navigate(`/album/${album.id}`); }; return (
{album.name}
{ if (album.artistId) { e.stopPropagation(); navigate(`/artist/${album.artistId}`); } }} >{album.artist}
{album.year &&{album.year}
} {showRating && (album.userRating ?? 0) > 0 && (