mirror of
https://github.com/glitch-soc/mastodon.git
synced 2025-02-03 13:33:32 -05:00
5e7c079787
Port 11786f1114f9dfb5a17810d14477a94162f94064 to glitch-soc Signed-off-by: Claire <claire.github-309c@sitedethib.com>
71 lines
1.5 KiB
TypeScript
71 lines
1.5 KiB
TypeScript
import { useCallback, useState, forwardRef } from 'react';
|
|
|
|
interface Props {
|
|
src: string;
|
|
alt?: string;
|
|
lang?: string;
|
|
width?: number;
|
|
height?: number;
|
|
onClick?: React.MouseEventHandler;
|
|
onMouseDown?: React.MouseEventHandler;
|
|
onTouchStart?: React.TouchEventHandler;
|
|
}
|
|
|
|
export const GIFV = forwardRef<HTMLVideoElement, Props>(
|
|
(
|
|
{ src, alt, lang, width, height, onClick, onMouseDown, onTouchStart },
|
|
ref,
|
|
) => {
|
|
const [loading, setLoading] = useState(true);
|
|
|
|
const handleLoadedData = useCallback(() => {
|
|
setLoading(false);
|
|
}, [setLoading]);
|
|
|
|
const handleClick = useCallback(
|
|
(e: React.MouseEvent) => {
|
|
e.stopPropagation();
|
|
onClick?.(e);
|
|
},
|
|
[onClick],
|
|
);
|
|
|
|
return (
|
|
<div className='gifv'>
|
|
{loading && (
|
|
<canvas
|
|
role='button'
|
|
tabIndex={0}
|
|
aria-label={alt}
|
|
title={alt}
|
|
lang={lang}
|
|
onClick={handleClick}
|
|
/>
|
|
)}
|
|
|
|
<video
|
|
ref={ref}
|
|
src={src}
|
|
role='button'
|
|
tabIndex={0}
|
|
aria-label={alt}
|
|
title={alt}
|
|
lang={lang}
|
|
width={width}
|
|
height={height}
|
|
muted
|
|
loop
|
|
autoPlay
|
|
playsInline
|
|
onClick={handleClick}
|
|
onLoadedData={handleLoadedData}
|
|
onMouseDown={onMouseDown}
|
|
onTouchStart={onTouchStart}
|
|
/>
|
|
</div>
|
|
);
|
|
},
|
|
);
|
|
|
|
GIFV.displayName = 'GIFV';
|