Ensure sidebar settings state is not reset on sidebar toggle

master
Torjus 2018-07-23 10:14:00 +02:00
parent 4431a40297
commit 0260186c65
2 changed files with 72 additions and 97 deletions

View File

@ -14,112 +14,75 @@ const modes = [ {
label : 'Filmstrip view' label : 'Filmstrip view'
} ]; } ];
class Settings extends React.Component const findOption = (options, value) => options.find((option) => option.value === value);
const Settings = ({
room, me, onToggleAdvancedMode, handleChangeWebcam,
handleChangeAudioDevice, handleChangeMode
}) =>
{ {
state = { let webcams;
selectedCamera : null, let webcamText;
selectedAudioDevice : null,
selectedMode : modes[0]
};
handleChangeWebcam = (webcam) => if (me.canChangeWebcam)
{ webcamText = 'Select camera';
this.props.handleChangeWebcam(webcam.value); else
webcamText = 'Unable to select camera';
this.setState({ if (me.webcamDevices)
selectedCamera : webcam webcams = Array.from(me.webcamDevices.values());
}); else
} webcams = [];
handleChangeAudioDevice = (device) => let audioDevices;
{ let audioDevicesText;
this.props.handleChangeAudioDevice(device.value);
this.setState({ if (me.canChangeAudioDevice)
selectedAudioDevice : device audioDevicesText = 'Select audio input device';
}); else
} audioDevicesText = 'Unable to select audio input device';
handleChangeMode = (mode) =>
{
this.setState({
selectedMode : mode
});
this.props.handleChangeMode(mode.value); if (me.audioDevices)
}; audioDevices = Array.from(me.audioDevices.values());
else
audioDevices = [];
render() return (
{ <div data-component='Settings'>
const { <div className='settings'>
room, <Dropdown
me, disabled={!me.canChangeWebcam}
onToggleAdvancedMode options={webcams}
} = this.props; value={findOption(webcams, me.selectedWebcam)}
onChange={(webcam) => handleChangeWebcam(webcam.value)}
placeholder={webcamText}
/>
<Dropdown
disabled={!me.canChangeAudioDevice}
options={audioDevices}
value={findOption(audioDevices, me.selectedAudioDevice)}
onChange={(device) => handleChangeAudioDevice(device.value)}
placeholder={audioDevicesText}
/>
let webcams; <input
let webcamText; id='room-mode'
type='checkbox'
checked={room.advancedMode}
onChange={onToggleAdvancedMode}
/>
<label htmlFor='room-mode'>Advanced mode</label>
if (me.canChangeWebcam) <Dropdown
webcamText = 'Select camera'; options={modes}
else value={findOption(modes, room.mode)}
webcamText = 'Unable to select camera'; onChange={(mode) => handleChangeMode(mode.value)}
/>
if (me.webcamDevices)
webcams = Array.from(me.webcamDevices.values());
else
webcams = [];
let audioDevices;
let audioDevicesText;
if (me.canChangeAudioDevice)
audioDevicesText = 'Select audio input device';
else
audioDevicesText = 'Unable to select audio input device';
if (me.audioDevices)
audioDevices = Array.from(me.audioDevices.values());
else
audioDevices = [];
return (
<div data-component='Settings'>
<div className='settings'>
<Dropdown
disabled={!me.canChangeWebcam}
options={webcams}
value={this.state.selectedCamera}
onChange={this.handleChangeWebcam}
placeholder={webcamText}
/>
<Dropdown
disabled={!me.canChangeAudioDevice}
options={audioDevices}
value={this.state.selectedAudioDevice}
onChange={this.handleChangeAudioDevice}
placeholder={audioDevicesText}
/>
<input
id='room-mode'
type='checkbox'
checked={room.advancedMode}
onChange={onToggleAdvancedMode}
/>
<label htmlFor='room-mode'>Advanced mode</label>
<Dropdown
options={modes}
value={this.state.selectedMode}
onChange={this.handleChangeMode}
/>
</div>
</div> </div>
); </div>
} );
} };
Settings.propTypes = Settings.propTypes =
{ {

View File

@ -22,7 +22,9 @@ const initialState =
raiseHand : false, raiseHand : false,
raiseHandInProgress : false, raiseHandInProgress : false,
restartIceInProgress : false, restartIceInProgress : false,
picture : null picture : null,
selectedWebcam : null,
selectedAudioDevice : null
}; };
const me = (state = initialState, action) => const me = (state = initialState, action) =>
@ -49,6 +51,16 @@ const me = (state = initialState, action) =>
}; };
} }
case 'CHANGE_WEBCAM':
{
return { ...state, selectedWebcam: action.payload.deviceId };
}
case 'CHANGE_AUDIO_DEVICE':
{
return { ...state, selectedAudioDevice: action.payload.deviceId };
}
case 'SET_MEDIA_CAPABILITIES': case 'SET_MEDIA_CAPABILITIES':
{ {
const { canSendMic, canSendWebcam } = action.payload; const { canSendMic, canSendWebcam } = action.payload;