From 962e65937871d5e0be5e72ff92fbfbb0f384be50 Mon Sep 17 00:00:00 2001
From: Oleksandr Zhurbenko <xaerok.od.ua@gmail.com>
Date: Sun, 7 Jan 2018 20:44:42 -0800
Subject: [PATCH] Switched the components from deprecated  method to

---
 .../imports/startup/client/base.jsx           |  6 +-
 .../imports/ui/components/about/container.jsx |  4 +-
 .../ui/components/actions-bar/container.jsx   | 14 ++--
 .../imports/ui/components/app/container.jsx   |  6 +-
 .../audio/audio-controls/container.jsx        | 24 +++----
 .../audio/audio-modal/container.jsx           | 68 +++++++++---------
 .../components/audio/audio-test/container.jsx |  6 +-
 .../imports/ui/components/audio/container.jsx |  6 +-
 .../imports/ui/components/chat/container.jsx  |  6 +-
 .../chat/notification/container.jsx           |  6 +-
 .../components/closed-captions/container.jsx  |  6 +-
 .../logout-confirmation/container.jsx         | 13 ++--
 .../imports/ui/components/media/container.jsx |  6 +-
 .../imports/ui/components/modal/container.jsx |  7 +-
 .../ui/components/nav-bar/container.jsx       |  8 +--
 .../notifications-bar/container.jsx           | 16 +++--
 .../ui/components/polling/container.jsx       | 26 ++++---
 .../ui/components/presentation/container.jsx  |  6 +-
 .../presentation/cursor/container.jsx         | 25 ++++---
 .../cursor-wrapper-container/container.jsx    | 11 ++-
 .../presentation-overlay/container.jsx        |  6 +-
 .../presentation-toolbar/container.jsx        |  9 +--
 .../presentation-uploader/container.jsx       |  6 +-
 .../ui/components/screenshare/container.jsx   | 15 ++--
 .../ui/components/settings/container.jsx      | 31 ++++-----
 .../submenus/application/container.jsx        | 12 ++--
 .../submenus/closed-captions/container.jsx    | 21 +++---
 .../imports/ui/components/toast/container.jsx |  6 +-
 .../ui/components/user-list/container.jsx     |  6 +-
 .../ui/components/video-dock/container.jsx    | 27 +++-----
 .../ui/components/video-dock/service.js       | 13 ++--
 .../video-dock/video-menu/component.jsx       | 69 ++++++++++---------
 .../video-dock/video-menu/container.jsx       |  6 +-
 .../reactive-annotation/container.jsx         |  6 +-
 .../whiteboard/annotation-group/container.jsx |  6 +-
 .../whiteboard/annotations/text/container.jsx |  6 +-
 .../whiteboard-overlay/container.jsx          |  6 +-
 .../whiteboard-toolbar/container.jsx          |  8 +--
 38 files changed, 257 insertions(+), 272 deletions(-)
 mode change 100755 => 100644 bigbluebutton-html5/imports/ui/components/video-dock/video-menu/component.jsx
 mode change 100755 => 100644 bigbluebutton-html5/imports/ui/components/video-dock/video-menu/container.jsx

diff --git a/bigbluebutton-html5/imports/startup/client/base.jsx b/bigbluebutton-html5/imports/startup/client/base.jsx
index 38f5625705..94c8f38fd0 100644
--- a/bigbluebutton-html5/imports/startup/client/base.jsx
+++ b/bigbluebutton-html5/imports/startup/client/base.jsx
@@ -1,5 +1,5 @@
 import React, { Component } from 'react';
-import { createContainer } from 'meteor/react-meteor-data';
+import { withTracker } from 'meteor/react-meteor-data';
 import { withRouter } from 'react-router';
 import PropTypes from 'prop-types';
 import Auth from '/imports/ui/services/auth';
@@ -87,7 +87,7 @@ const SUBSCRIPTIONS_NAME = [
   'slides', 'captions', 'breakouts', 'voiceUsers', 'whiteboard-multi-user', 'screenshare',
 ];
 
