bendwidth / frontend / src / videoComponents / ShareScreenButton.js
ShareScreenButton.js
Raw
import { useDispatch, useSelector } from "react-redux";
import { updateCallStatus } from "../redux-elements/callStatus";
import pair from "../redux-elements/pair";

const ShareScreenButton = () => {
    const callStatus = useSelector(state => state.callStatus);
    const dispatch = useDispatch();
  
    // replace the current tracks with required tracks.
    const setNewVideoStream = (videoTrack) => {
        const senders = callStatus.peerConnection.getSenders();
        const sender = senders.find(s => {
            if (s.track) {
                return s.track.kind === videoTrack.kind;
            } else {
                return false;
            }
        });
        sender.replaceTrack(videoTrack);
    }
    const startSharing = async () => {
        let mediaStream;
        if (!callStatus.sharingScreen) {
            let options = { video: true, audio: false, surfaceSwitching: 'include', cursor: true };
            try {
                mediaStream = await navigator.mediaDevices.getDisplayMedia(options);
                const [videoTrack] = mediaStream.getVideoTracks();

                // listen to stop of screen share.
                videoTrack.onended = async () => {
                    let options = { video: true, audio: true };
                    try {
                        mediaStream = await navigator.mediaDevices.getUserMedia(options);
                        const [videoTrack] = mediaStream.getVideoTracks();
                        setNewVideoStream(videoTrack);
                        dispatch(updateCallStatus(pair('sharingScreen', false)));
                        dispatch(updateCallStatus(pair('localStream', mediaStream)));
                    } catch (error) {
                        console.log(error);
                    }
                    
                }
                setNewVideoStream(videoTrack);
                dispatch(updateCallStatus(pair('sharingScreen', true)));
                dispatch(updateCallStatus(pair('localStream', mediaStream)));
            } catch (err) {
                console.log(err);
            }
        }
    }
    return (<div className='button-wrapper middle' onClick={startSharing}>
        <i className={`fa fa-desktop`}></i>
        <div className="btn-text">{callStatus.sharingScreen ? "Stop Sharing" : "Share Screen"}</div>
            </div>)
}

export default ShareScreenButton;