diff --git a/skins/base/views/organisms/RoomList.js b/skins/base/views/organisms/RoomList.js
index 82e33573..a3d02066 100644
--- a/skins/base/views/organisms/RoomList.js
+++ b/skins/base/views/organisms/RoomList.js
@@ -18,7 +18,7 @@ limitations under the License.
var React = require('react');
var ComponentBroker = require('../../../../src/ComponentBroker');
-
+var CallView = ComponentBroker.get('molecules/voip/CallView');
var RoomDropTarget = ComponentBroker.get('molecules/RoomDropTarget');
var RoomListController = require("../../../../src/controllers/organisms/RoomList");
@@ -28,8 +28,14 @@ module.exports = React.createClass({
mixins: [RoomListController],
render: function() {
+ var callElement;
+ if (this.state.show_call_element) {
+ callElement =
+ }
+
return (
+ {callElement}
Favourites
diff --git a/skins/base/views/pages/MatrixChat.js b/skins/base/views/pages/MatrixChat.js
index 602e241e..0fb627ab 100644
--- a/skins/base/views/pages/MatrixChat.js
+++ b/skins/base/views/pages/MatrixChat.js
@@ -18,7 +18,6 @@ limitations under the License.
var React = require('react');
var ComponentBroker = require('../../../../src/ComponentBroker');
-var CallHandler = require('../../../../src/CallHandler');
var LeftPanel = ComponentBroker.get('organisms/LeftPanel');
var RoomView = ComponentBroker.get('organisms/RoomView');
@@ -30,7 +29,6 @@ var CreateRoom = ComponentBroker.get('organisms/CreateRoom');
var RoomDirectory = ComponentBroker.get('organisms/RoomDirectory');
var MatrixToolbar = ComponentBroker.get('molecules/MatrixToolbar');
var Notifier = ComponentBroker.get('organisms/Notifier');
-var CallView = ComponentBroker.get('molecules/voip/CallView');
var MatrixChatController = require('../../../../src/controllers/pages/MatrixChat');
@@ -55,7 +53,7 @@ module.exports = React.createClass({
render: function() {
if (this.state.logged_in && this.state.ready) {
- var page_element, call_element;
+ var page_element;
var right_panel = "";
switch (this.state.page_type) {
@@ -76,18 +74,6 @@ module.exports = React.createClass({
right_panel =
break;
}
- // if we aren't viewing a room with an ongoing call, but there is an
- // active call, show the call element - we need to do this to make
- // audio/video not crap out
- if (this.state.active_call && (
- !this.state.currentRoom ||
- !CallHandler.getCallForRoom(this.state.currentRoom))) {
- console.log(
- "Creating global CallView for active call in room %s",
- this.state.active_call.roomId
- );
- call_element =
- }
// TODO: Fix duplication here and do conditionals like we do above
if (Notifier.supportsDesktopNotifications() && !Notifier.isEnabled() && !Notifier.isToolbarHidden()) {
@@ -96,7 +82,6 @@ module.exports = React.createClass({
- {call_element}
{page_element}
@@ -109,7 +94,6 @@ module.exports = React.createClass({
return (
- {call_element}
{page_element}
diff --git a/src/controllers/organisms/RoomList.js b/src/controllers/organisms/RoomList.js
index da571552..3933f53e 100644
--- a/src/controllers/organisms/RoomList.js
+++ b/src/controllers/organisms/RoomList.js
@@ -19,9 +19,11 @@ limitations under the License.
var React = require("react");
var MatrixClientPeg = require("../../MatrixClientPeg");
var RoomListSorter = require("../../RoomListSorter");
+var dis = require("../../dispatcher");
var ComponentBroker = require('../../ComponentBroker');
var ConferenceHandler = require("../../ConferenceHandler");
+var CallHandler = require("../../CallHandler");
var RoomTile = ComponentBroker.get("molecules/RoomTile");
@@ -41,7 +43,22 @@ module.exports = {
});
},
+ componentDidMount: function() {
+ this.dispatcherRef = dis.register(this.onAction);
+ },
+
+ onAction: function(payload) {
+ switch (payload.action) {
+ // listen for call state changes to prod the render method, which
+ // may hide the global CallView if the call it is tracking is dead
+ case 'call_state':
+ this._recheckCallElement(this.props.selectedRoom);
+ break;
+ }
+ },
+
componentWillUnmount: function() {
+ dis.unregister(this.dispatcherRef);
if (MatrixClientPeg.get()) {
MatrixClientPeg.get().removeListener("Room", this.onRoom);
MatrixClientPeg.get().removeListener("Room.timeline", this.onRoomTimeline);
@@ -51,6 +68,7 @@ module.exports = {
componentWillReceiveProps: function(newProps) {
this.state.activityMap[newProps.selectedRoom] = undefined;
+ this._recheckCallElement(newProps.selectedRoom);
this.setState({
activityMap: this.state.activityMap
});
@@ -122,6 +140,18 @@ module.exports = {
);
},
+ _recheckCallElement: function(selectedRoomId) {
+ // if we aren't viewing a room with an ongoing call, but there is an
+ // active call, show the call element - we need to do this to make
+ // audio/video not crap out
+ var activeCall = CallHandler.getAnyActiveCall();
+ var callForRoom = CallHandler.getCallForRoom(selectedRoomId);
+ var showCall = (activeCall && !callForRoom);
+ this.setState({
+ show_call_element: showCall
+ });
+ },
+
makeRoomTiles: function() {
var self = this;
return this.state.roomList.map(function(room) {
@@ -136,5 +166,5 @@ module.exports = {
/>
);
});
- },
+ }
};
diff --git a/src/controllers/pages/MatrixChat.js b/src/controllers/pages/MatrixChat.js
index b98f42c0..08cc652d 100644
--- a/src/controllers/pages/MatrixChat.js
+++ b/src/controllers/pages/MatrixChat.js
@@ -26,7 +26,6 @@ var dis = require("../../dispatcher");
var q = require("q");
var ComponentBroker = require('../../ComponentBroker');
-var CallHandler = require("../../CallHandler");
var Notifier = ComponentBroker.get('organisms/Notifier');
var MatrixTools = require('../../MatrixTools');
@@ -206,13 +205,6 @@ module.exports = {
case 'notifier_enabled':
this.forceUpdate();
break;
- case 'call_state':
- // listen for call state changes to prod the render method, which
- // may hide the global CallView if the call it is tracking is dead
- this.setState({
- active_call: CallHandler.getAnyActiveCall()
- });
- break;
}
},