Skip to content

Commit ad4f161

Browse files
committed
Improve ergonomics
1 parent 4211fac commit ad4f161

File tree

13 files changed

+125
-193
lines changed

13 files changed

+125
-193
lines changed

apps/meteor/app/autotranslate/client/lib/autotranslate.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -146,15 +146,15 @@ export const createAutoTranslateMessageStreamHandler = (): ((message: ITranslate
146146
(!message.translations ||
147147
(!hasTranslationLanguageInMessage(message, language) && !hasTranslationLanguageInAttachments(message.attachments, language)))
148148
) {
149-
Messages.state.update(
149+
Messages.store.update(
150150
(record) => record._id === message._id,
151151
(record) => ({
152152
...record,
153153
autoTranslateFetching: true,
154154
}),
155155
);
156156
} else if (AutoTranslate.messageIdsToWait[message._id] !== undefined && subscription && subscription.autoTranslate !== true) {
157-
Messages.state.update(
157+
Messages.store.update(
158158
(record) => record._id === message._id,
159159
({ autoTranslateFetching: _, ...record }) => ({
160160
...record,
@@ -163,7 +163,7 @@ export const createAutoTranslateMessageStreamHandler = (): ((message: ITranslate
163163
);
164164
delete AutoTranslate.messageIdsToWait[message._id];
165165
} else if (message.autoTranslateFetching === true) {
166-
Messages.state.update(
166+
Messages.store.update(
167167
(record) => record._id === message._id,
168168
({ autoTranslateFetching: _, ...record }) => record,
169169
);

apps/meteor/app/e2e/client/rocketchat.e2e.room.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -303,7 +303,7 @@ export class E2ERoom extends Emitter {
303303
}
304304

305305
async decryptPendingMessages() {
306-
await Messages.state.updateAsync(
306+
await Messages.store.updateAsync(
307307
(record) => record.rid === this.roomId && record.t === 'e2e' && record.e2e === 'pending',
308308
(record) => this.decryptMessage(record),
309309
);

apps/meteor/app/e2e/client/rocketchat.e2e.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -716,7 +716,7 @@ class E2E extends Emitter {
716716
}
717717

718718
async decryptPendingMessages(): Promise<void> {
719-
await Messages.state.updateAsync(
719+
await Messages.store.updateAsync(
720720
(record) => record.t === 'e2e' && record.e2e === 'pending',
721721
(record) => this.decryptMessage(record),
722722
);

apps/meteor/app/models/client/models/CachedChatRoom.ts

Lines changed: 51 additions & 119 deletions
Original file line numberDiff line numberDiff line change
@@ -25,125 +25,57 @@ class CachedChatRoom extends PrivateCachedCollection<IRoom> {
2525
}
2626

2727
private mergeWithSubscription(room: IRoom): IRoom {
28-
const sub = CachedChatSubscription.collection.state.find((record) => record.rid === room._id);
29-
if (!sub) {
30-
return room;
31-
}
32-
33-
CachedChatSubscription.collection.update(sub._id, {
34-
...sub,
35-
encrypted: room.encrypted,
36-
description: room.description,
37-
cl: room.cl,
38-
topic: room.topic,
39-
announcement: room.announcement,
40-
broadcast: room.broadcast,
41-
archived: room.archived,
42-
avatarETag: room.avatarETag,
43-
retention: (room as IRoomWithRetentionPolicy | undefined)?.retention,
44-
uids: room.uids,
45-
usernames: room.usernames,
46-
usersCount: room.usersCount,
47-
lastMessage: room.lastMessage,
48-
teamId: room.teamId,
49-
teamMain: room.teamMain,
50-
v: (room as IOmnichannelRoom | undefined)?.v,
51-
transcriptRequest: (room as IOmnichannelRoom | undefined)?.transcriptRequest,
52-
servedBy: (room as IOmnichannelRoom | undefined)?.servedBy,
53-
onHold: (room as IOmnichannelRoom | undefined)?.onHold,
54-
tags: (room as IOmnichannelRoom | undefined)?.tags,
55-
closedAt: (room as IOmnichannelRoom | undefined)?.closedAt,
56-
metrics: (room as IOmnichannelRoom | undefined)?.metrics,
57-
muted: room.muted,
58-
waitingResponse: (room as IOmnichannelRoom | undefined)?.waitingResponse,
59-
responseBy: (room as IOmnichannelRoom | undefined)?.responseBy,
60-
priorityId: (room as IOmnichannelRoom | undefined)?.priorityId,
61-
priorityWeight: (room as IOmnichannelRoom | undefined)?.priorityWeight || LivechatPriorityWeight.NOT_SPECIFIED,
62-
estimatedWaitingTimeQueue:
63-
(room as IOmnichannelRoom | undefined)?.estimatedWaitingTimeQueue || DEFAULT_SLA_CONFIG.ESTIMATED_WAITING_TIME_QUEUE,
64-
slaId: (room as IOmnichannelRoom | undefined)?.slaId,
65-
livechatData: (room as IOmnichannelRoom | undefined)?.livechatData,
66-
departmentId: (room as IOmnichannelRoom | undefined)?.departmentId,
67-
ts: room.ts ?? sub.ts,
68-
source: (room as IOmnichannelRoom | undefined)?.source,
69-
queuedAt: (room as IOmnichannelRoom | undefined)?.queuedAt,
70-
federated: room.federated,
71-
...(() => {
72-
const name = room.name || sub.name;
73-
const fname = room.fname || sub.fname || name;
74-
return {
75-
lowerCaseName: String(!room.prid ? name : fname).toLowerCase(),
76-
lowerCaseFName: String(fname).toLowerCase(),
77-
};
78-
})(),
79-
lm: (sub.lm?.getTime() ?? -1) < (room.lm?.getTime() ?? -1) ? room.lm : sub.lm,
80-
});
81-
82-
// CachedChatSubscription.collection.update(
83-
// {
84-
// rid: room._id,
85-
// },
86-
// {
87-
// $set: {
88-
// encrypted: room.encrypted,
89-
// description: room.description,
90-
// cl: room.cl,
91-
// topic: room.topic,
92-
// announcement: room.announcement,
93-
// broadcast: room.broadcast,
94-
// archived: room.archived,
95-
// avatarETag: room.avatarETag,
96-
// retention: (room as IRoomWithRetentionPolicy | undefined)?.retention,
97-
// uids: room.uids,
98-
// usernames: room.usernames,
99-
// usersCount: room.usersCount,
100-
// lastMessage: room.lastMessage,
101-
// teamId: room.teamId,
102-
// teamMain: room.teamMain,
103-
// v: (room as IOmnichannelRoom | undefined)?.v,
104-
// transcriptRequest: (room as IOmnichannelRoom | undefined)?.transcriptRequest,
105-
// servedBy: (room as IOmnichannelRoom | undefined)?.servedBy,
106-
// onHold: (room as IOmnichannelRoom | undefined)?.onHold,
107-
// tags: (room as IOmnichannelRoom | undefined)?.tags,
108-
// closedAt: (room as IOmnichannelRoom | undefined)?.closedAt,
109-
// metrics: (room as IOmnichannelRoom | undefined)?.metrics,
110-
// muted: room.muted,
111-
// waitingResponse: (room as IOmnichannelRoom | undefined)?.waitingResponse,
112-
// responseBy: (room as IOmnichannelRoom | undefined)?.responseBy,
113-
// priorityId: (room as IOmnichannelRoom | undefined)?.priorityId,
114-
// priorityWeight: (room as IOmnichannelRoom | undefined)?.priorityWeight || LivechatPriorityWeight.NOT_SPECIFIED,
115-
// estimatedWaitingTimeQueue:
116-
// (room as IOmnichannelRoom | undefined)?.estimatedWaitingTimeQueue || DEFAULT_SLA_CONFIG.ESTIMATED_WAITING_TIME_QUEUE,
117-
// slaId: (room as IOmnichannelRoom | undefined)?.slaId,
118-
// livechatData: (room as IOmnichannelRoom | undefined)?.livechatData,
119-
// departmentId: (room as IOmnichannelRoom | undefined)?.departmentId,
120-
// ts: room.ts,
121-
// source: (room as IOmnichannelRoom | undefined)?.source,
122-
// queuedAt: (room as IOmnichannelRoom | undefined)?.queuedAt,
123-
// federated: room.federated,
124-
// ...(() => {
125-
// const name = room.name || sub.name;
126-
// const fname = room.fname || sub.fname || name;
127-
// return {
128-
// lowerCaseName: String(!room.prid ? name : fname).toLowerCase(),
129-
// lowerCaseFName: String(fname).toLowerCase(),
130-
// };
131-
// })(),
132-
// },
133-
// },
134-
// );
135-
136-
// CachedChatSubscription.collection.update(
137-
// {
138-
// rid: room._id,
139-
// lm: { $lt: room.lm },
140-
// },
141-
// {
142-
// $set: {
143-
// lm: room.lm,
144-
// },
145-
// },
146-
// );
28+
CachedChatSubscription.collection.store.update(
29+
(record) => record.rid === room._id,
30+
(sub) => ({
31+
...sub,
32+
encrypted: room.encrypted,
33+
description: room.description,
34+
cl: room.cl,
35+
topic: room.topic,
36+
announcement: room.announcement,
37+
broadcast: room.broadcast,
38+
archived: room.archived,
39+
avatarETag: room.avatarETag,
40+
retention: (room as IRoomWithRetentionPolicy | undefined)?.retention,
41+
uids: room.uids,
42+
usernames: room.usernames,
43+
usersCount: room.usersCount,
44+
lastMessage: room.lastMessage,
45+
teamId: room.teamId,
46+
teamMain: room.teamMain,
47+
v: (room as IOmnichannelRoom | undefined)?.v,
48+
transcriptRequest: (room as IOmnichannelRoom | undefined)?.transcriptRequest,
49+
servedBy: (room as IOmnichannelRoom | undefined)?.servedBy,
50+
onHold: (room as IOmnichannelRoom | undefined)?.onHold,
51+
tags: (room as IOmnichannelRoom | undefined)?.tags,
52+
closedAt: (room as IOmnichannelRoom | undefined)?.closedAt,
53+
metrics: (room as IOmnichannelRoom | undefined)?.metrics,
54+
muted: room.muted,
55+
waitingResponse: (room as IOmnichannelRoom | undefined)?.waitingResponse,
56+
responseBy: (room as IOmnichannelRoom | undefined)?.responseBy,
57+
priorityId: (room as IOmnichannelRoom | undefined)?.priorityId,
58+
priorityWeight: (room as IOmnichannelRoom | undefined)?.priorityWeight || LivechatPriorityWeight.NOT_SPECIFIED,
59+
estimatedWaitingTimeQueue:
60+
(room as IOmnichannelRoom | undefined)?.estimatedWaitingTimeQueue || DEFAULT_SLA_CONFIG.ESTIMATED_WAITING_TIME_QUEUE,
61+
slaId: (room as IOmnichannelRoom | undefined)?.slaId,
62+
livechatData: (room as IOmnichannelRoom | undefined)?.livechatData,
63+
departmentId: (room as IOmnichannelRoom | undefined)?.departmentId,
64+
ts: room.ts ?? sub.ts,
65+
source: (room as IOmnichannelRoom | undefined)?.source,
66+
queuedAt: (room as IOmnichannelRoom | undefined)?.queuedAt,
67+
federated: room.federated,
68+
...(() => {
69+
const name = room.name || sub.name;
70+
const fname = room.fname || sub.fname || name;
71+
return {
72+
lowerCaseName: String(!room.prid ? name : fname).toLowerCase(),
73+
lowerCaseFName: String(fname).toLowerCase(),
74+
};
75+
})(),
76+
lm: (sub.lm?.getTime() ?? -1) < (room.lm?.getTime() ?? -1) ? room.lm : sub.lm,
77+
}),
78+
);
14779

14880
return room;
14981
}

apps/meteor/app/models/client/models/CachedChatSubscription.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ class CachedChatSubscription extends PrivateCachedCollection<SubscriptionWithRoo
3333
}
3434

3535
private mergeWithRoom(subscription: ISubscription): SubscriptionWithRoom {
36-
const room = CachedChatRoom.collection.state.find((record) => record._id === subscription.rid);
36+
const room = CachedChatRoom.collection.store.find((record) => record._id === subscription.rid);
3737

3838
const lastRoomUpdate = room?.lm || subscription.ts || room?.ts;
3939

apps/meteor/app/ui-utils/client/lib/RoomHistoryManager.ts

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ import { getUserPreference } from '../../../utils/client';
1515

1616
const waitAfterFlush = () => new Promise((resolve) => Tracker.afterFlush(() => resolve(void 0)));
1717

18-
export async function upsertMessage({ msg, subscription }: { msg: IMessage & { ignored?: boolean }; subscription?: ISubscription }) {
18+
const processMessage = async (msg: IMessage & { ignored?: boolean }, { subscription }: { subscription?: ISubscription }) => {
1919
const userId = msg.u?._id;
2020

2121
if (subscription?.ignored?.includes(userId)) {
@@ -25,19 +25,23 @@ export async function upsertMessage({ msg, subscription }: { msg: IMessage & { i
2525
if (msg.t === 'e2e' && !msg.file) {
2626
msg.e2e = 'pending';
2727
}
28-
msg = (await onClientMessageReceived(msg)) || msg;
2928

30-
const { _id } = msg;
29+
return (await onClientMessageReceived(msg)) || msg;
30+
};
3131

32-
return Messages.upsert({ _id }, msg);
32+
export async function upsertMessage({ msg, subscription }: { msg: IMessage & { ignored?: boolean }; subscription?: ISubscription }) {
33+
Messages.store.store(await processMessage(msg, { subscription }));
3334
}
3435

35-
export async function upsertMessageBulk({ msgs, subscription }: { msgs: IMessage[]; subscription?: ISubscription }) {
36-
await Messages.bulkMutate(async () => {
37-
for await (const msg of msgs) {
38-
await upsertMessage({ msg, subscription });
39-
}
40-
});
36+
export async function upsertMessageBulk({
37+
msgs,
38+
subscription,
39+
}: {
40+
msgs: (IMessage & { ignored?: boolean })[];
41+
subscription?: ISubscription;
42+
}) {
43+
const processedMsgs = await Promise.all(msgs.map(async (msg) => processMessage(msg, { subscription })));
44+
Messages.store.storeMany(processedMsgs);
4145
}
4246

4347
const defaultLimit = parseInt(getConfig('roomListLimit') ?? '50') || 50;

apps/meteor/client/lib/cachedCollections/CachedCollection.ts

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -109,7 +109,7 @@ export abstract class CachedCollection<T extends IRocketChatRecord, U = T> {
109109
this.updatedAt = new Date(updatedAt);
110110
}
111111

112-
this.collection.state.replaceAll(deserializedRecords.filter(hasId), { recomputeQueries: true });
112+
this.collection.store.replaceAll(deserializedRecords.filter(hasId));
113113

114114
this.updatedAt = data.updatedAt || this.updatedAt;
115115

@@ -155,7 +155,7 @@ export abstract class CachedCollection<T extends IRocketChatRecord, U = T> {
155155
}
156156
});
157157

158-
this.collection.state.storeMany(newRecords, { recomputeQueries: true });
158+
this.collection.store.storeMany(newRecords);
159159
this.updatedAt = this.updatedAt === lastTime ? startTime : this.updatedAt;
160160
}
161161

@@ -178,7 +178,7 @@ export abstract class CachedCollection<T extends IRocketChatRecord, U = T> {
178178

179179
private save = withDebouncing({ wait: 1000 })(async () => {
180180
this.log('saving cache');
181-
const data = this.collection.state.records;
181+
const data = this.collection.store.records;
182182
await localforage.setItem(this.name, {
183183
updatedAt: this.updatedAt,
184184
version: this.version,
@@ -193,7 +193,7 @@ export abstract class CachedCollection<T extends IRocketChatRecord, U = T> {
193193
protected async clearCache() {
194194
this.log('clearing cache');
195195
await localforage.removeItem(this.name);
196-
this.collection.state.replaceAll([], { recomputeQueries: true });
196+
this.collection.store.replaceAll([]);
197197
}
198198

199199
protected async setupListener() {
@@ -211,11 +211,11 @@ export abstract class CachedCollection<T extends IRocketChatRecord, U = T> {
211211
}
212212

213213
if (action === 'removed') {
214-
this.collection.state.delete(newRecord, { recomputeQueries: true });
214+
this.collection.store.delete(newRecord);
215215
} else {
216216
const { _id } = newRecord;
217217
if (!_id) return;
218-
this.collection.state.store(newRecord, { recomputeQueries: true });
218+
this.collection.store.store(newRecord);
219219
}
220220
await this.save();
221221
}
@@ -257,7 +257,7 @@ export abstract class CachedCollection<T extends IRocketChatRecord, U = T> {
257257
const actionTime = hasUpdatedAt(newRecord) ? newRecord._updatedAt : startTime;
258258
changes.push({
259259
action: () => {
260-
this.collection.state.store(newRecord, { recomputeQueries: true });
260+
this.collection.store.store(newRecord);
261261
if (actionTime > this.updatedAt) {
262262
this.updatedAt = actionTime;
263263
}
@@ -280,7 +280,7 @@ export abstract class CachedCollection<T extends IRocketChatRecord, U = T> {
280280
const actionTime = newRecord._deletedAt;
281281
changes.push({
282282
action: () => {
283-
this.collection.state.delete(newRecord, { recomputeQueries: true });
283+
this.collection.store.delete(newRecord);
284284
if (actionTime > this.updatedAt) {
285285
this.updatedAt = actionTime;
286286
}

apps/meteor/client/lib/cachedCollections/IDocumentMapStore.ts renamed to apps/meteor/client/lib/cachedCollections/DocumentMapStore.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,10 @@ export interface IDocumentMapStore<T extends { _id: string }> {
66
find(predicate: (record: T) => boolean): T | undefined;
77
filter<U extends T>(predicate: (record: T) => record is U): U[];
88
filter(predicate: (record: T) => boolean): T[];
9-
replaceAll(records: T[], options: { recomputeQueries: boolean }): void;
10-
store(doc: T, options: { recomputeQueries: boolean }): void;
11-
storeMany(docs: T[], options: { recomputeQueries: boolean }): void;
12-
delete(doc: T, options: { recomputeQueries: boolean }): void;
9+
replaceAll(records: T[]): void;
10+
store(doc: T): void;
11+
storeMany(docs: Iterable<T>): void;
12+
delete(doc: T): void;
1313
update<U extends T>(predicate: (record: T) => record is U, modifier: (record: U) => U): void;
1414
update(predicate: (record: T) => boolean, modifier: (record: T) => T): void;
1515
updateAsync<U extends T>(predicate: (record: T) => record is U, modifier: (record: U) => Promise<U>): Promise<void>;

0 commit comments

Comments
 (0)