Spaces:
Sleeping
Sleeping
File size: 1,023 Bytes
691cdd0 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 | import React, { useMemo, useState } from 'react';
// Flexible image loader that tries extensions in order when an image fails.
// Usage: <ImageFlex base="/assets/hero" alt="..." className="..." />
// Optionally pass explicit candidates via srcCandidates=["/a.jpg","/a.png"].
export default function ImageFlex({
base,
exts = ['webp', 'jpg', 'jpeg', 'png'],
srcCandidates,
alt = '',
className = '',
style,
...rest
}) {
const candidates = useMemo(() => {
if (Array.isArray(srcCandidates) && srcCandidates.length > 0) return srcCandidates;
if (typeof base === 'string') return exts.map((e) => `${base}.${e}`);
return [];
}, [base, exts, srcCandidates]);
const [idx, setIdx] = useState(0);
const src = candidates[idx];
function handleError() {
if (idx < candidates.length - 1) setIdx(idx + 1);
}
if (!src) return null;
return (
<img
src={src}
alt={alt}
className={className}
style={style}
onError={handleError}
{...rest}
/>
);
}
|