Added toggle for advanced mode. Show more info and diagnostics.

master
Håvar Aambø Fosstveit 2018-06-18 14:28:52 +02:00
parent cee74f9b29
commit 894009aa6a
9 changed files with 111 additions and 73 deletions

View File

@ -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,

View File

@ -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,

View File

@ -45,6 +45,7 @@ export default class PeerView extends React.Component
{ {
const { const {
isMe, isMe,
advancedMode,
peer, peer,
videoVisible, videoVisible,
videoProfile, videoProfile,
@ -67,42 +68,45 @@ export default class PeerView extends React.Component
return ( return (
<div data-component='PeerView'> <div data-component='PeerView'>
<div className='info'> <div className='info'>
<div className={classnames('media', { 'is-me': isMe })}> {advancedMode ?
{screenVisible ? <div className={classnames('media', { 'is-me': isMe })}>
<div className='box'> {screenVisible ?
{audioCodec ? <div className='box'>
<p className='codec'>{audioCodec}</p> {audioCodec ?
:null <p className='codec'>{audioCodec}</p>
} :null
}
{screenCodec ? {screenCodec ?
<p className='codec'>{screenCodec} {screenProfile}</p> <p className='codec'>{screenCodec} {screenProfile}</p>
:null :null
} }
{(screenVisible && screenWidth !== null) ? {(screenVisible && screenWidth !== null) ?
<p className='resolution'>{screenWidth}x{screenHeight}</p> <p className='resolution'>{screenWidth}x{screenHeight}</p>
:null :null
} }
</div> </div>
:<div className='box'> :<div className='box'>
{audioCodec ? {audioCodec ?
<p className='codec'>{audioCodec}</p> <p className='codec'>{audioCodec}</p>
:null :null
} }
{videoCodec ? {videoCodec ?
<p className='codec'>{videoCodec} {videoProfile}</p> <p className='codec'>{videoCodec} {videoProfile}</p>
:null :null
} }
{(videoVisible && videoWidth !== null) ? {(videoVisible && videoWidth !== null) ?
<p className='resolution'>{videoWidth}x{videoHeight}</p> <p className='resolution'>{videoWidth}x{videoHeight}</p>
:null :null
} }
</div> </div>
} }
</div> </div>
:null
}
<div className={classnames('peer', { 'is-me': isMe })}> <div className={classnames('peer', { 'is-me': isMe })}>
{isMe ? {isMe ?
@ -126,14 +130,17 @@ export default class PeerView extends React.Component
</span> </span>
} }
<div className='row'> {advancedMode ?
<span <div className='row'>
className={classnames('device-icon', peer.device.flag)} <span
/> className={classnames('device-icon', peer.device.flag)}
<span className='device-version'> />
{peer.device.name} {Math.floor(peer.device.version) || null} <span className='device-version'>
</span> {peer.device.name} {Math.floor(peer.device.version) || null}
</div> </span>
</div>
:null
}
</div> </div>
</div> </div>
@ -307,8 +314,9 @@ export default class PeerView extends React.Component
PeerView.propTypes = PeerView.propTypes =
{ {
isMe : PropTypes.bool, isMe : PropTypes.bool,
peer : PropTypes.oneOfType( advancedMode : PropTypes.bool,
peer : PropTypes.oneOfType(
[ appPropTypes.Me, appPropTypes.Peer ]).isRequired, [ appPropTypes.Me, appPropTypes.Peer ]).isRequired,
audioTrack : PropTypes.any, audioTrack : PropTypes.any,
videoTrack : PropTypes.any, videoTrack : PropTypes.any,

View File

@ -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
}; };

View File

@ -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'>

View File

@ -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());
} }
}; };
}; };

View File

@ -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;
} }

View File

@ -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 {

View File

@ -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;
} }
} }