const myId = Math.floor(Math.random() * 10000000); const bucket = "https://storage.googleapis.com/sample-video-watch-together/"; interface MessageT { id: number; text: string; } const App = () => { const [movieUrl, setMovieUrl] = React.useState( `${bucket}Inside.Out.2015.1080p.BluRay.x264.YIFY.mp4` ); const videoRef = React.useRef(); const [userMedia] = React.useState(() => new UserMedia(320, 240)); const [conn] = React.useState(() => { const conn = new WsConn(); RegisterVideoHandlers(conn); return conn; }); const refCallback = React.useCallback((video: HTMLVideoElement) => { video.onplay = conn.EventHandler(() => video.currentTime); video.onpause = conn.EventHandler(() => video.currentTime); video.onseeking = conn.EventHandler(() => video.currentTime); videoRef.current = video; }, []); const [messages, setMessages] = React.useState([]); const [clients, setClients] = React.useState>({}); const [myName, setMyName] = React.useState(""); const [serverId, setServerId] = React.useState(""); const signal = (filter: string, data: Object) => { conn.conn.send( JSON.stringify({event: "signal", value: {id: serverId, data}, filter}) ); }; const send = (event: React.KeyboardEvent) => { if (event.key != "Enter") return; const msg = {text: event.currentTarget.value, id: myId}; setMessages([...messages, msg]); event.currentTarget.value = ""; conn.conn.send( JSON.stringify({event: "message", target: "#app", value: msg}) ); }; const advertise = (name: string, filter: string) => { setMyName(name); conn.conn.send( JSON.stringify({ event: "advertise", value: {id: serverId, name}, filter, }) ); }; React.useEffect(() => { const elem = document.getElementById("messages"); elem.scrollTop = elem.scrollHeight; }, [messages]); React.useEffect(() => { RegisterUiHandlers( conn, setMessages, messages, setMovieUrl, videoRef, myName, setServerId, clients, setClients, signal, userMedia, advertise ); }, [ conn, setMessages, messages, setMovieUrl, videoRef, myName, setServerId, clients, setClients, signal, userMedia, advertise, ]); React.useEffect(() => { conn.onclose = () => { Object.values(clients).forEach((c) => c?.cleanup()); setClients({}); }; }, [clients]); return ( <>
advertise(ev.target.value, "")} /> ({serverId})
{Object.keys(clients).map((id) => (
{clients[id].name} ({id})
))}
{messages.map((message) => (
{message.text}
))}
); };