import { Actions, Connected, Connecting, Disconnected, LocalMediaList, Provider, RemoteAudioPlayer, Room } from '@andyet/simplewebrtc'; import React, { Component } from 'react'; import { connect } from 'react-redux'; import { RouteComponentProps } from 'react-router'; import styled from 'styled-components'; import ChatContainer from '../components/ChatContainer'; import ChatToggle from '../components/ChatToggle'; import Haircheck from '../components/Haircheck'; import PasswordEntry from '../components/PasswordEntry'; import PeerGrid from '../components/PeerGrid'; import Sidebar from '../components/Sidebar'; import mq from '../styles/media-queries'; const PasswordEntryContainer = styled.div({ display: 'flex', alignItems: 'center', justifyContent: 'center', width: '100vw', height: '100vh' }); const Container = styled.div({ display: 'flex', position: 'relative', flexDirection: 'column', minHeight: '100vh', [mq.SMALL_DESKTOP]: { flexDirection: 'row' } }); const LoadingState = styled.div({ width: '100vw', height: '100vh', display: 'flex', justifyContent: 'center', alignItems: 'center' }); interface MatchParams { roomName: string; } interface Props extends RouteComponentProps { configUrl: string; mute?: () => void; unmute?: () => void; } interface State { activeSpeakerView: boolean; pttMode: boolean; sendRtt: boolean; password?: string; chatOpen: boolean; } class Index extends Component { constructor(props: Props) { super(props); this.state = { activeSpeakerView: false, password: undefined, pttMode: false, sendRtt: false, chatOpen: false }; } public render() { const roomName = this.props.match.params.roomName; return ( ( <> {media.filter(m => m.shared).length === 0 ? ( ) : ( <>

Connecting...

Lost connection. Reattmpting to join...

{({ room }) => { if (!room.joined) { if (room.passwordRequired) { return ( ); } return (

Joining room...

); } return ( {this.state.chatOpen ? ( ) : ( )} ); }}
)} )} />
); } private toggleActiveSpeakerView = () => { this.setState({ activeSpeakerView: !this.state.activeSpeakerView }); }; private toggleRtt = () => { this.setState({ sendRtt: !this.state.sendRtt }); }; private togglePttMode = (e: React.SyntheticEvent) => { this.setState({ pttMode: !this.state.pttMode }, () => { if (this.state.pttMode) { document.addEventListener('keydown', this.unmute); document.addEventListener('keyup', this.mute); this.props.mute!(); } else { document.removeEventListener('keydown', this.unmute); document.removeEventListener('keyup', this.mute); this.props.unmute!(); } }); if (e.target) { (e.target as HTMLElement).blur(); } }; private mute = (e: KeyboardEvent) => { if (e.key === ' ') { this.props.mute!(); } }; private unmute = (e: KeyboardEvent) => { if (e.key === ' ') { this.props.unmute!(); } }; private setPassword = (password: string) => { this.setState({ password }); }; private toggleChat = () => { this.setState({ chatOpen: !this.state.chatOpen }); }; } function mapDispatchToProps(dispatch: any, props: Props): Props { return { ...props, mute: () => dispatch(Actions.muteSelf()), unmute: () => dispatch(Actions.unmuteSelf()) }; } export default connect( null, mapDispatchToProps )(Index);