Skip to content

Commit 8cc3b0f

Browse files
committed
refactor(multiverse): Add a common method to execute commands on rooms
1 parent bf201e3 commit 8cc3b0f

File tree

1 file changed

+40
-37
lines changed
  • labs/multiverse/src/widgets/room_view

1 file changed

+40
-37
lines changed

labs/multiverse/src/widgets/room_view/mod.rs

Lines changed: 40 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ use matrix_sdk::{
1010
api::client::receipt::create_receipt::v3::ReceiptType,
1111
events::room::message::RoomMessageEventContent, OwnedRoomId, UserId,
1212
},
13-
RoomState,
13+
Room, RoomState,
1414
};
1515
use ratatui::{prelude::*, widgets::*};
1616
use tokio::{spawn, task::JoinHandle};
@@ -264,56 +264,59 @@ impl RoomView {
264264
};
265265
}
266266

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)) {
268270
let Some(room) = self
269271
.selected_room
270272
.as_deref()
271273
.and_then(|room_id| self.ui_rooms.lock().get(room_id).cloned())
272274
else {
273275
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());
275277
return;
276278
};
277279

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+
}
289282

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+
}
299306
}
300-
}
307+
})
308+
.await;
309+
310+
self.input.clear();
301311
}
302312

303313
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;
317320

318321
self.input.clear();
319322
}

0 commit comments

Comments
 (0)