// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. // See LICENSE.txt for license information. 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; }