2025-01-21 12:34:22 +01:00
|
|
|
import { useCallback, useState, forwardRef } from 'react';
|
2023-04-16 23:09:04 +09:00
|
|
|
|
2023-05-10 12:59:29 +02:00
|
|
|
interface Props {
|
2023-04-16 23:09:04 +09:00
|
|
|
src: string;
|
|
|
|
alt?: string;
|
|
|
|
lang?: string;
|
2025-01-21 12:34:22 +01:00
|
|
|
width?: number;
|
|
|
|
height?: number;
|
|
|
|
onClick?: React.MouseEventHandler;
|
|
|
|
onMouseDown?: React.MouseEventHandler;
|
|
|
|
onTouchStart?: React.TouchEventHandler;
|
2023-05-10 12:59:29 +02:00
|
|
|
}
|
2023-04-16 23:09:04 +09:00
|
|
|
|
2025-01-21 12:34:22 +01:00
|
|
|
export const GIFV = forwardRef<HTMLVideoElement, Props>(
|
|
|
|
(
|
|
|
|
{ src, alt, lang, width, height, onClick, onMouseDown, onTouchStart },
|
|
|
|
ref,
|
|
|
|
) => {
|
|
|
|
const [loading, setLoading] = useState(true);
|
2023-04-16 23:09:04 +09:00
|
|
|
|
2025-01-21 12:34:22 +01:00
|
|
|
const handleLoadedData = useCallback(() => {
|
2023-05-09 13:02:12 -04:00
|
|
|
setLoading(false);
|
|
|
|
}, [setLoading]);
|
2023-04-16 23:09:04 +09:00
|
|
|
|
2025-01-21 12:34:22 +01:00
|
|
|
const handleClick = useCallback(
|
|
|
|
(e: React.MouseEvent) => {
|
2023-05-09 13:02:12 -04:00
|
|
|
e.stopPropagation();
|
2025-01-21 12:34:22 +01:00
|
|
|
onClick?.(e);
|
|
|
|
},
|
|
|
|
[onClick],
|
|
|
|
);
|
2023-04-16 23:09:04 +09:00
|
|
|
|
2025-01-21 12:34:22 +01:00
|
|
|
return (
|
|
|
|
<div className='gifv'>
|
|
|
|
{loading && (
|
|
|
|
<canvas
|
|
|
|
role='button'
|
|
|
|
tabIndex={0}
|
|
|
|
aria-label={alt}
|
|
|
|
title={alt}
|
|
|
|
lang={lang}
|
|
|
|
onClick={handleClick}
|
|
|
|
/>
|
|
|
|
)}
|
|
|
|
|
|
|
|
<video
|
|
|
|
ref={ref}
|
|
|
|
src={src}
|
2023-04-16 23:09:04 +09:00
|
|
|
role='button'
|
|
|
|
tabIndex={0}
|
|
|
|
aria-label={alt}
|
|
|
|
title={alt}
|
|
|
|
lang={lang}
|
2025-01-21 12:34:22 +01:00
|
|
|
width={width}
|
|
|
|
height={height}
|
|
|
|
muted
|
|
|
|
loop
|
|
|
|
autoPlay
|
|
|
|
playsInline
|
2023-04-16 23:09:04 +09:00
|
|
|
onClick={handleClick}
|
2025-01-21 12:34:22 +01:00
|
|
|
onLoadedData={handleLoadedData}
|
|
|
|
onMouseDown={onMouseDown}
|
|
|
|
onTouchStart={onTouchStart}
|
2023-04-16 23:09:04 +09:00
|
|
|
/>
|
2025-01-21 12:34:22 +01:00
|
|
|
</div>
|
|
|
|
);
|
|
|
|
},
|
|
|
|
);
|
2023-04-16 23:09:04 +09:00
|
|
|
|
2025-01-21 12:34:22 +01:00
|
|
|
GIFV.displayName = 'GIFV';
|