@@ -5,6 +5,7 @@ import * as config from '../config';
55import { createTransformer } from 'mobx-utils' ;
66import { SnackReporter } from '../snack/SnackManager' ;
77import { IApplication , IMessage , IPagedMessages } from '../types' ;
8+ import { closeSnackbar , SnackbarKey } from 'notistack' ;
89
910const AllMessages = - 1 ;
1011
@@ -15,17 +16,27 @@ interface MessagesState {
1516 loaded : boolean ;
1617}
1718
19+ interface PendingDelete {
20+ key : SnackbarKey ;
21+ message : IMessage ;
22+ }
23+
1824export class MessagesStore {
1925 private state : Record < string , MessagesState > = { } ;
26+ private pendingDeletes : Map < number , PendingDelete > = observable . map ( ) ;
2027
2128 private loading = false ;
2229
2330 public constructor (
2431 private readonly appStore : BaseStore < IApplication > ,
2532 private readonly snack : SnackReporter
2633 ) {
27- makeObservable < MessagesStore , 'state' > ( this , {
34+ makeObservable < MessagesStore , 'state' | 'pendingDeletes' > ( this , {
2835 state : observable ,
36+ pendingDeletes : observable ,
37+ addPendingDelete : action ,
38+ executePendingDeletes : action ,
39+ cancelPendingDelete : action ,
2940 loadMore : action ,
3041 publishSingleMessage : action ,
3142 removeByApp : action ,
@@ -95,15 +106,39 @@ export class MessagesStore {
95106 await this . loadMore ( appId ) ;
96107 } ;
97108
109+ public addPendingDelete = ( pending : PendingDelete ) =>
110+ this . pendingDeletes . set ( pending . message . id , pending ) ;
111+
112+ public cancelPendingDelete = ( message : IMessage ) : boolean => {
113+ const pending = this . pendingDeletes . get ( message . id ) ;
114+ if ( pending ) {
115+ this . pendingDeletes . delete ( message . id ) ;
116+ closeSnackbar ( pending . key ) ;
117+ }
118+ return ! ! pending ;
119+ } ;
120+
121+ public executePendingDeletes = ( ) =>
122+ Array . from ( this . pendingDeletes . values ( ) ) . forEach ( ( { message} ) => this . removeSingle ( message ) ) ;
123+
124+ public visible = ( message : number ) : boolean => ! this . pendingDeletes . has ( message ) ;
125+
98126 public removeSingle = async ( message : IMessage ) => {
99- await axios . delete ( config . get ( 'url' ) + 'message/' + message . id ) ;
127+ if ( ! this . pendingDeletes . has ( message . id ) ) {
128+ return ;
129+ }
130+
131+ await axios . delete ( config . get ( 'url' ) + 'message/' + message . id , {
132+ adapter : 'fetch' ,
133+ fetchOptions : { keepalive : true } ,
134+ } ) ;
100135 if ( this . exists ( AllMessages ) ) {
101136 this . removeFromList ( this . state [ AllMessages ] . messages , message ) ;
102137 }
103138 if ( this . exists ( message . appid ) ) {
104139 this . removeFromList ( this . state [ message . appid ] . messages , message ) ;
105140 }
106- this . snack ( 'Message deleted' ) ;
141+ this . cancelPendingDelete ( message ) ;
107142 } ;
108143
109144 public sendMessage = async (
@@ -170,12 +205,9 @@ export class MessagesStore {
170205 . getItems ( )
171206 . reduce ( ( all , app ) => ( { ...all , [ app . id ] : app . image } ) , { } ) ;
172207
173- return this . stateOf ( appId , false ) . messages . map (
174- ( message : IMessage ) : IMessage => ( {
175- ...message ,
176- image : appToImage [ message . appid ] ,
177- } )
178- ) ;
208+ return this . stateOf ( appId , false )
209+ . messages . filter ( ( message ) => ! this . pendingDeletes . has ( message . id ) )
210+ . map ( ( message : IMessage ) : IMessage => ( { ...message , image : appToImage [ message . appid ] } ) ) ;
179211 } ;
180212
181213 public get = createTransformer ( this . getUnCached ) ;
0 commit comments