feat(label): migrate AlbumCard → AlbumCardLite

LabelView (2 callsites: New Releases + Critics' Picks horizontal
rows) and LabelReleasesView (2 callsites: grouped + flat grids)
swap to Discovery V2's AlbumCardLite. Same `makeArtistClickHandler`
pattern as SearchView so the per-album artist id closes correctly
into the zero-arg `onArtistClick`.

Critics' Picks block in LabelView didn't pass the download/
isAlbumFullyDownloaded set originally — kept that gap (it's a
read-only editorial section, no offline-cache UX expected).

Same prop drops as the other Profile B migrations: `size`,
`releaseDate` → parsed `releaseYear`, `onOpenContainingFolder`,
`downloadStateVersion`. Renames: `onAddAlbumToPlaylist` →
`onAddToPlaylist`, `onclick` → `onClick`.

cc
This commit is contained in:
vicrodh committed 2026-05-12 16:58:30 -06:00
1 parent 550d75bbf0
commit 79cee87038
2 files changed
+37 -36

No files matched your search

@@ -3,7 +3,7 @@
import { onMount } from 'svelte';
import { t } from 'svelte-i18n';
import { ArrowLeft, Search, X, Disc3, LoaderCircle, ArrowUpDown, Funnel, ChevronDown, Users } from 'lucide-svelte';
import AlbumCard from '../AlbumCard.svelte';
import AlbumCard from '$lib/discovery-v2/AlbumCardLite.svelte';
import type { QobuzAlbum, LabelDetail, LabelPageData } from '$lib/types';
import type { OfflineCacheStatus } from '$lib/stores/offlineCacheState';
@@ -234,6 +234,15 @@
await Promise.all(albumList.map(album => loadAlbumOfflineCacheStatus(album.id)));
}
/** AlbumCardLite's `onArtistClick: () => void` doesn't take args.
* This helper closes over the album's artist id so the right one
* is captured per iteration. Returns undefined when there's no
* artist id or no parent handler. */
function makeArtistClickHandler(artistId: number | undefined): (() => void) | undefined {
if (artistId === undefined || !onArtistClick) return undefined;
return () => onArtistClick(artistId);
}
function isAlbumDownloaded(albumId: string): boolean {
void downloadStateVersion;
return albumOfflineCacheStatuses.get(albumId) || false;
@@ -491,24 +500,20 @@
artwork={album.image?.small || album.image?.thumbnail || ''}
title={album.title}
artist={album.artist?.name || 'Unknown Artist'}
artistId={album.artist?.id}
onArtistClick={onArtistClick}
genre={getGenreLabel(album)}
releaseDate={album.release_date_original}
releaseYear={Number(album.release_date_original?.slice(0, 4)) || undefined}
quality={getQualityLabel(album)}
size="large"
onclick={() => onAlbumClick?.(album.id)}
isAlbumFullyDownloaded={isAlbumDownloaded(album.id)}
onArtistClick={makeArtistClickHandler(album.artist?.id)}
onClick={() => onAlbumClick?.(album.id)}
onPlay={onAlbumPlay ? () => onAlbumPlay(album.id) : undefined}
onPlayNext={onAlbumPlayNext ? () => onAlbumPlayNext(album.id) : undefined}
onPlayLater={onAlbumPlayLater ? () => onAlbumPlayLater(album.id) : undefined}
onAddAlbumToPlaylist={onAddAlbumToPlaylist ? () => onAddAlbumToPlaylist(album.id) : undefined}
onAddToPlaylist={onAddAlbumToPlaylist ? () => onAddAlbumToPlaylist(album.id) : undefined}
onShareQobuz={onAlbumShareQobuz ? () => onAlbumShareQobuz(album.id) : undefined}
onShareSonglink={onAlbumShareSonglink ? () => onAlbumShareSonglink(album.id) : undefined}
onDownload={onAlbumDownload ? () => onAlbumDownload(album.id) : undefined}
isAlbumFullyDownloaded={isAlbumDownloaded(album.id)}
onOpenContainingFolder={onOpenAlbumFolder ? () => onOpenAlbumFolder(album.id) : undefined}
onReDownloadAlbum={onReDownloadAlbum ? () => onReDownloadAlbum(album.id) : undefined}
{downloadStateVersion}
/>
{/each}
</div>
@@ -522,24 +527,20 @@
artwork={album.image?.small || album.image?.thumbnail || ''}
title={album.title}
artist={album.artist?.name || 'Unknown Artist'}
artistId={album.artist?.id}
onArtistClick={onArtistClick}
genre={getGenreLabel(album)}
releaseDate={album.release_date_original}
releaseYear={Number(album.release_date_original?.slice(0, 4)) || undefined}
quality={getQualityLabel(album)}
size="large"
onclick={() => onAlbumClick?.(album.id)}
isAlbumFullyDownloaded={isAlbumDownloaded(album.id)}
onArtistClick={makeArtistClickHandler(album.artist?.id)}
onClick={() => onAlbumClick?.(album.id)}
onPlay={onAlbumPlay ? () => onAlbumPlay(album.id) : undefined}
onPlayNext={onAlbumPlayNext ? () => onAlbumPlayNext(album.id) : undefined}
onPlayLater={onAlbumPlayLater ? () => onAlbumPlayLater(album.id) : undefined}
onAddAlbumToPlaylist={onAddAlbumToPlaylist ? () => onAddAlbumToPlaylist(album.id) : undefined}
onAddToPlaylist={onAddAlbumToPlaylist ? () => onAddAlbumToPlaylist(album.id) : undefined}
onShareQobuz={onAlbumShareQobuz ? () => onAlbumShareQobuz(album.id) : undefined}
onShareSonglink={onAlbumShareSonglink ? () => onAlbumShareSonglink(album.id) : undefined}
onDownload={onAlbumDownload ? () => onAlbumDownload(album.id) : undefined}
isAlbumFullyDownloaded={isAlbumDownloaded(album.id)}
onOpenContainingFolder={onOpenAlbumFolder ? () => onOpenAlbumFolder(album.id) : undefined}
onReDownloadAlbum={onReDownloadAlbum ? () => onReDownloadAlbum(album.id) : undefined}
{downloadStateVersion}
/>
{/each}
</div>
+17 -17
View File
@@ -8,7 +8,7 @@
import BulkActionBar from '../BulkActionBar.svelte';
import { openAddToMixtape } from '$lib/stores/addToMixtapeModalStore';
import { t } from '$lib/i18n';
import AlbumCard from '../AlbumCard.svelte';
import AlbumCard from '$lib/discovery-v2/AlbumCardLite.svelte';
import HorizontalScrollRow from '../HorizontalScrollRow.svelte';
import QobuzPlaylistCard from '../QobuzPlaylistCard.svelte';
import TrackMenu from '../TrackMenu.svelte';
@@ -699,6 +699,13 @@
await Promise.all(albumList.map(album => loadAlbumOfflineCacheStatus(album.id)));
}
/** Bind an album's artistId into a no-arg callback for
* AlbumCardLite's `onArtistClick: () => void`. */
function makeArtistClickHandler(artistId: number | undefined): (() => void) | undefined {
if (artistId === undefined || !onArtistClick) return undefined;
return () => onArtistClick(artistId);
}
function isAlbumDownloaded(albumId: string): boolean {
void downloadStateVersion;
return albumOfflineCacheStatuses.get(albumId) || false;
@@ -1164,22 +1171,18 @@
artwork={album.image?.small || album.image?.thumbnail || ''}
title={album.title}
artist={album.artist?.name || ''}
artistId={album.artist?.id}
onArtistClick={onArtistClick}
releaseDate={album.release_date_original}
size="large"
onclick={() => onAlbumClick?.(album.id)}
releaseYear={Number(album.release_date_original?.slice(0, 4)) || undefined}
isAlbumFullyDownloaded={isAlbumDownloaded(album.id)}
onArtistClick={makeArtistClickHandler(album.artist?.id)}
onClick={() => onAlbumClick?.(album.id)}
onPlay={onAlbumPlay ? () => onAlbumPlay(album.id) : undefined}
onPlayNext={onAlbumPlayNext ? () => onAlbumPlayNext(album.id) : undefined}
onPlayLater={onAlbumPlayLater ? () => onAlbumPlayLater(album.id) : undefined}
onAddAlbumToPlaylist={onAddAlbumToPlaylist ? () => onAddAlbumToPlaylist(album.id) : undefined}
onAddToPlaylist={onAddAlbumToPlaylist ? () => onAddAlbumToPlaylist(album.id) : undefined}
onShareQobuz={onAlbumShareQobuz ? () => onAlbumShareQobuz(album.id) : undefined}
onShareSonglink={onAlbumShareSonglink ? () => onAlbumShareSonglink(album.id) : undefined}
onDownload={onAlbumDownload ? () => onAlbumDownload(album.id) : undefined}
isAlbumFullyDownloaded={isAlbumDownloaded(album.id)}
onOpenContainingFolder={onOpenAlbumFolder ? () => onOpenAlbumFolder(album.id) : undefined}
onReDownloadAlbum={onReDownloadAlbum ? () => onReDownloadAlbum(album.id) : undefined}
{downloadStateVersion}
/>
{/each}
<div class="spacer"></div>
@@ -1199,18 +1202,15 @@
artwork={album.image?.small || album.image?.thumbnail || ''}
title={album.title}
artist={album.artist?.name || ''}
artistId={album.artist?.id}
onArtistClick={onArtistClick}
releaseDate={album.release_date_original}
size="large"
onclick={() => onAlbumClick?.(album.id)}
releaseYear={Number(album.release_date_original?.slice(0, 4)) || undefined}
onArtistClick={makeArtistClickHandler(album.artist?.id)}
onClick={() => onAlbumClick?.(album.id)}
onPlay={onAlbumPlay ? () => onAlbumPlay(album.id) : undefined}
onPlayNext={onAlbumPlayNext ? () => onAlbumPlayNext(album.id) : undefined}
onPlayLater={onAlbumPlayLater ? () => onAlbumPlayLater(album.id) : undefined}
onAddAlbumToPlaylist={onAddAlbumToPlaylist ? () => onAddAlbumToPlaylist(album.id) : undefined}
onAddToPlaylist={onAddAlbumToPlaylist ? () => onAddAlbumToPlaylist(album.id) : undefined}
onShareQobuz={onAlbumShareQobuz ? () => onAlbumShareQobuz(album.id) : undefined}
onShareSonglink={onAlbumShareSonglink ? () => onAlbumShareSonglink(album.id) : undefined}
{downloadStateVersion}
/>
{/each}
<div class="spacer"></div>