refactor(multiverse): Simplify the selected read receipt rendering

This patch simplifies the selected read receipt rendering by the fact
that we can simply fetch the selected timeline item instead of the event
ID and then do a search for the selected item.

Co-authored-by: Benjamin Bouvier <benjamin@bouvier.cc>
Signed-off-by: Damir Jelić <poljar@termina.org.uk>
This commit is contained in:
Damir Jelić
2025-06-12 13:57:01 +02:00
parent 2a78b5b67a
commit a955af61e1
2 changed files with 18 additions and 55 deletions
@@ -1,4 +1,4 @@
use matrix_sdk::{ruma::EventId, Room};
use matrix_sdk::Room;
use matrix_sdk_base::read_receipts::RoomReadReceipts;
use matrix_sdk_ui::timeline::TimelineItem;
use ratatui::{
@@ -38,31 +38,16 @@ fn render_room_stats(room: &Room, area: Rect, buf: &mut Buffer) {
.render(area, buf);
}
fn find_selected_event(item: &TimelineItem, selected_event: &EventId) -> bool {
match item.as_event() {
Some(event) => event.event_id() == Some(selected_event),
None => false,
}
}
impl Widget for &mut ReadReceipts<'_> {
fn render(self, area: Rect, buf: &mut Buffer)
where
Self: Sized,
{
match self.state.selected_room {
Some(room) => match (self.state.timeline_items, self.state.selected_event.as_deref()) {
(None, None) | (None, Some(_)) | (Some(_), None) => {
render_room_stats(room, area, buf)
}
(Some(items), Some(selected_event)) => {
let item =
items.into_iter().find(|&item| find_selected_event(item, selected_event));
if let Some(item) = item.and_then(|i| format_timeline_item(i)) {
let second_item = ListItem::from(selected_event.to_string());
let list = List::new(vec![second_item, item])
if let Some(room) = self.state.selected_room {
match self.state.selected_item.as_deref() {
Some(selected_event) => {
if let Some(item) = format_timeline_item(selected_event) {
let list = List::new(vec![item])
.highlight_spacing(HighlightSpacing::Always)
.highlight_symbol(">")
.highlight_style(SELECTED_STYLE_FG);
@@ -74,11 +59,11 @@ impl Widget for &mut ReadReceipts<'_> {
render_room_stats(room, area, buf);
}
}
},
None => {
let content = "(room disappeared in the room list service)";
Paragraph::new(content).fg(TEXT_COLOR).wrap(Wrap { trim: false }).render(area, buf);
None => render_room_stats(room, area, buf),
}
} else {
let content = "(room disappeared in the room list service)";
Paragraph::new(content).fg(TEXT_COLOR).wrap(Wrap { trim: false }).render(area, buf);
}
}
}
+8 -30
View File
@@ -41,8 +41,7 @@ const DEFAULT_TILING_DIRECTION: Direction = Direction::Horizontal;
pub struct DetailsState<'a> {
selected_room: Option<&'a Room>,
timeline_items: Option<&'a Vector<Arc<TimelineItem>>>,
selected_event: Option<OwnedEventId>,
selected_item: Option<Arc<TimelineItem>>,
}
enum Mode {
@@ -579,16 +578,10 @@ impl RoomView {
}
}
fn get_selected_event_id(&self) -> Option<OwnedEventId> {
fn get_selected_event(&self) -> Option<Arc<TimelineItem>> {
let selected = self.timeline_list.selected()?;
let selected_room = self.room_id()?;
let timelines = self.timelines.lock();
let current_timeline = timelines.get(selected_room)?;
let items = current_timeline.items.lock();
let item = items.get(selected)?;
item.as_event()?.event_id().map(|e| e.to_owned())
let items = self.get_selected_timeline_items()?;
items.get(selected).cloned()
}
fn update(&mut self) {
@@ -642,13 +635,11 @@ impl Widget for &mut RoomView {
.render(middle_area, buf);
};
let selected_event = self.get_selected_event_id();
if let Some(room_id) = self.room_id() {
let maybe_room = self.client.get_room(room_id);
let mut maybe_room = maybe_room.as_ref();
let items = self.get_selected_timeline_items();
let selected_event = self.get_selected_event();
let timeline_area = match &mut self.mode {
Mode::Normal { invited_room_view } => {
@@ -670,23 +661,10 @@ impl Widget for &mut RoomView {
let [timeline_area, details_area] = vertical.areas(middle_area);
Clear.render(details_area, buf);
if let Some(items) = items {
let mut state = DetailsState {
selected_room: maybe_room,
timeline_items: Some(&items),
selected_event,
};
let mut state =
DetailsState { selected_room: maybe_room, selected_item: selected_event };
view.render(details_area, buf, &mut state);
} else {
let mut state = DetailsState {
selected_room: maybe_room,
timeline_items: None,
selected_event,
};
view.render(details_area, buf, &mut state);
}
view.render(details_area, buf, &mut state);
Some(timeline_area)
}