Skip to content

Commit fa4c1c0

Browse files
Keep previous artwork visible while preloading next
Co-authored-by: Kent C. Dodds <me+github@kentcdodds.com>
1 parent 9c38599 commit fa4c1c0

File tree

1 file changed

+23
-47
lines changed

1 file changed

+23
-47
lines changed

app/components/calls/episode-artwork-preview.tsx

Lines changed: 23 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -224,67 +224,43 @@ function EpisodeArtworkImg({
224224
latestSrcRef.current = safeSrc
225225
}
226226

227-
const isReplacing = fallbackSrc !== safeSrc
228-
const fallbackClassName = clsx(
227+
const isPending = fallbackSrc !== safeSrc
228+
const imgClassName = clsx(
229229
className,
230230
'transition-opacity',
231-
isReplacing ? 'opacity-60' : 'opacity-100',
231+
isPending ? 'opacity-60' : 'opacity-100',
232232
)
233-
const loadedClassName = clsx(className, 'transition-opacity', 'opacity-100')
234233

235234
function handleResolved(resolvedSrc: string) {
236235
if (resolvedSrc !== latestSrcRef.current) return
237236
setFallbackSrc(resolvedSrc)
238237
}
239238

240-
if (!isReplacing) {
241-
return <img src={safeSrc} {...props} className={loadedClassName} />
242-
}
243-
244239
return (
245-
<ErrorBoundary
246-
resetKeys={[safeSrc]}
247-
fallback={
248-
<img
249-
src={fallbackSrc || safeSrc}
250-
{...props}
251-
className={fallbackClassName}
252-
/>
253-
}
254-
>
255-
<React.Suspense
256-
fallback={
257-
<img
258-
src={fallbackSrc || safeSrc}
259-
{...props}
260-
className={fallbackClassName}
261-
/>
262-
}
263-
>
264-
<Img
265-
src={safeSrc}
266-
{...props}
267-
className={loadedClassName}
268-
onSrcResolved={handleResolved}
269-
/>
270-
</React.Suspense>
271-
</ErrorBoundary>
240+
<>
241+
<img src={fallbackSrc} {...props} className={imgClassName} />
242+
{isPending ? (
243+
<ErrorBoundary resetKeys={[safeSrc]} fallback={null}>
244+
<React.Suspense fallback={null}>
245+
<PreloadImage src={safeSrc} onResolved={handleResolved} />
246+
</React.Suspense>
247+
</ErrorBoundary>
248+
) : null}
249+
</>
272250
)
273251
}
274252

275-
function Img({
276-
src = '',
277-
onSrcResolved,
278-
...props
279-
}: React.ComponentProps<'img'> & {
280-
onSrcResolved?: (resolvedSrc: string) => void
253+
function PreloadImage({
254+
src,
255+
onResolved,
256+
}: {
257+
src: string
258+
onResolved: (resolvedSrc: string) => void
281259
}) {
282-
const isServer = typeof document === 'undefined'
283-
const loadedSrc = isServer ? src : React.use(imgSrc(src))
260+
const loadedSrc = React.use(imgSrc(src))
284261
React.useEffect(() => {
285-
if (isServer) return
286-
onSrcResolved?.(loadedSrc)
287-
}, [isServer, loadedSrc, onSrcResolved])
288-
return <img src={loadedSrc} {...props} />
262+
onResolved(loadedSrc)
263+
}, [loadedSrc, onResolved])
264+
return null
289265
}
290266

0 commit comments

Comments
 (0)