@base-ui/react
Version:
Base UI is a library of headless ('unstyled') React components and low-level hooks. You gain complete control over your app's CSS and accessibility features.
42 lines (40 loc) • 1.14 kB
JavaScript
'use client';
import * as React from 'react';
import { useIsoLayoutEffect } from '@base-ui/utils/useIsoLayoutEffect';
import { NOOP } from "../../internals/noop.js";
export function useImageLoadingStatus(src, {
referrerPolicy,
crossOrigin
}) {
const [loadingStatus, setLoadingStatus] = React.useState('idle');
useIsoLayoutEffect(() => {
if (!src) {
setLoadingStatus('error');
return NOOP;
}
let isMounted = true;
const image = new window.Image();
const updateStatus = status => () => {
if (!isMounted) {
return;
}
setLoadingStatus(status);
};
setLoadingStatus('loading');
image.onload = updateStatus('loaded');
image.onerror = updateStatus('error');
if (referrerPolicy) {
image.referrerPolicy = referrerPolicy;
}
image.crossOrigin = crossOrigin ?? null;
image.src = src;
// Fast path for cached/decoded images
if (image.complete) {
setLoadingStatus(image.naturalWidth > 0 ? 'loaded' : 'error');
}
return () => {
isMounted = false;
};
}, [src, crossOrigin, referrerPolicy]);
return loadingStatus;
}