-const BaseContainer = withRouter(createContainer(({ params, router }) => {
+const BaseContainer = withRouter(withTracker(({ params, router }) => {
   if (params.errorCode) return params;
 
   if (!Auth.loggedIn) {
@@ -110,6 +110,6 @@ const BaseContainer = withRouter(createContainer(({ params, router }) => {
     locale: Settings.application.locale,
     subscriptionsReady: subscriptionsHandlers.every(handler => handler.ready()),
   };
-}, Base));
+})(Base));
 
 export default BaseContainer;
diff --git a/bigbluebutton-html5/imports/ui/components/about/container.jsx b/bigbluebutton-html5/imports/ui/components/about/container.jsx
index ea2dc8fb96..6999424fe6 100644
--- a/bigbluebutton-html5/imports/ui/components/about/container.jsx
+++ b/bigbluebutton-html5/imports/ui/components/about/container.jsx
@@ -1,5 +1,5 @@
 import React from 'react';
-import { createContainer } from 'meteor/react-meteor-data';
+import { withTracker } from 'meteor/react-meteor-data';
 
 import AboutComponent from './component';
 
@@ -16,4 +16,4 @@ const getClientBuildInfo = function () {
   };
 };
 
-export default createContainer(() => getClientBuildInfo(), AboutContainer);
+export default withTracker(() => getClientBuildInfo())(AboutContainer);
diff --git a/bigbluebutton-html5/imports/ui/components/actions-bar/container.jsx b/bigbluebutton-html5/imports/ui/components/actions-bar/container.jsx
index 7465303e68..a753c2cf52 100644
--- a/bigbluebutton-html5/imports/ui/components/actions-bar/container.jsx
+++ b/bigbluebutton-html5/imports/ui/components/actions-bar/container.jsx
@@ -1,21 +1,21 @@
 import React from 'react';
-import { createContainer } from 'meteor/react-meteor-data';
+import { withTracker } from 'meteor/react-meteor-data';
 import ActionsBar from './component';
 import Service from './service';
 import VideoService from '../video-dock/service';
-import ScreenshareService from '../screenshare/service';
+import { shareScreen, unshareScreen, isVideoBroadcasting } from '../screenshare/service';
 
 const ActionsBarContainer = props => <ActionsBar {...props} />;
 
-export default createContainer(() => ({
+export default withTracker(() => ({
   isUserPresenter: Service.isUserPresenter(),
   emojiList: Service.getEmojiList(),
   emojiSelected: Service.getEmoji(),
   handleEmojiChange: Service.setEmoji,
   handleExitVideo: () => VideoService.exitVideo(),
   handleJoinVideo: () => VideoService.joinVideo(),
-  handleShareScreen: () =>  ScreenshareService.shareScreen(),
-  handleUnshareScreen: () => ScreenshareService.unshareScreen(),
-  isVideoBroadcasting: () => ScreenshareService.isVideoBroadcasting(),
+  handleShareScreen: () => shareScreen(),
+  handleUnshareScreen: () => unshareScreen(),
+  isVideoBroadcasting: () => isVideoBroadcasting(),
 
-}), ActionsBarContainer);
+}))(ActionsBarContainer);
diff --git a/bigbluebutton-html5/imports/ui/components/app/container.jsx b/bigbluebutton-html5/imports/ui/components/app/container.jsx
index 97e71e99e6..05d1ef72c9 100644
--- a/bigbluebutton-html5/imports/ui/components/app/container.jsx
+++ b/bigbluebutton-html5/imports/ui/components/app/container.jsx
@@ -1,5 +1,5 @@
 import React, { cloneElement } from 'react';
-import { createContainer } from 'meteor/react-meteor-data';
+import { withTracker } from 'meteor/react-meteor-data';
 import { withRouter } from 'react-router';
 import { defineMessages, injectIntl } from 'react-intl';
 import PropTypes from 'prop-types';
@@ -72,7 +72,7 @@ const AppContainer = (props) => {
   );
 };
 
-export default withRouter(injectIntl(withModalMounter(createContainer(({ router, intl, baseControls }) => {
+export default withRouter(injectIntl(withModalMounter(withTracker(({ router, intl, baseControls }) => {
   const currentUser = Users.findOne({ userId: Auth.userID });
   const isMeetingBreakout = meetingIsBreakout();
 
@@ -117,7 +117,7 @@ export default withRouter(injectIntl(withModalMounter(createContainer(({ router,
     closedCaption: getCaptionsStatus() ? <ClosedCaptionsContainer /> : null,
     fontSize: getFontSize(),
   };
-}, AppContainer))));
+})(AppContainer))));
 
 AppContainer.defaultProps = defaultProps;
 AppContainer.propTypes = propTypes;
diff --git a/bigbluebutton-html5/imports/ui/components/audio/audio-controls/container.jsx b/bigbluebutton-html5/imports/ui/components/audio/audio-controls/container.jsx
index 83c595cb06..51578831f3 100644
--- a/bigbluebutton-html5/imports/ui/components/audio/audio-controls/container.jsx
+++ b/bigbluebutton-html5/imports/ui/components/audio/audio-controls/container.jsx
@@ -1,5 +1,5 @@
 import React from 'react';
-import { createContainer } from 'meteor/react-meteor-data';
+import { withTracker } from 'meteor/react-meteor-data';
 import { withModalMounter } from '/imports/ui/components/modal/service';
 import AudioControls from './component';
 import AudioModalContainer from '../audio-modal/container';
@@ -7,14 +7,14 @@ import Service from '../service';
 
 const AudioControlsContainer = props => <AudioControls {...props} />;
 
-export default withModalMounter(createContainer(({ mountModal }) =>
-   ({
-     mute: Service.isConnected() && !Service.isListenOnly() && !Service.isEchoTest(),
-     unmute: Service.isConnected() && !Service.isListenOnly() && Service.isMuted(),
-     join: Service.isConnected() && !Service.isEchoTest(),
-     disable: Service.isConnecting() || Service.isHangingUp(),
-     glow: Service.isTalking() && !Service.isMuted(),
-     handleToggleMuteMicrophone: () => Service.toggleMuteMicrophone(),
-     handleJoinAudio: () => mountModal(<AudioModalContainer />),
-     handleLeaveAudio: () => Service.exitAudio(),
-   }), AudioControlsContainer));
+export default withModalMounter(withTracker(({ mountModal }) =>
+  ({
+    mute: Service.isConnected() && !Service.isListenOnly() && !Service.isEchoTest(),
+    unmute: Service.isConnected() && !Service.isListenOnly() && Service.isMuted(),
+    join: Service.isConnected() && !Service.isEchoTest(),
+    disable: Service.isConnecting() || Service.isHangingUp(),
+    glow: Service.isTalking() && !Service.isMuted(),
+    handleToggleMuteMicrophone: () => Service.toggleMuteMicrophone(),
+    handleJoinAudio: () => mountModal(<AudioModalContainer />),
+    handleLeaveAudio: () => Service.exitAudio(),
+  }))(AudioControlsContainer));
diff --git a/bigbluebutton-html5/imports/ui/components/audio/audio-modal/container.jsx b/bigbluebutton-html5/imports/ui/components/audio/audio-modal/container.jsx
index 543fe3e91b..b69051954f 100644
--- a/bigbluebutton-html5/imports/ui/components/audio/audio-modal/container.jsx
+++ b/bigbluebutton-html5/imports/ui/components/audio/audio-modal/container.jsx
@@ -1,41 +1,41 @@
 import React from 'react';
-import { createContainer } from 'meteor/react-meteor-data';
+import { withTracker } from 'meteor/react-meteor-data';
 import { withModalMounter } from '/imports/ui/components/modal/service';
 import AudioModal from './component';
 import Service from '../service';
 
 const AudioModalContainer = props => <AudioModal {...props} />;
 
-export default withModalMounter(createContainer(({ mountModal }) =>
-   ({
-     closeModal: () => {
-       if (!Service.isConnecting()) mountModal(null);
-     },
-     joinMicrophone: () =>
-       new Promise((resolve, reject) => {
-         Service.transferCall().then(() => {
-           mountModal(null);
-           resolve();
-         }).catch(() => {
-           Service.exitAudio();
-           reject();
-         });
-       }),
-     joinListenOnly: () => Service.joinListenOnly().then(() => mountModal(null)),
-     leaveEchoTest: () => {
-       if (!Service.isEchoTest()) {
-         return Promise.resolve();
-       }
-       return Service.exitAudio();
-     },
-     changeInputDevice: inputDeviceId => Service.changeInputDevice(inputDeviceId),
-     changeOutputDevice: outputDeviceId => Service.changeOutputDevice(outputDeviceId),
-     joinEchoTest: () => Service.joinEchoTest(),
-     exitAudio: () => Service.exitAudio(),
-     isConnecting: Service.isConnecting(),
-     isConnected: Service.isConnected(),
-     isEchoTest: Service.isEchoTest(),
-     inputDeviceId: Service.inputDeviceId(),
-     outputDeviceId: Service.outputDeviceId(),
-     showPermissionsOvelay: Service.isWaitingPermissions(),
-   }), AudioModalContainer));
+export default withModalMounter(withTracker(({ mountModal }) =>
+  ({
+    closeModal: () => {
+      if (!Service.isConnecting()) mountModal(null);
+    },
+    joinMicrophone: () =>
+      new Promise((resolve, reject) => {
+        Service.transferCall().then(() => {
+          mountModal(null);
+          resolve();
+        }).catch(() => {
+          Service.exitAudio();
+          reject();
+        });
+      }),
+    joinListenOnly: () => Service.joinListenOnly().then(() => mountModal(null)),
+    leaveEchoTest: () => {
+      if (!Service.isEchoTest()) {
+        return Promise.resolve();
+      }
+      return Service.exitAudio();
+    },
+    changeInputDevice: inputDeviceId => Service.changeInputDevice(inputDeviceId),
+    changeOutputDevice: outputDeviceId => Service.changeOutputDevice(outputDeviceId),
+    joinEchoTest: () => Service.joinEchoTest(),
+    exitAudio: () => Service.exitAudio(),
+    isConnecting: Service.isConnecting(),
+    isConnected: Service.isConnected(),
+    isEchoTest: Service.isEchoTest(),
+    inputDeviceId: Service.inputDeviceId(),
+    outputDeviceId: Service.outputDeviceId(),
+    showPermissionsOvelay: Service.isWaitingPermissions(),
+  }))(AudioModalContainer));
diff --git a/bigbluebutton-html5/imports/ui/components/audio/audio-test/container.jsx b/bigbluebutton-html5/imports/ui/components/audio/audio-test/container.jsx
index 8e74d4fb66..58e1f0501c 100644
--- a/bigbluebutton-html5/imports/ui/components/audio/audio-test/container.jsx
+++ b/bigbluebutton-html5/imports/ui/components/audio/audio-test/container.jsx
@@ -1,15 +1,15 @@
 import React from 'react';
-import { createContainer } from 'meteor/react-meteor-data';
+import { withTracker } from 'meteor/react-meteor-data';
 import Service from '/imports/ui/components/audio/service';
 import AudioTest from './component';
 
 const AudioTestContainer = props => <AudioTest {...props} />;
 
-export default createContainer(() => ({
+export default withTracker(() => ({
   outputDeviceId: Service.outputDeviceId(),
   handlePlayAudioSample: (deviceId) => {
     const sound = new Audio('resources/sounds/audioSample.mp3');
     if (deviceId && sound.setSinkId) sound.setSinkId(deviceId);
     sound.play();
   },
-}), AudioTestContainer);
+}))(AudioTestContainer);
diff --git a/bigbluebutton-html5/imports/ui/components/audio/container.jsx b/bigbluebutton-html5/imports/ui/components/audio/container.jsx
index b8f2a9c19e..27371ff45c 100644
--- a/bigbluebutton-html5/imports/ui/components/audio/container.jsx
+++ b/bigbluebutton-html5/imports/ui/components/audio/container.jsx
@@ -1,5 +1,5 @@
 import React from 'react';
-import { createContainer } from 'meteor/react-meteor-data';
+import { withTracker } from 'meteor/react-meteor-data';
 import { withModalMounter } from '/imports/ui/components/modal/service';
 import { injectIntl, defineMessages } from 'react-intl';
 import PropTypes from 'prop-types';
@@ -56,7 +56,7 @@ const AudioContainer = props => <Audio {...props} />;
 
 let didMountAutoJoin = false;
 
-export default withModalMounter(injectIntl(createContainer(({ mountModal, intl }) => {
+export default withModalMounter(injectIntl(withTracker(({ mountModal, intl }) => {
   const APP_CONFIG = Meteor.settings.public.app;
 
   const { autoJoinAudio } = APP_CONFIG;
@@ -95,7 +95,7 @@ export default withModalMounter(injectIntl(createContainer(({ mountModal, intl }
       didMountAutoJoin = true;
     },
   };
-}, AudioContainer)));
+})(AudioContainer)));
 
 AudioContainer.propTypes = propTypes;
 AudioContainer.defaultProps = defaultProps;
diff --git a/bigbluebutton-html5/imports/ui/components/chat/container.jsx b/bigbluebutton-html5/imports/ui/components/chat/container.jsx
index 088af86a6c..c1ce94ae16 100644
--- a/bigbluebutton-html5/imports/ui/components/chat/container.jsx
+++ b/bigbluebutton-html5/imports/ui/components/chat/container.jsx
@@ -1,6 +1,6 @@
 import React from 'react';
 import { defineMessages, injectIntl } from 'react-intl';
-import { createContainer } from 'meteor/react-meteor-data';
+import { withTracker } from 'meteor/react-meteor-data';
 import Chat from './component';
 import ChatService from './service';
 
@@ -34,7 +34,7 @@ const ChatContainer = props =>
     </Chat>
   );
 
-export default injectIntl(createContainer(({ params, intl }) => {
+export default injectIntl(withTracker(({ params, intl }) => {
   const chatID = params.chatID || PUBLIC_CHAT_KEY;
 
   let messages = [];
@@ -116,4 +116,4 @@ export default injectIntl(createContainer(({ params, intl }) => {
       handleReadMessage: timestamp => ChatService.updateUnreadMessage(chatID, timestamp),
     },
   };
-}, ChatContainer));
+})(ChatContainer));
diff --git a/bigbluebutton-html5/imports/ui/components/chat/notification/container.jsx b/bigbluebutton-html5/imports/ui/components/chat/notification/container.jsx
index ade6871a4c..b195501cf0 100644
--- a/bigbluebutton-html5/imports/ui/components/chat/notification/container.jsx
+++ b/bigbluebutton-html5/imports/ui/components/chat/notification/container.jsx
@@ -1,5 +1,5 @@
 import React from 'react';
-import { createContainer } from 'meteor/react-meteor-data';
+import { withTracker } from 'meteor/react-meteor-data';
 import UserListService from '/imports/ui/components/user-list/service';
 import Settings from '/imports/ui/services/settings';
 import ChatNotification from './component';
@@ -8,7 +8,7 @@ const ChatNotificationContainer = props => (
   <ChatNotification {...props} />
 );
 
-export default createContainer(() => {
+export default withTracker(() => {
   const AppSettings = Settings.application;
   const openChats = UserListService.getOpenChats();
 
@@ -17,4 +17,4 @@ export default createContainer(() => {
     disableNotify: !AppSettings.chatPushNotifications,
     openChats,
   };
-}, ChatNotificationContainer);
+})(ChatNotificationContainer);
diff --git a/bigbluebutton-html5/imports/ui/components/closed-captions/container.jsx b/bigbluebutton-html5/imports/ui/components/closed-captions/container.jsx
index a8da014e7c..d6c03fb2a8 100644
--- a/bigbluebutton-html5/imports/ui/components/closed-captions/container.jsx
+++ b/bigbluebutton-html5/imports/ui/components/closed-captions/container.jsx
@@ -1,10 +1,10 @@
 import React from 'react';
-import { createContainer } from 'meteor/react-meteor-data';
+import { withTracker } from 'meteor/react-meteor-data';
 import ClosedCaptionsService from './service';
 import ClosedCaptions from './component';
 
 const ClosedCaptionsContainer = props => (
   <ClosedCaptions {...props} />
- );
+);
 
-export default createContainer(() => ClosedCaptionsService.getCCData(), ClosedCaptionsContainer);
+export default withTracker(() => ClosedCaptionsService.getCCData())(ClosedCaptionsContainer);
diff --git a/bigbluebutton-html5/imports/ui/components/logout-confirmation/container.jsx b/bigbluebutton-html5/imports/ui/components/logout-confirmation/container.jsx
index 3dbc153b43..f9faba90e4 100644
--- a/bigbluebutton-html5/imports/ui/components/logout-confirmation/container.jsx
+++ b/bigbluebutton-html5/imports/ui/components/logout-confirmation/container.jsx
@@ -1,6 +1,6 @@
 import React from 'react';
 import { meetingIsBreakout } from '/imports/ui/components/app/service';
-import { createContainer } from 'meteor/react-meteor-data';
+import { withTracker } from 'meteor/react-meteor-data';
 import LogoutConfirmation from './component';
 import {
   isModerator,
@@ -11,10 +11,7 @@ const LogoutConfirmationContainer = props => (
   <LogoutConfirmation {...props} />
 );
 
-export default createContainer(() => {
-  return {
-    showEndMeeting: !meetingIsBreakout() &&
-                    isModerator(),
-    handleEndMeeting: endMeeting,
-  }
-}, LogoutConfirmationContainer);
+export default withTracker(() => ({
+  showEndMeeting: !meetingIsBreakout() && isModerator(),
+  handleEndMeeting: endMeeting,
+}))(LogoutConfirmationContainer);
diff --git a/bigbluebutton-html5/imports/ui/components/media/container.jsx b/bigbluebutton-html5/imports/ui/components/media/container.jsx
index 119567f8a1..d56e6b0ec7 100644
--- a/bigbluebutton-html5/imports/ui/components/media/container.jsx
+++ b/bigbluebutton-html5/imports/ui/components/media/container.jsx
@@ -1,5 +1,5 @@
 import React, { Component } from 'react';
-import { createContainer } from 'meteor/react-meteor-data';
+import { withTracker } from 'meteor/react-meteor-data';
 import Media from './component';
 import MediaService from './service';
 import PresentationAreaContainer from '../presentation/container';
@@ -52,7 +52,7 @@ class MediaContainer extends Component {
 
 MediaContainer.defaultProps = defaultProps;
 
-export default createContainer(() => {
+export default withTracker(() => {
   const data = {};
   data.currentPresentation = MediaService.getPresentationInfo();
 
@@ -71,4 +71,4 @@ export default createContainer(() => {
   }
 
   return data;
-}, MediaContainer);
+})(MediaContainer);
diff --git a/bigbluebutton-html5/imports/ui/components/modal/container.jsx b/bigbluebutton-html5/imports/ui/components/modal/container.jsx
index beeed571db..a1bbd0ed66 100644
--- a/bigbluebutton-html5/imports/ui/components/modal/container.jsx
+++ b/bigbluebutton-html5/imports/ui/components/modal/container.jsx
@@ -1,8 +1,5 @@
 import React from 'react';
-import { createContainer } from 'meteor/react-meteor-data';
+import { withTracker } from 'meteor/react-meteor-data';
 import { getModal } from './service';
 
-export default createContainer(
-  () => ({ modalComponent: getModal() }),
-  ({ modalComponent }) => modalComponent,
-);
+export default withTracker(() => ({ modalComponent: getModal() }))(({ modalComponent }) => modalComponent);
diff --git a/bigbluebutton-html5/imports/ui/components/nav-bar/container.jsx b/bigbluebutton-html5/imports/ui/components/nav-bar/container.jsx
index 47ba92261c..13e0a1cbd5 100644
--- a/bigbluebutton-html5/imports/ui/components/nav-bar/container.jsx
+++ b/bigbluebutton-html5/imports/ui/components/nav-bar/container.jsx
@@ -1,5 +1,5 @@
-import React, { Component } from 'react';
-import { createContainer } from 'meteor/react-meteor-data';
+import React from 'react';
+import { withTracker } from 'meteor/react-meteor-data';
 import { withRouter } from 'react-router';
 import Meetings from '/imports/api/meetings';
 import Auth from '/imports/ui/services/auth';
@@ -18,7 +18,7 @@ const NavBarContainer = ({ children, ...props }) => (
   </NavBar>
 );
 
-export default withRouter(createContainer(({ location, router }) => {
+export default withRouter(withTracker(({ location, router }) => {
   let meetingTitle;
   let meetingRecorded;
 
@@ -69,4 +69,4 @@ export default withRouter(createContainer(({ location, router }) => {
       }
     },
   };
-}, NavBarContainer));
+})(NavBarContainer));
diff --git a/bigbluebutton-html5/imports/ui/components/notifications-bar/container.jsx b/bigbluebutton-html5/imports/ui/components/notifications-bar/container.jsx
index 8383ca6749..4c03cf309b 100644
--- a/bigbluebutton-html5/imports/ui/components/notifications-bar/container.jsx
+++ b/bigbluebutton-html5/imports/ui/components/notifications-bar/container.jsx
@@ -1,5 +1,5 @@
 import { Meteor } from 'meteor/meteor';
-import { createContainer } from 'meteor/react-meteor-data';
+import { withTracker } from 'meteor/react-meteor-data';
 import React from 'react';
 import { defineMessages, injectIntl } from 'react-intl';
 import _ from 'lodash';
@@ -108,7 +108,7 @@ const startCounter = (sec, set, get, interval) => {
   }, 1000);
 };
 
-export default injectIntl(createContainer(({ intl }) => {
+export default injectIntl(withTracker(({ intl }) => {
   const { status, connected, retryTime } = Meteor.status();
   const data = {};
 
@@ -150,10 +150,12 @@ export default injectIntl(createContainer(({ intl }) => {
       const roomRemainingTime = currentBreakout.timeRemaining;
 
       if (!timeRemainingInterval && roomRemainingTime) {
-        timeRemainingInterval = startCounter(roomRemainingTime,
-                                             setTimeRemaining,
-                                             getTimeRemaining,
-                                             timeRemainingInterval);
+        timeRemainingInterval = startCounter(
+          roomRemainingTime,
+          setTimeRemaining,
+          getTimeRemaining,
+          timeRemainingInterval,
+        );
       }
     } else if (timeRemainingInterval) {
       clearInterval(timeRemainingInterval);
@@ -178,4 +180,4 @@ export default injectIntl(createContainer(({ intl }) => {
 
   data.color = 'primary';
   return data;
-}, NotificationsBarContainer));
+})(NotificationsBarContainer));
diff --git a/bigbluebutton-html5/imports/ui/components/polling/container.jsx b/bigbluebutton-html5/imports/ui/components/polling/container.jsx
index 02541c21d6..f3ea1cba73 100644
--- a/bigbluebutton-html5/imports/ui/components/polling/container.jsx
+++ b/bigbluebutton-html5/imports/ui/components/polling/container.jsx
@@ -1,15 +1,25 @@
 import React from 'react';
-import { createContainer } from 'meteor/react-meteor-data';
+import PropTypes from 'prop-types';
+import { withTracker } from 'meteor/react-meteor-data';
 import PollingService from './service';
 import PollingComponent from './component';
 
-const PollingContainer = ({
-  pollExists, poll, handleVote, ...props
-}) => {
-  if (!pollExists) return null;
-  return <PollingComponent poll={poll} handleVote={handleVote} {...props} />;
+const propTypes = {
+  pollExists: PropTypes.bool.isRequired,
 };
-export default createContainer(() => {
+
+const PollingContainer = ({ pollExists, ...props }) => {
+  if (pollExists) {
+    return (
+      <PollingComponent {...props} />
+    );
+  }
+  return null;
+};
+
+PollingContainer.propTypes = propTypes;
+
+export default withTracker(() => {
   const data = PollingService.mapPolls();
   return data;
-}, PollingContainer);
+})(PollingContainer);
diff --git a/bigbluebutton-html5/imports/ui/components/presentation/container.jsx b/bigbluebutton-html5/imports/ui/components/presentation/container.jsx
index a45c819198..0c66ef27d8 100644
--- a/bigbluebutton-html5/imports/ui/components/presentation/container.jsx
+++ b/bigbluebutton-html5/imports/ui/components/presentation/container.jsx
@@ -1,5 +1,5 @@
 import React from 'react';
-import { createContainer } from 'meteor/react-meteor-data';
+import { withTracker } from 'meteor/react-meteor-data';
 import PresentationAreaService from './service';
 import PresentationArea from './component';
 
@@ -7,8 +7,8 @@ const PresentationAreaContainer = props => (
   <PresentationArea {...props} />
 );
 
-export default createContainer(() => ({
+export default withTracker(() => ({
   currentSlide: PresentationAreaService.getCurrentSlide(),
   userIsPresenter: PresentationAreaService.isPresenter(),
   multiUser: PresentationAreaService.getMultiUserStatus(),
-}), PresentationAreaContainer);
+}))(PresentationAreaContainer);
diff --git a/bigbluebutton-html5/imports/ui/components/presentation/cursor/container.jsx b/bigbluebutton-html5/imports/ui/components/presentation/cursor/container.jsx
index 0059880163..0aeff9aed4 100644
--- a/bigbluebutton-html5/imports/ui/components/presentation/cursor/container.jsx
+++ b/bigbluebutton-html5/imports/ui/components/presentation/cursor/container.jsx
@@ -1,6 +1,6 @@
 import React, { Component } from 'react';
 import PropTypes from 'prop-types';
-import { createContainer } from 'meteor/react-meteor-data';
+import { withTracker } from 'meteor/react-meteor-data';
 import CursorService from './service';
 import Cursor from './component';
 
@@ -40,30 +40,29 @@ class CursorContainer extends Component {
     }
     return null;
   }
-
 }
 
 
-export default createContainer((params) => {
+export default withTracker((params) => {
   const { cursorId } = params;
 
   const cursor = CursorService.getCurrentCursor(cursorId);
-  let cursorX = -1;
-  let cursorY = -1;
-  let userName = '';
 
   if (cursor) {
-    cursorX = cursor.x;
-    cursorY = cursor.y;
-    userName = cursor.userName;
+    const { x: cursorX, y: cursorY, userName } = cursor;
+    return {
+      cursorX,
+      cursorY,
+      userName,
+    };
   }
 
   return {
-    cursorX,
-    cursorY,
-    userName,
+    cursorX: -1,
+    cursorY: -1,
+    userName: '',
   };
-}, CursorContainer);
+})(CursorContainer);
 
 
 CursorContainer.propTypes = {
diff --git a/bigbluebutton-html5/imports/ui/components/presentation/cursor/cursor-wrapper-container/container.jsx b/bigbluebutton-html5/imports/ui/components/presentation/cursor/cursor-wrapper-container/container.jsx
index 96c2d724d8..9f4da4e8d0 100644
--- a/bigbluebutton-html5/imports/ui/components/presentation/cursor/cursor-wrapper-container/container.jsx
+++ b/bigbluebutton-html5/imports/ui/components/presentation/cursor/cursor-wrapper-container/container.jsx
@@ -1,7 +1,7 @@
 /*
   The purpose of this wrapper is to fetch an array of active cursor iDs only
   and map them to the CursorContainer.
-  The reason for this is that Meteor tracks only the properties defined inside createContainer
+  The reason for this is that Meteor tracks only the properties defined inside withTracker
   and if we fetch the whole array of Cursors right away (let's say in the multi-user mode),
   then the whole array would be re-rendered every time one of the Cursors is changed.
 
@@ -13,7 +13,7 @@
 
 import React from 'react';
 import PropTypes from 'prop-types';
-import { createContainer } from 'meteor/react-meteor-data';
+import { withTracker } from 'meteor/react-meteor-data';
 import CursorWrapperService from './service';
 import CursorContainer from '../container';
 
@@ -35,12 +35,11 @@ const CursorWrapperContainer = ({ presenterCursorId, multiUserCursorIds, ...rest
         cursorId={cursorId._id}
         presenter={false}
         {...rest}
-      />),
-    )}
+      />))}
   </g>
 );
 
-export default createContainer(() => {
+export default withTracker(() => {
   const { presenterCursorId, multiUserCursorIds } = CursorWrapperService.getCurrentCursorIds();
   const isMultiUser = CursorWrapperService.getMultiUserStatus();
 
@@ -49,7 +48,7 @@ export default createContainer(() => {
     multiUserCursorIds,
     isMultiUser,
   };
-}, CursorWrapperContainer);
+})(CursorWrapperContainer);
 
 
 CursorWrapperContainer.propTypes = {
diff --git a/bigbluebutton-html5/imports/ui/components/presentation/presentation-overlay/container.jsx b/bigbluebutton-html5/imports/ui/components/presentation/presentation-overlay/container.jsx
index 6600b4ab97..89f5e39c6f 100644
--- a/bigbluebutton-html5/imports/ui/components/presentation/presentation-overlay/container.jsx
+++ b/bigbluebutton-html5/imports/ui/components/presentation/presentation-overlay/container.jsx
@@ -1,6 +1,6 @@
 import React from 'react';
 import PropTypes from 'prop-types';
-import { createContainer } from 'meteor/react-meteor-data';
+import { withTracker } from 'meteor/react-meteor-data';
 import PresentationOverlayService from './service';
 import PresentationOverlay from './component';
 
@@ -10,9 +10,9 @@ const PresentationOverlayContainer = ({ children, ...rest }) => (
   </PresentationOverlay>
 );
 
-export default createContainer(() => ({
+export default withTracker(() => ({
   updateCursor: PresentationOverlayService.updateCursor,
-}), PresentationOverlayContainer);
+}))(PresentationOverlayContainer);
 
 PresentationOverlayContainer.propTypes = {
   children: PropTypes.node,
diff --git a/bigbluebutton-html5/imports/ui/components/presentation/presentation-toolbar/container.jsx b/bigbluebutton-html5/imports/ui/components/presentation/presentation-toolbar/container.jsx
index e414e27505..6de339c075 100644
--- a/bigbluebutton-html5/imports/ui/components/presentation/presentation-toolbar/container.jsx
+++ b/bigbluebutton-html5/imports/ui/components/presentation/presentation-toolbar/container.jsx
@@ -1,6 +1,6 @@
 import React from 'react';
 import PropTypes from 'prop-types';
-import { createContainer } from 'meteor/react-meteor-data';
+import { withTracker } from 'meteor/react-meteor-data';
 import PresentationToolbarService from './service';
 import PresentationToolbar from './component';
 
@@ -25,7 +25,7 @@ const PresentationToolbarContainer = (props) => {
   return null;
 };
 
-export default createContainer((params) => {
+export default withTracker((params) => {
   const data = PresentationToolbarService.getSlideData(params);
 
   const {
@@ -45,15 +45,12 @@ export default createContainer((params) => {
         PresentationToolbarService.skipToSlide(event),
     },
   };
-}, PresentationToolbarContainer);
+})(PresentationToolbarContainer);
 
 PresentationToolbarContainer.propTypes = {
   // Number of current slide being displayed
   currentSlideNum: PropTypes.number.isRequired,
 
-  // PresentationId of the current presentation
-  presentationId: PropTypes.string.isRequired,
-
   // Is the user a presenter
   userIsPresenter: PropTypes.bool.isRequired,
 
diff --git a/bigbluebutton-html5/imports/ui/components/presentation/presentation-uploader/container.jsx b/bigbluebutton-html5/imports/ui/components/presentation/presentation-uploader/container.jsx
index e90e66b849..abcac9f716 100644
--- a/bigbluebutton-html5/imports/ui/components/presentation/presentation-uploader/container.jsx
+++ b/bigbluebutton-html5/imports/ui/components/presentation/presentation-uploader/container.jsx
@@ -1,5 +1,5 @@
 import React from 'react';
-import { createContainer } from 'meteor/react-meteor-data';
+import { withTracker } from 'meteor/react-meteor-data';
 
 import Service from './service';
 import PresentationUploader from './component';
@@ -8,7 +8,7 @@ const PresentationUploaderContainer = props => (
   <PresentationUploader {...props} />
 );
 
-export default createContainer(() => {
+export default withTracker(() => {
   const PRESENTATION_CONFIG = Meteor.settings.public.presentation;
   const currentPresentations = Service.getPresentations();
 
@@ -24,4 +24,4 @@ export default createContainer(() => {
       PRESENTATION_CONFIG.uploadEndpoint,
     ),
   };
-}, PresentationUploaderContainer);
+})(PresentationUploaderContainer);
diff --git a/bigbluebutton-html5/imports/ui/components/screenshare/container.jsx b/bigbluebutton-html5/imports/ui/components/screenshare/container.jsx
index 37a2ba3c6f..b10659a3db 100644
--- a/bigbluebutton-html5/imports/ui/components/screenshare/container.jsx
+++ b/bigbluebutton-html5/imports/ui/components/screenshare/container.jsx
@@ -1,25 +1,26 @@
 import React from 'react';
-import { createContainer } from 'meteor/react-meteor-data';
+import { withTracker } from 'meteor/react-meteor-data';
 import { isVideoBroadcasting, presenterScreenshareHasEnded,
   presenterScreenshareHasStarted } from './service';
 import ScreenshareComponent from './component';
 
 class ScreenshareContainer extends React.Component {
+  componentWillUnmount() {
+    this.props.presenterScreenshareHasEnded();
+  }
+
   render() {
     if (this.props.isVideoBroadcasting()) {
       return <ScreenshareComponent {...this.props} />;
     }
-  }
 
-  componentWillUnmount() {
-    this.props.presenterScreenshareHasEnded();
+    return null;
   }
-
 }
 
-export default createContainer(() => ({
+export default withTracker(() => ({
   isVideoBroadcasting,
   presenterScreenshareHasStarted,
   presenterScreenshareHasEnded,
-}), ScreenshareContainer);
+}))(ScreenshareContainer);
 
diff --git a/bigbluebutton-html5/imports/ui/components/settings/container.jsx b/bigbluebutton-html5/imports/ui/components/settings/container.jsx
index b5ff6d69bf..2fe0599d97 100644
--- a/bigbluebutton-html5/imports/ui/components/settings/container.jsx
+++ b/bigbluebutton-html5/imports/ui/components/settings/container.jsx
@@ -1,25 +1,20 @@
-import React, { Component } from 'react';
-import PropTypes from 'prop-types';
-import { createContainer } from 'meteor/react-meteor-data';
-import Settings from './component';
+import React from 'react';
+import { withTracker } from 'meteor/react-meteor-data';
 import SettingsService from '/imports/ui/services/settings';
+import Settings from './component';
 
 import {
-    getClosedCaptionLocales,
-    getUserRoles,
-    updateSettings,
-    getAvailableLocales,
-  } from './service';
+  getClosedCaptionLocales,
+  getUserRoles,
+  updateSettings,
+  getAvailableLocales,
+} from './service';
 
-class SettingsContainer extends Component {
-  render() {
-    return (
-      <Settings {...this.props} />
-    );
-  }
-}
+const SettingsContainer = props => (
+  <Settings {...props} />
+);
 
-export default createContainer(() => ({
+export default withTracker(() => ({
   audio: SettingsService.audio,
   video: SettingsService.video,
   application: SettingsService.application,
@@ -29,4 +24,4 @@ export default createContainer(() => ({
   locales: getClosedCaptionLocales(),
   availableLocales: getAvailableLocales(),
   isModerator: getUserRoles() === 'MODERATOR',
-}), SettingsContainer);
+}))(SettingsContainer);
diff --git a/bigbluebutton-html5/imports/ui/components/settings/submenus/application/container.jsx b/bigbluebutton-html5/imports/ui/components/settings/submenus/application/container.jsx
index 3320793888..b9011514dd 100644
--- a/bigbluebutton-html5/imports/ui/components/settings/submenus/application/container.jsx
+++ b/bigbluebutton-html5/imports/ui/components/settings/submenus/application/container.jsx
@@ -1,15 +1,15 @@
 import React from 'react';
-import { createContainer } from 'meteor/react-meteor-data';
+import { withTracker } from 'meteor/react-meteor-data';
 import Application from './component';
 
 
-const ApplicationContainer = props => (
+const ApplicationContainer = ({ children, ...props }) => (
   <Application {...props}>
-    {props.children}
+    {children}
   </Application>
-    );
+);
 
-export default createContainer(() => ({
+export default withTracker(() => ({
   fontSizes: [
     '12px',
     '14px',
@@ -17,4 +17,4 @@ export default createContainer(() => ({
     '18px',
     '20px',
   ],
-}), ApplicationContainer);
+}))(ApplicationContainer);
diff --git a/bigbluebutton-html5/imports/ui/components/settings/submenus/closed-captions/container.jsx b/bigbluebutton-html5/imports/ui/components/settings/submenus/closed-captions/container.jsx
index 53979f9292..e3d5c8861f 100644
--- a/bigbluebutton-html5/imports/ui/components/settings/submenus/closed-captions/container.jsx
+++ b/bigbluebutton-html5/imports/ui/components/settings/submenus/closed-captions/container.jsx
@@ -1,17 +1,12 @@
-import React, { Component } from 'react';
-import PropTypes from 'prop-types';
-import { createContainer } from 'meteor/react-meteor-data';
+import React from 'react';
+import { withTracker } from 'meteor/react-meteor-data';
 import ClosedCaptionsMenu from './component';
 import Service from './service';
 
-class ClosedCaptionsMenuContainer extends Component {
-  render() {
-    return (
-      <ClosedCaptionsMenu {...this.props}>
-        {this.props.children}
-      </ClosedCaptionsMenu>
-    );
-  }
-}
+const ClosedCaptionsMenuContainer = ({ children, ...props }) => (
+  <ClosedCaptionsMenu {...props}>
+    {children}
+  </ClosedCaptionsMenu>
+);
 
-export default createContainer(() => Service.getClosedCaptionSettings(), ClosedCaptionsMenuContainer);
+export default withTracker(() => Service.getClosedCaptionSettings(), ClosedCaptionsMenuContainer);
diff --git a/bigbluebutton-html5/imports/ui/components/toast/container.jsx b/bigbluebutton-html5/imports/ui/components/toast/container.jsx
index b34b095fc8..f40b8b427a 100644
--- a/bigbluebutton-html5/imports/ui/components/toast/container.jsx
+++ b/bigbluebutton-html5/imports/ui/components/toast/container.jsx
@@ -1,7 +1,7 @@
 import React from 'react';
 import Breakouts from '/imports/api/breakouts';
 import { ToastContainer as Toastify } from 'react-toastify';
-import { createContainer } from 'meteor/react-meteor-data';
+import { withTracker } from 'meteor/react-meteor-data';
 import { defineMessages, injectIntl } from 'react-intl';
 import injectNotify from '/imports/ui/components/toast/inject-notify/component';
 
@@ -38,7 +38,7 @@ class ToastContainer extends React.Component {
   }
 }
 
-export default injectIntl(injectNotify(createContainer(({ notify, intl }) => {
+export default injectIntl(injectNotify(withTracker(({ notify, intl }) => {
   Breakouts.find().observeChanges({
     removed() {
       notify(intl.formatMessage(intlMessages.toastBreakoutRoomEnded), 'info', 'rooms');
@@ -71,4 +71,4 @@ export default injectIntl(injectNotify(createContainer(({ notify, intl }) => {
     closeOnClick: true,
     pauseOnHover: true,
   };
-}, ToastContainer)));
+})(ToastContainer)));
diff --git a/bigbluebutton-html5/imports/ui/components/user-list/container.jsx b/bigbluebutton-html5/imports/ui/components/user-list/container.jsx
index 4d8063c9ed..eb9c26cff0 100644
--- a/bigbluebutton-html5/imports/ui/components/user-list/container.jsx
+++ b/bigbluebutton-html5/imports/ui/components/user-list/container.jsx
@@ -1,6 +1,6 @@
 import React from 'react';
 import PropTypes from 'prop-types';
-import { createContainer } from 'meteor/react-meteor-data';
+import { withTracker } from 'meteor/react-meteor-data';
 import { meetingIsBreakout } from '/imports/ui/components/app/service';
 import Meetings from '/imports/api/meetings';
 import Service from './service';
@@ -81,7 +81,7 @@ const UserListContainer = (props) => {
 UserListContainer.propTypes = propTypes;
 UserListContainer.defaultProps = defaultProps;
 
-export default createContainer(({ params }) => ({
+export default withTracker(({ params }) => ({
   users: Service.getUsers(),
   meeting: Meetings.findOne({}),
   currentUser: Service.getCurrentUser(),
@@ -99,4 +99,4 @@ export default createContainer(({ params }) => ({
   toggleVoice: Service.toggleVoice,
   changeRole: Service.changeRole,
   roving: Service.roving,
-}), UserListContainer);
+}))(UserListContainer);
diff --git a/bigbluebutton-html5/imports/ui/components/video-dock/container.jsx b/bigbluebutton-html5/imports/ui/components/video-dock/container.jsx
index a92bbb3d09..d4eb1e7140 100644
--- a/bigbluebutton-html5/imports/ui/components/video-dock/container.jsx
+++ b/bigbluebutton-html5/imports/ui/components/video-dock/container.jsx
@@ -1,25 +1,16 @@
-import React, { Component } from 'react';
-import { createContainer } from 'meteor/react-meteor-data';
-
+import React from 'react';
+import { withTracker } from 'meteor/react-meteor-data';
 import VideoDock from './component';
 import VideoService from './service';
 
-class VideoDockContainer extends Component {
-  constructor(props) {
-    super(props);
-  }
-
-  render() {
-    return (
-      <VideoDock {...this.props}>
-        {this.props.children}
-      </VideoDock>
-    );
-  }
-}
+const VideoDockContainer = ({ children, ...props }) => (
+  <VideoDock {...props}>
+    {children}
+  </VideoDock>
+);
 
-export default createContainer(() => ({
+export default withTracker(() => ({
   sendUserShareWebcam: VideoService.sendUserShareWebcam,
   sendUserUnshareWebcam: VideoService.sendUserUnshareWebcam,
   users: VideoService.getAllUsers(),
-}), VideoDockContainer);
+}))(VideoDockContainer);
diff --git a/bigbluebutton-html5/imports/ui/components/video-dock/service.js b/bigbluebutton-html5/imports/ui/components/video-dock/service.js
index 5d778fca8f..284b3a15b2 100644
--- a/bigbluebutton-html5/imports/ui/components/video-dock/service.js
+++ b/bigbluebutton-html5/imports/ui/components/video-dock/service.js
@@ -1,16 +1,15 @@
 import { makeCall } from '/imports/ui/services/api';
 import Users from '/imports/api/users';
-import { createContainer } from 'meteor/react-meteor-data';
 
 const joinVideo = () => {
-  var joinVideoEvent = new Event('joinVideo');
+  const joinVideoEvent = new Event('joinVideo');
   document.dispatchEvent(joinVideoEvent);
-}
+};
 
 const exitVideo = () => {
-  var exitVideoEvent = new Event('exitVideo');
+  const exitVideoEvent = new Event('exitVideo');
   document.dispatchEvent(exitVideoEvent);
-}
+};
 
 const sendUserShareWebcam = (stream) => {
   makeCall('userShareWebcam', stream);
@@ -20,9 +19,7 @@ const sendUserUnshareWebcam = (stream) => {
   makeCall('userUnshareWebcam', stream);
 };
 
-const getAllUsers = () => {
-  return Users.find().fetch();
-}
+const getAllUsers = () => Users.find().fetch();
 
 export default {
   sendUserShareWebcam, sendUserUnshareWebcam, joinVideo, exitVideo, getAllUsers,
diff --git a/bigbluebutton-html5/imports/ui/components/video-dock/video-menu/component.jsx b/bigbluebutton-html5/imports/ui/components/video-dock/video-menu/component.jsx
old mode 100755
new mode 100644
index 7d08e37f35..6d729bdbd3
--- a/bigbluebutton-html5/imports/ui/components/video-dock/video-menu/component.jsx
+++ b/bigbluebutton-html5/imports/ui/components/video-dock/video-menu/component.jsx
@@ -1,7 +1,7 @@
 import React from 'react';
-import { createContainer } from 'meteor/react-meteor-data';
+import PropTypes from 'prop-types';
 import Button from '/imports/ui/components/button/component';
-import { defineMessages, injectIntl } from 'react-intl';
+import { defineMessages, injectIntl, intlShape } from 'react-intl';
 
 const intlMessages = defineMessages({
   joinVideo: {
@@ -14,43 +14,48 @@ const intlMessages = defineMessages({
   },
 });
 
-class JoinVideoOptions extends React.Component {
-  render() {
-    const {
-      intl,
-      isSharingVideo,
-      handleJoinVideo,
-      handleCloseVideo,
-    } = this.props;
-
-    if (isSharingVideo) {
-        return (
-          <Button
-            onClick={handleCloseVideo}
-            label={intl.formatMessage(intlMessages.leaveVideo)}
-            hideLabel
-            aria-label={intl.formatMessage(intlMessages.leaveVideo)}
-            color={'danger'}
-            icon={'video'}
-            size={'lg'}
-            circle
-          />
-        );
-    }
+const JoinVideoOptions = (props) => {
+  const {
+    intl,
+    isSharingVideo,
+    handleJoinVideo,
+    handleCloseVideo,
+  } = props;
 
+  if (isSharingVideo) {
     return (
       <Button
-        onClick={handleJoinVideo}
-        label={intl.formatMessage(intlMessages.joinVideo)}
+        onClick={handleCloseVideo}
+        label={intl.formatMessage(intlMessages.leaveVideo)}
         hideLabel
-        aria-label={intl.formatMessage(intlMessages.joinVideo)}
-        color={'primary'}
-        icon={'video_off'}
-        size={'lg'}
+        aria-label={intl.formatMessage(intlMessages.leaveVideo)}
+        color="danger"
+        icon="video"
+        size="lg"
         circle
       />
     );
   }
-}
+
+  return (
+    <Button
+      onClick={handleJoinVideo}
+      label={intl.formatMessage(intlMessages.joinVideo)}
+      hideLabel
+      aria-label={intl.formatMessage(intlMessages.joinVideo)}
+      color="primary"
+      icon="video_off"
+      size="lg"
+      circle
+    />
+  );
+};
+
+JoinVideoOptions.propTypes = {
+  intl: intlShape.isRequired,
+  isSharingVideo: PropTypes.bool.isRequired,
+  handleJoinVideo: PropTypes.func.isRequired,
+  handleCloseVideo: PropTypes.func.isRequired,
+};
 
 export default injectIntl(JoinVideoOptions);
diff --git a/bigbluebutton-html5/imports/ui/components/video-dock/video-menu/container.jsx b/bigbluebutton-html5/imports/ui/components/video-dock/video-menu/container.jsx
old mode 100755
new mode 100644
index da7d5517f5..e90d3e1799
--- a/bigbluebutton-html5/imports/ui/components/video-dock/video-menu/container.jsx
+++ b/bigbluebutton-html5/imports/ui/components/video-dock/video-menu/container.jsx
@@ -1,15 +1,15 @@
 import React from 'react';
-import { createContainer } from 'meteor/react-meteor-data';
+import { withTracker } from 'meteor/react-meteor-data';
 import JoinVideoOptions from './component';
 import VideoMenuService from './service';
 
 const JoinVideoOptionsContainer = props => (<JoinVideoOptions {...props} />);
 
-export default createContainer((params) => {
+export default withTracker((params) => {
   const isSharingVideo = VideoMenuService.isSharingVideo();
   return {
     isSharingVideo,
     handleJoinVideo: params.handleJoinVideo,
     handleCloseVideo: params.handleCloseVideo,
   };
-}, JoinVideoOptionsContainer);
+})(JoinVideoOptionsContainer);
diff --git a/bigbluebutton-html5/imports/ui/components/whiteboard/annotation-factory/reactive-annotation/container.jsx b/bigbluebutton-html5/imports/ui/components/whiteboard/annotation-factory/reactive-annotation/container.jsx
index 9124ab46ec..51c5b5be59 100644
--- a/bigbluebutton-html5/imports/ui/components/whiteboard/annotation-factory/reactive-annotation/container.jsx
+++ b/bigbluebutton-html5/imports/ui/components/whiteboard/annotation-factory/reactive-annotation/container.jsx
@@ -1,6 +1,6 @@
 import React from 'react';
 import PropTypes from 'prop-types';
-import { createContainer } from 'meteor/react-meteor-data';
+import { withTracker } from 'meteor/react-meteor-data';
 import ReactiveAnnotationService from './service';
 import ReactiveAnnotation from './component';
 
@@ -19,14 +19,14 @@ const ReactiveAnnotationContainer = (props) => {
   return null;
 };
 
-export default createContainer((params) => {
+export default withTracker((params) => {
   const { shapeId } = params;
   const annotation = ReactiveAnnotationService.getAnnotationById(shapeId);
 
   return {
     annotation,
   };
-}, ReactiveAnnotationContainer);
+})(ReactiveAnnotationContainer);
 
 ReactiveAnnotationContainer.propTypes = {
   annotation: PropTypes.objectOf(PropTypes.oneOfType([
diff --git a/bigbluebutton-html5/imports/ui/components/whiteboard/annotation-group/container.jsx b/bigbluebutton-html5/imports/ui/components/whiteboard/annotation-group/container.jsx
index 53f3fecc97..1c697b061f 100644
--- a/bigbluebutton-html5/imports/ui/components/whiteboard/annotation-group/container.jsx
+++ b/bigbluebutton-html5/imports/ui/components/whiteboard/annotation-group/container.jsx
@@ -1,6 +1,6 @@
 import React from 'react';
 import PropTypes from 'prop-types';
-import { createContainer } from 'meteor/react-meteor-data';
+import { withTracker } from 'meteor/react-meteor-data';
 import AnnotationGroupService from './service';
 import AnnotationGroup from './component';
 
@@ -12,14 +12,14 @@ const AnnotationGroupContainer = props => (
   />
 );
 
-export default createContainer((params) => {
+export default withTracker((params) => {
   const { whiteboardId } = params;
   const annotationsInfo = AnnotationGroupService.getCurrentAnnotationsInfo(whiteboardId);
 
   return {
     annotationsInfo,
   };
-}, AnnotationGroupContainer);
+})(AnnotationGroupContainer);
 
 AnnotationGroupContainer.propTypes = {
   // initial width and height of the slide; required to calculate the annotations' coordinates
diff --git a/bigbluebutton-html5/imports/ui/components/whiteboard/annotations/text/container.jsx b/bigbluebutton-html5/imports/ui/components/whiteboard/annotations/text/container.jsx
index b58769135e..e910f81acb 100644
--- a/bigbluebutton-html5/imports/ui/components/whiteboard/annotations/text/container.jsx
+++ b/bigbluebutton-html5/imports/ui/components/whiteboard/annotations/text/container.jsx
@@ -1,5 +1,5 @@
 import React from 'react';
-import { createContainer } from 'meteor/react-meteor-data';
+import { withTracker } from 'meteor/react-meteor-data';
 import TextShapeService from './service';
 import TextDrawComponent from './component';
 
@@ -7,7 +7,7 @@ const TextDrawContainer = props => (
   <TextDrawComponent {...props} />
 );
 
-export default createContainer((params) => {
+export default withTracker((params) => {
   const isPresenter = TextShapeService.isPresenter();
   const isMultiUser = TextShapeService.getMultiUserStatus();
   const activeTextShapeId = TextShapeService.activeTextShapeId();
@@ -21,4 +21,4 @@ export default createContainer((params) => {
     setTextShapeValue: TextShapeService.setTextShapeValue,
     resetTextShapeActiveId: TextShapeService.resetTextShapeActiveId,
   };
-}, TextDrawContainer);
+})(TextDrawContainer);
diff --git a/bigbluebutton-html5/imports/ui/components/whiteboard/whiteboard-overlay/container.jsx b/bigbluebutton-html5/imports/ui/components/whiteboard/whiteboard-overlay/container.jsx
index 6db90e5968..d9580c9a81 100644
--- a/bigbluebutton-html5/imports/ui/components/whiteboard/whiteboard-overlay/container.jsx
+++ b/bigbluebutton-html5/imports/ui/components/whiteboard/whiteboard-overlay/container.jsx
@@ -1,5 +1,5 @@
 import React from 'react';
-import { createContainer } from 'meteor/react-meteor-data';
+import { withTracker } from 'meteor/react-meteor-data';
 import PropTypes from 'prop-types';
 import WhiteboardOverlayService from './service';
 import WhiteboardOverlay from './component';
@@ -13,13 +13,13 @@ const WhiteboardOverlayContainer = (props) => {
   return null;
 };
 
-export default createContainer(() => ({
+export default withTracker(() => ({
   sendAnnotation: WhiteboardOverlayService.sendAnnotation,
   setTextShapeActiveId: WhiteboardOverlayService.setTextShapeActiveId,
   resetTextShapeSession: WhiteboardOverlayService.resetTextShapeSession,
   drawSettings: WhiteboardOverlayService.getWhiteboardToolbarValues(),
   userId: WhiteboardOverlayService.getCurrentUserId(),
-}), WhiteboardOverlayContainer);
+}))(WhiteboardOverlayContainer);
 
 
 WhiteboardOverlayContainer.propTypes = {
diff --git a/bigbluebutton-html5/imports/ui/components/whiteboard/whiteboard-toolbar/container.jsx b/bigbluebutton-html5/imports/ui/components/whiteboard/whiteboard-toolbar/container.jsx
index 7c48c619b3..ed45e4208d 100644
--- a/bigbluebutton-html5/imports/ui/components/whiteboard/whiteboard-toolbar/container.jsx
+++ b/bigbluebutton-html5/imports/ui/components/whiteboard/whiteboard-toolbar/container.jsx
@@ -1,13 +1,13 @@
 import React from 'react';
-import { createContainer } from 'meteor/react-meteor-data';
+import { withTracker } from 'meteor/react-meteor-data';
 import WhiteboardToolbarService from './service';
 import WhiteboardToolbar from './component';
 
 const WhiteboardToolbarContainer = props => (
   <WhiteboardToolbar {...props} />
-  );
+);
 
-export default createContainer(() => ({
+export default withTracker(() => ({
   actions: {
     undoAnnotation: WhiteboardToolbarService.undoAnnotation,
     clearWhiteboard: WhiteboardToolbarService.clearWhiteboard,
@@ -23,4 +23,4 @@ export default createContainer(() => ({
   textShapeActiveId: WhiteboardToolbarService.getTextShapeActiveId(),
   multiUser: WhiteboardToolbarService.getMultiUserStatus(),
   isPresenter: WhiteboardToolbarService.isPresenter(),
-}), WhiteboardToolbarContainer);
+}))(WhiteboardToolbarContainer);
-- 
GitLab