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:
Bruno Windels 2019-04-11 12:43:39 +00:00 committed by GitHub
commit 86a6037a12
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
5 changed files with 76 additions and 75 deletions

View file

@ -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

View file

@ -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']}
/>, />,
]; ];

View file

@ -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() {

View file

@ -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,30 +83,11 @@ 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
if (this.state.phase === payload.phase && payload.fromHeader) {
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({ this.setState({
phase: payload.phase, phase: payload.phase,
}); });
} }
} }
}
render() { render() {
// inline style as this will be swapped around in future commits // inline style as this will be swapped around in future commits

View file

@ -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']}
/>, />,
]; ];