@@ -10,7 +10,7 @@ use matrix_sdk::{
10
10
api:: client:: receipt:: create_receipt:: v3:: ReceiptType ,
11
11
events:: room:: message:: RoomMessageEventContent , OwnedRoomId , UserId ,
12
12
} ,
13
- RoomState ,
13
+ Room , RoomState ,
14
14
} ;
15
15
use ratatui:: { prelude:: * , widgets:: * } ;
16
16
use tokio:: { spawn, task:: JoinHandle } ;
@@ -264,56 +264,59 @@ impl RoomView {
264
264
} ;
265
265
}
266
266
267
- async fn invite_member ( & mut self , user_id : & str ) {
267
+ /// Attempt to find the currently selected room and pass it to the async
268
+ /// callback.
269
+ async fn call_with_room ( & self , function : impl AsyncFnOnce ( Room , & StatusHandle ) ) {
268
270
let Some ( room) = self
269
271
. selected_room
270
272
. as_deref ( )
271
273
. and_then ( |room_id| self . ui_rooms . lock ( ) . get ( room_id) . cloned ( ) )
272
274
else {
273
275
self . status_handle
274
- . set_message ( format ! ( "Coulnd 't find the room object to invite {user_id}" ) ) ;
276
+ . set_message ( "Couldn 't find a room selected room to perform an action" . to_owned ( ) ) ;
275
277
return ;
276
278
} ;
277
279
278
- let user_id = match UserId :: parse_with_server_name (
279
- user_id,
280
- room. client ( ) . user_id ( ) . unwrap ( ) . server_name ( ) ,
281
- ) {
282
- Ok ( user_id) => user_id,
283
- Err ( e) => {
284
- self . status_handle
285
- . set_message ( format ! ( "Failed to parse {user_id} as a user ID: {e:?}" ) ) ;
286
- return ;
287
- }
288
- } ;
280
+ function ( room, & self . status_handle ) . await
281
+ }
289
282
290
- match room. invite_user_by_id ( & user_id) . await {
291
- Ok ( _) => {
292
- self . status_handle
293
- . set_message ( format ! ( "Successfully invited {user_id} to the room" ) ) ;
294
- self . input . clear ( ) ;
295
- }
296
- Err ( e) => {
297
- self . status_handle
298
- . set_message ( format ! ( "Failed to invite {user_id} to the room: {e:?}" ) ) ;
283
+ async fn invite_member ( & mut self , user_id : & str ) {
284
+ self . call_with_room ( async move |room, status_handle| {
285
+ let user_id = match UserId :: parse_with_server_name (
286
+ user_id,
287
+ room. client ( ) . user_id ( ) . unwrap ( ) . server_name ( ) ,
288
+ ) {
289
+ Ok ( user_id) => user_id,
290
+ Err ( e) => {
291
+ status_handle
292
+ . set_message ( format ! ( "Failed to parse {user_id} as a user ID: {e:?}" ) ) ;
293
+ return ;
294
+ }
295
+ } ;
296
+
297
+ match room. invite_user_by_id ( & user_id) . await {
298
+ Ok ( _) => {
299
+ status_handle
300
+ . set_message ( format ! ( "Successfully invited {user_id} to the room" ) ) ;
301
+ }
302
+ Err ( e) => {
303
+ status_handle
304
+ . set_message ( format ! ( "Failed to invite {user_id} to the room: {e:?}" ) ) ;
305
+ }
299
306
}
300
- }
307
+ } )
308
+ . await ;
309
+
310
+ self . input . clear ( ) ;
301
311
}
302
312
303
313
async fn leave_room ( & mut self ) {
304
- let Some ( room) = self
305
- . selected_room
306
- . as_deref ( )
307
- . and_then ( |room_id| self . ui_rooms . lock ( ) . get ( room_id) . cloned ( ) )
308
- else {
309
- self . status_handle
310
- . set_message ( format ! ( "Coulnd't find the room object to leave the room" ) ) ;
311
- return ;
312
- } ;
313
-
314
- let _ = room. leave ( ) . await . inspect_err ( |e| {
315
- self . status_handle . set_message ( format ! ( "Couldn't leave the room {e:?}" ) )
316
- } ) ;
314
+ self . call_with_room ( async |room, status_handle| {
315
+ let _ = room. leave ( ) . await . inspect_err ( |e| {
316
+ status_handle. set_message ( format ! ( "Couldn't leave the room {e:?}" ) )
317
+ } ) ;
318
+ } )
319
+ . await ;
317
320
318
321
self . input . clear ( ) ;
319
322
}
0 commit comments