@@ -16,14 +16,16 @@ limitations under the License.
16
16
17
17
import { Room } from "matrix-js-sdk/src/models/room" ;
18
18
import { sleep } from "matrix-js-sdk/src/utils" ;
19
+ import { EventStatus } from "matrix-js-sdk/src/models/event" ;
19
20
20
21
import { MatrixClientPeg } from "../MatrixClientPeg" ;
21
22
import { _t } from "../languageHandler" ;
22
- import Modal from "../Modal" ;
23
+ import Modal , { IHandle } from "../Modal" ;
23
24
import ErrorDialog from "../components/views/dialogs/ErrorDialog" ;
24
25
import React from "react" ;
25
26
import dis from "../dispatcher/dispatcher" ;
26
27
import RoomViewStore from "../stores/RoomViewStore" ;
28
+ import Spinner from "../components/views/elements/Spinner" ;
27
29
28
30
/**
29
31
* Approximation of a membership status for a given room.
@@ -85,7 +87,12 @@ export function isJoinedOrNearlyJoined(membership: string): boolean {
85
87
return effective === EffectiveMembership . Join || effective === EffectiveMembership . Invite ;
86
88
}
87
89
88
- export async function leaveRoomBehaviour ( roomId : string , retry = true ) {
90
+ export async function leaveRoomBehaviour ( roomId : string , retry = true , spinner = true ) {
91
+ let spinnerModal : IHandle < any > ;
92
+ if ( spinner ) {
93
+ spinnerModal = Modal . createDialog ( Spinner , null , 'mx_Dialog_spinner' ) ;
94
+ }
95
+
89
96
const cli = MatrixClientPeg . get ( ) ;
90
97
let leavingAllVersions = true ;
91
98
const history = cli . getRoomUpgradeHistory ( roomId ) ;
@@ -98,6 +105,26 @@ export async function leaveRoomBehaviour(roomId: string, retry = true) {
98
105
}
99
106
}
100
107
108
+ const room = cli . getRoom ( roomId ) ;
109
+ // await any queued messages being sent so that they do not fail
110
+ await Promise . all ( room . getPendingEvents ( ) . filter ( ev => {
111
+ return [ EventStatus . QUEUED , EventStatus . ENCRYPTING , EventStatus . SENDING ] . includes ( ev . status ) ;
112
+ } ) . map ( ev => new Promise < void > ( ( resolve , reject ) => {
113
+ const handler = ( ) => {
114
+ if ( ev . status === EventStatus . NOT_SENT ) {
115
+ spinnerModal ?. close ( ) ;
116
+ reject ( ev . error ) ;
117
+ }
118
+
119
+ if ( ! ev . status || ev . status === EventStatus . SENT ) {
120
+ ev . off ( "Event.status" , handler ) ;
121
+ resolve ( ) ;
122
+ }
123
+ } ;
124
+
125
+ ev . on ( "Event.status" , handler ) ;
126
+ } ) ) ) ;
127
+
101
128
let results : { [ roomId : string ] : Error & { errcode ?: string , message : string , data ?: Record < string , any > } } = { } ;
102
129
if ( ! leavingAllVersions ) {
103
130
try {
@@ -118,10 +145,12 @@ export async function leaveRoomBehaviour(roomId: string, retry = true) {
118
145
const limitExceededError = Object . values ( results ) . find ( e => e ?. errcode === "M_LIMIT_EXCEEDED" ) ;
119
146
if ( limitExceededError ) {
120
147
await sleep ( limitExceededError . data . retry_after_ms ?? 100 ) ;
121
- return leaveRoomBehaviour ( roomId , false ) ;
148
+ return leaveRoomBehaviour ( roomId , false , false ) ;
122
149
}
123
150
}
124
151
152
+ spinnerModal ?. close ( ) ;
153
+
125
154
const errors = Object . entries ( results ) . filter ( r => ! ! r [ 1 ] ) ;
126
155
if ( errors . length > 0 ) {
127
156
const messages = [ ] ;
0 commit comments