[Gekidou] Performance & UI fixes (#6122)

* Fix search bar style

* MM-42983 Align mention badge on channel list item

* MM-42985 polish channel intro UI

* MM-42984 update fonts on 'Show' bottom sheet

* MM-42982 Increase tap area of back button on channel view

* Set StatusBar style based on theme sidebarBg

* Reconnect other WS after 20 seconds insted of 5

* Only fetch missing profiles for DM/GMs

* Database prepare records optimization

* Do not use fallbackUsername for storing GM/DM in the database

* fix filter for fetching missing dm/gm

* remove use of indexOf inside another loop

* remove use of includes inside another loop

* remove use of find inside another loop

* Add missing translations

* disable Flipper on iOS

* Remove Flipper code from AppDelegate

* feedback review

* trim DM display name to make sure is not empty

* fixing missing direct channels display name

* UI/UX feedback

* fix WS channel viewed and mark as unread

* Remove duplicate emojis from reaction bar
This commit is contained in:
Elias Nahum
2022-04-04 17:09:26 -04:00
committed by GitHub
parent 137ba9d191
commit 2621d921d6
101 changed files with 1250 additions and 1538 deletions

View File

@@ -1,28 +1,13 @@
// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
// See LICENSE.txt for license information.
import type CategoryModel from '@typings/database/models/servers/category';
import type CategoryChannelModel from '@typings/database/models/servers/category_channel';
import type ChannelModel from '@typings/database/models/servers/channel';
import type ChannelInfoModel from '@typings/database/models/servers/channel_info';
import type ChannelMembershipModel from '@typings/database/models/servers/channel_membership';
import type CustomEmojiModel from '@typings/database/models/servers/custom_emoji';
import type DraftModel from '@typings/database/models/servers/draft';
import type FileModel from '@typings/database/models/servers/file';
import type MyChannelModel from '@typings/database/models/servers/my_channel';
import type MyChannelSettingsModel from '@typings/database/models/servers/my_channel_settings';
import type MyTeamModel from '@typings/database/models/servers/my_team';
import type PostModel from '@typings/database/models/servers/post';
import type PreferenceModel from '@typings/database/models/servers/preference';
import type RoleModel from '@typings/database/models/servers/role';
import type SlashCommandModel from '@typings/database/models/servers/slash_command';
import type SystemModel from '@typings/database/models/servers/system';
import type TeamModel from '@typings/database/models/servers/team';
import type TeamChannelHistoryModel from '@typings/database/models/servers/team_channel_history';
import type TeamMembershipModel from '@typings/database/models/servers/team_membership';
import type TeamSearchHistoryModel from '@typings/database/models/servers/team_search_history';
import type ThreadModel from '@typings/database/models/servers/thread';
import type UserModel from '@typings/database/models/servers/user';
/**
* This file contains all the comparators that are used by the handlers to find out which records to truly update and
@@ -31,94 +16,41 @@ import type UserModel from '@typings/database/models/servers/user';
* 'record' and the 'raw'
*/
export const isRecordCategoryEqualToRaw = (record: CategoryModel, raw: Category) => {
return raw.id === record.id;
export const buildDraftKey = (draft: DraftModel | Draft) => {
if ('channel_id' in draft) {
return `${draft.channel_id}-${draft.root_id}`;
}
return `${draft.channelId}-${draft.rootId}`;
};
export const isRecordCategoryChannelEqualToRaw = (record: CategoryChannelModel, raw: CategoryChannel) => {
return (record.id === raw.id);
export const buildPreferenceKey = (pref: PreferenceModel | PreferenceType) => {
return `${pref.category}-${pref.name}`;
};
export const isRecordRoleEqualToRaw = (record: RoleModel, raw: Role) => {
return raw.id === record.id;
export const buildTeamMembershipKey = (member: TeamMembershipModel | TeamMembership) => {
if ('team_id' in member) {
return `${member.team_id}-${member.user_id}`;
}
return `${member.teamId}-${member.userId}`;
};
export const isRecordSystemEqualToRaw = (record: SystemModel, raw: IdValue) => {
return raw.id === record.id;
export const buildChannelMembershipKey = (membership: ChannelMembershipModel | Pick<ChannelMembership, 'user_id' | 'channel_id'>) => {
if ('user_id' in membership) {
return `${membership.user_id}-${membership.channel_id}`;
}
return `${membership.userId}-${membership.channelId}`;
};
export const isRecordDraftEqualToRaw = (record: DraftModel, raw: Draft) => {
return raw.channel_id === record.channelId && raw.root_id === record.rootId;
export const buildTeamSearchHistoryKey = (history: TeamSearchHistoryModel | TeamSearchHistory) => {
if ('team_id' in history) {
return `${history.team_id}-${history.term}`;
}
return `${history.teamId}-${history.term}`;
};
export const isRecordPostEqualToRaw = (record: PostModel, raw: Post) => {
return raw.id === record.id;
};
export const isRecordUserEqualToRaw = (record: UserModel, raw: UserProfile) => {
return raw.id === record.id;
};
export const isRecordPreferenceEqualToRaw = (record: PreferenceModel, raw: PreferenceType) => {
return (
raw.category === record.category &&
raw.name === record.name &&
raw.user_id === record.userId
);
};
export const isRecordTeamMembershipEqualToRaw = (record: TeamMembershipModel, raw: TeamMembership) => {
return raw.team_id === record.teamId && raw.user_id === record.userId;
};
export const isRecordCustomEmojiEqualToRaw = (record: CustomEmojiModel, raw: CustomEmoji) => {
return raw.id === record.id;
};
export const isRecordChannelMembershipEqualToRaw = (record: ChannelMembershipModel, raw: Pick<ChannelMembership, 'user_id' | 'channel_id'>) => {
return raw.user_id === record.userId && raw.channel_id === record.channelId;
};
export const isRecordTeamEqualToRaw = (record: TeamModel, raw: Team) => {
return raw.id === record.id;
};
export const isRecordTeamChannelHistoryEqualToRaw = (record: TeamChannelHistoryModel, raw: TeamChannelHistory) => {
return raw.id === record.id;
};
export const isRecordTeamSearchHistoryEqualToRaw = (record: TeamSearchHistoryModel, raw: TeamSearchHistory) => {
return raw.team_id === record.teamId && raw.term === record.term;
};
export const isRecordSlashCommandEqualToRaw = (record: SlashCommandModel, raw: SlashCommand) => {
return raw.id === record.id;
};
export const isRecordMyTeamEqualToRaw = (record: MyTeamModel, raw: MyTeam) => {
return raw.id === record.id;
};
export const isRecordChannelEqualToRaw = (record: ChannelModel, raw: Channel) => {
return raw.id === record.id;
};
export const isRecordMyChannelSettingsEqualToRaw = (record: MyChannelSettingsModel, raw: ChannelMembership) => {
return raw.channel_id === record.id;
};
export const isRecordChannelInfoEqualToRaw = (record: ChannelInfoModel, raw: ChannelInfo) => {
return raw.id === record.id;
};
export const isRecordMyChannelEqualToRaw = (record: MyChannelModel, raw: ChannelMembership) => {
return raw.channel_id === record.id;
};
export const isRecordFileEqualToRaw = (record: FileModel, raw: FileInfo) => {
return raw.id === record.id;
};
export const isRecordThreadEqualToRaw = (record: ThreadModel, raw: Thread) => {
return raw.id === record.id;
export const buildMyChannelKey = (myChannel: MyChannelModel | MyChannelSettingsModel | ChannelMembership) => {
if ('channel_id' in myChannel) {
return myChannel.channel_id;
}
return myChannel.id;
};

View File

@@ -3,10 +3,6 @@
import {MM_TABLES} from '@constants/database';
import DatabaseManager from '@database/manager';
import {
isRecordCategoryEqualToRaw,
isRecordCategoryChannelEqualToRaw,
} from '@database/operator/server_data_operator/comparators';
import {
transformCategoryRecord,
transformCategoryChannelRecord,
@@ -49,7 +45,6 @@ describe('*** Operator: Category Handlers tests ***', () => {
createOrUpdateRawValues: categories,
tableName: MM_TABLES.SERVER.CATEGORY,
prepareRecordsOnly: false,
findMatchingRecordBy: isRecordCategoryEqualToRaw,
transformer: transformCategoryRecord,
});
});
@@ -78,7 +73,6 @@ describe('*** Operator: Category Handlers tests ***', () => {
createOrUpdateRawValues: categoryChannels,
tableName: MM_TABLES.SERVER.CATEGORY_CHANNEL,
prepareRecordsOnly: false,
findMatchingRecordBy: isRecordCategoryChannelEqualToRaw,
transformer: transformCategoryChannelRecord,
});
});

View File

@@ -3,10 +3,6 @@
import {MM_TABLES} from '@constants/database';
import DataOperatorException from '@database/exceptions/data_operator_exception';
import {
isRecordCategoryChannelEqualToRaw,
isRecordCategoryEqualToRaw,
} from '@database/operator/server_data_operator/comparators';
import {
transformCategoryChannelRecord,
transformCategoryRecord,
@@ -50,7 +46,6 @@ const CategoryHandler = (superclass: any) => class extends superclass {
return this.handleRecords({
fieldName: 'id',
findMatchingRecordBy: isRecordCategoryEqualToRaw,
transformer: transformCategoryRecord,
createOrUpdateRawValues,
tableName: CATEGORY,
@@ -77,7 +72,6 @@ const CategoryHandler = (superclass: any) => class extends superclass {
return this.handleRecords({
fieldName: 'id',
findMatchingRecordBy: isRecordCategoryChannelEqualToRaw,
transformer: transformCategoryChannelRecord,
createOrUpdateRawValues,
tableName: CATEGORY_CHANNEL,

View File

@@ -3,11 +3,8 @@
import DatabaseManager from '@database/manager';
import {
isRecordChannelEqualToRaw,
isRecordChannelInfoEqualToRaw,
isRecordChannelMembershipEqualToRaw,
isRecordMyChannelEqualToRaw,
isRecordMyChannelSettingsEqualToRaw,
buildChannelMembershipKey,
buildMyChannelKey,
} from '@database/operator/server_data_operator/comparators';
import {
transformChannelInfoRecord,
@@ -63,7 +60,6 @@ describe('*** Operator: Channel Handlers tests ***', () => {
createOrUpdateRawValues: channels,
tableName: 'Channel',
prepareRecordsOnly: false,
findMatchingRecordBy: isRecordChannelEqualToRaw,
transformer: transformChannelRecord,
});
});
@@ -103,7 +99,7 @@ describe('*** Operator: Channel Handlers tests ***', () => {
createOrUpdateRawValues: settings,
tableName: 'MyChannelSettings',
prepareRecordsOnly: false,
findMatchingRecordBy: isRecordMyChannelSettingsEqualToRaw,
buildKeyRecordBy: buildMyChannelKey,
transformer: transformMyChannelSettingsRecord,
});
});
@@ -135,7 +131,6 @@ describe('*** Operator: Channel Handlers tests ***', () => {
createOrUpdateRawValues: channelInfos,
tableName: 'ChannelInfo',
prepareRecordsOnly: false,
findMatchingRecordBy: isRecordChannelInfoEqualToRaw,
transformer: transformChannelInfoRecord,
});
});
@@ -196,7 +191,7 @@ describe('*** Operator: Channel Handlers tests ***', () => {
createOrUpdateRawValues: myChannels,
tableName: 'MyChannel',
prepareRecordsOnly: false,
findMatchingRecordBy: isRecordMyChannelEqualToRaw,
buildKeyRecordBy: buildMyChannelKey,
transformer: transformMyChannelRecord,
});
});
@@ -257,7 +252,7 @@ describe('*** Operator: Channel Handlers tests ***', () => {
createOrUpdateRawValues: channelMemberships,
tableName: 'ChannelMembership',
prepareRecordsOnly: false,
findMatchingRecordBy: isRecordChannelMembershipEqualToRaw,
buildKeyRecordBy: buildChannelMembershipKey,
transformer: transformChannelMembershipRecord,
});
});

View File

@@ -4,11 +4,8 @@
import {MM_TABLES} from '@constants/database';
import DataOperatorException from '@database/exceptions/data_operator_exception';
import {
isRecordChannelEqualToRaw,
isRecordChannelInfoEqualToRaw,
isRecordChannelMembershipEqualToRaw,
isRecordMyChannelEqualToRaw,
isRecordMyChannelSettingsEqualToRaw,
buildMyChannelKey,
buildChannelMembershipKey,
} from '@database/operator/server_data_operator/comparators';
import {
transformChannelInfoRecord,
@@ -62,7 +59,6 @@ const ChannelHandler = (superclass: any) => class extends superclass {
return this.handleRecords({
fieldName: 'id',
findMatchingRecordBy: isRecordChannelEqualToRaw,
transformer: transformChannelRecord,
prepareRecordsOnly,
createOrUpdateRawValues,
@@ -89,7 +85,7 @@ const ChannelHandler = (superclass: any) => class extends superclass {
return this.handleRecords({
fieldName: 'id',
findMatchingRecordBy: isRecordMyChannelSettingsEqualToRaw,
buildKeyRecordBy: buildMyChannelKey,
transformer: transformMyChannelSettingsRecord,
prepareRecordsOnly,
createOrUpdateRawValues,
@@ -119,7 +115,6 @@ const ChannelHandler = (superclass: any) => class extends superclass {
return this.handleRecords({
fieldName: 'id',
findMatchingRecordBy: isRecordChannelInfoEqualToRaw,
transformer: transformChannelInfoRecord,
prepareRecordsOnly,
createOrUpdateRawValues,
@@ -142,14 +137,18 @@ const ChannelHandler = (superclass: any) => class extends superclass {
);
}
myChannels.forEach((my) => {
const channel = channels.find((c) => c.id === my.channel_id);
const channelMap = channels.reduce((result: Record<string, Channel>, channel) => {
result[channel.id] = channel;
return result;
}, {});
for (const my of myChannels) {
const channel = channelMap[my.channel_id];
if (channel) {
const msgCount = Math.max(0, channel.total_msg_count - my.msg_count);
my.msg_count = msgCount;
my.is_unread = msgCount > 0;
}
});
}
const createOrUpdateRawValues = getUniqueRawsBy({
raws: myChannels,
@@ -158,7 +157,7 @@ const ChannelHandler = (superclass: any) => class extends superclass {
return this.handleRecords({
fieldName: 'id',
findMatchingRecordBy: isRecordMyChannelEqualToRaw,
buildKeyRecordBy: buildMyChannelKey,
transformer: transformMyChannelRecord,
prepareRecordsOnly,
createOrUpdateRawValues,
@@ -190,7 +189,7 @@ const ChannelHandler = (superclass: any) => class extends superclass {
return this.handleRecords({
fieldName: 'user_id',
findMatchingRecordBy: isRecordChannelMembershipEqualToRaw,
buildKeyRecordBy: buildChannelMembershipKey,
transformer: transformChannelMembershipRecord,
prepareRecordsOnly,
createOrUpdateRawValues,

View File

@@ -3,11 +3,6 @@
import DataOperatorException from '@database/exceptions/data_operator_exception';
import DatabaseManager from '@database/manager';
import {
isRecordCustomEmojiEqualToRaw,
isRecordRoleEqualToRaw,
isRecordSystemEqualToRaw,
} from '@database/operator/server_data_operator/comparators';
import {
transformCustomEmojiRecord,
transformRoleRecord,
@@ -45,7 +40,6 @@ describe('*** DataOperator: Base Handlers tests ***', () => {
expect(spyOnHandleRecords).toHaveBeenCalledWith({
fieldName: 'id',
transformer: transformRoleRecord,
findMatchingRecordBy: isRecordRoleEqualToRaw,
createOrUpdateRawValues: roles,
tableName: 'Role',
prepareRecordsOnly: false,
@@ -78,7 +72,6 @@ describe('*** DataOperator: Base Handlers tests ***', () => {
createOrUpdateRawValues: emojis,
tableName: 'CustomEmoji',
prepareRecordsOnly: false,
findMatchingRecordBy: isRecordCustomEmojiEqualToRaw,
transformer: transformCustomEmojiRecord,
});
});
@@ -96,7 +89,6 @@ describe('*** DataOperator: Base Handlers tests ***', () => {
});
expect(spyOnHandleRecords).toHaveBeenCalledWith({
findMatchingRecordBy: isRecordSystemEqualToRaw,
fieldName: 'id',
transformer: transformSystemRecord,
createOrUpdateRawValues: systems,
@@ -113,17 +105,12 @@ describe('*** DataOperator: Base Handlers tests ***', () => {
expect(appDatabase).toBeTruthy();
expect(appOperator).toBeTruthy();
const findMatchingRecordBy = (existing: Model, newRecord: any) => {
return existing === newRecord;
};
const transformer = async (model: Model) => model;
await expect(
operator?.handleRecords({
fieldName: 'invalidField',
tableName: 'INVALID_TABLE_NAME',
findMatchingRecordBy,
transformer,
createOrUpdateRawValues: [{id: 'tos-1', value: '1'}],
prepareRecordsOnly: false,

View File

@@ -4,11 +4,6 @@
import {MM_TABLES} from '@constants/database';
import DataOperatorException from '@database/exceptions/data_operator_exception';
import BaseDataOperator from '@database/operator/base_data_operator';
import {
isRecordCustomEmojiEqualToRaw,
isRecordRoleEqualToRaw,
isRecordSystemEqualToRaw,
} from '@database/operator/server_data_operator/comparators';
import {
transformCustomEmojiRecord,
transformRoleRecord,
@@ -34,7 +29,6 @@ export default class ServerDataOperatorBase extends BaseDataOperator {
return this.handleRecords({
fieldName: 'id',
findMatchingRecordBy: isRecordRoleEqualToRaw,
transformer: transformRoleRecord,
prepareRecordsOnly,
createOrUpdateRawValues: getUniqueRawsBy({raws: roles, key: 'id'}),
@@ -51,7 +45,6 @@ export default class ServerDataOperatorBase extends BaseDataOperator {
return this.handleRecords({
fieldName: 'name',
findMatchingRecordBy: isRecordCustomEmojiEqualToRaw,
transformer: transformCustomEmojiRecord,
prepareRecordsOnly,
createOrUpdateRawValues: getUniqueRawsBy({raws: emojis, key: 'name'}),
@@ -68,7 +61,6 @@ export default class ServerDataOperatorBase extends BaseDataOperator {
return this.handleRecords({
fieldName: 'id',
findMatchingRecordBy: isRecordSystemEqualToRaw,
transformer: transformSystemRecord,
prepareRecordsOnly,
createOrUpdateRawValues: getUniqueRawsBy({raws: systems, key: 'id'}),

View File

@@ -5,7 +5,7 @@ import {Q} from '@nozbe/watermelondb';
import {ActionType} from '@constants';
import DatabaseManager from '@database/manager';
import {isRecordDraftEqualToRaw} from '@database/operator/server_data_operator/comparators';
import {buildDraftKey} from '@database/operator/server_data_operator/comparators';
import {transformDraftRecord} from '@database/operator/server_data_operator/transformers/post';
import {createPostsChain} from '@database/operator/utils/post';
@@ -55,7 +55,7 @@ describe('*** Operator: Post Handlers tests ***', () => {
await operator.handleDraft({drafts, prepareRecordsOnly: false});
expect(spyOnHandleRecords).toHaveBeenCalledWith({
findMatchingRecordBy: isRecordDraftEqualToRaw,
buildKeyRecordBy: buildDraftKey,
fieldName: 'channel_id',
transformer: transformDraftRecord,
createOrUpdateRawValues: drafts,

View File

@@ -6,7 +6,7 @@ import {Q} from '@nozbe/watermelondb';
import {ActionType} from '@constants';
import {MM_TABLES} from '@constants/database';
import DataOperatorException from '@database/exceptions/data_operator_exception';
import {isRecordDraftEqualToRaw, isRecordFileEqualToRaw, isRecordPostEqualToRaw} from '@database/operator/server_data_operator/comparators';
import {buildDraftKey} from '@database/operator/server_data_operator/comparators';
import {
transformDraftRecord,
transformFileRecord,
@@ -59,7 +59,7 @@ const PostHandler = (superclass: any) => class extends superclass {
return this.handleRecords({
fieldName: 'channel_id',
findMatchingRecordBy: isRecordDraftEqualToRaw,
buildKeyRecordBy: buildDraftKey,
transformer: transformDraftRecord,
prepareRecordsOnly,
createOrUpdateRawValues,
@@ -165,7 +165,6 @@ const PostHandler = (superclass: any) => class extends superclass {
createOrUpdateRawValues: uniquePosts.filter((p) => p.delete_at === 0),
deleteRawValues: pendingPostsToDelete,
tableName,
findMatchingRecordBy: isRecordPostEqualToRaw,
fieldName: 'id',
})) as ProcessRecordResults;
@@ -237,7 +236,6 @@ const PostHandler = (superclass: any) => class extends superclass {
const processedFiles = (await this.processRecords({
createOrUpdateRawValues: files,
tableName: FILE,
findMatchingRecordBy: isRecordFileEqualToRaw,
fieldName: 'id',
})) as ProcessRecordResults;

View File

@@ -3,11 +3,8 @@
import DatabaseManager from '@database/manager';
import {
isRecordMyTeamEqualToRaw,
isRecordTeamChannelHistoryEqualToRaw,
isRecordTeamEqualToRaw,
isRecordTeamMembershipEqualToRaw,
isRecordTeamSearchHistoryEqualToRaw,
buildTeamMembershipKey,
buildTeamSearchHistoryKey,
} from '@database/operator/server_data_operator/comparators';
import {
transformMyTeamRecord,
@@ -62,7 +59,6 @@ describe('*** Operator: Team Handlers tests ***', () => {
createOrUpdateRawValues: teams,
tableName: 'Team',
prepareRecordsOnly: false,
findMatchingRecordBy: isRecordTeamEqualToRaw,
transformer: transformTeamRecord,
});
});
@@ -95,7 +91,7 @@ describe('*** Operator: Team Handlers tests ***', () => {
createOrUpdateRawValues: teamMemberships,
tableName: 'TeamMembership',
prepareRecordsOnly: false,
findMatchingRecordBy: isRecordTeamMembershipEqualToRaw,
buildKeyRecordBy: buildTeamMembershipKey,
transformer: transformTeamMembershipRecord,
});
});
@@ -122,7 +118,6 @@ describe('*** Operator: Team Handlers tests ***', () => {
createOrUpdateRawValues: myTeams,
tableName: 'MyTeam',
prepareRecordsOnly: false,
findMatchingRecordBy: isRecordMyTeamEqualToRaw,
transformer: transformMyTeamRecord,
});
});
@@ -149,7 +144,6 @@ describe('*** Operator: Team Handlers tests ***', () => {
createOrUpdateRawValues: teamChannelHistories,
tableName: 'TeamChannelHistory',
prepareRecordsOnly: false,
findMatchingRecordBy: isRecordTeamChannelHistoryEqualToRaw,
transformer: transformTeamChannelHistoryRecord,
});
});
@@ -178,7 +172,7 @@ describe('*** Operator: Team Handlers tests ***', () => {
createOrUpdateRawValues: teamSearchHistories,
tableName: 'TeamSearchHistory',
prepareRecordsOnly: false,
findMatchingRecordBy: isRecordTeamSearchHistoryEqualToRaw,
buildKeyRecordBy: buildTeamSearchHistoryKey,
transformer: transformTeamSearchHistoryRecord,
});
});

View File

@@ -4,11 +4,8 @@
import {MM_TABLES} from '@constants/database';
import DataOperatorException from '@database/exceptions/data_operator_exception';
import {
isRecordMyTeamEqualToRaw,
isRecordTeamChannelHistoryEqualToRaw,
isRecordTeamEqualToRaw,
isRecordTeamMembershipEqualToRaw,
isRecordTeamSearchHistoryEqualToRaw,
buildTeamMembershipKey,
buildTeamSearchHistoryKey,
} from '@database/operator/server_data_operator/comparators';
import {
transformMyTeamRecord,
@@ -20,11 +17,10 @@ import {
import {getUniqueRawsBy} from '@database/operator/utils/general';
import type {
HandleMyTeamArgs, HandleSlashCommandArgs, HandleTeamArgs,
HandleMyTeamArgs, HandleTeamArgs,
HandleTeamChannelHistoryArgs, HandleTeamMembershipArgs, HandleTeamSearchHistoryArgs,
} from '@typings/database/database';
import type MyTeamModel from '@typings/database/models/servers/my_team';
import type SlashCommandModel from '@typings/database/models/servers/slash_command';
import type TeamModel from '@typings/database/models/servers/team';
import type TeamChannelHistoryModel from '@typings/database/models/servers/team_channel_history';
import type TeamMembershipModel from '@typings/database/models/servers/team_membership';
@@ -43,7 +39,6 @@ export interface TeamHandlerMix {
handleTeam: ({teams, prepareRecordsOnly}: HandleTeamArgs) => Promise<TeamModel[]>;
handleTeamChannelHistory: ({teamChannelHistories, prepareRecordsOnly}: HandleTeamChannelHistoryArgs) => Promise<TeamChannelHistoryModel[]>;
handleTeamSearchHistory: ({teamSearchHistories, prepareRecordsOnly}: HandleTeamSearchHistoryArgs) => Promise<TeamSearchHistoryModel[]>;
handleSlashCommand: ({slashCommands, prepareRecordsOnly}: HandleSlashCommandArgs) => Promise<SlashCommandModel[]>;
handleMyTeam: ({myTeams, prepareRecordsOnly}: HandleMyTeamArgs) => Promise<MyTeamModel[]>;
}
@@ -67,7 +62,7 @@ const TeamHandler = (superclass: any) => class extends superclass {
return this.handleRecords({
fieldName: 'user_id',
findMatchingRecordBy: isRecordTeamMembershipEqualToRaw,
buildKeyRecordBy: buildTeamMembershipKey,
transformer: transformTeamMembershipRecord,
createOrUpdateRawValues,
tableName: TEAM_MEMBERSHIP,
@@ -94,7 +89,6 @@ const TeamHandler = (superclass: any) => class extends superclass {
return this.handleRecords({
fieldName: 'id',
findMatchingRecordBy: isRecordTeamEqualToRaw,
transformer: transformTeamRecord,
prepareRecordsOnly,
createOrUpdateRawValues,
@@ -121,7 +115,6 @@ const TeamHandler = (superclass: any) => class extends superclass {
return this.handleRecords({
fieldName: 'id',
findMatchingRecordBy: isRecordTeamChannelHistoryEqualToRaw,
transformer: transformTeamChannelHistoryRecord,
prepareRecordsOnly,
createOrUpdateRawValues,
@@ -148,7 +141,7 @@ const TeamHandler = (superclass: any) => class extends superclass {
return this.handleRecords({
fieldName: 'team_id',
findMatchingRecordBy: isRecordTeamSearchHistoryEqualToRaw,
buildKeyRecordBy: buildTeamSearchHistoryKey,
transformer: transformTeamSearchHistoryRecord,
prepareRecordsOnly,
createOrUpdateRawValues,
@@ -175,7 +168,6 @@ const TeamHandler = (superclass: any) => class extends superclass {
return this.handleRecords({
fieldName: 'id',
findMatchingRecordBy: isRecordMyTeamEqualToRaw,
transformer: transformMyTeamRecord,
prepareRecordsOnly,
createOrUpdateRawValues,

View File

@@ -2,7 +2,6 @@
// See LICENSE.txt for license information.
import DatabaseManager from '@database/manager';
import {isRecordThreadEqualToRaw} from '@database/operator/server_data_operator/comparators';
import {transformThreadRecord, transformThreadParticipantRecord, transformThreadInTeamRecord} from '@database/operator/server_data_operator/transformers/thread';
import ServerDataOperator from '..';
@@ -55,7 +54,6 @@ describe('*** Operator: Thread Handlers tests ***', () => {
await operator.handleThreads({threads, prepareRecordsOnly: false, teamId: 'team_id_1'});
expect(spyOnHandleRecords).toHaveBeenCalledWith({
findMatchingRecordBy: isRecordThreadEqualToRaw,
fieldName: 'id',
transformer: transformThreadRecord,
createOrUpdateRawValues: threads,

View File

@@ -5,7 +5,6 @@ import Model from '@nozbe/watermelondb/Model';
import {Database} from '@constants';
import DataOperatorException from '@database/exceptions/data_operator_exception';
import {isRecordThreadEqualToRaw} from '@database/operator/server_data_operator/comparators';
import {
transformThreadRecord,
transformThreadParticipantRecord,
@@ -65,7 +64,6 @@ const ThreadHandler = (superclass: any) => class extends superclass {
// Get thread models to be created and updated
const preparedThreads = await this.handleRecords({
fieldName: 'id',
findMatchingRecordBy: isRecordThreadEqualToRaw,
transformer: transformThreadRecord,
prepareRecordsOnly: true,
createOrUpdateRawValues: uniqueThreads,

View File

@@ -29,11 +29,13 @@ const ThreadInTeamHandler = (superclass: any) => class extends superclass {
const chunks = await (this.database as Database).get<ThreadInTeamModel>(THREADS_IN_TEAM).query(
Q.where('team_id', teamId),
).fetch();
const chunksMap = chunks.reduce((result: Record<string, ThreadInTeamModel>, chunk) => {
result[chunk.threadId] = chunk;
return result;
}, {});
for (const thread of threadsMap[teamId]) {
const chunk = chunks.find((threadInTeam) => {
return threadInTeam.threadId === thread.id;
});
const chunk = chunksMap[thread.id];
const newValue = {
thread_id: thread.id,

View File

@@ -3,10 +3,7 @@
import DatabaseManager from '@database/manager';
import ServerDataOperator from '@database/operator/server_data_operator';
import {
isRecordPreferenceEqualToRaw,
isRecordUserEqualToRaw,
} from '@database/operator/server_data_operator/comparators';
import {buildPreferenceKey} from '@database/operator/server_data_operator/comparators';
import {
transformPreferenceRecord,
transformUserRecord,
@@ -103,7 +100,6 @@ describe('*** Operator: User Handlers tests ***', () => {
createOrUpdateRawValues: users,
tableName: 'User',
prepareRecordsOnly: false,
findMatchingRecordBy: isRecordUserEqualToRaw,
transformer: transformUserRecord,
});
});
@@ -151,7 +147,7 @@ describe('*** Operator: User Handlers tests ***', () => {
createOrUpdateRawValues: preferences,
tableName: 'Preference',
prepareRecordsOnly: true,
findMatchingRecordBy: isRecordPreferenceEqualToRaw,
buildKeyRecordBy: buildPreferenceKey,
transformer: transformPreferenceRecord,
});
});

View File

@@ -3,10 +3,7 @@
import {MM_TABLES} from '@constants/database';
import DataOperatorException from '@database/exceptions/data_operator_exception';
import {
isRecordPreferenceEqualToRaw,
isRecordUserEqualToRaw,
} from '@database/operator/server_data_operator/comparators';
import {buildPreferenceKey} from '@database/operator/server_data_operator/comparators';
import {
transformPreferenceRecord,
transformUserRecord,
@@ -47,8 +44,12 @@ const UserHandler = (superclass: any) => class extends superclass {
const deleteValues: PreferenceModel[] = [];
if (sync) {
const stored = await this.database.get(PREFERENCE).query().fetch() as PreferenceModel[];
const preferenceMap = preferences.reduce((r: Record<string, boolean>, p) => {
r[`${p.category}-${p.name}`] = true;
return r;
}, {});
for (const pref of stored) {
const exists = preferences.findIndex((p) => p.category === pref.category && p.name === pref.name) > -1;
const exists = preferenceMap[`${pref.category}-${pref.name}`];
if (!exists) {
pref.prepareDestroyPermanently();
deleteValues.push(pref);
@@ -58,7 +59,7 @@ const UserHandler = (superclass: any) => class extends superclass {
const records: PreferenceModel[] = await this.handleRecords({
fieldName: 'user_id',
findMatchingRecordBy: isRecordPreferenceEqualToRaw,
buildKeyRecordBy: buildPreferenceKey,
transformer: transformPreferenceRecord,
prepareRecordsOnly: true,
createOrUpdateRawValues: preferences,
@@ -95,7 +96,6 @@ const UserHandler = (superclass: any) => class extends superclass {
return this.handleRecords({
fieldName: 'id',
findMatchingRecordBy: isRecordUserEqualToRaw,
transformer: transformUserRecord,
createOrUpdateRawValues,
tableName: USER,

View File

@@ -1,9 +1,9 @@
// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
// See LICENSE.txt for license information.
import {General} from '@constants';
import {MM_TABLES} from '@constants/database';
import {prepareBaseRecord} from '@database/operator/server_data_operator/transformers/index';
import {extractChannelDisplayName} from '@helpers/database';
import {OperationType} from '@typings/database/enums';
import type {TransformerArgs} from '@typings/database/database';
@@ -40,25 +40,7 @@ export const transformChannelRecord = ({action, database, value}: TransformerArg
channel.creatorId = raw.creator_id;
channel.deleteAt = raw.delete_at;
// for DM & GM's channels do not override the display name
// until we get the new info if there is any
let displayName;
if (raw.type === General.DM_CHANNEL && (record?.displayName || raw.display_name)) {
displayName = raw.display_name || record?.displayName;
} else if (raw.type === General.GM_CHANNEL) {
const rawMembers = raw.display_name.split(',').length;
const recordMembers = record?.displayName.split(',').length || rawMembers;
if (recordMembers < rawMembers && record.displayName) {
displayName = record.displayName;
} else {
displayName = raw.display_name;
}
} else {
displayName = raw.display_name;
}
channel.displayName = displayName;
channel.displayName = extractChannelDisplayName(raw, record);
channel.isGroupConstrained = Boolean(raw.group_constrained);
channel.name = raw.name;
channel.shared = Boolean(raw.shared);