import React, { useEffect, useState } from 'react'; import Hero from '../components/Hero'; import AlbumRow from '../components/AlbumRow'; import { getAlbumList, getArtists, SubsonicAlbum, SubsonicArtist } from '../api/subsonic'; import { useTranslation } from 'react-i18next'; import { useNavigate } from 'react-router-dom'; export default function Home() { const [starred, setStarred] = useState([]); const [recent, setRecent] = useState([]); const [random, setRandom] = useState([]); const [heroAlbums, setHeroAlbums] = useState([]); const [mostPlayed, setMostPlayed] = useState([]); const [randomArtists, setRandomArtists] = useState([]); const [loading, setLoading] = useState(true); useEffect(() => { Promise.all([ getAlbumList('starred', 12).catch(() => []), getAlbumList('newest', 12).catch(() => []), getAlbumList('random', 20).catch(() => []), getAlbumList('frequent', 12).catch(() => []), getArtists().catch(() => []), ]).then(([s, n, r, f, artists]) => { setStarred(s); setRecent(n); setHeroAlbums(r.slice(0, 8)); setRandom(r.slice(8)); setMostPlayed(f); // Pick 16 random artists via Fisher-Yates shuffle const shuffled = [...artists]; for (let i = shuffled.length - 1; i > 0; i--) { const j = Math.floor(Math.random() * (i + 1)); [shuffled[i], shuffled[j]] = [shuffled[j], shuffled[i]]; } setRandomArtists(shuffled.slice(0, 16)); setLoading(false); }).catch(() => setLoading(false)); }, []); const loadMore = async ( type: 'starred' | 'newest' | 'random' | 'frequent', currentList: SubsonicAlbum[], setter: React.Dispatch> ) => { try { const more = await getAlbumList(type, 12, currentList.length); const newItems = more.filter(m => !currentList.find(c => c.id === m.id)); if (newItems.length > 0) setter(prev => [...prev, ...newItems]); } catch (e) { console.error('Failed to load more', e); } }; const { t } = useTranslation(); const navigate = useNavigate(); return (
{loading ? (
) : ( <> loadMore('newest', recent, setRecent)} moreText={t('home.loadMore')} /> loadMore('random', random, setRandom)} moreText={t('home.discoverMore')} /> {randomArtists.length > 0 && (

{t('home.discoverArtists')}

{randomArtists.map(a => ( ))}
)} {starred.length > 0 && ( loadMore('starred', starred, setStarred)} moreText={t('home.loadMore')} /> )} loadMore('frequent', mostPlayed, setMostPlayed)} moreText={t('home.loadMore')} /> )}
); }