diff --git a/src/components/structures/RightPanel.js b/src/components/structures/RightPanel.js index 9120de8c..62adaa74 100644 --- a/src/components/structures/RightPanel.js +++ b/src/components/structures/RightPanel.js @@ -1,5 +1,7 @@ /* Copyright 2015, 2016 OpenMarket Ltd +Copyright 2017 Vector Creations Ltd +Copyright 2017 New Vector Ltd Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -14,8 +16,6 @@ See the License for the specific language governing permissions and limitations under the License. */ -'use strict'; - import React from 'react'; import { _t } from 'matrix-react-sdk/lib/languageHandler'; import sdk from 'matrix-react-sdk'; @@ -26,26 +26,31 @@ import Analytics from 'matrix-react-sdk/lib/Analytics'; import rate_limited_func from 'matrix-react-sdk/lib/ratelimitedfunc'; import Modal from 'matrix-react-sdk/lib/Modal'; import AccessibleButton from 'matrix-react-sdk/lib/components/views/elements/AccessibleButton'; +import { showGroupInviteDialog } from 'matrix-react-sdk/lib/GroupInvite'; module.exports = React.createClass({ displayName: 'RightPanel', propTypes: { - // TODO: This should not be a prop, it should be received from the RoomViewStore + // TODO: We're trying to move away from these being props, but we need to know + // whether we should be displaying a room or group member list roomId: React.PropTypes.string, // if showing panels for a given room, this is set + groupId: React.PropTypes.string, // if showing panels for a given group, this is set collapsed: React.PropTypes.bool, // currently unused property to request for a minimized view of the panel }, Phase: { - MemberList: 'MemberList', + RoomMemberList: 'RoomMemberList', + GroupMemberList: 'GroupMemberList', FilePanel: 'FilePanel', NotificationPanel: 'NotificationPanel', - MemberInfo: 'MemberInfo', + RoomMemberInfo: 'RoomMemberInfo', + GroupMemberInfo: 'GroupMemberInfo', }, componentWillMount: function() { this.dispatcherRef = dis.register(this.onAction); - var cli = MatrixClientPeg.get(); + const cli = MatrixClientPeg.get(); cli.on("RoomState.members", this.onRoomStateMember); }, @@ -57,14 +62,20 @@ module.exports = React.createClass({ }, getInitialState: function() { - return { - phase: this.Phase.MemberList - }; + if (this.props.groupId) { + return { + phase: this.Phase.GroupMemberList, + }; + } else { + return { + phase: this.Phase.RoomMemberList, + }; + } }, onMemberListButtonClick: function() { Analytics.trackEvent('Right Panel', 'Member List Button', 'click'); - this.setState({ phase: this.Phase.MemberList }); + this.setState({ phase: this.Phase.RoomMemberList }); }, onFileListButtonClick: function() { @@ -89,19 +100,23 @@ module.exports = React.createClass({ return; } - // call ChatInviteDialog - dis.dispatch({ - action: 'view_invite', - roomId: this.props.roomId, - }); + if (this.state.phase === this.Phase.GroupMemberList) { + showGroupInviteDialog(this.props.groupId); + } else { + // call UserPickerDialog + dis.dispatch({ + action: 'view_invite', + roomId: this.props.roomId, + }); + } }, onRoomStateMember: function(ev, state, member) { // redraw the badge on the membership list - if (this.state.phase == this.Phase.MemberList && member.roomId === this.props.roomId) { + if (this.state.phase == this.Phase.RoomMemberList && member.roomId === this.props.roomId) { this._delayedUpdate(); } - else if (this.state.phase === this.Phase.MemberInfo && member.roomId === this.props.roomId && + else if (this.state.phase === this.Phase.RoomMemberInfo && member.roomId === this.props.roomId && member.userId === this.state.member.userId) { // refresh the member info (e.g. new power level) this._delayedUpdate(); @@ -119,39 +134,55 @@ module.exports = React.createClass({ }); if (payload.member) { this.setState({ - phase: this.Phase.MemberInfo, + phase: this.Phase.RoomMemberInfo, member: payload.member, }); + } else { + if (this.props.roomId) { + this.setState({ + phase: this.Phase.RoomMemberList + }); + } else if (this.props.groupId) { + this.setState({ + phase: this.Phase.GroupMemberList, + groupId: payload.groupId, + member: payload.member, + }); + } } - else { - this.setState({ - phase: this.Phase.MemberList - }); - } - } - else if (payload.action === "view_room") { - if (this.state.phase === this.Phase.MemberInfo) { - this.setState({ - phase: this.Phase.MemberList - }); - } + } else if (payload.action === "view_group") { + this.setState({ + phase: this.Phase.GroupMemberList, + groupId: payload.groupId, + member: null, + }); + } else if (payload.action === "view_group_user") { + this.setState({ + phase: this.Phase.GroupMemberInfo, + groupId: payload.groupId, + member: payload.member, + }); + } else if (payload.action === "view_room") { + this.setState({ + phase: this.Phase.RoomMemberList + }); } }, render: function() { - var MemberList = sdk.getComponent('rooms.MemberList'); - var NotificationPanel = sdk.getComponent('structures.NotificationPanel'); - var FilePanel = sdk.getComponent('structures.FilePanel'); - var TintableSvg = sdk.getComponent("elements.TintableSvg"); - var buttonGroup; - var inviteGroup; - var panel; + const MemberList = sdk.getComponent('rooms.MemberList'); + const GroupMemberList = sdk.getComponent('groups.GroupMemberList'); + const NotificationPanel = sdk.getComponent('structures.NotificationPanel'); + const FilePanel = sdk.getComponent('structures.FilePanel'); + const TintableSvg = sdk.getComponent("elements.TintableSvg"); + let inviteGroup; + let panel; - var filesHighlight; - var membersHighlight; - var notificationsHighlight; + let filesHighlight; + let membersHighlight; + let notificationsHighlight; if (!this.props.collapsed) { - if (this.state.phase == this.Phase.MemberList || this.state.phase === this.Phase.MemberInfo) { + if (this.state.phase == this.Phase.RoomMemberList || this.state.phase === this.Phase.RoomMemberInfo) { membersHighlight =
; } else if (this.state.phase == this.Phase.FilePanel) { @@ -162,11 +193,11 @@ module.exports = React.createClass({ } } - var membersBadge; - if ((this.state.phase == this.Phase.MemberList || this.state.phase === this.Phase.MemberInfo) && this.props.roomId) { - var cli = MatrixClientPeg.get(); - var room = cli.getRoom(this.props.roomId); - var user_is_in_room; + let membersBadge; + if ((this.state.phase == this.Phase.RoomMemberList || this.state.phase === this.Phase.RoomMemberInfo) && this.props.roomId) { + const cli = MatrixClientPeg.get(); + const room = cli.getRoom(this.props.roomId); + let user_is_in_room; if (room) { membersBadge = room.getJoinedMembers().length; user_is_in_room = room.hasMembershipState( @@ -186,48 +217,72 @@ module.exports = React.createClass({ } + let headerButtons = []; if (this.props.roomId) { - buttonGroup = -
- -
{ membersBadge ? membersBadge :  }
- - { membersHighlight } -
- -
 
- - { filesHighlight } -
- -
 
- - { notificationsHighlight } -
-
- -
-
; + headerButtons.push( + +
{ membersBadge ? membersBadge :  }
+ + { membersHighlight } +
+ ); + headerButtons.push( + +
 
+ + { filesHighlight } +
+ ); + headerButtons.push( + +
 
+ + { notificationsHighlight } +
+ ); + } + + if (this.props.roomId || this.props.groupId) { + // Hiding the right panel hides it completely and relies on an 'expand' button + // being put in the RoomHeader or GroupView header, so only show the minimise + // button on these 2 screens or you won't be able to re-expand the panel. + headerButtons.push( +
+ +
+ ); } if (!this.props.collapsed) { - if(this.props.roomId && this.state.phase == this.Phase.MemberList) { + if (this.props.roomId && this.state.phase == this.Phase.RoomMemberList) { panel = - } - else if(this.state.phase == this.Phase.MemberInfo) { - var MemberInfo = sdk.getComponent('rooms.MemberInfo'); + } else if (this.props.groupId && this.state.phase == this.Phase.GroupMemberList) { + panel = ; + inviteGroup = ( + +
+ +
+
{ _t('Invite to this group') }
+
+ ); + } else if (this.state.phase == this.Phase.RoomMemberInfo) { + const MemberInfo = sdk.getComponent('rooms.MemberInfo'); panel = - } - else if (this.state.phase == this.Phase.NotificationPanel) { - panel = - } - else if (this.state.phase == this.Phase.FilePanel) { - panel = + } else if (this.state.phase == this.Phase.GroupMemberInfo) { + const GroupMemberInfo = sdk.getComponent('groups.GroupMemberInfo'); + panel = ; + } else if (this.state.phase == this.Phase.NotificationPanel) { + panel = ; + } else if (this.state.phase == this.Phase.FilePanel) { + panel = ; } } @@ -235,7 +290,7 @@ module.exports = React.createClass({ panel =
; } - var classes = "mx_RightPanel mx_fadable"; + let classes = "mx_RightPanel mx_fadable"; if (this.props.collapsed) { classes += " collapsed"; } @@ -243,7 +298,9 @@ module.exports = React.createClass({ return (