Skip to content

Commit 10ef86d

Browse files
Harden suspense image preload cache handling
Co-authored-by: Kent C. Dodds <me+github@kentcdodds.com>
1 parent 147d9ab commit 10ef86d

File tree

1 file changed

+8
-1
lines changed

1 file changed

+8
-1
lines changed

app/utils/suspense-image.ts

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,12 +25,19 @@ function preloadImage(src: string) {
2525
// SSR-safe: callers should generally only use this in the browser, but guard
2626
// anyway so we never throw on `new Image()` during server rendering.
2727
if (typeof Image === 'undefined') return Promise.resolve(src)
28+
if (!src) return Promise.resolve(src)
2829

2930
return new Promise<string>((resolve, reject) => {
3031
const img = new Image()
31-
img.src = src
3232
img.onload = () => resolve(src)
3333
img.onerror = reject
34+
img.src = src
35+
36+
// If the image is already in cache, `complete` can be true immediately.
37+
if (img.complete) {
38+
if (img.naturalWidth > 0) resolve(src)
39+
else reject(new Error(`Failed to preload image: ${src}`))
40+
}
3441
})
3542
}
3643

0 commit comments

Comments
 (0)