Skip to content

Commit bc50cae

Browse files
committed
feat(multiverse): Add support to join rooms you've been invited to
1 parent d36b2a6 commit bc50cae

File tree

6 files changed

+554
-164
lines changed

6 files changed

+554
-164
lines changed

Cargo.lock

Lines changed: 64 additions & 17 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

crates/matrix-sdk/src/room/mod.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2964,6 +2964,7 @@ impl Room {
29642964
/// this room.
29652965
pub async fn invite_details(&self) -> Result<Invite> {
29662966
let state = self.state();
2967+
29672968
if state != RoomState::Invited {
29682969
return Err(Error::WrongRoomState(Box::new(WrongRoomState::new("Invited", state))));
29692970
}

labs/multiverse/Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ matrix-sdk-ui = { path = "../../crates/matrix-sdk-ui" }
2323
ratatui = { version = "0.29.0", features = ["unstable-widget-ref"] }
2424
throbber-widgets-tui = "0.8.0"
2525
tui-textarea = "0.7.0"
26+
tui-framework-experiment = "0.4.0"
2627
rpassword = "7.3.1"
2728
serde_json = { workspace = true }
2829
strum = { version = "0.27.1", features = ["derive"] }

labs/multiverse/src/main.rs

Lines changed: 60 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,12 @@ use std::{
88

99
use clap::Parser;
1010
use color_eyre::Result;
11-
use crossterm::event::{self, Event, KeyCode, KeyEvent, KeyEventKind, KeyModifiers};
11+
use crossterm::{
12+
event::{
13+
self, DisableMouseCapture, EnableMouseCapture, Event, KeyCode, KeyEvent, KeyModifiers,
14+
},
15+
execute,
16+
};
1217
use futures_util::{pin_mut, StreamExt as _};
1318
use imbl::Vector;
1419
use layout::Flex;
@@ -110,6 +115,7 @@ async fn main() -> Result<()> {
110115
event_cache.enable_storage()?;
111116

112117
let terminal = ratatui::init();
118+
execute!(stdout(), EnableMouseCapture)?;
113119
let mut app = App::new(client).await?;
114120

115121
app.run(terminal).await
@@ -315,37 +321,46 @@ impl App {
315321
self.state.global_mode = mode;
316322
}
317323

318-
async fn handle_global_key_press(&mut self, key: KeyEvent) -> Result<bool> {
324+
async fn handle_global_event(&mut self, event: Event) -> Result<bool> {
319325
use KeyCode::*;
320326

321-
match (key.modifiers, key.code) {
322-
(KeyModifiers::NONE, F(1)) => self.set_global_mode(GlobalMode::Help),
327+
match event {
328+
Event::Key(KeyEvent { code: F(1), modifiers: KeyModifiers::NONE, .. }) => {
329+
self.set_global_mode(GlobalMode::Help)
330+
}
323331

324-
(KeyModifiers::NONE, F(10)) => self.set_global_mode(GlobalMode::Settings {
325-
view: SettingsView::new(self.client.clone(), self.sync_service.clone()),
326-
}),
332+
Event::Key(KeyEvent { code: F(10), modifiers: KeyModifiers::NONE, .. }) => self
333+
.set_global_mode(GlobalMode::Settings {
334+
view: SettingsView::new(self.client.clone(), self.sync_service.clone()),
335+
}),
327336

328-
(KeyModifiers::CONTROL, Char('j') | Down) => {
337+
Event::Key(KeyEvent {
338+
code: Char('j') | Down,
339+
modifiers: KeyModifiers::CONTROL,
340+
..
341+
}) => {
329342
self.room_list.next_room();
330343
let room_id = self.room_list.get_selected_room_id();
331344
self.room_view.set_selected_room(room_id);
332345
}
333346

334-
(KeyModifiers::CONTROL, Char('k') | Up) => {
347+
Event::Key(KeyEvent {
348+
code: Char('k') | Up, modifiers: KeyModifiers::CONTROL, ..
349+
}) => {
335350
self.room_list.previous_room();
336351
let room_id = self.room_list.get_selected_room_id();
337352
self.room_view.set_selected_room(room_id);
338353
}
339354

340-
(KeyModifiers::CONTROL, Char('q')) => {
355+
Event::Key(KeyEvent { code: Char('q'), modifiers: KeyModifiers::CONTROL, .. }) => {
341356
if !matches!(self.state.global_mode, GlobalMode::Default) {
342357
self.set_global_mode(GlobalMode::Default);
343358
} else {
344359
return Ok(true);
345360
}
346361
}
347362

348-
_ => self.room_view.handle_key_press(key).await,
363+
_ => self.room_view.handle_event(event).await,
349364
}
350365

351366
Ok(false)
@@ -369,43 +384,44 @@ impl App {
369384
terminal.draw(|f| f.render_widget(&mut *self, f.area()))?;
370385

371386
if event::poll(Duration::from_millis(100))? {
372-
if let Event::Key(key) = event::read()? {
373-
if key.kind == KeyEventKind::Press {
374-
match &mut self.state.global_mode {
375-
GlobalMode::Default => {
376-
if self.handle_global_key_press(key).await? {
377-
let sync_service = self.sync_service.clone();
378-
let timelines = self.timelines.clone();
379-
let listen_task = self.listen_task.abort_handle();
380-
381-
let shutdown_task = spawn(async move {
382-
sync_service.stop().await;
383-
384-
listen_task.abort();
385-
386-
for timeline in timelines.lock().values() {
387-
timeline.task.abort();
388-
}
389-
});
390-
391-
self.set_global_mode(GlobalMode::Exiting { shutdown_task });
392-
}
393-
}
394-
GlobalMode::Help => {
395-
if let (KeyModifiers::NONE, Char('q') | Esc) =
396-
(key.modifiers, key.code)
397-
{
398-
self.set_global_mode(GlobalMode::Default)
387+
let event = event::read()?;
388+
389+
match &mut self.state.global_mode {
390+
GlobalMode::Default => {
391+
if self.handle_global_event(event).await? {
392+
let sync_service = self.sync_service.clone();
393+
let timelines = self.timelines.clone();
394+
let listen_task = self.listen_task.abort_handle();
395+
396+
let shutdown_task = spawn(async move {
397+
sync_service.stop().await;
398+
399+
listen_task.abort();
400+
401+
for timeline in timelines.lock().values() {
402+
timeline.task.abort();
399403
}
404+
});
405+
406+
self.set_global_mode(GlobalMode::Exiting { shutdown_task });
407+
}
408+
}
409+
GlobalMode::Help => {
410+
if let Event::Key(key) = event {
411+
if let (KeyModifiers::NONE, Char('q') | Esc) = (key.modifiers, key.code)
412+
{
413+
self.set_global_mode(GlobalMode::Default)
400414
}
401-
GlobalMode::Settings { view } => {
402-
if view.handle_key_press(key).await {
403-
self.set_global_mode(GlobalMode::Default);
404-
}
415+
}
416+
}
417+
GlobalMode::Settings { view } => {
418+
if let Event::Key(key) = event {
419+
if view.handle_key_press(key).await {
420+
self.set_global_mode(GlobalMode::Default);
405421
}
406-
GlobalMode::Exiting { .. } => {}
407422
}
408423
}
424+
GlobalMode::Exiting { .. } => {}
409425
}
410426
}
411427

@@ -432,6 +448,7 @@ impl App {
432448

433449
// At this point the user has exited the loop, so shut down the application.
434450
ratatui::restore();
451+
execute!(stdout(), DisableMouseCapture)?;
435452

436453
Ok(())
437454
}

0 commit comments

Comments
 (0)