diff --git a/app/views/RoomView/RightButtons.tsx b/app/views/RoomView/RightButtons.tsx index 6755b986b..457402f37 100644 --- a/app/views/RoomView/RightButtons.tsx +++ b/app/views/RoomView/RightButtons.tsx @@ -34,6 +34,7 @@ interface IRightButtonsProps { showActionSheet: Function; // TODO: Change to proper type transferLivechatGuestPermission: boolean; navigation: StackNavigationProp; + omnichannelPermissions: boolean[]; } interface IRigthButtonsState { @@ -41,8 +42,6 @@ interface IRigthButtonsState { tunread: string[]; tunreadUser: string[]; tunreadGroup: string[]; - canReturnQueue: boolean; - canForwardGuest: boolean; } class RightButtonsContainer extends Component { @@ -55,14 +54,12 @@ class RightButtonsContainer extends Component { - const canReturnQueue = await this.canReturnQueue(); - const canForwardGuest = await this.canForwardGuest(); - this.setState({ canReturnQueue, canForwardGuest }); - }; - observeThread = (threadRecord: TMessageModel) => { const threadObservable: Observable = threadRecord.observe(); this.threadSubscription = threadObservable.subscribe(thread => this.updateThread(thread)); @@ -232,16 +212,15 @@ class RightButtonsContainer extends Component { logEvent(events.ROOM_SHOW_MORE_ACTIONS); - const { showActionSheet, rid, navigation } = this.props; - const { canReturnQueue, canForwardGuest } = this.state; + const { showActionSheet, rid, omnichannelPermissions, navigation } = this.props; const options = [ - canForwardGuest && { + omnichannelPermissions[0] && { title: i18n.t('Forward_Chat'), icon: 'chat-forward', onPress: () => navigation.navigate('ForwardLivechatView', { rid }) }, - canReturnQueue && { + omnichannelPermissions[1] && { title: i18n.t('Return_to_waiting_line'), icon: 'move-to-the-queue', onPress: () => this.returnLivechat() @@ -335,8 +314,7 @@ class RightButtonsContainer extends Component ({ userId: getUserSelector(state).id, threadsEnabled: state.settings.Threads_enabled as boolean, - isMasterDetail: state.app.isMasterDetail, - transferLivechatGuestPermission: state.permissions['transfer-livechat-guest'] + isMasterDetail: state.app.isMasterDetail }); export default connect(mapStateToProps)(withActionSheet(RightButtonsContainer)); diff --git a/app/views/RoomView/index.tsx b/app/views/RoomView/index.tsx index 149211201..f0e3791f7 100644 --- a/app/views/RoomView/index.tsx +++ b/app/views/RoomView/index.tsx @@ -136,6 +136,7 @@ interface IRoomViewProps extends IBaseScreen { width: number; height: number; insets: EdgeInsets; + transferLivechatGuestPermission?: string[]; // TODO: Check if its the correct type } type TRoomUpdate = typeof roomAttrsUpdate[number]; @@ -163,6 +164,8 @@ interface IRoomViewState { readOnly: boolean; unreadsCount: number | null; roomUserId?: string | null; + canReturnQueue?: boolean; + canForwardGuest?: boolean; } class RoomView extends React.Component { @@ -232,7 +235,9 @@ class RoomView extends React.Component { reacting: false, readOnly: false, unreadsCount: null, - roomUserId + roomUserId, + canReturnQueue: false, + canForwardGuest: false }; this.setHeader(); @@ -280,6 +285,9 @@ class RoomView extends React.Component { if (isIOS && this.rid) { this.updateUnreadCount(); } + if (this.t === 'l') { + this.setOmnichannelPermissions(); + } }); if (isTablet) { EventEmitter.addEventListener(KEY_COMMAND, this.handleCommands); @@ -346,6 +354,7 @@ class RoomView extends React.Component { !dequal(prevState.roomUpdate.status, roomUpdate.status) || prevState.joined !== joined ) { + this.setOmnichannelPermissions(); this.setHeader(); } } @@ -422,13 +431,34 @@ class RoomView extends React.Component { console.countReset(`${this.constructor.name}.render calls`); } + canForwardGuest = async () => { + const { transferLivechatGuestPermission } = this.props; + const permissions = await RocketChat.hasPermission([transferLivechatGuestPermission], this.rid); + return permissions[0]; + }; + + canReturnQueue = async () => { + try { + const { returnQueue } = await RocketChat.getRoutingConfig(); + return returnQueue; + } catch { + return false; + } + }; + + setOmnichannelPermissions = async () => { + const canReturnQueue = await this.canReturnQueue(); + const canForwardGuest = await this.canForwardGuest(); + this.setState({ canReturnQueue, canForwardGuest }); + }; + get isOmnichannel() { const { room } = this.state; return room.t === 'l'; } setHeader = () => { - const { room, unreadsCount, roomUserId, joined } = this.state; + const { room, unreadsCount, roomUserId, joined, canReturnQueue, canForwardGuest } = this.state; const { navigation, isMasterDetail, theme, baseUrl, user, insets, route } = this.props; const { rid, tmid } = this; if (!room.rid) { @@ -455,6 +485,7 @@ class RoomView extends React.Component { let token: string | undefined; let avatar: string | undefined; let visitor: IVisitor | undefined; + let status: string | undefined; if ('id' in room) { subtitle = room.topic; t = room.t; @@ -464,10 +495,11 @@ class RoomView extends React.Component { ({ id: userId, token } = user); avatar = room.name; visitor = room.visitor; + status = room.status; } let numIconsRight = 2; - if (tmid || room.status) { + if (tmid || (status && joined)) { numIconsRight = 1; } else if (teamId && isTeamRoom({ teamId, joined })) { numIconsRight = 3; @@ -520,6 +552,7 @@ class RoomView extends React.Component { teamId={teamId} joined={joined} status={room.status} + omnichannelPermissions={[canForwardGuest, canReturnQueue]} t={this.t || t} encrypted={encrypted} navigation={navigation} @@ -1348,7 +1381,6 @@ class RoomView extends React.Component { if ('id' in room) { ({ sysMes, bannerClosed, announcement, tunread, ignored } = room); } - console.log({ room }); return ( @@ -1409,7 +1441,8 @@ const mapStateToProps = (state: IApplicationState) => ({ baseUrl: state.server.server, serverVersion: state.server.version, Message_Read_Receipt_Enabled: state.settings.Message_Read_Receipt_Enabled as boolean, - Hide_System_Messages: state.settings.Hide_System_Messages as string[] + Hide_System_Messages: state.settings.Hide_System_Messages as string[], + transferLivechatGuestPermission: state.permissions['transfer-livechat-guest'] }); export default connect(mapStateToProps)(withDimensions(withTheme(withSafeAreaInsets(RoomView))));