2022-02-28 00:08:20 +01:00
|
|
|
import { IconPatch } from "components/buttons/IconPatch";
|
|
|
|
import { Icons } from "components/Icon";
|
|
|
|
import { Loading } from "components/layout/Loading";
|
2022-02-20 16:55:30 +01:00
|
|
|
import { MWMediaStream } from "providers";
|
2022-02-20 16:45:46 +01:00
|
|
|
import { useRef } from "react";
|
|
|
|
|
|
|
|
export interface VideoPlayerProps {
|
|
|
|
source: MWMediaStream;
|
2022-02-28 00:08:20 +01:00
|
|
|
startAt?: number;
|
2022-02-20 16:45:46 +01:00
|
|
|
onProgress?: (event: ProgressEvent) => void;
|
|
|
|
}
|
|
|
|
|
2022-02-28 00:08:20 +01:00
|
|
|
export function SkeletonVideoPlayer(props: { error?: boolean }) {
|
|
|
|
return (
|
|
|
|
<div className="bg-denim-200 flex aspect-video w-full items-center justify-center rounded-xl">
|
|
|
|
{props.error ? (
|
|
|
|
<div className="flex flex-col items-center">
|
|
|
|
<IconPatch icon={Icons.WARNING} className="text-red-400" />
|
|
|
|
<p className="mt-5 text-white">Couldn't get your stream</p>
|
|
|
|
</div>
|
|
|
|
) : (
|
|
|
|
<div className="flex flex-col items-center">
|
|
|
|
<Loading />
|
|
|
|
<p className="mt-3 text-white">Getting your stream...</p>
|
|
|
|
</div>
|
|
|
|
)}
|
|
|
|
</div>
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
2022-02-20 16:45:46 +01:00
|
|
|
export function VideoPlayer(props: VideoPlayerProps) {
|
|
|
|
const videoRef = useRef<HTMLVideoElement | null>(null);
|
|
|
|
const mustUseHls = props.source.type === "m3u8";
|
|
|
|
|
|
|
|
return (
|
|
|
|
<video
|
2022-02-28 00:08:20 +01:00
|
|
|
className="bg-denim-500 w-full rounded-xl"
|
2022-02-20 16:45:46 +01:00
|
|
|
ref={videoRef}
|
|
|
|
onProgress={(e) =>
|
|
|
|
props.onProgress && props.onProgress(e.nativeEvent as ProgressEvent)
|
|
|
|
}
|
2022-02-28 00:08:20 +01:00
|
|
|
onLoadedData={(e) => {
|
|
|
|
if (props.startAt)
|
|
|
|
(e.target as HTMLVideoElement).currentTime = props.startAt;
|
|
|
|
}}
|
2022-02-20 16:45:46 +01:00
|
|
|
controls
|
|
|
|
autoPlay
|
|
|
|
>
|
|
|
|
{!mustUseHls ? <source src={props.source.url} type="video/mp4" /> : null}
|
|
|
|
</video>
|
|
|
|
);
|
|
|
|
}
|