1
0
mirror of https://github.com/lexogrine/cs2-react-hud.git synced 2025-12-10 10:52:50 +01:00
2023-09-11 12:37:32 +02:00

78 lines
2.4 KiB
TypeScript

import React, { useEffect, useState } from "react";
import { mediaStreams } from "./mediaStream";
import { v4 as uuidv4 } from 'uuid';
type Props = {
steamid: string,
visible: boolean;
}
const CameraView = ({ steamid, visible }: Props) => {
const [uuid] = useState(uuidv4());
const [ forceHide, setForceHide ] = useState(false);
useEffect(() => {
}, [])
useEffect(() => {
const mountStream = (stream: MediaStream) => {
console.log("mounting video");
const remoteVideo = document.getElementById(`remote-video-${steamid}-${uuid}`) as HTMLVideoElement;
if(!remoteVideo || !stream){
console.log("no video element")
}
if (!remoteVideo || !stream) return;
remoteVideo.srcObject = stream;
remoteVideo.play();
}
const mountExistingStream = () => {
const currentStream = mediaStreams.players.find(player => player.steamid === steamid);
if(!currentStream || !currentStream.peerConnection || !currentStream.peerConnection._remoteStreams) return;
const stream = currentStream.peerConnection._remoteStreams[0];
if(!stream) return;
mountStream(stream);
}
const onStreamCreate = (stream: MediaStream) => {
mountStream(stream);
}
const onStreamDestroy = () => {
const remoteVideo = document.getElementById(`remote-video-${steamid}-${uuid}`) as HTMLVideoElement;
if (!remoteVideo) return;
remoteVideo.srcObject = null;
}
const onBlockedUpdate = (steamids: string[]) => {
setForceHide(steamids.includes(steamid));
}
mediaStreams.onStreamCreate(onStreamCreate, steamid);
mediaStreams.onStreamDestroy(onStreamDestroy, steamid);
mediaStreams.onBlockedUpdate(onBlockedUpdate);
mountExistingStream();
return () => {
mediaStreams.removeListener(onStreamCreate);
mediaStreams.removeListener(onStreamDestroy);
mediaStreams.removeListener(onBlockedUpdate);
}
}, [steamid]);
return <React.Fragment>
<video className="video-call-preview" autoPlay muted id={`remote-video-${steamid}-${uuid}`} style={{ opacity: visible && !forceHide ? 1 : 0.001 }}></video>
</React.Fragment>
}
export default CameraView;