Added toggle for advanced mode. Show more info and diagnostics.
parent
cee74f9b29
commit
894009aa6a
|
|
@ -29,6 +29,7 @@ class Me extends React.Component
|
||||||
const {
|
const {
|
||||||
connected,
|
connected,
|
||||||
me,
|
me,
|
||||||
|
advancedMode,
|
||||||
micProducer,
|
micProducer,
|
||||||
webcamProducer,
|
webcamProducer,
|
||||||
onChangeDisplayName,
|
onChangeDisplayName,
|
||||||
|
|
@ -104,6 +105,7 @@ class Me extends React.Component
|
||||||
|
|
||||||
<PeerView
|
<PeerView
|
||||||
isMe
|
isMe
|
||||||
|
advancedMode={advancedMode}
|
||||||
peer={me}
|
peer={me}
|
||||||
audioTrack={micProducer ? micProducer.track : null}
|
audioTrack={micProducer ? micProducer.track : null}
|
||||||
videoTrack={webcamProducer ? webcamProducer.track : null}
|
videoTrack={webcamProducer ? webcamProducer.track : null}
|
||||||
|
|
@ -159,6 +161,7 @@ class Me extends React.Component
|
||||||
Me.propTypes =
|
Me.propTypes =
|
||||||
{
|
{
|
||||||
connected : PropTypes.bool.isRequired,
|
connected : PropTypes.bool.isRequired,
|
||||||
|
advancedMode : PropTypes.bool,
|
||||||
me : appPropTypes.Me.isRequired,
|
me : appPropTypes.Me.isRequired,
|
||||||
micProducer : appPropTypes.Producer,
|
micProducer : appPropTypes.Producer,
|
||||||
webcamProducer : appPropTypes.Producer,
|
webcamProducer : appPropTypes.Producer,
|
||||||
|
|
|
||||||
|
|
@ -9,6 +9,7 @@ import PeerView from './PeerView';
|
||||||
const Peer = (props) =>
|
const Peer = (props) =>
|
||||||
{
|
{
|
||||||
const {
|
const {
|
||||||
|
advancedMode,
|
||||||
peer,
|
peer,
|
||||||
micConsumer,
|
micConsumer,
|
||||||
webcamConsumer,
|
webcamConsumer,
|
||||||
|
|
@ -86,6 +87,7 @@ const Peer = (props) =>
|
||||||
}
|
}
|
||||||
|
|
||||||
<PeerView
|
<PeerView
|
||||||
|
advancedMode={advancedMode}
|
||||||
peer={peer}
|
peer={peer}
|
||||||
audioTrack={micConsumer ? micConsumer.track : null}
|
audioTrack={micConsumer ? micConsumer.track : null}
|
||||||
videoTrack={webcamConsumer ? webcamConsumer.track : null}
|
videoTrack={webcamConsumer ? webcamConsumer.track : null}
|
||||||
|
|
@ -104,6 +106,7 @@ const Peer = (props) =>
|
||||||
|
|
||||||
Peer.propTypes =
|
Peer.propTypes =
|
||||||
{
|
{
|
||||||
|
advancedMode : PropTypes.bool,
|
||||||
peer : appPropTypes.Peer.isRequired,
|
peer : appPropTypes.Peer.isRequired,
|
||||||
micConsumer : appPropTypes.Consumer,
|
micConsumer : appPropTypes.Consumer,
|
||||||
webcamConsumer : appPropTypes.Consumer,
|
webcamConsumer : appPropTypes.Consumer,
|
||||||
|
|
|
||||||
|
|
@ -45,6 +45,7 @@ export default class PeerView extends React.Component
|
||||||
{
|
{
|
||||||
const {
|
const {
|
||||||
isMe,
|
isMe,
|
||||||
|
advancedMode,
|
||||||
peer,
|
peer,
|
||||||
videoVisible,
|
videoVisible,
|
||||||
videoProfile,
|
videoProfile,
|
||||||
|
|
@ -67,6 +68,7 @@ export default class PeerView extends React.Component
|
||||||
return (
|
return (
|
||||||
<div data-component='PeerView'>
|
<div data-component='PeerView'>
|
||||||
<div className='info'>
|
<div className='info'>
|
||||||
|
{advancedMode ?
|
||||||
<div className={classnames('media', { 'is-me': isMe })}>
|
<div className={classnames('media', { 'is-me': isMe })}>
|
||||||
{screenVisible ?
|
{screenVisible ?
|
||||||
<div className='box'>
|
<div className='box'>
|
||||||
|
|
@ -103,6 +105,8 @@ export default class PeerView extends React.Component
|
||||||
</div>
|
</div>
|
||||||
}
|
}
|
||||||
</div>
|
</div>
|
||||||
|
:null
|
||||||
|
}
|
||||||
|
|
||||||
<div className={classnames('peer', { 'is-me': isMe })}>
|
<div className={classnames('peer', { 'is-me': isMe })}>
|
||||||
{isMe ?
|
{isMe ?
|
||||||
|
|
@ -126,6 +130,7 @@ export default class PeerView extends React.Component
|
||||||
</span>
|
</span>
|
||||||
}
|
}
|
||||||
|
|
||||||
|
{advancedMode ?
|
||||||
<div className='row'>
|
<div className='row'>
|
||||||
<span
|
<span
|
||||||
className={classnames('device-icon', peer.device.flag)}
|
className={classnames('device-icon', peer.device.flag)}
|
||||||
|
|
@ -134,6 +139,8 @@ export default class PeerView extends React.Component
|
||||||
{peer.device.name} {Math.floor(peer.device.version) || null}
|
{peer.device.name} {Math.floor(peer.device.version) || null}
|
||||||
</span>
|
</span>
|
||||||
</div>
|
</div>
|
||||||
|
:null
|
||||||
|
}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
@ -308,6 +315,7 @@ export default class PeerView extends React.Component
|
||||||
PeerView.propTypes =
|
PeerView.propTypes =
|
||||||
{
|
{
|
||||||
isMe : PropTypes.bool,
|
isMe : PropTypes.bool,
|
||||||
|
advancedMode : PropTypes.bool,
|
||||||
peer : PropTypes.oneOfType(
|
peer : PropTypes.oneOfType(
|
||||||
[ appPropTypes.Me, appPropTypes.Peer ]).isRequired,
|
[ appPropTypes.Me, appPropTypes.Peer ]).isRequired,
|
||||||
audioTrack : PropTypes.any,
|
audioTrack : PropTypes.any,
|
||||||
|
|
|
||||||
|
|
@ -8,9 +8,9 @@ import Peer from './Peer';
|
||||||
|
|
||||||
class Peers extends React.Component
|
class Peers extends React.Component
|
||||||
{
|
{
|
||||||
constructor()
|
constructor(props)
|
||||||
{
|
{
|
||||||
super();
|
super(props);
|
||||||
this.state = {
|
this.state = {
|
||||||
peerWidth : 400,
|
peerWidth : 400,
|
||||||
peerHeight : 300,
|
peerHeight : 300,
|
||||||
|
|
@ -81,6 +81,7 @@ class Peers extends React.Component
|
||||||
render()
|
render()
|
||||||
{
|
{
|
||||||
const {
|
const {
|
||||||
|
advancedMode,
|
||||||
activeSpeakerName,
|
activeSpeakerName,
|
||||||
peers
|
peers
|
||||||
} = this.props;
|
} = this.props;
|
||||||
|
|
@ -103,7 +104,10 @@ class Peers extends React.Component
|
||||||
'active-speaker' : peer.name === activeSpeakerName
|
'active-speaker' : peer.name === activeSpeakerName
|
||||||
})} style={style}
|
})} style={style}
|
||||||
>
|
>
|
||||||
<Peer name={peer.name} />
|
<Peer
|
||||||
|
advancedMode={advancedMode}
|
||||||
|
name={peer.name}
|
||||||
|
/>
|
||||||
</div>
|
</div>
|
||||||
</Appear>
|
</Appear>
|
||||||
);
|
);
|
||||||
|
|
@ -116,6 +120,7 @@ class Peers extends React.Component
|
||||||
|
|
||||||
Peers.propTypes =
|
Peers.propTypes =
|
||||||
{
|
{
|
||||||
|
advancedMode : PropTypes.bool,
|
||||||
peers : PropTypes.arrayOf(appPropTypes.Peer).isRequired,
|
peers : PropTypes.arrayOf(appPropTypes.Peer).isRequired,
|
||||||
activeSpeakerName : PropTypes.string
|
activeSpeakerName : PropTypes.string
|
||||||
};
|
};
|
||||||
|
|
|
||||||
|
|
@ -99,14 +99,18 @@ class Room extends React.Component
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<Peers />
|
<Peers
|
||||||
|
advancedMode={room.advancedMode}
|
||||||
|
/>
|
||||||
|
|
||||||
<div
|
<div
|
||||||
className={classnames('me-container', {
|
className={classnames('me-container', {
|
||||||
'active-speaker' : amActiveSpeaker
|
'active-speaker' : amActiveSpeaker
|
||||||
})}
|
})}
|
||||||
>
|
>
|
||||||
<Me />
|
<Me
|
||||||
|
advancedMode={room.advancedMode}
|
||||||
|
/>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div className='sidebar'>
|
<div className='sidebar'>
|
||||||
|
|
|
||||||
|
|
@ -2,6 +2,7 @@ import React from 'react';
|
||||||
import { connect } from 'react-redux';
|
import { connect } from 'react-redux';
|
||||||
import * as appPropTypes from './appPropTypes';
|
import * as appPropTypes from './appPropTypes';
|
||||||
import * as requestActions from '../redux/requestActions';
|
import * as requestActions from '../redux/requestActions';
|
||||||
|
import * as stateActions from '../redux/stateActions';
|
||||||
import PropTypes from 'prop-types';
|
import PropTypes from 'prop-types';
|
||||||
import { Appear } from './transitions';
|
import { Appear } from './transitions';
|
||||||
import Dropdown from 'react-dropdown';
|
import Dropdown from 'react-dropdown';
|
||||||
|
|
@ -20,7 +21,8 @@ class Settings extends React.Component
|
||||||
me,
|
me,
|
||||||
handleChangeWebcam,
|
handleChangeWebcam,
|
||||||
handleChangeAudioDevice,
|
handleChangeAudioDevice,
|
||||||
onToggleSettings
|
onToggleSettings,
|
||||||
|
onToggleAdvancedMode
|
||||||
} = this.props;
|
} = this.props;
|
||||||
|
|
||||||
if (!room.showSettings)
|
if (!room.showSettings)
|
||||||
|
|
@ -72,6 +74,12 @@ class Settings extends React.Component
|
||||||
onChange={handleChangeAudioDevice}
|
onChange={handleChangeAudioDevice}
|
||||||
placeholder={audioDevicesText}
|
placeholder={audioDevicesText}
|
||||||
/>
|
/>
|
||||||
|
<input
|
||||||
|
type='checkbox'
|
||||||
|
defaultChecked={room.advancedMode}
|
||||||
|
onChange={onToggleAdvancedMode}
|
||||||
|
/>
|
||||||
|
<span>Advanced mode</span>
|
||||||
</div>
|
</div>
|
||||||
<div className='footer'>
|
<div className='footer'>
|
||||||
<span
|
<span
|
||||||
|
|
@ -94,7 +102,8 @@ Settings.propTypes =
|
||||||
room : appPropTypes.Room.isRequired,
|
room : appPropTypes.Room.isRequired,
|
||||||
onToggleSettings : PropTypes.func.isRequired,
|
onToggleSettings : PropTypes.func.isRequired,
|
||||||
handleChangeWebcam : PropTypes.func.isRequired,
|
handleChangeWebcam : PropTypes.func.isRequired,
|
||||||
handleChangeAudioDevice : PropTypes.func.isRequired
|
handleChangeAudioDevice : PropTypes.func.isRequired,
|
||||||
|
onToggleAdvancedMode : PropTypes.func.isRequired
|
||||||
};
|
};
|
||||||
|
|
||||||
const mapStateToProps = (state) =>
|
const mapStateToProps = (state) =>
|
||||||
|
|
@ -115,6 +124,10 @@ const mapDispatchToProps = (dispatch) =>
|
||||||
handleChangeAudioDevice : (device) =>
|
handleChangeAudioDevice : (device) =>
|
||||||
{
|
{
|
||||||
dispatch(requestActions.changeAudioDevice(device.value));
|
dispatch(requestActions.changeAudioDevice(device.value));
|
||||||
|
},
|
||||||
|
onToggleAdvancedMode : () =>
|
||||||
|
{
|
||||||
|
dispatch(stateActions.toggleAdvancedMode());
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
|
||||||
|
|
@ -3,9 +3,8 @@ const initialState =
|
||||||
url : null,
|
url : null,
|
||||||
state : 'new', // new/connecting/connected/disconnected/closed,
|
state : 'new', // new/connecting/connected/disconnected/closed,
|
||||||
activeSpeakerName : null,
|
activeSpeakerName : null,
|
||||||
peerHeight : 300,
|
showSettings : false,
|
||||||
peerWidth : 400,
|
advancedMode : false
|
||||||
showSettings : false
|
|
||||||
};
|
};
|
||||||
|
|
||||||
const room = (state = initialState, action) =>
|
const room = (state = initialState, action) =>
|
||||||
|
|
@ -36,13 +35,6 @@ const room = (state = initialState, action) =>
|
||||||
return { ...state, activeSpeakerName: peerName };
|
return { ...state, activeSpeakerName: peerName };
|
||||||
}
|
}
|
||||||
|
|
||||||
case 'SET_COMPONENT_SIZE':
|
|
||||||
{
|
|
||||||
const { peerWidth, peerHeight } = action.payload;
|
|
||||||
|
|
||||||
return { ...state, peerWidth: peerWidth, peerHeight: peerHeight };
|
|
||||||
}
|
|
||||||
|
|
||||||
case 'TOGGLE_SETTINGS':
|
case 'TOGGLE_SETTINGS':
|
||||||
{
|
{
|
||||||
const showSettings = !state.showSettings;
|
const showSettings = !state.showSettings;
|
||||||
|
|
@ -50,6 +42,13 @@ const room = (state = initialState, action) =>
|
||||||
return { ...state, showSettings };
|
return { ...state, showSettings };
|
||||||
}
|
}
|
||||||
|
|
||||||
|
case 'TOGGLE_ADVANCED_MODE':
|
||||||
|
{
|
||||||
|
const advancedMode = !state.advancedMode;
|
||||||
|
|
||||||
|
return { ...state, advancedMode };
|
||||||
|
}
|
||||||
|
|
||||||
default:
|
default:
|
||||||
return state;
|
return state;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -22,14 +22,6 @@ export const setRoomActiveSpeaker = (peerName) =>
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
export const onComponentResize = (peerWidth, peerHeight) =>
|
|
||||||
{
|
|
||||||
return {
|
|
||||||
type : 'SET_COMPONENT_SIZE',
|
|
||||||
payload : { peerWidth, peerHeight }
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
export const setMe = ({ peerName, displayName, displayNameSet, device }) =>
|
export const setMe = ({ peerName, displayName, displayNameSet, device }) =>
|
||||||
{
|
{
|
||||||
return {
|
return {
|
||||||
|
|
@ -94,6 +86,13 @@ export const setDisplayName = (displayName) =>
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
export const toggleAdvancedMode = () =>
|
||||||
|
{
|
||||||
|
return {
|
||||||
|
type : 'TOGGLE_ADVANCED_MODE'
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
export const setAudioOnlyState = (enabled) =>
|
export const setAudioOnlyState = (enabled) =>
|
||||||
{
|
{
|
||||||
return {
|
return {
|
||||||
|
|
|
||||||
|
|
@ -17,9 +17,9 @@
|
||||||
|
|
||||||
position: absolute;
|
position: absolute;
|
||||||
z-index: 5
|
z-index: 5
|
||||||
top: 0;
|
top: 0.6vmin;
|
||||||
|
left: 0.6vmin;
|
||||||
bottom: 0;
|
bottom: 0;
|
||||||
left: 0;
|
|
||||||
right: 0;
|
right: 0;
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
|
|
@ -31,8 +31,7 @@
|
||||||
flex-direction: row;
|
flex-direction: row;
|
||||||
|
|
||||||
> .box {
|
> .box {
|
||||||
margin: 4px;
|
padding: 0.4vmin;
|
||||||
padding: 2px 4px;
|
|
||||||
border-radius: 2px;
|
border-radius: 2px;
|
||||||
background-color: rgba(#000, 0.25);
|
background-color: rgba(#000, 0.25);
|
||||||
|
|
||||||
|
|
@ -55,15 +54,20 @@
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
justify-content: flex-end;
|
justify-content: flex-end;
|
||||||
|
position: absolute;
|
||||||
|
bottom: 0.6vmin;
|
||||||
|
left: 0;
|
||||||
|
border-radius: 2px;
|
||||||
|
background-color: rgba(#000, 0.25);
|
||||||
|
|
||||||
+desktop() {
|
+desktop() {
|
||||||
&.is-me {
|
&.is-me {
|
||||||
padding: 10px;
|
padding: 1vmin;
|
||||||
align-items: flex-start;
|
align-items: flex-start;
|
||||||
}
|
}
|
||||||
|
|
||||||
&:not(.is-me) {
|
&:not(.is-me) {
|
||||||
padding: 20px;
|
padding: 1vmin;
|
||||||
align-items: flex-start;
|
align-items: flex-start;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue