From 2f8160d3608759f66e03d745e417e63296cbd693 Mon Sep 17 00:00:00 2001 From: Elias Nahum Date: Fri, 1 Oct 2021 16:07:57 -0300 Subject: [PATCH] Remove team unreads and rely on channel member instead (#5710) --- app/actions/local/channel.ts | 6 +----- app/actions/remote/entry.ts | 4 ++-- app/actions/remote/retry.ts | 4 ++-- app/actions/remote/team.ts | 13 ++++--------- app/actions/remote/user.ts | 8 ++------ app/client/rest/teams.ts | 16 ---------------- app/database/models/server/my_team.ts | 6 ------ .../server_data_operator/handlers/team.test.ts | 2 -- .../transformers/team.test.ts | 2 -- .../server_data_operator/transformers/team.ts | 2 -- .../schema/server/table_schemas/my_team.ts | 2 -- app/database/schema/server/test.ts | 4 ---- app/queries/servers/entry.ts | 2 +- app/queries/servers/team.ts | 7 +++---- ios/Mattermost/MattermostManaged.m | 8 ++++++++ types/api/teams.d.ts | 6 ------ types/database/models/servers/my_team.d.ts | 6 ------ types/database/raw_values.d.ts | 2 -- 18 files changed, 23 insertions(+), 77 deletions(-) diff --git a/app/actions/local/channel.ts b/app/actions/local/channel.ts index 0b19be40a2..33351d9d06 100644 --- a/app/actions/local/channel.ts +++ b/app/actions/local/channel.ts @@ -67,7 +67,6 @@ export const switchToChannelByName = async (serverUrl: string, channelName: stri let myChannel: MyChannelModel | ChannelMembership | undefined; let team: TeamModel | Team | undefined; let myTeam: MyTeamModel | TeamMembership | undefined; - let unreads: TeamUnread | undefined; let name = teamName; const roles: string [] = []; const system = await queryCommonSystemValues(database); @@ -99,7 +98,6 @@ export const switchToChannelByName = async (serverUrl: string, channelName: stri } myTeam = added.member!; roles.push(...myTeam.roles.split(' ')); - unreads = added.unreads!; joinedNewTeam = true; } @@ -163,7 +161,7 @@ export const switchToChannelByName = async (serverUrl: string, channelName: stri const modelPromises: Array> = []; const {operator} = DatabaseManager.serverDatabases[serverUrl]; if (!(team instanceof Model)) { - const prepT = prepareMyTeams(operator, [team], [(myTeam as TeamMembership)], [unreads!]); + const prepT = prepareMyTeams(operator, [team], [(myTeam as TeamMembership)]); if (prepT) { modelPromises.push(...prepT); } @@ -171,8 +169,6 @@ export const switchToChannelByName = async (serverUrl: string, channelName: stri const mt: MyTeam[] = [{ id: myTeam.team_id, roles: myTeam.roles, - is_unread: unreads!.msg_count > 0, - mentions_count: unreads!.mention_count, }]; modelPromises.push( operator.handleMyTeam({myTeams: mt, prepareRecordsOnly: true}), diff --git a/app/actions/remote/entry.ts b/app/actions/remote/entry.ts index 2827ea51bd..8a698758fe 100644 --- a/app/actions/remote/entry.ts +++ b/app/actions/remote/entry.ts @@ -130,7 +130,7 @@ export const loginEntry = async ({serverUrl, user, deviceToken}: AfterLoginArgs) let initialChannel: Channel|undefined; let myTeams: Team[]|undefined; - // Fetch in parallel server config & license / user preferences / teams / team membership / team unreads + // Fetch in parallel server config & license / user preferences / teams / team membership const promises: [Promise, Promise, Promise] = [ fetchConfigAndLicense(serverUrl, true), fetchMyPreferences(serverUrl, true), @@ -269,7 +269,7 @@ const fetchAppEntryData = async (serverUrl: string, initialTeamId: string): Prom const includeDeletedChannels = true; const fetchOnly = true; - // Fetch in parallel teams / team membership / team unreads / channels for current team / user preferences / user + // Fetch in parallel teams / team membership / channels for current team / user preferences / user const promises: [Promise, Promise, Promise, Promise] = [ fetchMyTeams(serverUrl, fetchOnly), initialTeamId ? fetchMyChannelsForTeam(serverUrl, initialTeamId, includeDeletedChannels, lastDisconnected, fetchOnly) : Promise.resolve(undefined), diff --git a/app/actions/remote/retry.ts b/app/actions/remote/retry.ts index 1559cf8431..350c355007 100644 --- a/app/actions/remote/retry.ts +++ b/app/actions/remote/retry.ts @@ -43,7 +43,7 @@ export const retryInitialTeamAndChannel = async (serverUrl: string) => { return {error: true}; } - // Fetch in parallel server config & license / user preferences / teams / team membership / team unreads + // Fetch in parallel server config & license / user preferences / teams / team membership const promises: [Promise, Promise, Promise] = [ fetchConfigAndLicense(serverUrl, true), fetchMyPreferences(serverUrl, true), @@ -103,7 +103,7 @@ export const retryInitialTeamAndChannel = async (serverUrl: string) => { modelPromises.push(prefModel); } - const teamModels = prepareMyTeams(operator, teamData.teams!, teamData.memberships!, teamData.unreads!); + const teamModels = prepareMyTeams(operator, teamData.teams!, teamData.memberships!); if (teamModels) { modelPromises.push(...teamModels); } diff --git a/app/actions/remote/team.ts b/app/actions/remote/team.ts index 17a9005d30..16bfca9bd9 100644 --- a/app/actions/remote/team.ts +++ b/app/actions/remote/team.ts @@ -20,7 +20,6 @@ import type TeamMembershipModel from '@typings/database/models/servers/team_memb export type MyTeamsRequest = { teams?: Team[]; memberships?: TeamMembership[]; - unreads?: TeamUnread[]; error?: unknown; } @@ -34,7 +33,6 @@ export const addUserToTeam = async (serverUrl: string, teamId: string, userId: s try { const member = await client.addToTeam(teamId, userId); - const unreads = await client.getTeamUnreads(teamId); if (!fetchOnly) { fetchRolesIfNeeded(serverUrl, member.roles.split(' ')); @@ -43,8 +41,6 @@ export const addUserToTeam = async (serverUrl: string, teamId: string, userId: s const myTeams: MyTeam[] = [{ id: member.team_id, roles: member.roles, - is_unread: unreads.msg_count > 0, - mentions_count: unreads.mention_count, }]; const models = await Promise.all([ @@ -61,7 +57,7 @@ export const addUserToTeam = async (serverUrl: string, teamId: string, userId: s } } - return {member, unreads}; + return {member}; } catch (error) { forceLogoutIfNecessary(serverUrl, error as ClientError); return {error}; @@ -77,17 +73,16 @@ export const fetchMyTeams = async (serverUrl: string, fetchOnly = false): Promis } try { - const [teams, memberships, unreads] = await Promise.all([ + const [teams, memberships] = await Promise.all([ client.getMyTeams(), client.getMyTeamMembers(), - client.getMyTeamUnreads(), ]); if (!fetchOnly) { const operator = DatabaseManager.serverDatabases[serverUrl]?.operator; const modelPromises: Array> = []; if (operator) { - const prepare = prepareMyTeams(operator, teams, memberships, unreads); + const prepare = prepareMyTeams(operator, teams, memberships); if (prepare) { modelPromises.push(...prepare); } @@ -101,7 +96,7 @@ export const fetchMyTeams = async (serverUrl: string, fetchOnly = false): Promis } } - return {teams, memberships, unreads}; + return {teams, memberships}; } catch (error) { forceLogoutIfNecessary(serverUrl, error as ClientError); return {error}; diff --git a/app/actions/remote/user.ts b/app/actions/remote/user.ts index 45ab60ff62..e127af8b51 100644 --- a/app/actions/remote/user.ts +++ b/app/actions/remote/user.ts @@ -163,7 +163,6 @@ export const loadMe = async (serverUrl: string, {deviceToken, user}: LoadMeArgs) // Goes into myTeam table const teamMembersRequest = client.getMyTeamMembers(); - const teamUnreadRequest = client.getMyTeamUnreads(); const preferencesRequest = client.getMyPreferences(); const configRequest = client.getClientConfigOld(); @@ -172,14 +171,12 @@ export const loadMe = async (serverUrl: string, {deviceToken, user}: LoadMeArgs) const [ teams, teamMemberships, - teamUnreads, preferences, config, license, ] = await Promise.all([ teamsRequest, teamMembersRequest, - teamUnreadRequest, preferencesRequest, configRequest, licenseRequest, @@ -189,9 +186,8 @@ export const loadMe = async (serverUrl: string, {deviceToken, user}: LoadMeArgs) const teamRecords = operator.handleTeam({prepareRecordsOnly: true, teams}); const teamMembershipRecords = operator.handleTeamMemberships({prepareRecordsOnly: true, teamMemberships}); - const myTeams = teamUnreads.map((unread) => { - const matchingTeam = teamMemberships.find((team) => team.team_id === unread.team_id); - return {id: unread.team_id, roles: matchingTeam?.roles ?? '', is_unread: unread.msg_count > 0, mentions_count: unread.mention_count}; + const myTeams = teamMemberships.map((tm) => { + return {id: tm.team_id, roles: tm.roles ?? ''}; }); const myTeamRecords = operator.handleMyTeam({ diff --git a/app/client/rest/teams.ts b/app/client/rest/teams.ts index 80849a834a..53a6662988 100644 --- a/app/client/rest/teams.ts +++ b/app/client/rest/teams.ts @@ -16,8 +16,6 @@ export interface ClientTeamsMix { getMyTeams: () => Promise; getTeamsForUser: (userId: string) => Promise; getMyTeamMembers: () => Promise; - getMyTeamUnreads: () => Promise; - getTeamUnreads: (teamId: string) => Promise; getTeamMembers: (teamId: string, page?: number, perPage?: number) => Promise; getTeamMember: (teamId: string, userId: string) => Promise; addToTeam: (teamId: string, userId: string) => Promise; @@ -108,20 +106,6 @@ const ClientTeams = (superclass: any) => class extends superclass { ); }; - getMyTeamUnreads = async () => { - return this.doFetch( - `${this.getUserRoute('me')}/teams/unread`, - {method: 'get'}, - ); - }; - - getTeamUnreads = async (teamId: string) => { - return this.doFetch( - `${this.getUserRoute('me')}/${this.getTeamRoute(teamId)}/unread`, - {method: 'get'}, - ); - } - getTeamMembers = async (teamId: string, page = 0, perPage = PER_PAGE_DEFAULT) => { return this.doFetch( `${this.getTeamMembersRoute(teamId)}${buildQueryString({page, per_page: perPage})}`, diff --git a/app/database/models/server/my_team.ts b/app/database/models/server/my_team.ts index 229e4268cd..4e133da769 100644 --- a/app/database/models/server/my_team.ts +++ b/app/database/models/server/my_team.ts @@ -18,12 +18,6 @@ export default class MyTeamModel extends Model { /** table (name) : MyTeam */ static table = MY_TEAM; - /** is_unread : Boolean flag for unread messages on team level */ - @field('is_unread') isUnread!: boolean; - - /** mentions_count : Count of posts in which the user has been mentioned */ - @field('mentions_count') mentionsCount!: number; - /** roles : The different permissions that this user has in the team, concatenated together with comma to form a single string. */ @field('roles') roles!: string; diff --git a/app/database/operator/server_data_operator/handlers/team.test.ts b/app/database/operator/server_data_operator/handlers/team.test.ts index b8e8a8f340..c7e00a1826 100644 --- a/app/database/operator/server_data_operator/handlers/team.test.ts +++ b/app/database/operator/server_data_operator/handlers/team.test.ts @@ -110,8 +110,6 @@ describe('*** Operator: Team Handlers tests ***', () => { { id: 'teamA', roles: 'roleA, roleB, roleC', - is_unread: true, - mentions_count: 3, }, ]; diff --git a/app/database/operator/server_data_operator/transformers/team.test.ts b/app/database/operator/server_data_operator/transformers/team.test.ts index 83bd02ddf9..0c979e30a0 100644 --- a/app/database/operator/server_data_operator/transformers/team.test.ts +++ b/app/database/operator/server_data_operator/transformers/team.test.ts @@ -64,8 +64,6 @@ describe('*** TEAM Prepare Records Test ***', () => { raw: { id: 'teamA', roles: 'roleA, roleB, roleC', - is_unread: true, - mentions_count: 3, }, }, }); diff --git a/app/database/operator/server_data_operator/transformers/team.ts b/app/database/operator/server_data_operator/transformers/team.ts index 123a7f410d..29a4648978 100644 --- a/app/database/operator/server_data_operator/transformers/team.ts +++ b/app/database/operator/server_data_operator/transformers/team.ts @@ -190,8 +190,6 @@ export const transformMyTeamRecord = ({action, database, value}: TransformerArgs const fieldsMapper = (myTeam: MyTeamModel) => { myTeam._raw.id = isCreateAction ? (raw.id || myTeam.id) : record.id; myTeam.roles = raw.roles; - myTeam.isUnread = raw.is_unread; - myTeam.mentionsCount = raw.mentions_count; }; return prepareBaseRecord({ diff --git a/app/database/schema/server/table_schemas/my_team.ts b/app/database/schema/server/table_schemas/my_team.ts index 7859d5916f..0b07e475f5 100644 --- a/app/database/schema/server/table_schemas/my_team.ts +++ b/app/database/schema/server/table_schemas/my_team.ts @@ -10,8 +10,6 @@ const {MY_TEAM} = MM_TABLES.SERVER; export default tableSchema({ name: MY_TEAM, columns: [ - {name: 'is_unread', type: 'boolean'}, - {name: 'mentions_count', type: 'number'}, {name: 'roles', type: 'string'}, ], }); diff --git a/app/database/schema/server/test.ts b/app/database/schema/server/test.ts index 3f96d7b499..84e37705cc 100644 --- a/app/database/schema/server/test.ts +++ b/app/database/schema/server/test.ts @@ -322,13 +322,9 @@ describe('*** Test schema for SERVER database ***', () => { [MY_TEAM]: { name: MY_TEAM, columns: { - is_unread: {name: 'is_unread', type: 'boolean'}, - mentions_count: {name: 'mentions_count', type: 'number'}, roles: {name: 'roles', type: 'string'}, }, columnArray: [ - {name: 'is_unread', type: 'boolean'}, - {name: 'mentions_count', type: 'number'}, {name: 'roles', type: 'string'}, ], }, diff --git a/app/queries/servers/entry.ts b/app/queries/servers/entry.ts index 04da8f6d03..9168234b1b 100644 --- a/app/queries/servers/entry.ts +++ b/app/queries/servers/entry.ts @@ -43,7 +43,7 @@ export const prepareModels = async ({operator, initialTeamId, removeTeams, remov } if (teamData?.teams?.length) { - const teamModels = prepareMyTeams(operator, teamData.teams, teamData.memberships || [], teamData.unreads || []); + const teamModels = prepareMyTeams(operator, teamData.teams, teamData.memberships || []); if (teamModels) { modelPromises.push(...teamModels); } diff --git a/app/queries/servers/team.ts b/app/queries/servers/team.ts index 6da6d8c067..97caf4e322 100644 --- a/app/queries/servers/team.ts +++ b/app/queries/servers/team.ts @@ -46,14 +46,13 @@ export const addChannelToTeamHistory = async (operator: ServerDataOperator, team return operator.handleTeamChannelHistory({teamChannelHistories: [tch], prepareRecordsOnly}); }; -export const prepareMyTeams = (operator: ServerDataOperator, teams: Team[], memberships: TeamMembership[], unreads: TeamUnread[]) => { +export const prepareMyTeams = (operator: ServerDataOperator, teams: Team[], memberships: TeamMembership[]) => { try { const teamRecords = operator.handleTeam({prepareRecordsOnly: true, teams}); const teamMemberships = memberships.filter((m) => teams.find((t) => t.id === m.team_id)); const teamMembershipRecords = operator.handleTeamMemberships({prepareRecordsOnly: true, teamMemberships}); - const myTeams: MyTeam[] = unreads.map((unread) => { - const matchingTeam = teamMemberships.find((team) => team.team_id === unread.team_id); - return {id: unread.team_id, roles: matchingTeam?.roles ?? '', is_unread: unread.msg_count > 0, mentions_count: unread.mention_count}; + const myTeams: MyTeam[] = teamMemberships.map((tm) => { + return {id: tm.team_id, roles: tm.roles ?? ''}; }); const myTeamRecords = operator.handleMyTeam({ prepareRecordsOnly: true, diff --git a/ios/Mattermost/MattermostManaged.m b/ios/Mattermost/MattermostManaged.m index c00e515d3a..e4a93211b3 100644 --- a/ios/Mattermost/MattermostManaged.m +++ b/ios/Mattermost/MattermostManaged.m @@ -102,4 +102,12 @@ RCT_EXPORT_METHOD(deleteEntititesFile: (RCTResponseSenderBlock) callback) { } } +RCT_EXPORT_METHOD(addListener:(NSString *)eventName) { + // Keep: Required for RN built in Event Emitter Calls. +} + +RCT_EXPORT_METHOD(removeListeners:(double)count) { + // Keep: Required for RN built in Event Emitter Calls. +} + @end diff --git a/types/api/teams.d.ts b/types/api/teams.d.ts index 0db87b7f8e..e3c0784b3e 100644 --- a/types/api/teams.d.ts +++ b/types/api/teams.d.ts @@ -49,9 +49,3 @@ type TeamsState = { groupsAssociatedToTeam: any; totalCount: number; }; - -type TeamUnread = { - team_id: string; - mention_count: number; - msg_count: number; -}; diff --git a/types/database/models/servers/my_team.d.ts b/types/database/models/servers/my_team.d.ts index 0422c9e837..12882f52eb 100644 --- a/types/database/models/servers/my_team.d.ts +++ b/types/database/models/servers/my_team.d.ts @@ -11,12 +11,6 @@ export default class MyTeamModel extends Model { /** table (name) : MyTeam */ static table: string; - /** is_unread : Boolean flag for unread messages on team level */ - isUnread: boolean; - - /** mentions_count : Count of posts in which the user has been mentioned */ - mentionsCount: number; - /** roles : The different permissions that this user has in the team, concatenated together with comma to form a single string. */ roles: string; diff --git a/types/database/raw_values.d.ts b/types/database/raw_values.d.ts index 750c21325d..42a8e07398 100644 --- a/types/database/raw_values.d.ts +++ b/types/database/raw_values.d.ts @@ -42,8 +42,6 @@ type GroupTeamRelation = { type MyTeam = { id: string; roles: string; - is_unread: boolean; - mentions_count: number; }; type PostsInChannel = {