diff --git a/CHANGES.rst b/CHANGES.rst
index 4d04dbade..d15c9d8ed 100644
--- a/CHANGES.rst
+++ b/CHANGES.rst
@@ -1,3 +1,14 @@
+Changes in vector v0.1.2 (2015-10-28)
+======================================
+ * Support Room Avatars
+ * Fullscreen video calls
+ * Mute mic in VoIP calls
+ * Fix bug with multiple desktop notifications
+ * Context menu on messages
+ * Better hover-over on member list
+ * Support CAS auth
+ * Many other bug fixes
+
Changes in vector v0.1.1 (2015-08-10)
======================================
diff --git a/package.json b/package.json
index 275ef4c29..cab45e836 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "vector-web",
- "version": "0.0.1",
+ "version": "0.1.2",
"description": "Vector webapp",
"author": "matrix.org",
"repository": {
@@ -27,8 +27,8 @@
"filesize": "^3.1.2",
"flux": "~2.0.3",
"linkifyjs": "^2.0.0-beta.4",
- "matrix-js-sdk": "^0.2.2",
- "matrix-react-sdk": "^0.0.1",
+ "matrix-js-sdk": "^0.3.0",
+ "matrix-react-sdk": "^0.0.2",
"q": "^1.4.1",
"react": "^0.13.3",
"react-loader": "^1.4.0"
diff --git a/src/controllers/molecules/voip/CallView.js b/src/controllers/molecules/voip/CallView.js
index b16655679..ab7121488 100644
--- a/src/controllers/molecules/voip/CallView.js
+++ b/src/controllers/molecules/voip/CallView.js
@@ -90,6 +90,7 @@ module.exports = {
else {
this.getVideoView().getLocalVideoElement().style.display = "none";
this.getVideoView().getRemoteVideoElement().style.display = "none";
+ dis.dispatch({action: 'video_fullscreen', fullscreen: false});
}
}
};
diff --git a/src/controllers/organisms/RoomList.js b/src/controllers/organisms/RoomList.js
index 03a1bfcd1..151a6ca27 100644
--- a/src/controllers/organisms/RoomList.js
+++ b/src/controllers/organisms/RoomList.js
@@ -34,6 +34,7 @@ module.exports = {
cli.on("Room.timeline", this.onRoomTimeline);
cli.on("Room.name", this.onRoomName);
cli.on("RoomState.events", this.onRoomStateEvents);
+ cli.on("RoomMember.name", this.onRoomMemberName);
var rooms = this.getRoomList();
this.setState({
@@ -116,6 +117,10 @@ module.exports = {
setTimeout(this.refreshRoomList, 0);
},
+ onRoomMemberName: function(ev, member) {
+ setTimeout(this.refreshRoomList, 0);
+ },
+
refreshRoomList: function() {
var rooms = this.getRoomList();
diff --git a/src/skins/vector/css/common.css b/src/skins/vector/css/common.css
index aff9666e9..93012c0f1 100644
--- a/src/skins/vector/css/common.css
+++ b/src/skins/vector/css/common.css
@@ -86,6 +86,10 @@ a:visited {
cursor: pointer;
}
+.mx_ContextualMenu_spinner {
+ display: block;
+ margin: 0 auto;
+}
.mx_Dialog_background {
position: fixed;
diff --git a/src/skins/vector/img/spinner.gif b/src/skins/vector/img/spinner.gif
new file mode 100644
index 000000000..ab4871214
Binary files /dev/null and b/src/skins/vector/img/spinner.gif differ
diff --git a/src/skins/vector/views/atoms/RoomAvatar.js b/src/skins/vector/views/atoms/RoomAvatar.js
index e57b3b7ae..3b5d46349 100644
--- a/src/skins/vector/views/atoms/RoomAvatar.js
+++ b/src/skins/vector/views/atoms/RoomAvatar.js
@@ -17,7 +17,6 @@ limitations under the License.
'use strict';
var React = require('react');
-var MatrixClientPeg = require('matrix-react-sdk/lib/MatrixClientPeg');
var RoomAvatarController = require('matrix-react-sdk/lib/controllers/atoms/RoomAvatar')
diff --git a/src/skins/vector/views/atoms/Spinner.js b/src/skins/vector/views/atoms/Spinner.js
new file mode 100644
index 000000000..908f26785
--- /dev/null
+++ b/src/skins/vector/views/atoms/Spinner.js
@@ -0,0 +1,34 @@
+/*
+Copyright 2015 OpenMarket Ltd
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+'use strict';
+
+var React = require('react');
+
+module.exports = React.createClass({
+ displayName: 'Spinner',
+
+ render: function() {
+ var w = this.props.w || 32;
+ var h = this.props.h || 32;
+ var imgClass = this.props.imgClassName || "";
+ return (
+
+
+
+ );
+ }
+});
diff --git a/src/skins/vector/views/molecules/EventAsTextTile.js b/src/skins/vector/views/molecules/EventAsTextTile.js
index db9df9f49..ec644a4ec 100644
--- a/src/skins/vector/views/molecules/EventAsTextTile.js
+++ b/src/skins/vector/views/molecules/EventAsTextTile.js
@@ -18,7 +18,6 @@ limitations under the License.
var React = require('react');
-var sdk = require('matrix-react-sdk')
var TextForEvent = require('matrix-react-sdk/lib/TextForEvent');
module.exports = React.createClass({
diff --git a/src/skins/vector/views/molecules/EventTile.js b/src/skins/vector/views/molecules/EventTile.js
index 1b1642bde..389b8b401 100644
--- a/src/skins/vector/views/molecules/EventTile.js
+++ b/src/skins/vector/views/molecules/EventTile.js
@@ -69,8 +69,6 @@ module.exports = React.createClass({
var SenderProfile = sdk.getComponent('molecules.SenderProfile');
var MemberAvatar = sdk.getComponent('atoms.MemberAvatar');
- var UnknownMessageTile = sdk.getComponent('molecules.UnknownMessageTile');
-
var content = this.props.mxEvent.getContent();
var msgtype = content.msgtype;
diff --git a/src/skins/vector/views/molecules/MemberInfo.js b/src/skins/vector/views/molecules/MemberInfo.js
index cc9a8f2d3..a2a3874ac 100644
--- a/src/skins/vector/views/molecules/MemberInfo.js
+++ b/src/skins/vector/views/molecules/MemberInfo.js
@@ -17,6 +17,7 @@ limitations under the License.
'use strict';
var React = require('react');
+var Loader = require("../atoms/Spinner");
var MatrixClientPeg = require('matrix-react-sdk/lib/MatrixClientPeg');
var MemberInfoController = require('matrix-react-sdk/lib/controllers/molecules/MemberInfo')
@@ -26,7 +27,7 @@ module.exports = React.createClass({
mixins: [MemberInfoController],
render: function() {
- var interactButton, kickButton, banButton, muteButton, giveModButton;
+ var interactButton, kickButton, banButton, muteButton, giveModButton, spinner;
if (this.props.member.userId === MatrixClientPeg.get().credentials.userId) {
interactButton = Leave room
;
}
@@ -34,6 +35,10 @@ module.exports = React.createClass({
interactButton = Start chat
;
}
+ if (this.state.creatingRoom) {
+ spinner = ;
+ }
+
if (this.state.can.kick) {
kickButton =
Kick
@@ -64,6 +69,7 @@ module.exports = React.createClass({
{kickButton}
{banButton}
{giveModButton}
+ {spinner}
);
}
diff --git a/src/skins/vector/views/molecules/MessageTile.js b/src/skins/vector/views/molecules/MessageTile.js
index 44f5b6356..f30fee92d 100644
--- a/src/skins/vector/views/molecules/MessageTile.js
+++ b/src/skins/vector/views/molecules/MessageTile.js
@@ -17,12 +17,10 @@ limitations under the License.
'use strict';
var React = require('react');
-var classNames = require("classnames");
var sdk = require('matrix-react-sdk')
var MessageTileController = require('matrix-react-sdk/lib/controllers/molecules/MessageTile')
-var ContextualMenu = require('../../../../ContextualMenu');
module.exports = React.createClass({
displayName: 'MessageTile',
diff --git a/src/skins/vector/views/molecules/RoomHeader.js b/src/skins/vector/views/molecules/RoomHeader.js
index de6aea15e..d3f9119ae 100644
--- a/src/skins/vector/views/molecules/RoomHeader.js
+++ b/src/skins/vector/views/molecules/RoomHeader.js
@@ -39,7 +39,7 @@ module.exports = React.createClass({
},
onFullscreenClick: function() {
- dis.dispatch({action: 'video_fullscreen'}, true);
+ dis.dispatch({action: 'video_fullscreen', fullscreen: true}, true);
},
render: function() {
@@ -61,7 +61,7 @@ module.exports = React.createClass({
var call_buttons;
var zoom_button;
if (this.state && this.state.call_state != 'ended') {
- var muteVideoButton;
+ //var muteVideoButton;
var activeCall = (
CallHandler.getCallForRoom(this.props.room.roomId)
);
diff --git a/src/skins/vector/views/molecules/voip/IncomingCallBox.js b/src/skins/vector/views/molecules/voip/IncomingCallBox.js
index ee437f0a6..c3bcd8258 100644
--- a/src/skins/vector/views/molecules/voip/IncomingCallBox.js
+++ b/src/skins/vector/views/molecules/voip/IncomingCallBox.js
@@ -31,24 +31,28 @@ module.exports = React.createClass({
},
render: function() {
+
+ // NB: This block MUST have a "key" so React doesn't clobber the elements
+ // between in-call / not-in-call.
+ var audioBlock = (
+
+ );
+
if (!this.state.incomingCall || !this.state.incomingCall.roomId) {
return (
);
}
var caller = MatrixClientPeg.get().getRoom(this.state.incomingCall.roomId).name;
return (
+ {audioBlock}
-
Incoming { this.state.incomingCall ? this.state.incomingCall.type : '' } call from { caller }
diff --git a/src/skins/vector/views/molecules/voip/VideoView.js b/src/skins/vector/views/molecules/voip/VideoView.js
index 9dff7cdf3..4e0fb913e 100644
--- a/src/skins/vector/views/molecules/voip/VideoView.js
+++ b/src/skins/vector/views/molecules/voip/VideoView.js
@@ -51,8 +51,26 @@ module.exports = React.createClass({
return;
}
var element = this.container.getDOMNode();
- var requestMethod = element.requestFullScreen || element.webkitRequestFullScreen || element.mozRequestFullScreen || element.msRequestFullscreen;
- requestMethod.call(element);
+ if (payload.fullscreen) {
+ var requestMethod = (
+ element.requestFullScreen ||
+ element.webkitRequestFullScreen ||
+ element.mozRequestFullScreen ||
+ element.msRequestFullscreen
+ );
+ requestMethod.call(element);
+ }
+ else {
+ var exitMethod = (
+ document.exitFullscreen ||
+ document.mozCancelFullScreen ||
+ document.webkitExitFullscreen ||
+ document.msExitFullscreen
+ );
+ if (exitMethod) {
+ exitMethod.call(document);
+ }
+ }
break;
}
},