From c099e01fb70b95412661a98e7669aceda8b2aa87 Mon Sep 17 00:00:00 2001 From: schroda <50052685+schroda@users.noreply.github.com> Date: Fri, 16 Feb 2024 19:38:13 +0100 Subject: [PATCH] Add manga fetch timestamp to thumbnail url (#598) In case the fetch timestamp of a manga changed, it's possible that the thumbnail has changed as well, thus, the currently cached image should be ignored --- src/components/MangaCard.tsx | 14 +++----------- src/components/manga/MangaDetails.tsx | 5 ++--- src/lib/data/Mangas.ts | 6 ++++++ src/lib/requests/RequestManager.ts | 4 ---- src/screens/Updates.tsx | 3 ++- 5 files changed, 13 insertions(+), 19 deletions(-) diff --git a/src/components/MangaCard.tsx b/src/components/MangaCard.tsx index 41b3305c..0d6ad583 100644 --- a/src/components/MangaCard.tsx +++ b/src/components/MangaCard.tsx @@ -24,6 +24,7 @@ import { MangaOptionButton } from '@/components/manga/MangaOptionButton.tsx'; import { MangaActionMenuItems, SingleModeProps } from '@/components/manga/MangaActionMenuItems.tsx'; import { Menu } from '@/components/menu/Menu.tsx'; import { MigrateDialog } from '@/components/MigrateDialog.tsx'; +import { Mangas } from '@/lib/data/Mangas.ts'; const BottomGradient = styled('div')({ position: 'absolute', @@ -96,17 +97,8 @@ export const MangaCard = (props: MangaCardProps) => { const { t } = useTranslation(); const { manga, gridLayout, inLibraryIndicator, selected, handleSelection, mode = 'default' } = props; - const { - id, - title, - thumbnailUrl: tmpThumbnailUrl, - downloadCount, - unreadCount: unread, - inLibrary, - latestReadChapter, - chapters, - } = manga; - const thumbnailUrl = tmpThumbnailUrl ?? 'nonExistingMangaUrl'; + const { id, title, downloadCount, unreadCount: unread, inLibrary, latestReadChapter, chapters } = manga; + const thumbnailUrl = Mangas.getThumbnailUrl(manga); const { options: { showContinueReadingButton, showUnreadBadge, showDownloadBadge }, } = useLibraryOptionsContext(); diff --git a/src/components/manga/MangaDetails.tsx b/src/components/manga/MangaDetails.tsx index 76793f0d..89443337 100644 --- a/src/components/manga/MangaDetails.tsx +++ b/src/components/manga/MangaDetails.tsx @@ -19,6 +19,7 @@ import { requestManager } from '@/lib/requests/RequestManager.ts'; import { makeToast } from '@/components/util/Toast'; import { useMetadataServerSettings } from '@/util/metadataServerSettings.ts'; import { CategorySelect } from '@/components/navbar/action/CategorySelect.tsx'; +import { Mangas } from '@/lib/data/Mangas.ts'; const DetailsWrapper = styled('div')(({ theme }) => ({ width: '100%', @@ -215,9 +216,7 @@ export const MangaDetails: React.FC = ({ manga }) => { - {manga.thumbnailUrl && ( - Manga Thumbnail - )} + {manga.thumbnailUrl && Manga Thumbnail}

{manga.title}

diff --git a/src/lib/data/Mangas.ts b/src/lib/data/Mangas.ts index 92ccdaa9..fea0dcd1 100644 --- a/src/lib/data/Mangas.ts +++ b/src/lib/data/Mangas.ts @@ -99,6 +99,8 @@ export const actionToTranslationKey: { export type MangaChapterCountInfo = { chapters: Pick }; export type MangaDownloadInfo = Pick & MangaChapterCountInfo; export type MangaUnreadInfo = Pick & MangaChapterCountInfo; +export type MangaLastFetchedInfo = Pick; +export type MangaThumbnailInfo = Pick; export type MigrateMode = 'copy' | 'migrate'; @@ -171,6 +173,10 @@ export class Mangas { return mangas.filter(Mangas.isPartiallyRead); } + static getThumbnailUrl(manga: MangaLastFetchedInfo & Partial): string { + return manga.thumbnailUrl ? `${manga.thumbnailUrl}?fetchedAt=${manga.lastFetchedAt}` : 'nonExistingMangaUrl'; + } + static async getChapterIdsWithState( mangaIds: number[], state: Pick, diff --git a/src/lib/requests/RequestManager.ts b/src/lib/requests/RequestManager.ts index f4400a87..35825a5f 100644 --- a/src/lib/requests/RequestManager.ts +++ b/src/lib/requests/RequestManager.ts @@ -1499,10 +1499,6 @@ export class RequestManager { return this.doRequest(GQLMethod.USE_QUERY, GET_MIGRATABLE_SOURCE_MANGAS, { sourceId }, options); } - public getMangaThumbnailUrl(mangaId: number): string { - return this.getValidImgUrlFor(`manga/${mangaId}/thumbnail`); - } - public useUpdateMangaCategories( options?: MutationHookOptions, ): AbortableApolloUseMutationResponse { diff --git a/src/screens/Updates.tsx b/src/screens/Updates.tsx index c26d3c85..4f4544cd 100644 --- a/src/screens/Updates.tsx +++ b/src/screens/Updates.tsx @@ -28,6 +28,7 @@ import { UpdateChecker } from '@/components/library/UpdateChecker.tsx'; import { StyledGroupedVirtuoso } from '@/components/virtuoso/StyledGroupedVirtuoso.tsx'; import { StyledGroupHeader } from '@/components/virtuoso/StyledGroupHeader.tsx'; import { StyledGroupItemWrapper } from '@/components/virtuoso/StyledGroupItemWrapper.tsx'; +import { Mangas } from '@/lib/data/Mangas.ts'; function epochToDate(epoch: number) { const date = new Date(0); // The 0 there is the key, which sets the date to the epoch @@ -200,7 +201,7 @@ export const Updates: React.FC = () => { marginRight: 2, imageRendering: 'pixelated', }} - src={requestManager.getValidImgUrlFor(manga.thumbnailUrl ?? '')} + src={Mangas.getThumbnailUrl(manga)} />