@ -1,10 +1,12 @@
/* @flow */
import _ from 'lodash' ;
import React , { Component } from 'react' ;
import { connect } from 'react-redux' ;
import { Toolbox } from '../../toolbox' ;
import { setFilmstripHovered } from '../actions' ;
import { shouldRemoteVideosBeVisible } from '../functions' ;
/ * *
@ -14,19 +16,68 @@ import { shouldRemoteVideosBeVisible } from '../functions';
* @ extends Component
* /
class Filmstrip extends Component {
_isHovered : boolean ;
_notifyOfHoveredStateUpdate : Function ;
_onMouseOut : Function ;
_onMouseOver : Function ;
/ * *
* { @ code Filmstrip } component ' s property types .
*
* @ static
* /
static propTypes = {
/ * *
* Whether or not remote videos are currently being hovered over .
* /
_hovered : React . PropTypes . bool ,
/ * *
* Whether or not the remote videos should be visible . Will toggle
* a class for hiding the videos .
* /
_remoteVideosVisible : React . PropTypes . bool ,
/ * *
* Updates the redux store with filmstrip hover changes .
* /
dispatch : React . PropTypes . func ,
/ * *
* Whether or not the toolbox should be displayed within the filmstrip .
* /
displayToolbox : React . PropTypes . bool
} ;
/ * *
* Initializes a new { @ code Filmstrip } instance .
*
* @ param { Object } props - The read - only properties with which the new
* instance is to be initialized .
* /
constructor ( props ) {
super ( props ) ;
// Debounce the method for dispatching the new filmstrip handled state
// so that it does not get called with each mouse movement event. This
// also works around an issue where mouseout and then a mouseover event
// is fired when hovering over remote thumbnails, which are not yet in
// react.
this . _notifyOfHoveredStateUpdate
= _ . debounce ( this . _notifyOfHoveredStateUpdate , 100 ) ;
// Cache the current hovered state for _updateHoveredState to always
// send the last known hovered state.
this . _isHovered = false ;
// Bind event handlers so they are only bound once for every instance.
this . _onMouseOver = this . _onMouseOver . bind ( this ) ;
this . _onMouseOut = this . _onMouseOut . bind ( this ) ;
}
/ * *
* Implements React ' s { @ link Component # render ( ) } .
*
@ -54,7 +105,9 @@ class Filmstrip extends Component {
id = 'remoteVideos' >
< div
className = 'filmstrip__videos'
id = 'filmstripLocalVideo' / >
id = 'filmstripLocalVideo'
onMouseOut = { this . _onMouseOut }
onMouseOver = { this . _onMouseOver } / >
< div
className = 'filmstrip__videos'
id = 'filmstripRemoteVideos' >
@ -65,7 +118,9 @@ class Filmstrip extends Component {
* / }
< div
className = 'remote-videos-container'
id = 'filmstripRemoteVideosContainer' / >
id = 'filmstripRemoteVideosContainer'
onMouseOut = { this . _onMouseOut }
onMouseOver = { this . _onMouseOver } / >
< / d i v >
< audio
id = 'userJoined'
@ -79,6 +134,43 @@ class Filmstrip extends Component {
< / d i v >
) ;
}
/ * *
* If the current hover state does not match the known hover state in redux ,
* dispatch an action to update the known hover state in redux .
*
* @ private
* @ returns { void }
* /
_notifyOfHoveredStateUpdate ( ) {
if ( this . props . _hovered !== this . _isHovered ) {
this . props . dispatch ( setFilmstripHovered ( this . _isHovered ) ) ;
}
}
/ * *
* Updates the currently known mouseover state and attempt to dispatch an
* update of the known hover state in redux .
*
* @ private
* @ returns { void }
* /
_onMouseOut ( ) {
this . _isHovered = false ;
this . _notifyOfHoveredStateUpdate ( ) ;
}
/ * *
* Updates the currently known mouseover state and attempt to dispatch an
* update of the known hover state in redux .
*
* @ private
* @ returns { void }
* /
_onMouseOver ( ) {
this . _isHovered = true ;
this . _notifyOfHoveredStateUpdate ( ) ;
}
}
/ * *
@ -87,11 +179,13 @@ class Filmstrip extends Component {
* @ param { Object } state - The Redux state .
* @ private
* @ returns { {
* _hovered : boolean ,
* _remoteVideosVisible : boolean
* } }
* /
function _mapStateToProps ( state ) {
return {
_hovered : state [ 'features/filmstrip' ] . hovered ,
_remoteVideosVisible : shouldRemoteVideosBeVisible ( state )
} ;
}