[MM-60555] Use channel memberships to calculate total unread status instead of team memberships (#30166)
* [MM-60555] Use channel memberships to calculate total unread status instead of team memberships * Fix lint --------- Co-authored-by: Mattermost Build <build@mattermost.com>
Этот коммит содержится в:
коммит произвёл
GitHub
родитель
ce61ed8f52
Коммит
b604930cf6
@@ -2189,7 +2189,7 @@ describe('Selectors.Channels.getUnreadStatus', () => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
it('get unreads', () => {
|
it('get unreads', () => {
|
||||||
expect(Selectors.getUnreadStatus(testState)).toBe(69);
|
expect(Selectors.getUnreadStatus(testState)).toBe(5);
|
||||||
});
|
});
|
||||||
|
|
||||||
it('get unreads with a missing profile entity', () => {
|
it('get unreads with a missing profile entity', () => {
|
||||||
@@ -2208,7 +2208,7 @@ describe('Selectors.Channels.getUnreadStatus', () => {
|
|||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
expect(Selectors.getUnreadStatus(newState)).toBe(69);
|
expect(Selectors.getUnreadStatus(newState)).toBe(5);
|
||||||
});
|
});
|
||||||
|
|
||||||
it('get unreads with a deactivated user', () => {
|
it('get unreads with a deactivated user', () => {
|
||||||
@@ -2230,7 +2230,7 @@ describe('Selectors.Channels.getUnreadStatus', () => {
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
expect(Selectors.getUnreadStatus(newState)).toBe(69);
|
expect(Selectors.getUnreadStatus(newState)).toBe(5);
|
||||||
});
|
});
|
||||||
|
|
||||||
it('get unreads with a deactivated channel', () => {
|
it('get unreads with a deactivated channel', () => {
|
||||||
@@ -2253,17 +2253,15 @@ describe('Selectors.Channels.getUnreadStatus', () => {
|
|||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
expect(Selectors.getUnreadStatus(newState)).toBe(65);
|
expect(Selectors.getUnreadStatus(newState)).toBe(1);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
describe('Selectors.Channels.getUnreadStatus', () => {
|
describe('Selectors.Channels.getUnreadStatus', () => {
|
||||||
const team1 = {id: 'team1', delete_at: 0};
|
const team1 = {id: 'team1', delete_at: 0};
|
||||||
const team2 = {id: 'team2', delete_at: 0};
|
|
||||||
|
|
||||||
const channelA = {id: 'channelA', name: 'channelA', team_id: 'team1', delete_at: 0};
|
const channelA = {id: 'channelA', name: 'channelA', team_id: 'team1', delete_at: 0};
|
||||||
const channelB = {id: 'channelB', name: 'channelB', team_id: 'team1', delete_at: 0};
|
const channelB = {id: 'channelB', name: 'channelB', team_id: 'team1', delete_at: 0};
|
||||||
const channelC = {id: 'channelB', name: 'channelB', team_id: 'team2', delete_at: 0};
|
|
||||||
|
|
||||||
const dmChannel = {id: 'dmChannel', name: 'user1__user2', team_id: '', delete_at: 0, type: General.DM_CHANNEL};
|
const dmChannel = {id: 'dmChannel', name: 'user1__user2', team_id: '', delete_at: 0, type: General.DM_CHANNEL};
|
||||||
const gmChannel = {id: 'gmChannel', name: 'gmChannel', team_id: 'team1', delete_at: 0, type: General.GM_CHANNEL};
|
const gmChannel = {id: 'gmChannel', name: 'gmChannel', team_id: 'team1', delete_at: 0, type: General.GM_CHANNEL};
|
||||||
@@ -2497,61 +2495,6 @@ describe('Selectors.Channels.getUnreadStatus', () => {
|
|||||||
expect(unreadMeta.isUnread).toBe(true); // gmChannel is unread
|
expect(unreadMeta.isUnread).toBe(true); // gmChannel is unread
|
||||||
expect(unreadMeta.unreadMentionCount).toBe(gmMember.mention_count);
|
expect(unreadMeta.unreadMentionCount).toBe(gmMember.mention_count);
|
||||||
});
|
});
|
||||||
|
|
||||||
test('should count mentions and messages for other teams from team members', () => {
|
|
||||||
const myMemberA = {mention_count: 2, msg_count: 3, notify_props: {mark_unread: 'all'}};
|
|
||||||
const myMemberC = {mention_count: 5, msg_count: 7, notify_props: {mark_unread: 'all'}};
|
|
||||||
|
|
||||||
const teamMember1 = {msg_count: 1, mention_count: 2};
|
|
||||||
const teamMember2 = {msg_count: 3, mention_count: 6};
|
|
||||||
|
|
||||||
const state = {
|
|
||||||
entities: {
|
|
||||||
general: {config: {}},
|
|
||||||
preferences: {
|
|
||||||
myPreferences: {},
|
|
||||||
},
|
|
||||||
threads: {
|
|
||||||
counts: {},
|
|
||||||
},
|
|
||||||
channels: {
|
|
||||||
channels: {
|
|
||||||
channelA,
|
|
||||||
channelC,
|
|
||||||
},
|
|
||||||
messageCounts: {
|
|
||||||
channelA: {total: 11},
|
|
||||||
channelC: {total: 17},
|
|
||||||
},
|
|
||||||
myMembers: {
|
|
||||||
channelA: myMemberA,
|
|
||||||
channelC: myMemberC,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
teams: {
|
|
||||||
currentTeamId: 'team1',
|
|
||||||
myMembers: {
|
|
||||||
team1: teamMember1,
|
|
||||||
team2: teamMember2,
|
|
||||||
},
|
|
||||||
teams: {
|
|
||||||
team1,
|
|
||||||
team2,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
users: {
|
|
||||||
currentUserId: 'user1',
|
|
||||||
profiles: {},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
} as unknown as GlobalState;
|
|
||||||
|
|
||||||
const unreadStatus = Selectors.getUnreadStatus(state);
|
|
||||||
const unreadMeta = Selectors.basicUnreadMeta(unreadStatus);
|
|
||||||
|
|
||||||
expect(unreadMeta.isUnread).toBe(true); // channelA and channelC are unread
|
|
||||||
expect(unreadMeta.unreadMentionCount).toBe(myMemberA.mention_count + teamMember2.mention_count);
|
|
||||||
});
|
|
||||||
});
|
});
|
||||||
|
|
||||||
describe('Selectors.Channels.getUnreadStatus', () => {
|
describe('Selectors.Channels.getUnreadStatus', () => {
|
||||||
|
|||||||
@@ -42,7 +42,7 @@ import {
|
|||||||
haveICurrentChannelPermission,
|
haveICurrentChannelPermission,
|
||||||
haveITeamPermission,
|
haveITeamPermission,
|
||||||
} from 'mattermost-redux/selectors/entities/roles';
|
} from 'mattermost-redux/selectors/entities/roles';
|
||||||
import {getCurrentTeamId, getMyTeams, getTeamMemberships} from 'mattermost-redux/selectors/entities/teams';
|
import {getCurrentTeamId, getMyTeams} from 'mattermost-redux/selectors/entities/teams';
|
||||||
import {
|
import {
|
||||||
getCurrentUserId,
|
getCurrentUserId,
|
||||||
getStatusForUserId,
|
getStatusForUserId,
|
||||||
@@ -612,8 +612,6 @@ export const getUnreadStatus: (state: GlobalState) => BasicUnreadStatus = create
|
|||||||
getUsers,
|
getUsers,
|
||||||
getCurrentUserId,
|
getCurrentUserId,
|
||||||
getCurrentTeamId,
|
getCurrentTeamId,
|
||||||
getMyTeams,
|
|
||||||
getTeamMemberships,
|
|
||||||
isCollapsedThreadsEnabled,
|
isCollapsedThreadsEnabled,
|
||||||
getThreadCounts,
|
getThreadCounts,
|
||||||
getThreadCountsIncludingDirect,
|
getThreadCountsIncludingDirect,
|
||||||
@@ -624,15 +622,13 @@ export const getUnreadStatus: (state: GlobalState) => BasicUnreadStatus = create
|
|||||||
users,
|
users,
|
||||||
currentUserId,
|
currentUserId,
|
||||||
currentTeamId,
|
currentTeamId,
|
||||||
myTeams,
|
|
||||||
myTeamMemberships,
|
|
||||||
collapsedThreads,
|
collapsedThreads,
|
||||||
threadCounts,
|
threadCounts,
|
||||||
threadCountsIncludingDirect,
|
threadCountsIncludingDirect,
|
||||||
) => {
|
) => {
|
||||||
const {
|
const {
|
||||||
messages: currentTeamUnreadMessages,
|
messages: unreadMessages,
|
||||||
mentions: currentTeamUnreadMentions,
|
mentions: unreadMentions,
|
||||||
} = Object.entries(myMembers).reduce((counts, [channelId, membership]) => {
|
} = Object.entries(myMembers).reduce((counts, [channelId, membership]) => {
|
||||||
const channel = channels[channelId];
|
const channel = channels[channelId];
|
||||||
|
|
||||||
@@ -640,15 +636,6 @@ export const getUnreadStatus: (state: GlobalState) => BasicUnreadStatus = create
|
|||||||
return counts;
|
return counts;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (
|
|
||||||
// other-team non-DM/non-GM channels
|
|
||||||
channel.team_id !== currentTeamId &&
|
|
||||||
channel.type !== General.DM_CHANNEL &&
|
|
||||||
channel.type !== General.GM_CHANNEL
|
|
||||||
) {
|
|
||||||
return counts;
|
|
||||||
}
|
|
||||||
|
|
||||||
const channelExists = channel.type === General.DM_CHANNEL ? users[getUserIdFromChannelName(currentUserId, channel.name)]?.delete_at === 0 : channel.delete_at === 0;
|
const channelExists = channel.type === General.DM_CHANNEL ? users[getUserIdFromChannelName(currentUserId, channel.name)]?.delete_at === 0 : channel.delete_at === 0;
|
||||||
if (!channelExists) {
|
if (!channelExists) {
|
||||||
return counts;
|
return counts;
|
||||||
@@ -670,26 +657,8 @@ export const getUnreadStatus: (state: GlobalState) => BasicUnreadStatus = create
|
|||||||
mentions: 0,
|
mentions: 0,
|
||||||
});
|
});
|
||||||
|
|
||||||
// Includes mention count and message count from teams other than the current team
|
const totalUnreadMessages = unreadMessages;
|
||||||
// This count does not include GM's and DM's
|
let totalUnreadMentions = unreadMentions;
|
||||||
const {
|
|
||||||
messages: otherTeamsUnreadMessages,
|
|
||||||
mentions: otherTeamsUnreadMentions,
|
|
||||||
} = myTeams.reduce((acc, team) => {
|
|
||||||
if (currentTeamId !== team.id) {
|
|
||||||
const member = myTeamMemberships[team.id];
|
|
||||||
acc.messages += collapsedThreads ? member.msg_count_root : member.msg_count;
|
|
||||||
acc.mentions += collapsedThreads ? member.mention_count_root : member.mention_count;
|
|
||||||
}
|
|
||||||
|
|
||||||
return acc;
|
|
||||||
}, {
|
|
||||||
messages: 0,
|
|
||||||
mentions: 0,
|
|
||||||
});
|
|
||||||
|
|
||||||
const totalUnreadMessages = currentTeamUnreadMessages + otherTeamsUnreadMessages;
|
|
||||||
let totalUnreadMentions = currentTeamUnreadMentions + otherTeamsUnreadMentions;
|
|
||||||
let anyUnreadThreads = false;
|
let anyUnreadThreads = false;
|
||||||
|
|
||||||
// when collapsed threads are enabled, we start with root-post counts from channels, then
|
// when collapsed threads are enabled, we start with root-post counts from channels, then
|
||||||
|
|||||||
Ссылка в новой задаче
Block a user