import React, { useMemo } from 'react'; import { SubsonicArtist, buildCoverArtUrl, coverArtCacheKey } from '../api/subsonic'; import { useNavigate } from 'react-router-dom'; import { Users } from 'lucide-react'; import CachedImage from './CachedImage'; interface Props { artist: SubsonicArtist; } export default function ArtistCardLocal({ artist }: Props) { const navigate = useNavigate(); const coverId = artist.coverArt || artist.id; // buildCoverArtUrl generates a new crypto salt on every call — must be // memoized to prevent a new URL on every parent re-render causing refetch loops. const coverSrc = useMemo(() => buildCoverArtUrl(coverId, 300), [coverId]); const coverCacheKey = useMemo(() => coverArtCacheKey(coverId, 300), [coverId]); return (
navigate(`/artist/${artist.id}`)}>
{coverId ? ( { e.currentTarget.style.display = 'none'; e.currentTarget.parentElement?.classList.add('fallback-visible'); }} /> ) : ( )}
{artist.name} {typeof artist.albumCount === 'number' && ( {artist.albumCount} {artist.albumCount === 1 ? 'Album' : 'Alben'} )}
); }