diff --git a/src/renderer/features/artists/components/album-artist-detail-content.tsx b/src/renderer/features/artists/components/album-artist-detail-content.tsx index 606f5ae11..427ab0b98 100644 --- a/src/renderer/features/artists/components/album-artist-detail-content.tsx +++ b/src/renderer/features/artists/components/album-artist-detail-content.tsx @@ -225,6 +225,39 @@ const AlbumArtistMetadataBiography = ({ ); }; +const TABLE_ROW_HEIGHT = { + compact: 40, + default: 64, + large: 88, +} as const; + +const TABLE_HEADER_HEIGHT = 40; + +interface SongTableListContainerProps { + children: React.ReactNode; + enableHeader?: boolean; + itemCount: number; + maxRows?: number; + tableSize?: 'compact' | 'default' | 'large'; +} + +function getTableRowHeight(size: 'compact' | 'default' | 'large' | undefined): number { + return size ? TABLE_ROW_HEIGHT[size] : TABLE_ROW_HEIGHT.default; +} + +const SongTableListContainer = ({ + children, + enableHeader = true, + itemCount, + maxRows = 5, + tableSize = 'default', +}: SongTableListContainerProps) => { + const rowHeight = getTableRowHeight(tableSize); + const headerOffset = enableHeader ? TABLE_HEADER_HEIGHT : 0; + const height = headerOffset + rowHeight * Math.min(itemCount, maxRows); + return
{children}
; +}; + interface AlbumArtistMetadataTopSongsProps { detailQuery: ReturnType>; routeId: string; @@ -237,7 +270,6 @@ const AlbumArtistMetadataTopSongsContent = ({ const { t } = useTranslation(); const [searchTerm, setSearchTerm] = useState(''); const [debouncedSearchTerm] = useDebouncedValue(searchTerm, 300); - const [showAll, setShowAll] = useState(false); const [topSongsQueryType, setTopSongsQueryType] = useLocalStorage<'community' | 'personal'>({ defaultValue: 'community', key: 'album-artist-top-songs-query-type', @@ -269,13 +301,8 @@ const AlbumArtistMetadataTopSongsContent = ({ }, [tableConfig?.columns]); const filteredSongs = useMemo(() => { - const filtered = searchLibraryItems(songs, debouncedSearchTerm, LibraryItem.SONG); - // When searching, show all results. Otherwise, limit to 5 if not showing all - if (debouncedSearchTerm?.trim() || showAll) { - return filtered; - } - return filtered.slice(0, 5); - }, [songs, debouncedSearchTerm, showAll]); + return searchLibraryItems(songs, debouncedSearchTerm, LibraryItem.SONG); + }, [songs, debouncedSearchTerm]); const { handleColumnReordered } = useItemListColumnReorder({ itemListKey: ItemListKey.SONG, @@ -459,35 +486,35 @@ const AlbumArtistMetadataTopSongsContent = ({ tableColumnsData={SONG_TABLE_COLUMNS} /> - - {!searchTerm.trim() && songs.length > 5 && !showAll && ( - - - - )} + itemCount={filteredSongs.length} + maxRows={5} + tableSize={tableConfig.size} + > + + ) : null} @@ -523,7 +550,6 @@ const AlbumArtistMetadataFavoriteSongs = ({ routeId }: AlbumArtistMetadataFavori const { t } = useTranslation(); const [searchTerm, setSearchTerm] = useState(''); const [debouncedSearchTerm] = useDebouncedValue(searchTerm, 300); - const [showAll, setShowAll] = useState(false); const tableConfig = useSettingsStore((state) => state.lists[ItemListKey.SONG]?.table); const currentSong = usePlayerSong(); const player = usePlayer(); @@ -548,13 +574,8 @@ const AlbumArtistMetadataFavoriteSongs = ({ routeId }: AlbumArtistMetadataFavori }, [tableConfig?.columns]); const filteredSongs = useMemo(() => { - const filtered = searchLibraryItems(songs, debouncedSearchTerm, LibraryItem.SONG); - // When searching, show all results. Otherwise, limit to 5 if not showing all - if (debouncedSearchTerm?.trim() || showAll) { - return filtered; - } - return filtered.slice(0, 5); - }, [songs, debouncedSearchTerm, showAll]); + return searchLibraryItems(songs, debouncedSearchTerm, LibraryItem.SONG); + }, [songs, debouncedSearchTerm]); const { handleColumnReordered } = useItemListColumnReorder({ itemListKey: ItemListKey.SONG, @@ -717,8 +738,12 @@ const AlbumArtistMetadataFavoriteSongs = ({ routeId }: AlbumArtistMetadataFavori tableColumnsData={SONG_TABLE_COLUMNS} /> - {/* Restrict the height. Rendering all items in the DOM makes for a long delay */} -
+ -
- - {!searchTerm.trim() && songs.length > 5 && !showAll && ( - - - - )} + ) : null}