From 527b95521e37ba1458ee05716a6a9dea3ebfb4e4 Mon Sep 17 00:00:00 2001 From: Huang Xin Date: Fri, 18 Jul 2025 12:03:22 +0800 Subject: [PATCH] fix: replace fallback book cover with new cover image (#1604) --- apps/readest-app/src/components/BookCover.tsx | 37 +++++++++++++------ 1 file changed, 26 insertions(+), 11 deletions(-) diff --git a/apps/readest-app/src/components/BookCover.tsx b/apps/readest-app/src/components/BookCover.tsx index 5f0713fe..7f34dbed 100644 --- a/apps/readest-app/src/components/BookCover.tsx +++ b/apps/readest-app/src/components/BookCover.tsx @@ -1,5 +1,6 @@ import clsx from 'clsx'; import Image from 'next/image'; +import { useEffect, useRef } from 'react'; import { Book } from '@/types/book'; import { LibraryCoverFitType, LibraryViewModeType } from '@/types/settings'; import { formatAuthors, formatTitle } from '@/utils/book'; @@ -21,26 +22,40 @@ const BookCover: React.FC = ({ imageClassName, isPreview, }) => { - const handleImageError = (e: React.SyntheticEvent) => { - const img = e.target as HTMLImageElement; - img.style.display = 'none'; + const coverRef = useRef(null); - const mainContainer = img.closest('.book-cover-container'); - const fallbackDiv = mainContainer?.querySelector('.fallback-cover'); - - if (fallbackDiv) { - fallbackDiv.classList.remove('invisible'); + const toggleImageVisibility = (showImage: boolean) => { + if (coverRef.current) { + const coverImage = coverRef.current.querySelector('.cover-image'); + const fallbackCover = coverRef.current.querySelector('.fallback-cover'); + if (coverImage) { + coverImage.classList.toggle('invisible', !showImage); + } + if (fallbackCover) { + fallbackCover.classList.toggle('invisible', showImage); + } } }; + const handleImageError = () => { + toggleImageVisibility(false); + }; + + useEffect(() => { + toggleImageVisibility(true); + }, [book.metadata?.coverImageUrl, book.coverImageUrl]); + return ( -
+
{coverFit === 'crop' ? ( {book.title} ) : ( @@ -57,7 +72,7 @@ const BookCover: React.FC = ({ height={0} sizes='100vw' className={clsx( - 'fit-cover-img h-auto max-h-full w-auto max-w-full shadow-md', + 'cover-image fit-cover-img h-auto max-h-full w-auto max-w-full shadow-md', imageClassName, )} onError={handleImageError}