fix(remote-image): add load timeout (#72)
This commit is contained in:
@@ -67,6 +67,8 @@ interface RemoteImageProps {
|
||||
* />
|
||||
* ```
|
||||
*/
|
||||
const IMAGE_LOAD_TIMEOUT_MS = 30000
|
||||
|
||||
export function RemoteImage({
|
||||
src,
|
||||
alt,
|
||||
@@ -91,8 +93,10 @@ export function RemoteImage({
|
||||
const imageSrc = shouldUseCache ? cachedSrc : (src ?? undefined)
|
||||
|
||||
const [isImageLoading, setIsImageLoading] = useState(true)
|
||||
const [timedOutSrc, setTimedOutSrc] = useState<string | null>(null)
|
||||
const isCacheLoading = shouldUseCache && src && cachedSrc === undefined
|
||||
const isLoading = isCacheLoading || isImageLoading
|
||||
const hasTimedOut = Boolean(src) && timedOutSrc === src
|
||||
const isLoading = !hasTimedOut && (isCacheLoading || isImageLoading)
|
||||
|
||||
useEffect(() => {
|
||||
if (imageSrc) {
|
||||
@@ -102,6 +106,19 @@ export function RemoteImage({
|
||||
}
|
||||
}, [imageSrc])
|
||||
|
||||
useEffect(() => {
|
||||
if (!src || hasTimedOut || !isLoading) return
|
||||
|
||||
const timeoutId = window.setTimeout(() => {
|
||||
setTimedOutSrc(src)
|
||||
setIsImageLoading(false)
|
||||
}, IMAGE_LOAD_TIMEOUT_MS)
|
||||
|
||||
return () => {
|
||||
window.clearTimeout(timeoutId)
|
||||
}
|
||||
}, [src, hasTimedOut, isLoading])
|
||||
|
||||
useEffect(() => {
|
||||
onLoadingChange?.(isLoading)
|
||||
}, [isLoading, onLoadingChange])
|
||||
|
||||
Reference in New Issue
Block a user