This commit is contained in:
Josh Hawkins 2024-02-26 12:18:15 -06:00
parent 969a0067c4
commit b7340f7ea5

View File

@ -37,6 +37,27 @@ type Preview = {
end: number; end: number;
}; };
const useImageLoaded = (): [
React.RefObject<HTMLImageElement>,
boolean,
() => void,
] => {
const [loaded, setLoaded] = useState(false);
const ref = useRef<HTMLImageElement>(null);
const onLoad = () => {
setLoaded(true);
};
useEffect(() => {
if (ref.current && ref.current?.complete) {
onLoad();
}
});
return [ref, loaded, onLoad];
};
export default function PreviewThumbnailPlayer({ export default function PreviewThumbnailPlayer({
review, review,
relevantPreview, relevantPreview,
@ -50,7 +71,6 @@ export default function PreviewThumbnailPlayer({
const [hoverTimeout, setHoverTimeout] = useState<NodeJS.Timeout | null>(); const [hoverTimeout, setHoverTimeout] = useState<NodeJS.Timeout | null>();
const [playback, setPlayback] = useState(false); const [playback, setPlayback] = useState(false);
const [progress, setProgress] = useState(0); const [progress, setProgress] = useState(0);
const [imgLoaded, setImgLoaded] = useState(false);
const playingBack = useMemo(() => playback, [playback, autoPlayback]); const playingBack = useMemo(() => playback, [playback, autoPlayback]);
@ -95,6 +115,8 @@ export default function PreviewThumbnailPlayer({
[hoverTimeout, review] [hoverTimeout, review]
); );
const [imgRef, imgLoaded, onImgLoad] = useImageLoaded();
// date // date
const formattedDate = useFormattedTimestamp( const formattedDate = useFormattedTimestamp(
@ -126,6 +148,7 @@ export default function PreviewThumbnailPlayer({
)} )}
<div className={`${imgLoaded ? "visible" : "invisible"}`}> <div className={`${imgLoaded ? "visible" : "invisible"}`}>
<img <img
ref={imgRef}
className={`w-full h-full transition-opacity ${ className={`w-full h-full transition-opacity ${
playingBack ? "opacity-0" : "opacity-100" playingBack ? "opacity-0" : "opacity-100"
}`} }`}
@ -135,7 +158,7 @@ export default function PreviewThumbnailPlayer({
)}`} )}`}
loading="lazy" loading="lazy"
onLoad={() => { onLoad={() => {
setImgLoaded(true); onImgLoad();
}} }}
/> />