@@ -8,6 +8,7 @@ import type {
8
8
ChannelSort ,
9
9
Event ,
10
10
LocalMessage ,
11
+ Message ,
11
12
MessageResponse ,
12
13
PollResponse ,
13
14
ReactionFilters ,
@@ -623,7 +624,10 @@ export abstract class AbstractOfflineDB implements OfflineDBApi {
623
624
return response ;
624
625
} ;
625
626
626
- private executeTask = async ( { task } : { task : PendingTask } ) => {
627
+ private executeTask = async (
628
+ { task } : { task : PendingTask } ,
629
+ isPendingTask = false ,
630
+ ) => {
627
631
if ( task . type === 'delete-message' ) {
628
632
return await this . client . _deleteMessage ( ...task . payload ) ;
629
633
}
@@ -632,6 +636,7 @@ export abstract class AbstractOfflineDB implements OfflineDBApi {
632
636
633
637
if ( channelType && channelId ) {
634
638
const channel = this . client . channel ( channelType , channelId ) ;
639
+ // TODO: Think about this a bit better. Do we really need to watch or is it okay if we don't ?
635
640
if ( ! channel . initialized ) {
636
641
await channel . watch ( ) ;
637
642
}
@@ -643,6 +648,14 @@ export abstract class AbstractOfflineDB implements OfflineDBApi {
643
648
if ( task . type === 'delete-reaction' ) {
644
649
return await channel . _deleteReaction ( ...task . payload ) ;
645
650
}
651
+
652
+ if ( task . type === 'send-message' ) {
653
+ const newMessage = await channel . _sendMessage ( ...task . payload ) ;
654
+ if ( isPendingTask ) {
655
+ channel . state . addMessageSorted ( newMessage . message , true ) ;
656
+ }
657
+ return newMessage ;
658
+ }
646
659
}
647
660
648
661
throw new Error ( 'Invalid task type' ) ;
@@ -651,15 +664,17 @@ export abstract class AbstractOfflineDB implements OfflineDBApi {
651
664
public executePendingTasks = async ( ) => {
652
665
const queue = await this . getPendingTasks ( ) ;
653
666
for ( const task of queue ) {
654
- console . log ( '[OFFLINE]: ' , task ) ;
655
667
if ( ! task . id ) {
656
668
continue ;
657
669
}
658
670
659
671
try {
660
- await this . executeTask ( {
661
- task,
662
- } ) ;
672
+ await this . executeTask (
673
+ {
674
+ task,
675
+ } ,
676
+ true ,
677
+ ) ;
663
678
} catch ( e ) {
664
679
const error = e as AxiosError < APIErrorResponse > ;
665
680
if ( error ?. response ?. data ?. code === 4 ) {
@@ -701,6 +716,7 @@ export type PendingTaskTypes = {
701
716
deleteMessage : 'delete-message' ;
702
717
deleteReaction : 'delete-reaction' ;
703
718
sendReaction : 'send-reaction' ;
719
+ sendMessage : 'send-message' ;
704
720
} ;
705
721
706
722
// TODO: Please rethink the definition of PendingTasks as it seems awkward
@@ -722,8 +738,16 @@ export type PendingTask = {
722
738
payload : Parameters < Channel [ 'deleteReaction' ] > ;
723
739
type : PendingTaskTypes [ 'deleteReaction' ] ;
724
740
}
741
+ | {
742
+ payload : Parameters < Channel [ 'sendMessage' ] > ;
743
+ type : PendingTaskTypes [ 'sendMessage' ] ;
744
+ }
725
745
) ;
726
746
747
+ export type PendingTaskExtraData = {
748
+ message ?: Message ;
749
+ } ;
750
+
727
751
/**
728
752
* DBSyncManager has the responsibility to sync the channel states
729
753
* within local database whenever possible.
0 commit comments