From 4c725f157b7a9a1bbd3571f262bf936d0f7deef7 Mon Sep 17 00:00:00 2001 From: Elias Nahum Date: Fri, 16 Apr 2021 09:53:42 -0400 Subject: [PATCH] MM-27251 Fetch team channels including archived since last known timestamp (#5328) --- app/actions/views/channel.js | 6 +++--- app/actions/websocket/websocket.test.js | 2 +- app/client/rest/channels.ts | 9 ++++++--- app/mm-redux/actions/channels.ts | 8 +++----- 4 files changed, 13 insertions(+), 12 deletions(-) diff --git a/app/actions/views/channel.js b/app/actions/views/channel.js index e56cc7760..eaf380d73 100644 --- a/app/actions/views/channel.js +++ b/app/actions/views/channel.js @@ -717,6 +717,7 @@ export function loadChannelsForTeam(teamId, skipDispatch = false) { return async (dispatch, getState) => { const state = getState(); const currentUserId = getCurrentUserId(state); + const lastConnectAt = state.websocket?.lastConnectAt || 0; const data = { sync: true, teamId, @@ -724,13 +725,12 @@ export function loadChannelsForTeam(teamId, skipDispatch = false) { }; const actions = []; - if (currentUserId) { for (let i = 0; i <= MAX_RETRIES; i++) { try { - console.log('Fetching channels attempt', teamId, (i + 1)); //eslint-disable-line no-console + console.log('Fetching channels attempt', (i + 1), teamId, 'include deleted since', lastConnectAt); //eslint-disable-line no-console const [channels, channelMembers] = await Promise.all([ //eslint-disable-line no-await-in-loop - Client4.getMyChannels(teamId, true), + Client4.getMyChannels(teamId, true, lastConnectAt), Client4.getMyChannelMembers(teamId), ]); diff --git a/app/actions/websocket/websocket.test.js b/app/actions/websocket/websocket.test.js index e7a70d678..cd1da0aa5 100644 --- a/app/actions/websocket/websocket.test.js +++ b/app/actions/websocket/websocket.test.js @@ -30,7 +30,7 @@ const mockConfigRequest = (config = {}) => { const mockChanelsRequest = (teamId, channels = []) => { nock(Client4.getUserRoute('me')). - get(`/teams/${teamId}/channels?include_deleted=true`). + get(`/teams/${teamId}/channels?include_deleted=true&last_delete_at=0`). reply(200, channels); }; diff --git a/app/client/rest/channels.ts b/app/client/rest/channels.ts index 4df26f460..c09a52020 100644 --- a/app/client/rest/channels.ts +++ b/app/client/rest/channels.ts @@ -24,7 +24,7 @@ export interface ClientChannelsMix { getChannelByNameAndTeamName: (teamName: string, channelName: string, includeDeleted?: boolean) => Promise; getChannels: (teamId: string, page?: number, perPage?: number) => Promise; getArchivedChannels: (teamId: string, page?: number, perPage?: number) => Promise; - getMyChannels: (teamId: string, includeDeleted?: boolean) => Promise; + getMyChannels: (teamId: string, includeDeleted?: boolean, lastDeleteAt?: number) => Promise; getMyChannelMember: (channelId: string) => Promise; getMyChannelMembers: (teamId: string) => Promise; getChannelMembers: (channelId: string, page?: number, perPage?: number) => Promise; @@ -186,9 +186,12 @@ const ClientChannels = (superclass: any) => class extends superclass { ); }; - getMyChannels = async (teamId: string, includeDeleted = false) => { + getMyChannels = async (teamId: string, includeDeleted = false, lastDeleteAt = 0) => { return this.doFetch( - `${this.getUserRoute('me')}/teams/${teamId}/channels${buildQueryString({include_deleted: includeDeleted})}`, + `${this.getUserRoute('me')}/teams/${teamId}/channels${buildQueryString({ + include_deleted: includeDeleted, + last_delete_at: lastDeleteAt, + })}`, {method: 'get'}, ); }; diff --git a/app/mm-redux/actions/channels.ts b/app/mm-redux/actions/channels.ts index 5441af9fe..0a5bf92e1 100644 --- a/app/mm-redux/actions/channels.ts +++ b/app/mm-redux/actions/channels.ts @@ -12,8 +12,7 @@ import { isManuallyUnread, } from '@mm-redux/selectors/entities/channels'; import {getCurrentTeamId} from '@mm-redux/selectors/entities/teams'; -import {getConfig, getServerVersion} from '@mm-redux/selectors/entities/general'; -import {isMinimumServerVersion} from '@mm-redux/utils/helpers'; +import {getConfig} from '@mm-redux/selectors/entities/general'; import {Action, ActionFunc, batchActions, DispatchFunc, GetStateFunc} from '@mm-redux/types/actions'; @@ -546,9 +545,9 @@ export function fetchMyChannelsAndMembers(teamId: string): ActionFunc { let channels; let channelMembers; const state = getState(); - const shouldFetchArchived = isMinimumServerVersion(getServerVersion(state), 5, 21); + const lastConnectAt = state.websocket?.lastConnectAt || 0; try { - const channelRequest = Client4.getMyChannels(teamId, shouldFetchArchived); + const channelRequest = Client4.getMyChannels(teamId, true, lastConnectAt); const memberRequest = Client4.getMyChannelMembers(teamId); channels = await channelRequest; channelMembers = await memberRequest; @@ -577,7 +576,6 @@ export function fetchMyChannelsAndMembers(teamId: string): ActionFunc { { type: ChannelTypes.RECEIVED_MY_CHANNEL_MEMBERS, data: channelMembers, - sync: !shouldFetchArchived, channels, remove: getChannelsIdForTeam(state, teamId), currentUserId,