From b5067d352652039ec0d4c710e95ffd9976399a5c Mon Sep 17 00:00:00 2001 From: Diego Mello Date: Thu, 16 Nov 2017 15:49:49 -0200 Subject: [PATCH] Permalink action --- app/actions/actionsTypes.js | 5 ++++- app/actions/messages.js | 21 +++++++++++++++++++++ app/containers/message/index.js | 32 +++++++++++++++++++++++++++----- app/lib/rocketchat.js | 26 ++++++++++++++++++++++++++ app/reducers/messages.js | 8 +++++++- app/sagas/messages.js | 15 ++++++++++++++- 6 files changed, 99 insertions(+), 8 deletions(-) diff --git a/app/actions/actionsTypes.js b/app/actions/actionsTypes.js index 842708b62..45233418f 100644 --- a/app/actions/actionsTypes.js +++ b/app/actions/actionsTypes.js @@ -39,7 +39,10 @@ export const MESSAGES = createRequestTypes('MESSAGES', [ 'EDIT_FAILURE', 'STAR_REQUEST', 'STAR_SUCCESS', - 'STAR_FAILURE' + 'STAR_FAILURE', + 'PERMALINK_REQUEST', + 'PERMALINK_SUCCESS', + 'PERMALINK_FAILURE' ]); export const CREATE_CHANNEL = createRequestTypes('CREATE_CHANNEL', [ ...defaultTypes, diff --git a/app/actions/messages.js b/app/actions/messages.js index 9c33381ea..db580db6c 100644 --- a/app/actions/messages.js +++ b/app/actions/messages.js @@ -84,3 +84,24 @@ export function starFailure() { type: types.MESSAGES.STAR_FAILURE }; } + +export function permalinkRequest(message) { + return { + type: types.MESSAGES.PERMALINK_REQUEST, + message + }; +} + +export function permalinkSuccess(permalink) { + return { + type: types.MESSAGES.PERMALINK_SUCCESS, + permalink + }; +} + +export function permalinkFailure(err) { + return { + type: types.MESSAGES.PERMALINK_FAILURE, + err + }; +} diff --git a/app/containers/message/index.js b/app/containers/message/index.js index 8af8410c6..c453a2146 100644 --- a/app/containers/message/index.js +++ b/app/containers/message/index.js @@ -9,7 +9,7 @@ import { connect } from 'react-redux'; import Card from './Card'; import User from './User'; import Avatar from '../Avatar'; -import { deleteRequest, editInit, starRequest } from '../../actions/messages'; +import { deleteRequest, editInit, starRequest, permalinkRequest } from '../../actions/messages'; const title = 'Message actions'; const options = ['Cancel', 'Reply', 'Edit', 'Permalink', 'Copy', 'Quote', 'Star Message', 'Delete']; @@ -38,11 +38,13 @@ const styles = StyleSheet.create({ }); @connect(state => ({ - message: state.messages.message + message: state.messages.message, + permalink: state.messages.permalink }), dispatch => ({ deleteRequest: message => dispatch(deleteRequest(message)), editInit: message => dispatch(editInit(message)), - starRequest: message => dispatch(starRequest(message)) + starRequest: message => dispatch(starRequest(message)), + permalinkRequest: message => dispatch(permalinkRequest(message)) })) export default class Message extends React.Component { static propTypes = { @@ -52,15 +54,28 @@ export default class Message extends React.Component { deleteRequest: PropTypes.func.isRequired, editInit: PropTypes.func.isRequired, starRequest: PropTypes.func.isRequired, - message: PropTypes.object + permalinkRequest: PropTypes.func.isRequired, + message: PropTypes.object, + permalink: PropTypes.string } constructor(props) { super(props); + this.state = { copyPermalink: false }; this.handleActionPress = this.handleActionPress.bind(this); this.showActions = this.showActions.bind(this); } + async componentWillReceiveProps(props) { + if (props.permalink) { + if (this.state.copyPermalink) { + this.setState({ copyPermalink: false }); + await Clipboard.setString(props.permalink); + Alert.alert('Permalink copied to clipboard!'); + } + } + } + isDeleted() { return !this.props.item.msg; } @@ -103,18 +118,25 @@ export default class Message extends React.Component { handleCopy = async() => { await Clipboard.setString(this.props.item.msg); - Alert.alert('Copied to Clipboard!'); + Alert.alert('Copied to clipboard!'); } handleStar() { this.props.starRequest(this.props.item); } + handlePermalink() { + this.setState({ copyPermalink: true }); + this.props.permalinkRequest(this.props.item); + } + handleActionPress = (actionIndex) => { if (actionIndex === 7) { this.handleDelete(); } else if (actionIndex === 2) { this.handleEdit(); + } else if (actionIndex === 3) { + this.handlePermalink(); } else if (actionIndex === 4) { this.handleCopy(); } else if (actionIndex === 6) { diff --git a/app/lib/rocketchat.js b/app/lib/rocketchat.js index ad971f02e..f373763f4 100644 --- a/app/lib/rocketchat.js +++ b/app/lib/rocketchat.js @@ -464,6 +464,32 @@ const RocketChat = { }, starMessage(message) { return call('starMessage', message); + }, + getPermalink(message) { + return new Promise((resolve, reject) => { + const result = realm.objects('subscriptions').filtered('rid = $0', message.rid); + + if (result.length === 0) { + return reject(new Error('Room not found')); + } + + const room = result[0]; + let roomType; + switch (room.t) { + case 'p': + roomType = 'group'; + break; + case 'c': + roomType = 'channel'; + break; + case 'd': + roomType = 'direct'; + break; + default: + break; + } + return resolve(`${ room._server.id }/${ roomType }/${ room.name }?msg=${ message._id }`); + }); } }; diff --git a/app/reducers/messages.js b/app/reducers/messages.js index ef41b21e4..4097f3b67 100644 --- a/app/reducers/messages.js +++ b/app/reducers/messages.js @@ -4,7 +4,8 @@ const initialState = { isFetching: false, failure: false, message: {}, - editing: false + editing: false, + permalink: '' }; export default function messages(state = initialState, action) { @@ -38,6 +39,11 @@ export default function messages(state = initialState, action) { message: {}, editing: false }; + case types.MESSAGES.PERMALINK_SUCCESS: + return { + ...state, + permalink: action.permalink + }; default: return state; } diff --git a/app/sagas/messages.js b/app/sagas/messages.js index 2b1fd192c..d9fbd07cb 100644 --- a/app/sagas/messages.js +++ b/app/sagas/messages.js @@ -8,13 +8,16 @@ import { editSuccess, editFailure, starSuccess, - starFailure + starFailure, + permalinkSuccess, + permalinkFailure } from '../actions/messages'; import RocketChat from '../lib/rocketchat'; const deleteMessage = message => RocketChat.deleteMessage(message); const editMessage = message => RocketChat.editMessage(message); const starMessage = message => RocketChat.starMessage(message); +const getPermalink = message => RocketChat.getPermalink(message); const get = function* get({ rid }) { const auth = yield select(state => state.login.isAuthenticated); @@ -58,10 +61,20 @@ const handleStarRequest = function* handleStarRequest({ message }) { } }; +const handlePermalinkRequest = function* handlePermalinkRequest({ message }) { + try { + const permalink = yield call(getPermalink, message); + yield put(permalinkSuccess(permalink)); + } catch (error) { + yield put(permalinkFailure(error)); + } +}; + const root = function* root() { yield takeLatest(MESSAGES.REQUEST, get); yield takeLatest(MESSAGES.DELETE_REQUEST, handleDeleteRequest); yield takeLatest(MESSAGES.EDIT_REQUEST, handleEditRequest); yield takeLatest(MESSAGES.STAR_REQUEST, handleStarRequest); + yield takeLatest(MESSAGES.PERMALINK_REQUEST, handlePermalinkRequest); }; export default root;