mirador
Version:
An open-source, web-based 'multi-up' viewer that supports zoom-pan-rotate functionality, ability to display/compare simple images, and images with annotations.
42 lines (36 loc) • 1.15 kB
JSX
import { useState, useEffect, useContext } from 'react';
import PropTypes from 'prop-types';
import FailedImageContext from '../contexts/FailedImageContext';
/**
* A plain img element that renders a fallback node when the image fails to load.
*
* Reports failures through FailedImageContext like IIIFThumbnail/OpenSeadragonTileSource
*/
export function ImageWithFallback({ alt, fallback, src, ...props }) {
const [hasError, setHasError] = useState(false);
const { notifyFailure } = useContext(FailedImageContext);
// A later src may succeed even if an earlier one failed.
useEffect(() => {
setHasError(false);
}, [src]);
if (hasError) return fallback;
return (
<img
alt={alt}
src={src}
onError={() => {
setHasError(true);
notifyFailure(src);
}}
{...props}
/>
);
}
ImageWithFallback.propTypes = {
/** Alt text for the underlying img element. */
alt: PropTypes.string.isRequired,
/** Node rendered in place of the image when it fails to load. */
fallback: PropTypes.node.isRequired,
/** URL of the image to display. */
src: PropTypes.string.isRequired,
};