From b6456a675d140d6d80eb0874a5b6a89008e28eaa Mon Sep 17 00:00:00 2001
From: David Meza <dmeza@users.noreply.github.com>
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 = (
             <Tooltip id='remove-dm-tooltip'>
                 <FormattedMessage
                     id='sidebar.removeList'
@@ -553,6 +567,16 @@ export default class Sidebar extends React.Component {
                 />
             </Tooltip>
         );
+        if (channel.type === Constants.OPEN_CHANNEL || channel.type === Constants.PRIVATE_CHANNEL) {
+            removeTooltip = (
+                <Tooltip id='remove-dm-tooltip'>
+                    <FormattedMessage
+                        id='sidebar.leave'
+                        defaultMessage='Leave channel'
+                    />
+                </Tooltip>
+            );
+        }
         if (handleClose && !badge) {
             closeButton = (
                 <OverlayTrigger
@@ -631,14 +655,32 @@ export default class Sidebar extends React.Component {
             map((channel, index, arr) => {
                 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

