diff --git a/client/src/pages/room/[slug].jsx b/client/src/pages/room/[slug].jsx index e3e1735..0e342c3 100644 --- a/client/src/pages/room/[slug].jsx +++ b/client/src/pages/room/[slug].jsx @@ -10,6 +10,7 @@ const RoomPage = () => { const [remoteStream, setRemoteStream] = useState(null); const [isAudioMute, setIsAudioMute] = useState(false); const [isVideoOnHold, setIsVideoOnHold] = useState(false); + const [callButton, setCallButton] = useState(true); const handleUserJoined = useCallback(({ email, id }) => { //! console.log(`Email ${email} joined the room!`); @@ -98,6 +99,33 @@ const RoomPage = () => { handleNegoFinal ]); + + useEffect(() => { + socket.on("call:end", ({ from }) => { + if (from === remoteSocketId) { + peer.peer.close(); + + if (myStream) { + myStream.getTracks().forEach(track => track.stop()); + setMyStream(null); + } + + setRemoteStream(null); + setRemoteSocketId(null); + } + }); + }, [remoteSocketId, myStream, socket]); + + //* for disappearing call button + useEffect(() => { + socket.on("call:initiated", ({ from }) => { + if (from === remoteSocketId) { + setCallButton(false); + } + }); + }, [socket, remoteSocketId]); + + const handleCallUser = useCallback(async () => { const stream = await navigator.mediaDevices.getUserMedia({ audio: true, @@ -109,8 +137,8 @@ const RoomPage = () => { audioTracks.forEach(track => track.enabled = false); } - const videoTracks = stream.getVideoTracks(); if (isVideoOnHold) { + const videoTracks = stream.getVideoTracks(); videoTracks.forEach(track => track.enabled = false); } @@ -120,7 +148,12 @@ const RoomPage = () => { socket.emit("user:call", { to: remoteSocketId, offer }) // set my stream setMyStream(stream); - }, [remoteSocketId, socket, isAudioMute, isVideoOnHold]); + + // hide the call button + setCallButton(false); + // Inform the remote user to hide their "CALL" button + socket.emit("call:initiated", { to: remoteSocketId }); + }, [remoteSocketId, socket, isAudioMute, isVideoOnHold, callButton]); const handleToggleAudio = () => { @@ -133,8 +166,24 @@ const RoomPage = () => { setIsVideoOnHold(!isVideoOnHold); } + const handleEndCall = useCallback(() => { + peer.peer.close(); + + if (myStream) { + myStream.getTracks().forEach(track => track.stop()); + setMyStream(null); + } + + setRemoteStream(null); + + if (remoteSocketId) { + socket.emit("call:end", { to: remoteSocketId }); + } + setRemoteSocketId(null); + }, [myStream, remoteSocketId, socket]); + return ( -