diff --git a/conference.js b/conference.js index cf1b00388..0db7b7cdc 100644 --- a/conference.js +++ b/conference.js @@ -62,6 +62,7 @@ import { getLocationContextRoot } from './react/features/base/util'; import { statsEmitter } from './react/features/connection-indicator'; import { showDesktopPicker } from './react/features/desktop-picker'; import { maybeOpenFeedbackDialog } from './react/features/feedback'; +import { setFilmstripRemoteVideosVisibility } from './react/features/filmstrip'; import { mediaPermissionPromptVisibilityChanged, suspendDetected @@ -2176,8 +2177,9 @@ export default { || remoteVideosCount > 1 || remoteParticipantsCount !== remoteVideosCount; - APP.UI.setRemoteThumbnailsVisibility( - Boolean(shouldShowRemoteThumbnails)); + APP.store.dispatch( + setFilmstripRemoteVideosVisibility( + Boolean(shouldShowRemoteThumbnails))); } }, /** diff --git a/modules/UI/UI.js b/modules/UI/UI.js index 70cdf022f..59ce0d02e 100644 --- a/modules/UI/UI.js +++ b/modules/UI/UI.js @@ -290,10 +290,6 @@ UI.start = function () { SideContainerToggler.init(eventEmitter); Filmstrip.init(eventEmitter); - // By default start with remote videos hidden and rely on other logic to - // make them visible. - UI.setRemoteThumbnailsVisibility(false); - VideoLayout.init(eventEmitter); if (!interfaceConfig.filmStripOnly) { VideoLayout.initLargeVideo(); @@ -1220,16 +1216,6 @@ UI.onUserFeaturesChanged = user => VideoLayout.onUserFeaturesChanged(user); */ UI.getRemoteVideosCount = () => VideoLayout.getRemoteVideosCount(); -/** - * Makes remote thumbnail videos visible or not visible. - * - * @param {boolean} shouldHide - True if remote thumbnails should be hidden, - * false f they should be visible. - * @returns {void} - */ -UI.setRemoteThumbnailsVisibility - = shouldHide => Filmstrip.setRemoteVideoVisibility(shouldHide); - /** * Sets the remote control active status for a remote participant. * diff --git a/modules/UI/videolayout/Filmstrip.js b/modules/UI/videolayout/Filmstrip.js index 0ff8345e2..05754cf2a 100644 --- a/modules/UI/videolayout/Filmstrip.js +++ b/modules/UI/videolayout/Filmstrip.js @@ -1,9 +1,6 @@ -/* global $, APP, config, JitsiMeetJS, interfaceConfig */ +/* global $, APP, JitsiMeetJS, interfaceConfig */ -import { - setFilmstripRemoteVideosVisibility, - setFilmstripVisibility -} from '../../../react/features/filmstrip'; +import { setFilmstripVisibility } from '../../../react/features/filmstrip'; import UIEvents from "../../../service/UI/UIEvents"; import UIUtil from "../util/UIUtil"; @@ -30,26 +27,6 @@ const Filmstrip = { } }, - /** - * Sets a class on the remote videos container for CSS to adjust visibility - * of the remote videos. Will no-op if config.debug is truthy, as should be - * the case with torture tests. - * - * @param {boolean} shouldHide - True if remote videos should be hidden, - * false if they should be visible. - * @returns {void} - */ - setRemoteVideoVisibility(shouldShow) { - // Allow disabling on 1-on-1 UI mode. Used by torture tests. - if (config.disable1On1Mode) { - return; - } - - APP.store.dispatch(setFilmstripRemoteVideosVisibility(shouldShow)); - $(`.${this.filmstripContainerClassName}`) - .toggleClass('hide-videos', !shouldShow); - }, - /** * Initializes the filmstrip toolbar. */ diff --git a/react/features/filmstrip/components/Filmstrip.web.js b/react/features/filmstrip/components/Filmstrip.web.js index 0fe94f4c1..9c345ae56 100644 --- a/react/features/filmstrip/components/Filmstrip.web.js +++ b/react/features/filmstrip/components/Filmstrip.web.js @@ -1,6 +1,7 @@ /* @flow */ import React, { Component } from 'react'; +import { connect } from 'react-redux'; import { Toolbox } from '../../toolbox'; @@ -10,8 +11,14 @@ import { Toolbox } from '../../toolbox'; * * @extends Component */ -export default class Filmstrip extends Component { +class Filmstrip extends Component { static propTypes = { + /** + * Whether or not the remote videos should be visible. Will toggle + * a class for hiding the videos. + */ + _remoteVideosVisible: React.PropTypes.bool, + /** * Whether or not the toolbox should be displayed within the filmstrip. */ @@ -25,8 +32,20 @@ export default class Filmstrip extends Component { * @returns {ReactElement} */ render() { + /** + * Note: Appending of {@code RemoteVideo} views is handled through + * VideoLayout. The views do not get blown away on render() because + * ReactDOMComponent is only aware of the given JSX and not new appended + * DOM. As such, when updateDOMProperties gets called, only attributes + * will get updated without replacing the DOM. If the known DOM gets + * modified, then the views will get blown away. + */ + + const filmstripClassNames = `filmstrip ${this.props._remoteVideosVisible + ? '' : 'hide-videos'}`; + return ( -