From 8efb32407d02566578274b19595277d130768bf4 Mon Sep 17 00:00:00 2001 From: jeffvli Date: Mon, 9 Feb 2026 15:28:33 -0800 Subject: [PATCH] add optimistic update for favorite/rating in song list queries --- .../mutations/favorite-optimistic-updates.ts | 27 +++++++++++++++++++ .../mutations/rating-optimistic-updates.ts | 24 +++++++++++++++++ 2 files changed, 51 insertions(+) diff --git a/src/renderer/features/shared/mutations/favorite-optimistic-updates.ts b/src/renderer/features/shared/mutations/favorite-optimistic-updates.ts index b416c3e39..64238ae7b 100644 --- a/src/renderer/features/shared/mutations/favorite-optimistic-updates.ts +++ b/src/renderer/features/shared/mutations/favorite-optimistic-updates.ts @@ -520,6 +520,28 @@ export const applyFavoriteOptimisticUpdates = ( } }); + const songListQueryKey = queryKeys.songs.list(variables.apiClientProps.serverId); + const songListQueries = queryClient.getQueriesData({ + exact: false, + queryKey: songListQueryKey, + }); + + songListQueries.forEach(([queryKey, data]) => { + if (data) { + pendingUpdates.push({ + previousData: data, + queryKey, + updater: (prev: { items: Song[] } | undefined) => { + if (!prev) return prev; + const updatedItems = updateItemInArray(prev.items, itemIdSet, (item) => + createFavoriteUpdater(item), + ); + return updatedItems ? { ...prev, items: updatedItems } : prev; + }, + }); + } + }); + const topSongsQueryKey = queryKeys.albumArtists.topSongs( variables.apiClientProps.serverId, ); @@ -679,6 +701,10 @@ export const applyFavoriteOptimisticUpdatesDeferred = ( queryKeys.playlists.songList(variables.apiClientProps.serverId), 'playlist-song-list', ); + collectQueries( + queryKeys.songs.list(variables.apiClientProps.serverId), + 'song-list', + ); collectQueries( queryKeys.albumArtists.topSongs(variables.apiClientProps.serverId), 'top-songs', @@ -742,6 +768,7 @@ export const applyFavoriteOptimisticUpdatesDeferred = ( case 'album-list': case 'artist-list': case 'playlist-song-list': + case 'song-list': case 'top-songs': { const updatedItems = updateItemInArray( prev.items || [], diff --git a/src/renderer/features/shared/mutations/rating-optimistic-updates.ts b/src/renderer/features/shared/mutations/rating-optimistic-updates.ts index 83b92ccf9..22c404462 100644 --- a/src/renderer/features/shared/mutations/rating-optimistic-updates.ts +++ b/src/renderer/features/shared/mutations/rating-optimistic-updates.ts @@ -519,6 +519,28 @@ export const applyRatingOptimisticUpdates = ( } }); + const songListQueryKey = queryKeys.songs.list(variables.apiClientProps.serverId); + const songListQueries = queryClient.getQueriesData({ + exact: false, + queryKey: songListQueryKey, + }); + + songListQueries.forEach(([queryKey, data]) => { + if (data) { + pendingUpdates.push({ + previousData: data, + queryKey, + updater: (prev: undefined | { items: Song[] }) => { + if (!prev) return prev; + const updatedItems = updateItemInArray(prev.items, itemIdSet, (item) => + createRatingUpdater(item), + ); + return updatedItems ? { ...prev, items: updatedItems } : prev; + }, + }); + } + }); + const topSongsQueryKey = queryKeys.albumArtists.topSongs( variables.apiClientProps.serverId, ); @@ -652,6 +674,7 @@ export const applyRatingOptimisticUpdatesDeferred = ( queryKeys.songs.detail(variables.apiClientProps.serverId), 'song-detail', ); + collectQueries(queryKeys.songs.list(variables.apiClientProps.serverId), 'song-list'); collectQueries( queryKeys.albumArtists.topSongs(variables.apiClientProps.serverId), 'top-songs', @@ -712,6 +735,7 @@ export const applyRatingOptimisticUpdatesDeferred = ( case 'album-artist-list': case 'album-list': case 'artist-list': + case 'song-list': case 'top-songs': { const updatedItems = updateItemInArray( prev.items || [],