import React, { useEffect, useState, useRef, useCallback, useMemo } from 'react'; import { useNavigate } from 'react-router-dom'; import { Play, ListPlus } from 'lucide-react'; import { getRandomAlbums, SubsonicAlbum, buildCoverArtUrl, coverArtCacheKey, getAlbum } from '../api/subsonic'; import CachedImage, { useCachedUrl } from './CachedImage'; import { usePlayerStore, songToTrack } from '../store/playerStore'; import { useTranslation } from 'react-i18next'; import { playAlbum } from '../utils/playAlbum'; import { useIsMobile } from '../hooks/useIsMobile'; import { useAuthStore } from '../store/authStore'; const INTERVAL_MS = 10000; // Crossfading background — same layer pattern as FullscreenPlayer function HeroBg({ url }: { url: string }) { const [layers, setLayers] = useState>(() => url ? [{ url, id: 0, visible: true }] : [] ); const counter = useRef(1); useEffect(() => { if (!url) return; const id = counter.current++; setLayers(prev => [...prev, { url, id, visible: false }]); const t1 = setTimeout(() => setLayers(prev => prev.map(l => ({ ...l, visible: l.id === id }))), 20); const t2 = setTimeout(() => setLayers(prev => prev.filter(l => l.id === id)), 900); return () => { clearTimeout(t1); clearTimeout(t2); }; }, [url]); return ( <> {layers.map(layer => (