daydream

A small matrix web client written in rust
git clone git://archive.git.mtrnord.blog/daydream-mx/daydream.git
Log | Files | Refs | README | LICENSE

item.rs (2478B)


      1 use std::rc::Rc;
      2 
      3 use matrix_sdk::{
      4     events::{
      5         room::message::MessageEventContent, AnyPossiblyRedactedSyncMessageEvent,
      6         AnySyncMessageEvent, SyncMessageEvent,
      7     },
      8     identifiers::RoomId,
      9     Room,
     10 };
     11 use yew::prelude::*;
     12 use yewtil::NeqAssign;
     13 
     14 pub(crate) struct RoomItem {
     15     props: Props,
     16     link: ComponentLink<Self>,
     17 }
     18 
     19 pub enum Msg {
     20     ChangeRoom(Rc<Room>),
     21 }
     22 
     23 #[derive(Clone, Properties, Debug, PartialEq)]
     24 pub struct Props {
     25     pub room: Rc<Room>,
     26 
     27     #[prop_or_default]
     28     pub change_room_callback: Callback<RoomId>,
     29 }
     30 
     31 impl Component for RoomItem {
     32     type Message = Msg;
     33     type Properties = Props;
     34 
     35     fn create(props: Self::Properties, link: ComponentLink<Self>) -> Self {
     36         RoomItem { props, link }
     37     }
     38 
     39     fn update(&mut self, msg: Self::Message) -> bool {
     40         match msg {
     41             Msg::ChangeRoom(room) => {
     42                 self.props.change_room_callback.emit(room.room_id.clone());
     43             }
     44         }
     45         false
     46     }
     47 
     48     fn change(&mut self, props: Self::Properties) -> bool {
     49         self.props.neq_assign(props)
     50     }
     51 
     52     //noinspection RsTypeCheck
     53     fn view(&self) -> Html {
     54         let room = self.props.room.clone();
     55 
     56         // TODO placeholder for encrypted rooms
     57         let last_message = match room.messages.iter().last() {
     58             Some(AnyPossiblyRedactedSyncMessageEvent::Regular(
     59                 AnySyncMessageEvent::RoomMessage(SyncMessageEvent {
     60                     content: MessageEventContent::Text(text_event),
     61                     ..
     62                 }),
     63             )) => &text_event.body,
     64             _ => "",
     65         };
     66 
     67         let room = room.clone();
     68         let display_name = room.display_name();
     69 
     70         html! {
     71             <div class="room-list-item">
     72                 <a onclick=self.link.callback(move |e: MouseEvent| Msg::ChangeRoom(room.clone()))>
     73                     <div class="content">
     74                         // TODO remove placeholder
     75                         <img class="avatar" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAYAAACM/rhtAAAARUlEQVRYhe3OMQ0AIADAMBKUowmBoIKMo0f/jrnX+dmoA4KCdUBQsA4ICtYBQcE6IChYBwQF64CgYB0QFKwDgoJ1QPC1C8gY0kSgNLTWAAAAAElFTkSuQmCC"/>
     76                         <div>
     77                             <h5 class="name">{display_name}</h5>
     78                             <p class="latest-msg">{last_message}</p>
     79                         </div>
     80                     </div>
     81                 </a>
     82             </div>
     83         }
     84     }
     85 }