From 6e4cd6912bba9fadb6763f009aaf7f2bd1ef3a32 Mon Sep 17 00:00:00 2001 From: Kendall Garner <17521368+kgarner7@users.noreply.github.com> Date: Sat, 24 Jan 2026 14:54:29 -0800 Subject: [PATCH] enable refresh for all home carousels, and fix favorite/rating on home --- .../features/home/routes/home-route.tsx | 8 +++-- .../mutations/favorite-optimistic-updates.ts | 35 ++++++++++++++++++- .../mutations/rating-optimistic-updates.ts | 7 +++- 3 files changed, 46 insertions(+), 4 deletions(-) diff --git a/src/renderer/features/home/routes/home-route.tsx b/src/renderer/features/home/routes/home-route.tsx index ae51b4763..6f83d303f 100644 --- a/src/renderer/features/home/routes/home-route.tsx +++ b/src/renderer/features/home/routes/home-route.tsx @@ -46,6 +46,7 @@ const HomeRoute = () => { const carousels = { [HomeItem.MOST_PLAYED]: { + enableRefresh: true, itemType: isJellyfin ? LibraryItem.SONG : LibraryItem.ALBUM, sortBy: isJellyfin ? SongListSort.PLAY_COUNT : AlbumListSort.PLAY_COUNT, sortOrder: SortOrder.DESC, @@ -59,18 +60,21 @@ const HomeRoute = () => { title: t('page.home.explore', { postProcess: 'sentenceCase' }), }, [HomeItem.RECENTLY_ADDED]: { + enableRefresh: true, itemType: LibraryItem.ALBUM, sortBy: AlbumListSort.RECENTLY_ADDED, sortOrder: SortOrder.DESC, title: t('page.home.newlyAdded', { postProcess: 'sentenceCase' }), }, [HomeItem.RECENTLY_PLAYED]: { + enableRefresh: true, itemType: isJellyfin ? LibraryItem.SONG : LibraryItem.ALBUM, sortBy: isJellyfin ? SongListSort.RECENTLY_PLAYED : AlbumListSort.RECENTLY_PLAYED, sortOrder: SortOrder.DESC, title: t('page.home.recentlyPlayed', { postProcess: 'sentenceCase' }), }, [HomeItem.RECENTLY_RELEASED]: { + enableRefresh: true, itemType: LibraryItem.ALBUM, sortBy: AlbumListSort.RELEASE_DATE, sortOrder: SortOrder.DESC, @@ -142,7 +146,7 @@ const HomeRoute = () => { containerQuery={containerQuery} enableRefresh={carousel.enableRefresh} key={`carousel-${carousel.uniqueId}`} - queryKey={['home', carousel.uniqueId] as const} + queryKey={['home', 'album', carousel.uniqueId] as const} rowCount={1} sortBy={carousel.sortBy as AlbumListSort} sortOrder={carousel.sortOrder} @@ -157,7 +161,7 @@ const HomeRoute = () => { containerQuery={containerQuery} enableRefresh={carousel.enableRefresh} key={`carousel-${carousel.uniqueId}`} - queryKey={['home', carousel.uniqueId] as const} + queryKey={['home', 'song', carousel.uniqueId] as const} rowCount={1} sortBy={carousel.sortBy as SongListSort} sortOrder={carousel.sortOrder} diff --git a/src/renderer/features/shared/mutations/favorite-optimistic-updates.ts b/src/renderer/features/shared/mutations/favorite-optimistic-updates.ts index 8f4e031b1..b416c3e39 100644 --- a/src/renderer/features/shared/mutations/favorite-optimistic-updates.ts +++ b/src/renderer/features/shared/mutations/favorite-optimistic-updates.ts @@ -15,6 +15,7 @@ import { PlaylistSongListResponse, Song, SongDetailResponse, + SongListResponse, TopSongListResponse, } from '/@/shared/types/domain-types'; @@ -155,7 +156,12 @@ export const applyFavoriteOptimisticUpdates = ( queryKey: infiniteListQueryKey, }); - infiniteListQueries.forEach(([queryKey, data]) => { + const homeQueries = queryClient.getQueriesData({ + exact: false, + queryKey: ['home', 'album'], + }); + + infiniteListQueries.concat(homeQueries).forEach(([queryKey, data]) => { if (data) { pendingUpdates.push({ previousData: data, @@ -538,6 +544,33 @@ export const applyFavoriteOptimisticUpdates = ( } }); + const homeQueries = queryClient.getQueriesData({ + exact: false, + queryKey: ['home', 'song'], + }); + + homeQueries.concat(homeQueries).forEach(([queryKey, data]) => { + if (data) { + pendingUpdates.push({ + previousData: data, + queryKey, + updater: ( + current: + | undefined + | { pageParams: string[]; pages: SongListResponse[] }, + ) => { + if (!current) return current; + const updatedPages = updateItemsInPages( + current.pages.filter((p): p is SongListResponse => !!p), + itemIdSet, + (item) => createFavoriteUpdater(item), + ); + return updatedPages ? { ...current, pages: updatedPages } : current; + }, + }); + } + }); + break; } } diff --git a/src/renderer/features/shared/mutations/rating-optimistic-updates.ts b/src/renderer/features/shared/mutations/rating-optimistic-updates.ts index 22e895822..0a536c052 100644 --- a/src/renderer/features/shared/mutations/rating-optimistic-updates.ts +++ b/src/renderer/features/shared/mutations/rating-optimistic-updates.ts @@ -149,7 +149,12 @@ export const applyRatingOptimisticUpdates = ( queryKey: infiniteListQueryKey, }); - infiniteListQueries.forEach(([queryKey, data]) => { + const homeQueries = queryClient.getQueriesData({ + exact: false, + queryKey: ['home', 'album'], + }); + + infiniteListQueries.concat(homeQueries).forEach(([queryKey, data]) => { if (data) { pendingUpdates.push({ previousData: data,