Add mode switch (democratic, filmstrip) to settings

master
Torjus 2018-07-20 10:49:03 +02:00
parent 0c3eb4f154
commit bab4f420fd
6 changed files with 70 additions and 36 deletions

View File

@ -2,7 +2,6 @@ import React, { Component } from 'react';
import PropTypes from 'prop-types'; import PropTypes from 'prop-types';
import { connect } from 'react-redux'; import { connect } from 'react-redux';
import classnames from 'classnames'; import classnames from 'classnames';
import * as appPropTypes from './appPropTypes';
import Peer from './Peer'; import Peer from './Peer';
class Filmstrip extends Component class Filmstrip extends Component
@ -65,7 +64,7 @@ class Filmstrip extends Component
Filmstrip.propTypes = { Filmstrip.propTypes = {
activeSpeakerName : PropTypes.string, activeSpeakerName : PropTypes.string,
advancedMode : PropTypes.bool, advancedMode : PropTypes.bool,
peers : appPropTypes.peers peers : PropTypes.object.isRequired
}; };
const mapStateToProps = (state) => const mapStateToProps = (state) =>

View File

@ -14,14 +14,22 @@ class Peers extends React.Component
constructor(props) constructor(props)
{ {
super(props); super(props);
this.state = { this.state = {
peerWidth : 400, peerWidth : 400,
peerHeight : 300 peerHeight : 300
}; };
this.peersRef = React.createRef();
} }
updateDimensions = () => updateDimensions = () =>
{ {
if (!this.peersRef.current)
{
return;
}
const n = this.props.boxes; const n = this.props.boxes;
if (n === 0) if (n === 0)
@ -29,8 +37,8 @@ class Peers extends React.Component
return; return;
} }
const width = this.refs.peers.clientWidth; const width = this.peersRef.current.clientWidth;
const height = this.refs.peers.clientHeight; const height = this.peersRef.current.clientHeight;
let x, y, space; let x, y, space;
@ -64,7 +72,7 @@ class Peers extends React.Component
window.addEventListener('resize', this.updateDimensions); window.addEventListener('resize', this.updateDimensions);
const observer = new ResizeObserver(this.updateDimensions); const observer = new ResizeObserver(this.updateDimensions);
observer.observe(this.refs.peers); observer.observe(this.peersRef.current);
} }
componentWillUnmount() componentWillUnmount()
@ -92,7 +100,7 @@ class Peers extends React.Component
}; };
return ( return (
<div data-component='Peers' ref='peers'> <div data-component='Peers' ref={this.peersRef}>
{ {
peers.map((peer) => peers.map((peer) =>
{ {

View File

@ -65,6 +65,11 @@ class Room extends React.Component
onRoomLinkCopy onRoomLinkCopy
} = this.props; } = this.props;
const View = {
filmstrip : Filmstrip,
democratic : Peers
}[room.mode];
return ( return (
<Appear duration={300}> <Appear duration={300}>
<div data-component='Room'> <div data-component='Room'>
@ -122,12 +127,7 @@ class Room extends React.Component
</div> </div>
</div> </div>
<Filmstrip advancedMode={room.advancedMode} /> <View advancedMode={room.advancedMode} />
{false && (
<Peers
advancedMode={room.advancedMode}
/>
)}
<Draggable handle='.me-container' bounds='body' cancel='.display-name'> <Draggable handle='.me-container' bounds='body' cancel='.display-name'>
<div <div

View File

@ -6,31 +6,49 @@ import * as stateActions from '../redux/stateActions';
import PropTypes from 'prop-types'; import PropTypes from 'prop-types';
import Dropdown from 'react-dropdown'; import Dropdown from 'react-dropdown';
const modes = [ {
value : 'democratic',
label : 'Democratic view'
}, {
value : 'filmstrip',
label : 'Filmstrip view'
} ];
class Settings extends React.Component class Settings extends React.Component
{ {
state = { state = {
selectedCamera: null, selectedCamera : null,
selectedAudioDevice: null selectedAudioDevice : null,
selectedMode : modes[0]
}; };
handleChangeWebcam = (webcam) => handleChangeWebcam = (webcam) =>
{ {
this.props.handleChangeWebcam(webcam); this.props.handleChangeWebcam(webcam.value);
this.setState({ this.setState({
selectedCamera: webcam selectedCamera : webcam
}); });
} }
handleChangeAudioDevice = (device) => handleChangeAudioDevice = (device) =>
{ {
this.props.handleChangeAudioDevice(device); this.props.handleChangeAudioDevice(device.value);
this.setState({ this.setState({
selectedAudioDevice: device selectedAudioDevice : device
}); });
} }
handleChangeMode = (mode) =>
{
this.setState({
selectedMode : mode
});
this.props.handleChangeMode(mode.value);
};
render() render()
{ {
const { const {
@ -75,6 +93,7 @@ class Settings extends React.Component
onChange={this.handleChangeWebcam} onChange={this.handleChangeWebcam}
placeholder={webcamText} placeholder={webcamText}
/> />
<Dropdown <Dropdown
disabled={!me.canChangeAudioDevice} disabled={!me.canChangeAudioDevice}
options={audioDevices} options={audioDevices}
@ -82,6 +101,7 @@ class Settings extends React.Component
onChange={this.handleChangeAudioDevice} onChange={this.handleChangeAudioDevice}
placeholder={audioDevicesText} placeholder={audioDevicesText}
/> />
<input <input
id='room-mode' id='room-mode'
type='checkbox' type='checkbox'
@ -89,6 +109,12 @@ class Settings extends React.Component
onChange={onToggleAdvancedMode} onChange={onToggleAdvancedMode}
/> />
<label htmlFor='room-mode'>Advanced mode</label> <label htmlFor='room-mode'>Advanced mode</label>
<Dropdown
options={modes}
value={this.state.selectedMode}
onChange={this.handleChangeMode}
/>
</div> </div>
</div> </div>
); );
@ -101,7 +127,8 @@ Settings.propTypes =
room : appPropTypes.Room.isRequired, room : appPropTypes.Room.isRequired,
handleChangeWebcam : PropTypes.func.isRequired, handleChangeWebcam : PropTypes.func.isRequired,
handleChangeAudioDevice : PropTypes.func.isRequired, handleChangeAudioDevice : PropTypes.func.isRequired,
onToggleAdvancedMode : PropTypes.func.isRequired onToggleAdvancedMode : PropTypes.func.isRequired,
handleChangeMode : PropTypes.func.isRequired
}; };
const mapStateToProps = (state) => const mapStateToProps = (state) =>
@ -112,22 +139,11 @@ const mapStateToProps = (state) =>
}; };
}; };
const mapDispatchToProps = (dispatch) => const mapDispatchToProps = {
{ handleChangeWebcam : requestActions.changeWebcam,
return { handleChangeAudioDevice : requestActions.changeAudioDevice,
handleChangeWebcam : (device) => onToggleAdvancedMode : stateActions.toggleAdvancedMode,
{ handleChangeMode : stateActions.setDisplayMode
dispatch(requestActions.changeWebcam(device.value));
},
handleChangeAudioDevice : (device) =>
{
dispatch(requestActions.changeAudioDevice(device.value));
},
onToggleAdvancedMode : () =>
{
dispatch(stateActions.toggleAdvancedMode());
}
};
}; };
const SettingsContainer = connect( const SettingsContainer = connect(

View File

@ -6,7 +6,8 @@ const initialState =
showSettings : false, showSettings : false,
advancedMode : false, advancedMode : false,
fullScreenConsumer : null, // ConsumerID fullScreenConsumer : null, // ConsumerID
toolbarsVisible : true toolbarsVisible : true,
mode : 'democratic'
}; };
const room = (state = initialState, action) => const room = (state = initialState, action) =>
@ -65,6 +66,10 @@ const room = (state = initialState, action) =>
return { ...state, toolbarsVisible }; return { ...state, toolbarsVisible };
} }
case 'SET_DISPLAY_MODE':
return { ...state, mode: action.payload.mode };
default: default:
return state; return state;
} }

View File

@ -93,6 +93,12 @@ export const toggleAdvancedMode = () =>
}; };
}; };
export const setDisplayMode = (mode) =>
({
type : 'SET_DISPLAY_MODE',
payload : { mode }
});
export const setAudioOnlyState = (enabled) => export const setAudioOnlyState = (enabled) =>
{ {
return { return {