@@ -3,6 +3,7 @@ import type {
3
3
AppSettingsAPIResponse ,
4
4
ChannelAPIResponse ,
5
5
ChannelFilters ,
6
+ ChannelMemberResponse ,
6
7
ChannelResponse ,
7
8
ChannelSort ,
8
9
Event ,
@@ -75,12 +76,23 @@ export type UpsertMessagesType = {
75
76
flush ?: boolean ;
76
77
} ;
77
78
79
+ export type UpsertMembersType = {
80
+ cid : string ;
81
+ members : ChannelMemberResponse [ ] ;
82
+ flush ?: boolean ;
83
+ } ;
84
+
78
85
export type UpdateReactionType = {
79
86
message : MessageResponse | LocalMessage ;
80
87
reaction : ReactionResponse ;
81
88
flush ?: boolean ;
82
89
} ;
83
90
91
+ export type UpdateMessageType = {
92
+ message : MessageResponse | LocalMessage ;
93
+ flush ?: boolean ;
94
+ } ;
95
+
84
96
export type GetChannelsType = {
85
97
cids : string [ ] ;
86
98
userId : string ;
@@ -117,6 +129,12 @@ export type DeleteReactionType = {
117
129
flush ?: boolean ;
118
130
} ;
119
131
132
+ export type DeleteMemberType = {
133
+ cid : string ;
134
+ member : ChannelMemberResponse ;
135
+ flush ?: boolean ;
136
+ } ;
137
+
120
138
export type DeleteMessageType = { id : string ; flush ?: boolean } ;
121
139
122
140
export type ChannelExistsType = { cid : string } ;
@@ -137,7 +155,9 @@ export interface OfflineDBApi {
137
155
upsertChannelData : ( options : UpsertChannelDataType ) => Promise < ExecuteBatchQueriesType > ;
138
156
upsertReads : ( options : UpsertReadsType ) => Promise < ExecuteBatchQueriesType > ;
139
157
upsertMessages : ( options : UpsertMessagesType ) => Promise < ExecuteBatchQueriesType > ;
158
+ upsertMembers : ( options : UpsertMembersType ) => Promise < ExecuteBatchQueriesType > ;
140
159
updateReaction : ( options : UpdateReactionType ) => Promise < ExecuteBatchQueriesType > ;
160
+ updateMessage : ( options : UpdateMessageType ) => Promise < ExecuteBatchQueriesType > ;
141
161
getChannels : ( options : GetChannelsType ) => Promise < unknown > ;
142
162
getChannelsForQuery : (
143
163
options : GetChannelsForQueryType ,
@@ -151,6 +171,7 @@ export interface OfflineDBApi {
151
171
getPendingTasks : ( conditions ?: GetPendingTasksType ) => Promise < PendingTask [ ] > ;
152
172
deletePendingTask : ( options : DeletePendingTaskType ) => Promise < ExecuteBatchQueriesType > ;
153
173
deleteReaction : ( options : DeleteReactionType ) => Promise < ExecuteBatchQueriesType > ;
174
+ deleteMember : ( options : DeleteMemberType ) => Promise < ExecuteBatchQueriesType > ;
154
175
hardDeleteMessage : ( options : DeleteMessageType ) => Promise < ExecuteBatchQueriesType > ;
155
176
softDeleteMessage : ( options : DeleteMessageType ) => Promise < ExecuteBatchQueriesType > ;
156
177
resetDB : ( ) => Promise < unknown > ;
@@ -184,8 +205,12 @@ export abstract class AbstractOfflineDB implements OfflineDBApi {
184
205
185
206
abstract upsertMessages : OfflineDBApi [ 'upsertMessages' ] ;
186
207
208
+ abstract upsertMembers : OfflineDBApi [ 'upsertMembers' ] ;
209
+
187
210
abstract updateReaction : OfflineDBApi [ 'updateReaction' ] ;
188
211
212
+ abstract updateMessage : OfflineDBApi [ 'updateMessage' ] ;
213
+
189
214
abstract getChannels : OfflineDBApi [ 'getChannels' ] ;
190
215
191
216
abstract getChannelsForQuery : OfflineDBApi [ 'getChannelsForQuery' ] ;
@@ -208,6 +233,8 @@ export abstract class AbstractOfflineDB implements OfflineDBApi {
208
233
209
234
abstract deleteReaction : OfflineDBApi [ 'deleteReaction' ] ;
210
235
236
+ abstract deleteMember : OfflineDBApi [ 'deleteMember' ] ;
237
+
211
238
abstract hardDeleteMessage : OfflineDBApi [ 'hardDeleteMessage' ] ;
212
239
213
240
abstract softDeleteMessage : OfflineDBApi [ 'softDeleteMessage' ] ;
@@ -378,6 +405,55 @@ export abstract class AbstractOfflineDB implements OfflineDBApi {
378
405
return [ ] ;
379
406
} ;
380
407
408
+ public handleMemberEvent = async ( {
409
+ event,
410
+ flush = true ,
411
+ } : {
412
+ event : Event ;
413
+ flush ?: boolean ;
414
+ } ) => {
415
+ const { member, cid, type } = event ;
416
+
417
+ if ( member && cid ) {
418
+ return await this . queriesWithChannelGuard (
419
+ { event, flush } ,
420
+ async ( flushOverride ) => {
421
+ if ( type === 'member.removed' ) {
422
+ return await this . deleteMember ( { member, cid, flush : flushOverride } ) ;
423
+ }
424
+
425
+ return await this . upsertMembers ( {
426
+ cid,
427
+ members : [ member ] ,
428
+ flush : flushOverride ,
429
+ } ) ;
430
+ } ,
431
+ ) ;
432
+ }
433
+
434
+ return [ ] ;
435
+ } ;
436
+
437
+ public handleMessageUpdatedEvent = async ( {
438
+ event,
439
+ flush = true ,
440
+ } : {
441
+ event : Event ;
442
+ flush ?: boolean ;
443
+ } ) => {
444
+ const { message } = event ;
445
+
446
+ if ( message && ! message . parent_id ) {
447
+ return await this . queriesWithChannelGuard (
448
+ { event, flush } ,
449
+ async ( flushOverride ) =>
450
+ await this . updateMessage ( { message, flush : flushOverride } ) ,
451
+ ) ;
452
+ }
453
+
454
+ return [ ] ;
455
+ } ;
456
+
381
457
public queueTask = async ( { task } : { task : PendingTask } ) => {
382
458
let response ;
383
459
try {
@@ -638,6 +714,14 @@ export class OfflineDBSyncManager {
638
714
return await this . offlineDb . handleDeleteMessage ( { event, flush } ) ;
639
715
}
640
716
717
+ if ( type === 'message.updated' ) {
718
+ return this . offlineDb . handleMessageUpdatedEvent ( { event, flush } ) ;
719
+ }
720
+
721
+ if ( type . startsWith ( 'member.' ) ) {
722
+ return await this . offlineDb . handleMemberEvent ( { event, flush } ) ;
723
+ }
724
+
641
725
return [ ] ;
642
726
} ;
643
727
0 commit comments