diff --git a/CHANGES.rst b/CHANGES.rst
index 4d04dbad..d15c9d8e 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 3cfbab52..78e9e64b 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 b1665567..ab712148 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 012910c2..964a2648 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 s = this.getRoomLists();
s.activityMap = {};
@@ -112,6 +113,10 @@ module.exports = {
setTimeout(this.refreshRoomList, 0);
},
+ onRoomMemberName: function(ev, member) {
+ setTimeout(this.refreshRoomList, 0);
+ },
+
refreshRoomList: function() {
this.setState(this.getRoomLists());
diff --git a/src/skins/vector/css/common.css b/src/skins/vector/css/common.css
index 39f713e5..a68d190d 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 00000000..ab487121
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 161b1eb1..a1d87f7f 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 00000000..908f2678
--- /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 db9df9f4..ec644a4e 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 3be02a5d..6c2f948c 100644
--- a/src/skins/vector/views/molecules/EventTile.js
+++ b/src/skins/vector/views/molecules/EventTile.js
@@ -70,8 +70,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;
@@ -79,7 +77,7 @@ module.exports = React.createClass({
// This shouldn't happen: the caller should check we support this type
// before trying to instantiate us
if (!EventTileType) {
- return null;
+ throw new Error("Event type not supported");
}
var classes = classNames({
diff --git a/src/skins/vector/views/molecules/MemberInfo.js b/src/skins/vector/views/molecules/MemberInfo.js
index 1c62fe41..5f8e806d 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 sdk = require('matrix-react-sdk')
@@ -37,7 +38,7 @@ module.exports = React.createClass({
},
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
;
}
@@ -45,6 +46,10 @@ module.exports = React.createClass({
interactButton = Start chat
;
}
+ if (this.state.creatingRoom) {
+ spinner = ;
+ }
+
if (this.state.can.kick) {
kickButton =
Kick
@@ -88,6 +93,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 4386c13f..6ea44413 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 ddd27c20..7f45fd42 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() {
@@ -60,7 +60,7 @@ module.exports = React.createClass({
var call_buttons;
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 ee437f0a..c3bcd825 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 9dff7cdf..4e0fb913 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;
}
},