@@ -114,6 +114,40 @@ const GridView = ( { aggregatedData, onDeleteCard, onUpdateCard, sortConfig, han
114114
115115 const getFullImagePath = useCallback ( ( cardId ) => `/images/yugiohImages/${ String ( cardId ) } .jpg` , [ ] ) ;
116116
117+ const getCardImageSources = useCallback (
118+ ( card ) => {
119+ const localImageSrc = card ?. cardId ? getFullImagePath ( card . cardId ) : null ;
120+ const remoteImageSrc = typeof card ?. remoteImageUrl === "string" && card . remoteImageUrl . trim ( )
121+ ? card . remoteImageUrl . trim ( )
122+ : null ;
123+ const primaryImageSrc = remoteImageSrc || localImageSrc || FALLBACK_IMAGE ;
124+ const secondaryImageSrc = primaryImageSrc === remoteImageSrc ? localImageSrc : remoteImageSrc ;
125+
126+ return {
127+ primaryImageSrc,
128+ secondaryImageSrc : secondaryImageSrc && secondaryImageSrc !== primaryImageSrc ? secondaryImageSrc : null ,
129+ } ;
130+ } ,
131+ [ getFullImagePath ] ,
132+ ) ;
133+
134+ const handleCardImageError = useCallback ( ( event ) => {
135+ const image = event . currentTarget ;
136+ const nextSrc = image . dataset . nextSrc ;
137+ const fallbackSrc = image . dataset . fallbackSrc ;
138+
139+ if ( nextSrc ) {
140+ image . src = nextSrc ;
141+ image . dataset . nextSrc = "" ;
142+ return ;
143+ }
144+
145+ if ( fallbackSrc ) {
146+ image . src = fallbackSrc ;
147+ image . dataset . fallbackSrc = "" ;
148+ image . onerror = null ;
149+ }
150+ } , [ ] ) ;
117151
118152 const getFolderLabels = useCallback (
119153 ( card ) => ( Array . isArray ( card ?. folderIds ) ? card . folderIds : [ ] )
@@ -217,8 +251,7 @@ const GridView = ( { aggregatedData, onDeleteCard, onUpdateCard, sortConfig, han
217251 { memoizedAggregatedData . map ( ( card ) => {
218252 if ( ! card ) return null ;
219253
220- const cardIdImage = card . cardId ? getFullImagePath ( card . cardId ) : null ;
221- const imageSrc = cardIdImage || card . remoteImageUrl || FALLBACK_IMAGE ;
254+ const { primaryImageSrc, secondaryImageSrc } = getCardImageSources ( card ) ;
222255 const cardId = String ( card . _id ?? "" ) ;
223256 const isSelected = isSelectionEnabled && selectedCardIds . has ( cardId ) ;
224257 const isFlipped = Boolean ( flippedCards [ card . _id ] ) ;
@@ -345,9 +378,12 @@ const GridView = ( { aggregatedData, onDeleteCard, onUpdateCard, sortConfig, han
345378 < div className = "relative flex aspect-[260/360] h-full max-h-[31rem] w-full items-center justify-center overflow-hidden rounded-[6px] border border-white/10 bg-black/40 transition duration-300 group-hover:border-indigo-400/60 dark:border-white/20 dark:bg-gray-900/60" >
346379 < img
347380 className = "mx-auto h-full w-full object-top object-cover"
348- src = { imageSrc }
381+ src = { primaryImageSrc }
349382 alt = { `Card Image - ${ card . productName } ` }
350383 loading = "lazy"
384+ data-next-src = { secondaryImageSrc || "" }
385+ data-fallback-src = { FALLBACK_IMAGE }
386+ onError = { handleCardImageError }
351387 />
352388 < div
353389 aria-hidden = "true"
0 commit comments