decouple AlbumArtistInfo from AlbumArtistDetail (#1809)

This commit is contained in:
jeffvli
2026-03-08 22:06:18 -07:00
parent 7dbf8dd9fe
commit 17deac8d65
14 changed files with 386 additions and 156 deletions
@@ -6,6 +6,7 @@ import {
Album,
AlbumArtist,
AlbumArtistDetailResponse,
AlbumArtistInfoResponse,
AlbumArtistListResponse,
AlbumDetailResponse,
AlbumListResponse,
@@ -240,29 +241,44 @@ export const applyFavoriteOptimisticUpdates = (
return { ...prev, userFavorite: isFavorite };
}
if (prev.similarArtists && prev.similarArtists.length > 0) {
const hasMatchingSimilarArtist = prev.similarArtists.some(
(artist) => itemIdSet.has(artist.id),
);
if (hasMatchingSimilarArtist) {
return {
...prev,
similarArtists: prev.similarArtists.map((artist) =>
itemIdSet.has(artist.id)
? { ...artist, userFavorite: isFavorite }
: artist,
),
};
}
}
return prev;
},
});
}
});
const infoQueryKey = queryKeys.albumArtists.info(variables.apiClientProps.serverId);
const infoQueries = queryClient.getQueriesData({
exact: false,
queryKey: infoQueryKey,
});
infoQueries.forEach(([queryKey, data]) => {
if (data) {
pendingUpdates.push({
previousData: data,
queryKey,
updater: (prev: AlbumArtistInfoResponse | null | undefined) => {
if (!prev?.similarArtists?.length) return prev;
const hasMatching = prev.similarArtists.some((artist) =>
itemIdSet.has(artist.id),
);
if (!hasMatching) return prev;
return {
...prev,
similarArtists: prev.similarArtists.map((artist) =>
itemIdSet.has(artist.id)
? { ...artist, userFavorite: isFavorite }
: artist,
),
};
},
});
}
});
const listQueryKey = queryKeys.albumArtists.list(variables.apiClientProps.serverId);
const listQueries = queryClient.getQueriesData({
exact: false,
@@ -654,6 +670,10 @@ export const applyFavoriteOptimisticUpdatesDeferred = (
queryKeys.albumArtists.detail(variables.apiClientProps.serverId),
'album-artist-detail',
);
collectQueries(
queryKeys.albumArtists.info(variables.apiClientProps.serverId),
'album-artist-info',
);
collectQueries(
queryKeys.albumArtists.list(variables.apiClientProps.serverId),
'album-artist-list',
@@ -7,6 +7,7 @@ import {
Album,
AlbumArtist,
AlbumArtistDetailResponse,
AlbumArtistInfoResponse,
AlbumArtistListResponse,
AlbumDetailResponse,
AlbumListResponse,
@@ -235,29 +236,44 @@ export const applyRatingOptimisticUpdates = (
return { ...prev, userRating: rating };
}
if (prev.similarArtists && prev.similarArtists.length > 0) {
const hasMatchingSimilarArtist = prev.similarArtists.some(
(artist) => itemIdSet.has(artist.id),
);
if (hasMatchingSimilarArtist) {
return {
...prev,
similarArtists: prev.similarArtists.map((artist) =>
itemIdSet.has(artist.id)
? { ...artist, userRating: rating }
: artist,
),
};
}
}
return prev;
},
});
}
});
const infoQueryKey = queryKeys.albumArtists.info(variables.apiClientProps.serverId);
const infoQueries = queryClient.getQueriesData({
exact: false,
queryKey: infoQueryKey,
});
infoQueries.forEach(([queryKey, data]) => {
if (data) {
pendingUpdates.push({
previousData: data,
queryKey,
updater: (prev: AlbumArtistInfoResponse | null | undefined) => {
if (!prev?.similarArtists?.length) return prev;
const hasMatching = prev.similarArtists.some((artist) =>
itemIdSet.has(artist.id),
);
if (!hasMatching) return prev;
return {
...prev,
similarArtists: prev.similarArtists.map((artist) =>
itemIdSet.has(artist.id)
? { ...artist, userRating: rating }
: artist,
),
};
},
});
}
});
const listQueryKey = queryKeys.albumArtists.list(variables.apiClientProps.serverId);
const listQueries = queryClient.getQueriesData({
exact: false,
@@ -626,6 +642,10 @@ export const applyRatingOptimisticUpdatesDeferred = (
queryKeys.albumArtists.detail(variables.apiClientProps.serverId),
'album-artist-detail',
);
collectQueries(
queryKeys.albumArtists.info(variables.apiClientProps.serverId),
'album-artist-info',
);
collectQueries(
queryKeys.albumArtists.list(variables.apiClientProps.serverId),
'album-artist-list',
@@ -695,19 +715,6 @@ export const applyRatingOptimisticUpdatesDeferred = (
if (itemIdSet.has(prev.id)) {
return { ...prev, userRating: rating };
}
if (prev.similarArtists) {
const hasMatch = prev.similarArtists.some((a: any) =>
itemIdSet.has(a.id),
);
if (hasMatch) {
return {
...prev,
similarArtists: prev.similarArtists.map((a: any) =>
itemIdSet.has(a.id) ? { ...a, userRating: rating } : a,
),
};
}
}
return prev;
}
case 'album-artist-infinite-list':
@@ -732,6 +739,17 @@ export const applyRatingOptimisticUpdatesDeferred = (
}
return prev;
}
case 'album-artist-info': {
if (!prev?.similarArtists?.length) return prev;
const hasMatch = prev.similarArtists.some((a: any) => itemIdSet.has(a.id));
if (!hasMatch) return prev;
return {
...prev,
similarArtists: prev.similarArtists.map((a: any) =>
itemIdSet.has(a.id) ? { ...a, userRating: rating } : a,
),
};
}
case 'album-artist-list':
case 'album-list':
case 'artist-list':