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 (
- + {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; } },