Add global fullscreen toggle button

master
Torjus 2018-07-19 10:01:34 +02:00
parent 88f59214e6
commit a26cf2fa14
4 changed files with 145 additions and 77 deletions

View File

@ -1,96 +1,147 @@
import React from 'react'; 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 * as appPropTypes from './appPropTypes';
import * as requestActions from '../redux/requestActions'; import * as requestActions from '../redux/requestActions';
import fscreen from 'fscreen';
const Sidebar = ({ class Sidebar extends Component
toolbarsVisible, me, screenProducer, onLogin, onShareScreen,
onUnShareScreen, onNeedExtension, onLeaveMeeting
}) =>
{ {
let screenState; state = {
let screenTip; fullscreen: false
};
if (me.needExtension) handleToggleFullscreen = () =>
{ {
screenState = 'need-extension'; if (fscreen.fullscreenElement) {
screenTip = 'Install screen sharing extension'; fscreen.exitFullscreen();
} } else {
else if (!me.canShareScreen) fscreen.requestFullscreen(document.documentElement);
}
};
handleFullscreenChange = () => {
this.setState({
fullscreen: fscreen.fullscreenElement !== null
})
};
componentDidMount()
{ {
screenState = 'unsupported'; if (fscreen.fullscreenEnabled)
screenTip = 'Screen sharing not supported'; {
} fscreen.addEventListener('fullscreenchange', this.handleFullscreenChange);
else if (screenProducer) }
{
screenState = 'on';
screenTip = 'Stop screen sharing';
}
else
{
screenState = 'off';
screenTip = 'Start screen sharing';
} }
return ( componentWillUnmount()
<div className={classnames('sidebar room-controls', { {
'visible' : toolbarsVisible if (fscreen.fullscreenEnabled)
})} {
> fscreen.removeEventListener('fullscreenchange', this.handleFullscreenChange);
<div }
className={classnames('button', 'screen', screenState)} }
data-tip={screenTip}
data-type='dark' render() {
onClick={() => const {
{ toolbarsVisible, me, screenProducer, onLogin, onShareScreen,
switch (screenState) onUnShareScreen, onNeedExtension, onLeaveMeeting
{ } = this.props;
case 'on':
{ let screenState;
onUnShareScreen(); let screenTip;
break;
} if (me.needExtension)
case 'off': {
{ screenState = 'need-extension';
onShareScreen(); screenTip = 'Install screen sharing extension';
break; }
} else if (!me.canShareScreen)
case 'need-extension': {
{ screenState = 'unsupported';
onNeedExtension(); screenTip = 'Screen sharing not supported';
break; }
} else if (screenProducer)
default: {
{ screenState = 'on';
break; screenTip = 'Stop screen sharing';
} }
} else
}} {
/> screenState = 'off';
screenTip = 'Start screen sharing';
}
return (
<div className={classnames('sidebar room-controls', {
'visible' : toolbarsVisible
})}
>
{fscreen.fullscreenEnabled && (
<div
className={classnames('button', 'fullscreen', {
on: this.state.fullscreen
})}
onClick={this.handleToggleFullscreen}
data-tip='Fullscreen'
data-type='dark'
/>
)}
{me.loginEnabled ?
<div <div
className={classnames('button', 'login', 'off', { className={classnames('button', 'screen', screenState)}
disabled : me.loginInProgress data-tip={screenTip}
})}
data-tip='Login'
data-type='dark' data-type='dark'
onClick={() => onLogin()} onClick={() =>
{
switch (screenState)
{
case 'on':
{
onUnShareScreen();
break;
}
case 'off':
{
onShareScreen();
break;
}
case 'need-extension':
{
onNeedExtension();
break;
}
default:
{
break;
}
}
}}
/> />
:null
} {me.loginEnabled ?
<div
<div className={classnames('button', 'login', 'off', {
className={classnames('button', 'leave-meeting')} disabled : me.loginInProgress
data-tip='Leave meeting' })}
data-type='dark' data-tip='Login'
onClick={() => onLeaveMeeting()} data-type='dark'
/> onClick={() => onLogin()}
</div> />
); :null
}; }
<div
className={classnames('button', 'leave-meeting')}
data-tip='Leave meeting'
data-type='dark'
onClick={() => onLeaveMeeting()}
/>
</div>
);
}
}
Sidebar.propTypes = { Sidebar.propTypes = {
toolbarsVisible : PropTypes.bool.isRequired, toolbarsVisible : PropTypes.bool.isRequired,

View File

@ -0,0 +1,4 @@
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="#FFF">
<path d="M0 0h24v24H0z" fill="none"/>
<path d="M5 16h3v3h2v-5H5v2zm3-8H5v2h5V5H8v3zm6 11h2v-3h3v-2h-5v5zm2-11V5h-2v5h5V8h-3z"/>
</svg>

After

Width:  |  Height:  |  Size: 239 B

View File

@ -0,0 +1,4 @@
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="#FFF">
<path d="M0 0h24v24H0z" fill="none" />
<path d="M7 14H5v5h5v-2H7v-3zm-2-4h2V7h3V5H5v5zm12 7h-3v2h5v-5h-2v3zM14 5v2h3v3h2V5h-5z" />
</svg>

After

Width:  |  Height:  |  Size: 242 B

View File

@ -232,6 +232,14 @@
} }
} }
&.fullscreen {
background-image: url('/resources/images/icon_fullscreen_white.svg');
&.on {
background-image: url('/resources/images/icon_fullscreen_exit_white.svg');
}
}
&.screen { &.screen {
&.on { &.on {
background-image: url('/resources/images/no-share-screen-black.svg'); background-image: url('/resources/images/no-share-screen-black.svg');
@ -250,6 +258,7 @@
background-image: url('/resources/images/share-screen-extension.svg'); background-image: url('/resources/images/share-screen-extension.svg');
} }
} }
&.raise-hand { &.raise-hand {
background-image: url('/resources/images/icon-hand-white.svg'); background-image: url('/resources/images/icon-hand-white.svg');