From 29286e98a8402ce65ac1c0b76de42465c131430b Mon Sep 17 00:00:00 2001
From: Djorkaeff Alexandre <djorkaeff.unb@gmail.com>
Date: Wed, 29 May 2019 18:19:12 -0300
Subject: [PATCH] [IMPROVEMENT] Share channel (#908)

* Generate and share permalink to rooms

* Create constant to share type

* Fix unnecessary await

* Remove unnecessary test

* Revert delete e2e test
---
 app/containers/MessageActions.js   |  2 +-
 app/containers/MessageBox/index.js |  2 +-
 app/lib/rocketchat.js              | 11 ++++++++++-
 app/views/RoomActionsView/index.js | 12 ++++++++++--
 e2e/09-roomactions.spec.js         | 13 +++++++------
 5 files changed, 29 insertions(+), 11 deletions(-)

diff --git a/app/containers/MessageActions.js b/app/containers/MessageActions.js
index 05f6ff746..2def87628 100644
--- a/app/containers/MessageActions.js
+++ b/app/containers/MessageActions.js
@@ -155,7 +155,7 @@ export default class MessageActions extends React.Component {
 
 	getPermalink = async(message) => {
 		try {
-			return await RocketChat.getPermalink(message);
+			return await RocketChat.getPermalinkMessage(message);
 		} catch (error) {
 			return null;
 		}
diff --git a/app/containers/MessageBox/index.js b/app/containers/MessageBox/index.js
index c0753c40e..810988f61 100644
--- a/app/containers/MessageBox/index.js
+++ b/app/containers/MessageBox/index.js
@@ -245,7 +245,7 @@ class MessageBox extends Component {
 
 	getPermalink = async(message) => {
 		try {
-			return await RocketChat.getPermalink(message);
+			return await RocketChat.getPermalinkMessage(message);
 		} catch (error) {
 			return null;
 		}
diff --git a/app/lib/rocketchat.js b/app/lib/rocketchat.js
index 0b47d301d..01635f99c 100644
--- a/app/lib/rocketchat.js
+++ b/app/lib/rocketchat.js
@@ -527,7 +527,7 @@ const RocketChat = {
 		}
 		return Promise.resolve(result);
 	},
-	async getPermalink(message) {
+	async getPermalinkMessage(message) {
 		let room;
 		try {
 			room = await RocketChat.getRoom(message.rid);
@@ -543,6 +543,15 @@ const RocketChat = {
 		}[room.t];
 		return `${ server }/${ roomType }/${ room.name }?msg=${ message._id }`;
 	},
+	getPermalinkChannel(channel) {
+		const { server } = reduxStore.getState().server;
+		const roomType = {
+			p: 'group',
+			c: 'channel',
+			d: 'direct'
+		}[channel.t];
+		return `${ server }/${ roomType }/${ channel.name }`;
+	},
 	subscribe(...args) {
 		return this.sdk.subscribe(...args);
 	},
diff --git a/app/views/RoomActionsView/index.js b/app/views/RoomActionsView/index.js
index 9a3057cab..2f4d60d7f 100644
--- a/app/views/RoomActionsView/index.js
+++ b/app/views/RoomActionsView/index.js
@@ -1,7 +1,7 @@
 import React from 'react';
 import PropTypes from 'prop-types';
 import {
-	View, SectionList, Text, Alert
+	View, SectionList, Text, Alert, Share
 } from 'react-native';
 import { connect } from 'react-redux';
 import { SafeAreaView } from 'react-navigation';
@@ -241,7 +241,7 @@ export default class RoomActionsView extends React.Component {
 				{
 					icon: 'share',
 					name: I18n.t('Share'),
-					disabled: true,
+					event: this.handleShare,
 					testID: 'room-actions-share'
 				},
 				{
@@ -351,6 +351,14 @@ export default class RoomActionsView extends React.Component {
 		}
 	}
 
+	handleShare = () => {
+		const { room } = this.state;
+		const permalink = RocketChat.getPermalinkChannel(room);
+		Share.share({
+			message: permalink
+		});
+	};
+
 	leaveChannel = () => {
 		const { room } = this.state;
 		const { leaveRoom } = this.props;
diff --git a/e2e/09-roomactions.spec.js b/e2e/09-roomactions.spec.js
index 956407798..4f6f7e40e 100644
--- a/e2e/09-roomactions.spec.js
+++ b/e2e/09-roomactions.spec.js
@@ -187,12 +187,13 @@ describe('Room actions screen', () => {
 				await expect(element(by.id('room-actions-view'))).toBeVisible();
 			});
 
-			it('should NOT navigate to share messages', async() => {
-				await waitFor(element(by.id('room-actions-share'))).toBeVisible().whileElement(by.id('room-actions-list')).scroll(scrollDown, 'down');
-				await element(by.id('room-actions-share')).tap();
-				await waitFor(element(by.id('room-actions-view'))).toBeVisible().withTimeout(2000);
-				await expect(element(by.id('room-actions-view'))).toBeVisible();
-			});
+			// TODO: test share room link
+			// it('should NOT navigate to share room', async() => {
+			// 	await waitFor(element(by.id('room-actions-share'))).toBeVisible().whileElement(by.id('room-actions-list')).scroll(scrollDown, 'down');
+			// 	await element(by.id('room-actions-share')).tap();
+			// 	await waitFor(element(by.id('room-actions-view'))).toBeVisible().withTimeout(2000);
+			// 	await expect(element(by.id('room-actions-view'))).toBeVisible();
+			// });
 
 			after(async() => {
 				takeScreenshot();
-- 
GitLab