Merge pull request #2906 from matrix-org/bwindels/toggleheaderbutton
Fix having to click the member list button twice to show it after having changed room.
This commit is contained in:
commit
86a6037a12
5 changed files with 76 additions and 75 deletions
|
@ -565,20 +565,6 @@ export default React.createClass({
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
break;
|
break;
|
||||||
case 'view_user':
|
|
||||||
// FIXME: ugly hack to expand the RightPanel and then re-dispatch.
|
|
||||||
if (this.state.collapsedRhs) {
|
|
||||||
setTimeout(()=>{
|
|
||||||
dis.dispatch({
|
|
||||||
action: 'show_right_panel',
|
|
||||||
});
|
|
||||||
dis.dispatch({
|
|
||||||
action: 'view_user',
|
|
||||||
member: payload.member,
|
|
||||||
});
|
|
||||||
}, 0);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case 'view_room':
|
case 'view_room':
|
||||||
// Takes either a room ID or room alias: if switching to a room the client is already
|
// Takes either a room ID or room alias: if switching to a room the client is already
|
||||||
// known to be in (eg. user clicks on a room in the recents panel), supply the ID
|
// known to be in (eg. user clicks on a room in the recents panel), supply the ID
|
||||||
|
|
|
@ -19,23 +19,30 @@ limitations under the License.
|
||||||
|
|
||||||
import React from 'react';
|
import React from 'react';
|
||||||
import { _t } from '../../../languageHandler';
|
import { _t } from '../../../languageHandler';
|
||||||
import dis from '../../../dispatcher';
|
|
||||||
import HeaderButton from './HeaderButton';
|
import HeaderButton from './HeaderButton';
|
||||||
import HeaderButtons from './HeaderButtons';
|
import HeaderButtons from './HeaderButtons';
|
||||||
import RightPanel from '../../structures/RightPanel';
|
import RightPanel from '../../structures/RightPanel';
|
||||||
|
|
||||||
|
const GROUP_PHASES = [
|
||||||
|
RightPanel.Phase.GroupMemberInfo,
|
||||||
|
RightPanel.Phase.GroupMemberList,
|
||||||
|
];
|
||||||
|
const ROOM_PHASES = [
|
||||||
|
RightPanel.Phase.GroupRoomList,
|
||||||
|
RightPanel.Phase.GroupRoomInfo,
|
||||||
|
];
|
||||||
|
|
||||||
export default class GroupHeaderButtons extends HeaderButtons {
|
export default class GroupHeaderButtons extends HeaderButtons {
|
||||||
constructor(props) {
|
constructor(props) {
|
||||||
super(props, RightPanel.Phase.GroupMemberList);
|
super(props, RightPanel.Phase.GroupMemberList);
|
||||||
|
this._onMembersClicked = this._onMembersClicked.bind(this);
|
||||||
|
this._onRoomsClicked = this._onRoomsClicked.bind(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
onAction(payload) {
|
onAction(payload) {
|
||||||
super.onAction(payload);
|
super.onAction(payload);
|
||||||
|
|
||||||
if (payload.action === "view_user") {
|
if (payload.action === "view_user") {
|
||||||
dis.dispatch({
|
|
||||||
action: 'show_right_panel',
|
|
||||||
});
|
|
||||||
if (payload.member) {
|
if (payload.member) {
|
||||||
this.setPhase(RightPanel.Phase.RoomMemberInfo, {member: payload.member});
|
this.setPhase(RightPanel.Phase.RoomMemberInfo, {member: payload.member});
|
||||||
} else {
|
} else {
|
||||||
|
@ -54,27 +61,26 @@ export default class GroupHeaderButtons extends HeaderButtons {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
renderButtons() {
|
_onMembersClicked() {
|
||||||
const groupPhases = [
|
this.togglePhase(RightPanel.Phase.GroupMemberList, GROUP_PHASES);
|
||||||
RightPanel.Phase.GroupMemberInfo,
|
}
|
||||||
RightPanel.Phase.GroupMemberList,
|
|
||||||
];
|
|
||||||
const roomPhases = [
|
|
||||||
RightPanel.Phase.GroupRoomList,
|
|
||||||
RightPanel.Phase.GroupRoomInfo,
|
|
||||||
];
|
|
||||||
|
|
||||||
|
_onRoomsClicked() {
|
||||||
|
this.togglePhase(RightPanel.Phase.GroupRoomList, ROOM_PHASES);
|
||||||
|
}
|
||||||
|
|
||||||
|
renderButtons() {
|
||||||
return [
|
return [
|
||||||
<HeaderButton key="groupMembersButton" name="groupMembersButton"
|
<HeaderButton key="groupMembersButton" name="groupMembersButton"
|
||||||
title={_t('Members')}
|
title={_t('Members')}
|
||||||
isHighlighted={this.isPhase(groupPhases)}
|
isHighlighted={this.isPhase(GROUP_PHASES)}
|
||||||
clickPhase={RightPanel.Phase.GroupMemberList}
|
onClick={this._onMembersClicked}
|
||||||
analytics={['Right Panel', 'Group Member List Button', 'click']}
|
analytics={['Right Panel', 'Group Member List Button', 'click']}
|
||||||
/>,
|
/>,
|
||||||
<HeaderButton key="roomsButton" name="roomsButton"
|
<HeaderButton key="roomsButton" name="roomsButton"
|
||||||
title={_t('Rooms')}
|
title={_t('Rooms')}
|
||||||
isHighlighted={this.isPhase(roomPhases)}
|
isHighlighted={this.isPhase(ROOM_PHASES)}
|
||||||
clickPhase={RightPanel.Phase.GroupRoomList}
|
onClick={this._onRoomsClicked}
|
||||||
analytics={['Right Panel', 'Group Room List Button', 'click']}
|
analytics={['Right Panel', 'Group Room List Button', 'click']}
|
||||||
/>,
|
/>,
|
||||||
];
|
];
|
||||||
|
|
|
@ -20,7 +20,6 @@ limitations under the License.
|
||||||
import React from 'react';
|
import React from 'react';
|
||||||
import PropTypes from 'prop-types';
|
import PropTypes from 'prop-types';
|
||||||
import classNames from 'classnames';
|
import classNames from 'classnames';
|
||||||
import dis from '../../../dispatcher';
|
|
||||||
import Analytics from '../../../Analytics';
|
import Analytics from '../../../Analytics';
|
||||||
import AccessibleButton from '../elements/AccessibleButton';
|
import AccessibleButton from '../elements/AccessibleButton';
|
||||||
|
|
||||||
|
@ -32,11 +31,7 @@ export default class HeaderButton extends React.Component {
|
||||||
|
|
||||||
onClick(ev) {
|
onClick(ev) {
|
||||||
Analytics.trackEvent(...this.props.analytics);
|
Analytics.trackEvent(...this.props.analytics);
|
||||||
dis.dispatch({
|
this.props.onClick();
|
||||||
action: 'view_right_panel_phase',
|
|
||||||
phase: this.props.clickPhase,
|
|
||||||
fromHeader: true,
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
render() {
|
render() {
|
||||||
|
|
|
@ -40,14 +40,36 @@ export default class HeaderButtons extends React.Component {
|
||||||
dis.unregister(this.dispatcherRef);
|
dis.unregister(this.dispatcherRef);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
componentDidUpdate(prevProps) {
|
||||||
|
if (!prevProps.collapsedRhs && this.props.collapsedRhs) {
|
||||||
|
this.setState({
|
||||||
|
phase: null,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
setPhase(phase, extras) {
|
setPhase(phase, extras) {
|
||||||
// TODO: delay?
|
if (this.props.collapsedRhs) {
|
||||||
|
dis.dispatch({
|
||||||
|
action: 'show_right_panel',
|
||||||
|
});
|
||||||
|
}
|
||||||
dis.dispatch(Object.assign({
|
dis.dispatch(Object.assign({
|
||||||
action: 'view_right_panel_phase',
|
action: 'view_right_panel_phase',
|
||||||
phase: phase,
|
phase: phase,
|
||||||
}, extras));
|
}, extras));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
togglePhase(phase, validPhases = [phase]) {
|
||||||
|
if (validPhases.includes(this.state.phase)) {
|
||||||
|
dis.dispatch({
|
||||||
|
action: 'hide_right_panel',
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
this.setPhase(phase);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
isPhase(phases) {
|
isPhase(phases) {
|
||||||
if (this.props.collapsedRhs) {
|
if (this.props.collapsedRhs) {
|
||||||
return false;
|
return false;
|
||||||
|
@ -61,28 +83,9 @@ export default class HeaderButtons extends React.Component {
|
||||||
|
|
||||||
onAction(payload) {
|
onAction(payload) {
|
||||||
if (payload.action === "view_right_panel_phase") {
|
if (payload.action === "view_right_panel_phase") {
|
||||||
// only actions coming from header buttons should collapse the right panel
|
this.setState({
|
||||||
if (this.state.phase === payload.phase && payload.fromHeader) {
|
phase: payload.phase,
|
||||||
dis.dispatch({
|
});
|
||||||
action: 'hide_right_panel',
|
|
||||||
});
|
|
||||||
this.setState({
|
|
||||||
phase: null,
|
|
||||||
});
|
|
||||||
} else {
|
|
||||||
if (this.props.collapsedRhs && payload.fromHeader) {
|
|
||||||
dis.dispatch({
|
|
||||||
action: 'show_right_panel',
|
|
||||||
});
|
|
||||||
// emit payload again as the RightPanel didn't exist up
|
|
||||||
// till show_right_panel, just without the fromHeader flag
|
|
||||||
// as that would hide the right panel again
|
|
||||||
dis.dispatch(Object.assign({}, payload, {fromHeader: false}));
|
|
||||||
}
|
|
||||||
this.setState({
|
|
||||||
phase: payload.phase,
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -19,28 +19,33 @@ limitations under the License.
|
||||||
|
|
||||||
import React from 'react';
|
import React from 'react';
|
||||||
import { _t } from '../../../languageHandler';
|
import { _t } from '../../../languageHandler';
|
||||||
import dis from '../../../dispatcher';
|
|
||||||
import HeaderButton from './HeaderButton';
|
import HeaderButton from './HeaderButton';
|
||||||
import HeaderButtons from './HeaderButtons';
|
import HeaderButtons from './HeaderButtons';
|
||||||
import RightPanel from '../../structures/RightPanel';
|
import RightPanel from '../../structures/RightPanel';
|
||||||
|
|
||||||
|
const MEMBER_PHASES = [
|
||||||
|
RightPanel.Phase.RoomMemberList,
|
||||||
|
RightPanel.Phase.RoomMemberInfo,
|
||||||
|
RightPanel.Phase.Room3pidMemberInfo,
|
||||||
|
];
|
||||||
|
|
||||||
export default class RoomHeaderButtons extends HeaderButtons {
|
export default class RoomHeaderButtons extends HeaderButtons {
|
||||||
constructor(props) {
|
constructor(props) {
|
||||||
super(props, RightPanel.Phase.RoomMemberList);
|
super(props, RightPanel.Phase.RoomMemberList);
|
||||||
|
this._onMembersClicked = this._onMembersClicked.bind(this);
|
||||||
|
this._onFilesClicked = this._onFilesClicked.bind(this);
|
||||||
|
this._onNotificationsClicked = this._onNotificationsClicked.bind(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
onAction(payload) {
|
onAction(payload) {
|
||||||
super.onAction(payload);
|
super.onAction(payload);
|
||||||
if (payload.action === "view_user") {
|
if (payload.action === "view_user") {
|
||||||
dis.dispatch({
|
|
||||||
action: 'show_right_panel',
|
|
||||||
});
|
|
||||||
if (payload.member) {
|
if (payload.member) {
|
||||||
this.setPhase(RightPanel.Phase.RoomMemberInfo, {member: payload.member});
|
this.setPhase(RightPanel.Phase.RoomMemberInfo, {member: payload.member});
|
||||||
} else {
|
} else {
|
||||||
this.setPhase(RightPanel.Phase.RoomMemberList);
|
this.setPhase(RightPanel.Phase.RoomMemberList);
|
||||||
}
|
}
|
||||||
} else if (payload.action === "view_room") {
|
} else if (payload.action === "view_room" && !this.props.collapsedRhs) {
|
||||||
this.setPhase(RightPanel.Phase.RoomMemberList);
|
this.setPhase(RightPanel.Phase.RoomMemberList);
|
||||||
} else if (payload.action === "view_3pid_invite") {
|
} else if (payload.action === "view_3pid_invite") {
|
||||||
if (payload.event) {
|
if (payload.event) {
|
||||||
|
@ -51,30 +56,36 @@ export default class RoomHeaderButtons extends HeaderButtons {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
renderButtons() {
|
_onMembersClicked() {
|
||||||
const membersPhases = [
|
this.togglePhase(RightPanel.Phase.RoomMemberList, MEMBER_PHASES);
|
||||||
RightPanel.Phase.RoomMemberList,
|
}
|
||||||
RightPanel.Phase.RoomMemberInfo,
|
|
||||||
RightPanel.Phase.Room3pidMemberInfo,
|
|
||||||
];
|
|
||||||
|
|
||||||
|
_onFilesClicked() {
|
||||||
|
this.togglePhase(RightPanel.Phase.FilePanel);
|
||||||
|
}
|
||||||
|
|
||||||
|
_onNotificationsClicked() {
|
||||||
|
this.togglePhase(RightPanel.Phase.NotificationPanel);
|
||||||
|
}
|
||||||
|
|
||||||
|
renderButtons() {
|
||||||
return [
|
return [
|
||||||
<HeaderButton key="membersButton" name="membersButton"
|
<HeaderButton key="membersButton" name="membersButton"
|
||||||
title={_t('Members')}
|
title={_t('Members')}
|
||||||
isHighlighted={this.isPhase(membersPhases)}
|
isHighlighted={this.isPhase(MEMBER_PHASES)}
|
||||||
clickPhase={RightPanel.Phase.RoomMemberList}
|
onClick={this._onMembersClicked}
|
||||||
analytics={['Right Panel', 'Member List Button', 'click']}
|
analytics={['Right Panel', 'Member List Button', 'click']}
|
||||||
/>,
|
/>,
|
||||||
<HeaderButton key="filesButton" name="filesButton"
|
<HeaderButton key="filesButton" name="filesButton"
|
||||||
title={_t('Files')}
|
title={_t('Files')}
|
||||||
isHighlighted={this.isPhase(RightPanel.Phase.FilePanel)}
|
isHighlighted={this.isPhase(RightPanel.Phase.FilePanel)}
|
||||||
clickPhase={RightPanel.Phase.FilePanel}
|
onClick={this._onFilesClicked}
|
||||||
analytics={['Right Panel', 'File List Button', 'click']}
|
analytics={['Right Panel', 'File List Button', 'click']}
|
||||||
/>,
|
/>,
|
||||||
<HeaderButton key="notifsButton" name="notifsButton"
|
<HeaderButton key="notifsButton" name="notifsButton"
|
||||||
title={_t('Notifications')}
|
title={_t('Notifications')}
|
||||||
isHighlighted={this.isPhase(RightPanel.Phase.NotificationPanel)}
|
isHighlighted={this.isPhase(RightPanel.Phase.NotificationPanel)}
|
||||||
clickPhase={RightPanel.Phase.NotificationPanel}
|
onClick={this._onNotificationsClicked}
|
||||||
analytics={['Right Panel', 'Notification List Button', 'click']}
|
analytics={['Right Panel', 'Notification List Button', 'click']}
|
||||||
/>,
|
/>,
|
||||||
];
|
];
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue