forked from Ivasoft/mattermost-mobile
[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:
@@ -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;
|
||||
};
|
||||
|
||||
@@ -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,
|
||||
});
|
||||
});
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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,
|
||||
});
|
||||
});
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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'}),
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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,
|
||||
});
|
||||
});
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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,
|
||||
});
|
||||
});
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user