From e358a92cf46d7d99018f75722a83b3493cfc92ff Mon Sep 17 00:00:00 2001 From: Bryan Van Deusen Date: Sat, 6 Jun 2026 22:34:46 -0400 Subject: [PATCH] feat(web): similar-artists strip + top-tracks panel on artist detail --- web/src/lib/api/queries.ts | 18 +++++++++ web/src/routes/artists/[id]/+page.svelte | 43 +++++++++++++++++++++- web/src/routes/artists/[id]/artist.test.ts | 41 +++++++++++++++++++-- 3 files changed, 97 insertions(+), 5 deletions(-) diff --git a/web/src/lib/api/queries.ts b/web/src/lib/api/queries.ts index 50f9ad9e..71f444f4 100644 --- a/web/src/lib/api/queries.ts +++ b/web/src/lib/api/queries.ts @@ -56,6 +56,8 @@ export const qk = { home: () => ['home'] as const, albumsAlpha: () => ['albumsAlpha'] as const, artistTracks: (artistId: string) => ['artistTracks', artistId] as const, + similarArtists: (artistId: string) => ['similarArtists', artistId] as const, + artistTopTracks: (artistId: string) => ['artistTopTracks', artistId] as const, playlists: (kind?: 'user' | 'system' | 'all') => ['playlists', { kind: kind ?? 'user' }] as const, playlist: (id: string) => ['playlist', id] as const, @@ -88,6 +90,22 @@ export function createAlbumQuery(id: string) { }); } +export function createSimilarArtistsQuery(id: string) { + return createQuery({ + queryKey: qk.similarArtists(id), + queryFn: () => api.get(`/api/artists/${id}/similar`), + enabled: id.length > 0, + }); +} + +export function createArtistTopTracksQuery(id: string) { + return createQuery({ + queryKey: qk.artistTopTracks(id), + queryFn: () => api.get(`/api/artists/${id}/top-tracks`), + enabled: id.length > 0, + }); +} + export function createSearchQuery(q: string) { return createQuery({ queryKey: qk.search(q), diff --git a/web/src/routes/artists/[id]/+page.svelte b/web/src/routes/artists/[id]/+page.svelte index c79fe59e..3f829273 100644 --- a/web/src/routes/artists/[id]/+page.svelte +++ b/web/src/routes/artists/[id]/+page.svelte @@ -1,9 +1,16 @@