multiverse/widgets/room_view/details/
events.rs

1use itertools::Itertools;
2use matrix_sdk::Room;
3use matrix_sdk_common::executor::Handle;
4use ratatui::{
5    prelude::*,
6    widgets::{Paragraph, Wrap},
7};
8
9use crate::TEXT_COLOR;
10
11pub struct EventsView<'a> {
12    room: Option<&'a Room>,
13}
14
15impl<'a> EventsView<'a> {
16    pub fn new(room: Option<&'a Room>) -> Self {
17        Self { room }
18    }
19}
20
21impl Widget for &mut EventsView<'_> {
22    fn render(self, area: Rect, buf: &mut Buffer)
23    where
24        Self: Sized,
25    {
26        match self.room {
27            Some(room) => {
28                let events = tokio::task::block_in_place(|| {
29                    Handle::current().block_on(async {
30                        let (room_event_cache, _drop_handles) = room.event_cache().await.unwrap();
31                        room_event_cache
32                            .events()
33                            .await
34                            .expect("Failed to fetch the events because of a store error")
35                    })
36                });
37
38                let separator = Line::from("\n");
39                let events = events
40                    .into_iter()
41                    .map(|sync_timeline_item| sync_timeline_item.raw().json().to_string())
42                    .map(Line::from);
43
44                let events = Itertools::intersperse(events, separator);
45                let lines: Vec<_> = [Line::from("")].into_iter().chain(events).collect();
46
47                Paragraph::new(lines).fg(TEXT_COLOR).wrap(Wrap { trim: false }).render(area, buf);
48            }
49
50            None => {
51                Paragraph::new("(room disappeared in the room list service)")
52                    .fg(TEXT_COLOR)
53                    .wrap(Wrap { trim: false })
54                    .render(area, buf);
55            }
56        }
57    }
58}