@pdftron/webviewer-react-toolkit
Version:
A React component library for integrating with PDFTron WebViewer API.
33 lines (32 loc) • 1.45 kB
JavaScript
import classnames from 'classnames';
import React, { forwardRef, useCallback, useEffect, useState } from 'react';
import { futureableOrLazyToFuturable } from '../../data';
export const Image = forwardRef(({ src, pending, onRenderLoading, onRenderFallback, alt, className, ...imgProps }, ref) => {
const sourceIsNotPromise = typeof src === 'string' || !src;
const [loading, setLoading] = useState(!sourceIsNotPromise);
const [source, setSource] = useState(sourceIsNotPromise ? src : undefined);
const getSource = useCallback(async (srcGetter) => {
setLoading(true);
let fetchedSource = undefined;
try {
fetchedSource = await futureableOrLazyToFuturable(srcGetter);
}
catch { }
setLoading(false);
setSource(fetchedSource || undefined);
}, []);
useEffect(() => {
if (sourceIsNotPromise) {
setLoading(false);
setSource(src || undefined);
return;
}
getSource(src);
}, [getSource, sourceIsNotPromise, src]);
const imageClass = classnames('ui__image', className);
if (loading || pending)
return React.createElement(React.Fragment, null, onRenderLoading?.());
if (!source)
return React.createElement(React.Fragment, null, onRenderFallback?.());
return React.createElement("img", Object.assign({}, imgProps, { alt: alt, src: source, className: imageClass, ref: ref }));
});