mattermost-mobile/app/utils/channels.js
Anurag Shivarathri 3c51b39bf4
Added "Join prompt" when sys admin clicks on perma links of private channels (#4988)
* Added join prompt when sys admin clicks on private channel perma links

* Moved isChannelMember to utils

* Update app/actions/views/permalink.ts

Co-authored-by: Elias Nahum <nahumhbl@gmail.com>

* Added error messages

* Added error messages

* Moved checks to screen components

* Removed unused Alert import

* Removed unused translations and showing channel 'display' name

* fixed eslint error

* Moved private channel check logic from component to handleSelectChannelByName to avoid issues while pressing on url from different team

* Detox test WIP

* Test link fixes

* Added e2e test

* Hiding <Loading component on RN Alert as detox is unable to press on the Join button

* Updated message

* Added team membership check and auto-joining teams before viewing posts

* Fixed testcases

* Leaves newly joined team on any error while joining the channel

* Leaves the team if newly joined if cancelled the prompt

* Moved code to tapping_channel_url_link_joins_channel and refactored code

* Removed unwanted optional chaining operator

Co-authored-by: anurag shivarathri <anuragindianbraves@gmail.com>
Co-authored-by: Elias Nahum <nahumhbl@gmail.com>
2021-02-12 09:09:34 +05:30

119 lines
4.5 KiB
JavaScript

// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
// See LICENSE.txt for license information.
import {Alert} from 'react-native';
import {Preferences} from '@mm-redux/constants';
import {getUserIdFromChannelName} from '@mm-redux/utils/channel_utils';
import {getLastCreateAt} from '@mm-redux/utils/post_utils';
export function isDirectChannelVisible(userId, myPreferences, channel) {
const channelId = getUserIdFromChannelName(userId, channel.name);
const dm = myPreferences[`${Preferences.CATEGORY_DIRECT_CHANNEL_SHOW}--${channelId}`];
return dm && dm.value === 'true';
}
export function isGroupChannelVisible(myPreferences, channel) {
const gm = myPreferences[`${Preferences.CATEGORY_GROUP_CHANNEL_SHOW}--${channel.id}`];
return gm && gm.value === 'true';
}
export function isFavoriteChannel(preferences, channelId) {
const fav = preferences[`${Preferences.CATEGORY_FAVORITE_CHANNEL}--${channelId}`];
return fav ? fav.value === 'true' : false;
}
export function isDirectChannelAutoClosed(config, preferences, channelId, channelActivity, channelArchiveTime = 0, currentChannelId = '') {
// When the config is not set or is a favorite channel
if (config.CloseUnusedDirectMessages !== 'true' || isFavoriteChannel(preferences, channelId)) {
return false;
}
const cutoff = new Date().getTime() - (7 * 24 * 60 * 60 * 1000);
const viewTimePref = preferences[`${Preferences.CATEGORY_CHANNEL_APPROXIMATE_VIEW_TIME}--${channelId}`];
const viewTime = viewTimePref ? parseInt(viewTimePref.value || 0, 10) : 0;
if (viewTime > cutoff) {
return false;
}
const openTimePref = preferences[`${Preferences.CATEGORY_CHANNEL_OPEN_TIME}--${channelId}`];
const openTime = openTimePref ? parseInt(openTimePref.value || 0, 10) : 0;
// Only close archived channels when not being viewed
if (channelId !== currentChannelId && channelArchiveTime && channelArchiveTime > openTime) {
return true;
}
const autoClose = preferences[`${Preferences.CATEGORY_SIDEBAR_SETTINGS}--close_unused_direct_messages`];
if (!autoClose || autoClose.value === 'after_seven_days') {
if (channelActivity && channelActivity > cutoff) {
return false;
}
if (openTime > cutoff) {
return false;
}
return !channelActivity || channelActivity < cutoff;
}
return false;
}
export function getChannelSinceValue(state, channelId, postIds) {
const lastGetPosts = state.views.channel.lastGetPosts[channelId];
const lastConnectAt = state.websocket?.lastConnectAt || 0;
let since;
if (lastGetPosts && lastGetPosts < lastConnectAt) {
// Since the websocket disconnected, we may have missed some posts since then
since = lastGetPosts;
} else {
// Trust that we've received all posts since the last time the websocket disconnected
// so set `since` to the `create_at` of latest one we've received
const {posts} = state.entities.posts;
const channelPosts = postIds.map((id) => posts[id]);
since = getLastCreateAt(channelPosts);
}
return since;
}
export function privateChannelJoinPrompt(channel, intl) {
return new Promise((resolve) => {
Alert.alert(
intl.formatMessage({
id: 'permalink.show_dialog_warn.title',
defaultMessage: 'Join private channel',
}),
intl.formatMessage({
id: 'permalink.show_dialog_warn.description',
defaultMessage: 'You are about to join {channel} without explicitly being added by the channel admin. Are you sure you wish to join this private channel?',
}, {
channel: channel.display_name,
}),
[
{
text: intl.formatMessage({
id: 'permalink.show_dialog_warn.cancel',
defaultMessage: 'Cancel',
}),
onPress: async () => {
resolve({
join: false,
});
},
},
{
text: intl.formatMessage({
id: 'permalink.show_dialog_warn.join',
defaultMessage: 'Join',
}),
onPress: async () => {
resolve({
join: true,
});
},
},
],
);
});
}