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 }