import { h, Component } from 'preact'; import PropTypes from 'prop-types'; import { getTwilioToken } from './actions'; export default class Video extends Component { constructor(props) { super(props); this.state = { leftPx: 200, topPx: 200, pageX: null, pageY: null, token: null, room: null, participants: [], }; } componentDidMount() { getTwilioToken( `private-video-channel-${this.props.activeChannelId}`, this.setupCallChannel, ); } componentWillUnmount() { this.state.room.disconnect(); } setupCallChannel = response => { const component = this; import('twilio-video').then(({ connect, createLocalVideoTrack }) => { connect( response.token, { name: `private-video-channel-${this.props.activeChannelId}`, audio: true, type: 'peer-to-peer', video: { width: 640 }, }, ).then( function(room) { component.setState({ token: response.token, room }); createLocalVideoTrack().then(track => { const localMediaContainer = document.getElementById( 'videolocalscreen', ); localMediaContainer.appendChild(track.attach()); }); const roomParticipants = []; room.participants.forEach(participant => { component.triggerRemoteJoin(participant); roomParticipants.push(participant); }); component.setState({ participants: roomParticipants }); room.on('participantConnected', function(participant) { component.triggerRemoteJoin(participant); const roomParticipants = []; room.participants.forEach(participant => { roomParticipants.push(participant); }); component.setState({ participants: roomParticipants }); room.on('participantDisconnected', function(participant) { component.props.onExit(); }); }); }, function(error) { document.getElementById('videoremotescreen').innerHTML = ''; console.error(`Unable to connect to Room: ${error.message}`); }, ); }); }; triggerRemoteJoin = participant => { // document.getElementById('videoremotescreen').innerHTML = "" participant.on('trackAdded', track => { document.getElementById('videoremotescreen').appendChild(track.attach()); }); }; handleDrag = e => { if (!this.state.pageX) { this.setState({ pageX: e.pageX, pageY: e.pageY, offsetDiffX: e.pageX - e.target.offsetLeft, offsetDiffY: e.pageY - e.target.offsetTop, }); } else if (e.pageX != 0) { this.setState({ leftPx: this.state.pageX + e.pageX - this.state.pageX - this.state.offsetDiffX, topPx: this.state.pageY + e.pageY - this.state.pageY - this.state.offsetDiffY, }); } else if (e.pageX === 0) { this.setState({ pageX: null, pageY: null, offsetDiffX: null, offsetDiffY: null, }); } }; render() { return (
); } }