import { getAlbumsByGenre } from '../api/subsonicGenres'; import type { SubsonicAlbum } from '../api/subsonicTypes'; import React, { useEffect, useState, useCallback } from 'react'; import { useParams, useNavigate } from 'react-router-dom'; import { useTranslation } from 'react-i18next'; import { ArrowLeft, Disc3 } from 'lucide-react'; import { useAuthStore } from '../store/authStore'; import AlbumCard from '../components/AlbumCard'; import { usePerfProbeFlags } from '../utils/perf/perfFlags'; import { VirtualCardGrid } from '../components/VirtualCardGrid'; const PAGE_SIZE = 50; export default function GenreDetail() { const { name } = useParams<{ name: string }>(); const genre = decodeURIComponent(name ?? ''); const { t } = useTranslation(); const perfFlags = usePerfProbeFlags(); const navigate = useNavigate(); const [albums, setAlbums] = useState([]); const [loading, setLoading] = useState(true); const [loadingMore, setLoadingMore] = useState(false); const [hasMore, setHasMore] = useState(true); const [offset, setOffset] = useState(0); const musicLibraryFilterVersion = useAuthStore(s => s.musicLibraryFilterVersion); useEffect(() => { setAlbums([]); setOffset(0); setHasMore(true); setLoading(true); getAlbumsByGenre(genre, PAGE_SIZE, 0) .then(data => { setAlbums(data); setHasMore(data.length === PAGE_SIZE); setOffset(PAGE_SIZE); }) .finally(() => setLoading(false)); }, [genre]); const loadMore = useCallback(() => { if (loadingMore || !hasMore) return; setLoadingMore(true); getAlbumsByGenre(genre, PAGE_SIZE, offset) .then(data => { setAlbums(prev => [...prev, ...data]); setHasMore(data.length === PAGE_SIZE); setOffset(prev => prev + PAGE_SIZE); }) .finally(() => setLoadingMore(false)); }, [genre, offset, loadingMore, hasMore]); return (

{genre}

{!loading && albums.length > 0 && ( {t('genres.albumCount', { count: albums.length })}{hasMore ? '+' : ''} )}
{loading &&

{t('genres.albumsLoading')}

} {!loading && albums.length === 0 &&

{t('genres.albumsEmpty')}

} {albums.length > 0 && ( a.id} rowVariant="album" disableVirtualization={perfFlags.disableMainstageVirtualLists} layoutSignal={albums.length} renderItem={album => } /> )} {hasMore && !loading && (
)}
); }