fix(library): empty-state on Mainstage, Albums, New Releases, Random Albums (#750)

* fix(library): show empty-state on Mainstage, Albums, New Releases, Random Albums

When the active library has no albums, Mainstage and the three album-list
pages rendered a fully blank page — every rail and grid was empty but
nothing told the user why. Add a shared `common.libraryEmpty` message
(all 9 locales) and render it in place of the empty grid:

* Home: when no rail has any albums after loading.
* Albums: when no albums and no filter (genre/year/starred/comp) is
  active — filtered "no matches" is a separate state and stays as-is.
* New Releases: when no albums and no genre filter is active.
* Random Albums: when no albums after loading.

Pages that already had a dedicated empty-state (Artists, Genres,
Composers, Playlists, Favorites, MostPlayed, LosslessAlbums,
LabelAlbums, InternetRadio) are left alone — their wording is
intentional and per-page.

* docs(changelog): note empty-library states on Mainstage / album lists (#750)
This commit is contained in:
Frank Stellmacher
2026-05-17 14:10:36 +02:00
committed by GitHub
parent 9609da6bc2
commit 5856bdbf1a
14 changed files with 41 additions and 0 deletions
+14
View File
@@ -183,6 +183,16 @@ export default function Home() {
const homeLiteArtworkFx = perfFlags.disableHomeArtworkFx;
const homeFlatArtworkClip = perfFlags.disableHomeArtworkClip;
// Treat the library as empty when every album endpoint returned zero. The
// song/artist rails can be empty for non-empty libraries (rare server quirks),
// so they don't count toward this signal.
const libraryEmpty =
!loading &&
recent.length === 0 &&
random.length === 0 &&
mostPlayed.length === 0 &&
recentlyPlayed.length === 0 &&
starred.length === 0;
return (
<div className={`animate-fade-in${homeLiteArtworkFx ? ' home-lite-artwork' : ''}${homeFlatArtworkClip ? ' home-flat-artwork-clip' : ''}`}>
{!perfFlags.disableMainstageHero && isVisible('hero') && <Hero albums={heroAlbums} />}
@@ -192,6 +202,10 @@ export default function Home() {
<div style={{ display: 'flex', justifyContent: 'center', padding: '4rem' }}>
<div className="spinner" />
</div>
) : libraryEmpty ? (
<div className="empty-state" style={{ padding: '4rem 1rem', textAlign: 'center' }}>
{t('common.libraryEmpty')}
</div>
) : (
<>
{!homeAlbumRowsDisabled && isVisible('recent') && (