From b54d1342990253d3fe4a00c64df27cdd1bb0719b Mon Sep 17 00:00:00 2001
From: David Meza <dmeza@users.noreply.github.com>
Date: Thu, 3 Aug 2017 07:59:42 -0500
Subject: PLT-6484 Add /leave command to leave a channel (#6402)

* PLT-6484 Add /leave command to leave a channel

* Text changes requeted on review.

* PLT-6484 Display the right error message when trying to /leave town-square

* PLT-6484 Be able to execute /leave command in direct and group message channels with the same effect as clicking x

* PLT-6484 Refactor to create new leave_private_channel_modal.jsx

* PLT-6484 Remove previous leave private channel logic to use new leave_private_channel_modal.jsx

* Remove dot in command description. Change localized error when leaving Town square.

* disable /leave command in reply threads on the right-hand sidebar, since it is not obvious which channel you should leave
---
 .../modals/leave_private_channel_modal.jsx         | 120 +++++++++++++++++++++
 1 file changed, 120 insertions(+)
 create mode 100644 webapp/components/modals/leave_private_channel_modal.jsx

(limited to 'webapp/components/modals/leave_private_channel_modal.jsx')

diff --git a/webapp/components/modals/leave_private_channel_modal.jsx b/webapp/components/modals/leave_private_channel_modal.jsx
new file mode 100644
index 000000000..9b8e6df83
--- /dev/null
+++ b/webapp/components/modals/leave_private_channel_modal.jsx
@@ -0,0 +1,120 @@
+// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
+// See License.txt for license information.
+
+import ConfirmModal from 'components/confirm_modal.jsx';
+
+import * as ChannelActions from 'actions/channel_actions.jsx';
+
+import ModalStore from 'stores/modal_store.jsx';
+import Constants from 'utils/constants.jsx';
+
+import {intlShape, injectIntl, FormattedMessage} from 'react-intl';
+
+import React from 'react';
+
+class LeavePrivateChannelModal extends React.Component {
+    constructor(props) {
+        super(props);
+
+        this.handleToggle = this.handleToggle.bind(this);
+        this.handleSubmit = this.handleSubmit.bind(this);
+        this.handleHide = this.handleHide.bind(this);
+        this.handleKeyPress = this.handleKeyPress.bind(this);
+
+        this.state = {
+            show: false,
+            channel: null
+        };
+        this.mounted = false;
+    }
+
+    componentDidMount() {
+        this.mounted = true;
+        ModalStore.addModalListener(Constants.ActionTypes.TOGGLE_LEAVE_PRIVATE_CHANNEL_MODAL, this.handleToggle);
+    }
+
+    componentWillUnmount() {
+        this.mounted = false;
+        ModalStore.removeModalListener(Constants.ActionTypes.TOGGLE_LEAVE_PRIVATE_CHANNEL_MODAL, this.handleToggle);
+    }
+
+    handleKeyPress(e) {
+        if (e.key === 'Enter' && this.state.show) {
+            this.handleSubmit();
+        }
+    }
+
+    handleSubmit() {
+        const channelId = this.state.channel.id;
+        this.setState({
+            show: false,
+            channel: null
+        });
+        ChannelActions.leaveChannel(channelId);
+    }
+
+    handleToggle(value) {
+        this.setState({
+            channel: value,
+            show: value !== null
+        });
+    }
+
+    handleHide() {
+        this.setState({
+            show: false
+        });
+    }
+
+    render() {
+        let title = '';
+        let message = '';
+        if (this.state.channel) {
+            title = (
+                <FormattedMessage
+                    id='leave_private_channel_modal.title'
+                    defaultMessage='Leave Private Channel {channel}'
+                    values={{
+                        channel: <b>{this.state.channel.display_name}</b>
+                    }}
+                />
+            );
+
+            message = (
+                <FormattedMessage
+                    id='leave_private_channel_modal.message'
+                    defaultMessage='Are you sure you wish to leave the private channel {channel}? You must be re-invited in order to re-join this channel in the future.'
+                    values={{
+                        channel: <b>{this.state.channel.display_name}</b>
+                    }}
+                />
+            );
+        }
+
+        const buttonClass = 'btn btn-danger';
+        const button = (
+            <FormattedMessage
+                id='leave_private_channel_modal.leave'
+                defaultMessage='Yes, leave channel'
+            />
+        );
+
+        return (
+            <ConfirmModal
+                show={this.state.show}
+                title={title}
+                message={message}
+                confirmButtonClass={buttonClass}
+                confirmButtonText={button}
+                onConfirm={this.handleSubmit}
+                onCancel={this.handleHide}
+            />
+        );
+    }
+}
+
+LeavePrivateChannelModal.propTypes = {
+    intl: intlShape.isRequired
+};
+
+export default injectIntl(LeavePrivateChannelModal);
-- 
cgit v1.2.3-1-g7c22

