From b6456a675d140d6d80eb0874a5b6a89008e28eaa Mon Sep 17 00:00:00 2001 From: David Meza Date: Fri, 1 Sep 2017 13:21:09 -0500 Subject: Add x to be able to leave public and private channels (#7145) * Add config value EnableXToLeaveChannelsFromLHS that if true displays x to the right of private and public channels on the LHS. * Displays x to the right of private and public channels on the LHS based on if EnableXToLeaveChannelsFromLHS=true. * change the tooltip for private and public channels to `Leave channel` * Add client-side event for when user clicks the "x" button. Different for public, private, DM. --- webapp/components/sidebar.jsx | 48 ++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 45 insertions(+), 3 deletions(-) (limited to 'webapp/components/sidebar.jsx') diff --git a/webapp/components/sidebar.jsx b/webapp/components/sidebar.jsx index ff889fd6b..3399734a6 100644 --- a/webapp/components/sidebar.jsx +++ b/webapp/components/sidebar.jsx @@ -21,6 +21,7 @@ import AppDispatcher from 'dispatcher/app_dispatcher.jsx'; import * as Utils from 'utils/utils.jsx'; import * as ChannelUtils from 'utils/channel_utils.jsx'; import * as ChannelActions from 'actions/channel_actions.jsx'; +import * as GlobalActions from 'actions/global_actions.jsx'; import {trackEvent} from 'actions/diagnostics_actions.jsx'; import {ActionTypes, Constants} from 'utils/constants.jsx'; @@ -326,6 +327,18 @@ export default class Sidebar extends React.Component { return this.state.favoriteChannels.concat(this.state.publicChannels).concat(this.state.privateChannels).concat(this.state.directAndGroupChannels); } + handleLeavePublicChannel = (e, channel) => { + e.preventDefault(); + ChannelActions.leaveChannel(channel.id); + trackEvent('ui', 'ui_public_channel_x_button_clicked'); + } + + handleLeavePrivateChannel = (e, channel) => { + e.preventDefault(); + GlobalActions.showLeavePrivateChannelModal(channel); + trackEvent('ui', 'ui_private_channel_x_button_clicked'); + } + handleLeaveDirectChannel = (e, channel) => { e.preventDefault(); @@ -354,6 +367,7 @@ export default class Sidebar extends React.Component { } this.setState(this.getStateFromStores()); + trackEvent('ui', 'ui_direct_channel_x_button_clicked'); } if (channel.id === this.state.activeId) { @@ -545,7 +559,7 @@ export default class Sidebar extends React.Component { } let closeButton = null; - const removeTooltip = ( + let removeTooltip = ( ); + if (channel.type === Constants.OPEN_CHANNEL || channel.type === Constants.PRIVATE_CHANNEL) { + removeTooltip = ( + + + + ); + } if (handleClose && !badge) { closeButton = ( { if (channel.type === Constants.DM_CHANNEL || channel.type === Constants.GM_CHANNEL) { return this.createChannelElement(channel, index, arr, this.handleLeaveDirectChannel); + } else if (global.window.mm_config.EnableXToLeaveChannelsFromLHS === 'true') { + if (channel.type === Constants.OPEN_CHANNEL && channel.name !== Constants.DEFAULT_CHANNEL) { + return this.createChannelElement(channel, index, arr, this.handleLeavePublicChannel); + } else if (channel.type === Constants.PRIVATE_CHANNEL) { + return this.createChannelElement(channel, index, arr, this.handleLeavePrivateChannel); + } } return this.createChannelElement(channel); }); - const publicChannelItems = this.state.publicChannels.map(this.createChannelElement); + const publicChannelItems = this.state.publicChannels.map((channel, index, arr) => { + if (global.window.mm_config.EnableXToLeaveChannelsFromLHS !== 'true' || + channel.name === Constants.DEFAULT_CHANNEL + ) { + return this.createChannelElement(channel); + } + return this.createChannelElement(channel, index, arr, this.handleLeavePublicChannel); + }); - const privateChannelItems = this.state.privateChannels.map(this.createChannelElement); + const privateChannelItems = this.state.privateChannels.map((channel, index, arr) => { + if (global.window.mm_config.EnableXToLeaveChannelsFromLHS !== 'true') { + return this.createChannelElement(channel); + } + return this.createChannelElement(channel, index, arr, this.handleLeavePrivateChannel); + }); const directMessageItems = this.state.directAndGroupChannels.map((channel, index, arr) => { return this.createChannelElement(channel, index, arr, this.handleLeaveDirectChannel); -- cgit v1.2.3-1-g7c22