import { FunctionComponent, useCallback, useEffect, useRef, useState, } from "react"; import styles from "./ScreenViewer.module.css"; import { ScreenSharingClient, StateChangedEvent, StateChangedEventType, StreamChangedEvent, StreamChangedEventType, } from "../../api/webrtc"; export interface ScreenViewerProps { sessionId: string; } export const ScreenViewer: FunctionComponent = ({ sessionId, }) => { const videoRef = useRef(null); const [client, setClient] = useState(null); const [stream, setStream] = useState(null); const [state, setState] = useState(null); const onStreamChanged = useCallback((evt: Event) => { setStream((evt as StreamChangedEvent).stream); }, []); const onStateChanged = useCallback((evt: Event) => { setState((evt as StateChangedEvent).state); }, []); useEffect(() => { const client = new ScreenSharingClient(sessionId); client.addEventListener(StreamChangedEventType, onStreamChanged); client.addEventListener(StateChangedEventType, onStateChanged); client.connect(); setClient(client); return () => { client.removeEventListener(StreamChangedEventType, onStreamChanged); client.removeEventListener(StateChangedEventType, onStateChanged); client.close(); setClient(null); }; }, [sessionId, onStreamChanged, onStateChanged]); useEffect(() => { if (!videoRef.current) return; const video = videoRef.current; console.log("Changing video stream", video, stream); video.autoplay = true; video.playsInline = true; video.srcObject = stream; video.muted = true; }, [videoRef, stream]); const isVideoReady = state === "connected" && stream !== null; console.log("isVideoReady", isVideoReady); return (

); }; export interface ConnectionStateProps { state: string | null; } export const ConnectionState: FunctionComponent = ({ state, }) => { switch (state) { case null: return Connecting...; case "Connecté": return Connection established !; case "disconnected": return Connection lost !; case "failed": return Connection failed !; default: return ( État inconnu ({state}) ); } };