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 275ef4c2..cab45e83 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 03a1bfcd..151a6ca2 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 aff9666e..93012c0f 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 e57b3b7a..3b5d4634 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 1b1642bd..389b8b40 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 cc9a8f2d..a2a3874a 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 44f5b635..f30fee92 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 de6aea15..d3f9119a 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 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 (
- + {audioBlock}
); } 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; } },