23.diff (8786B)
1 diff --git a/src/app/components/event_list.rs b/src/app/components/event_list.rs 2 index 3c540cf..732bf3d 100644 3 --- a/src/app/components/event_list.rs 4 +++ b/src/app/components/event_list.rs 5 @@ -7,7 +7,7 @@ use matrix_sdk::{ 6 identifiers::RoomId, 7 Room, 8 }; 9 -use yew::prelude::*; 10 +use yew::{prelude::*, virtual_dom::VList}; 11 12 use crate::app::components::{ 13 events::{image::Image, notice::Notice, text::Text, video::Video}, 14 @@ -144,33 +144,40 @@ impl Component for EventList { 15 } 16 17 fn view(&self) -> Html { 18 - return html! { 19 + let events = if self 20 + .state 21 + .events 22 + .contains_key(&self.props.current_room.room_id) 23 + { 24 + let events = &self.state.events[&self.props.current_room.room_id]; 25 + 26 + let mut html_nodes = VList::new(); 27 + if let Some(event) = events.first() { 28 + html_nodes.add_child(self.get_event(None, event)); 29 + } 30 + html_nodes.add_children( 31 + events 32 + .windows(2) 33 + .map(|e| self.get_event(Some(&e[0]), &e[1])), 34 + ); 35 + 36 + html_nodes.into() 37 + } else { 38 + html! {} 39 + }; 40 + 41 + html! { 42 <div class="event-list"> 43 <div class="room-title"><div><h1>{ self.props.current_room.display_name() }</h1></div></div> 44 <div class="scrollable message-scrollarea"> 45 <div class="message-container"> 46 - { 47 - if self.state.events.contains_key(&self.props.current_room.room_id) { 48 - let events = self.state.events[&self.props.current_room.room_id].clone(); 49 - let mut elements: Vec<Html> = Vec::new(); 50 - for (pos, event) in self.state.events[&self.props.current_room.room_id].iter().enumerate() { 51 - if pos == 0 { 52 - elements.push(self.get_event(None, event)); 53 - } else { 54 - elements.push(self.get_event(Some(events[pos - 1].clone()), event)); 55 - } 56 - } 57 - elements.into_iter().collect::<Html>() 58 - } else { 59 - html! {} 60 - } 61 - } 62 + { events } 63 <div id="anchor"></div> 64 </div> 65 </div> 66 <Input on_submit=&self.on_submit/> 67 </div> 68 - }; 69 + } 70 } 71 } 72 73 @@ -179,7 +186,7 @@ impl EventList { 74 //noinspection RsTypeCheck 75 fn get_event( 76 &self, 77 - prev_event: Option<AnyMessageEventStub>, 78 + prev_event: Option<&AnyMessageEventStub>, 79 event: &AnyMessageEventStub, 80 ) -> Html { 81 // TODO make encryption supported 82 @@ -189,7 +196,7 @@ impl EventList { 83 MessageEventContent::Text(text_event) => { 84 html! { 85 <Text 86 - prev_event=prev_event.clone() 87 + prev_event=prev_event.cloned() 88 event=event.clone() 89 room=self.props.current_room.clone() 90 text_event=text_event.clone() 91 @@ -199,7 +206,7 @@ impl EventList { 92 MessageEventContent::Notice(notice_event) => { 93 html! { 94 <Notice 95 - prev_event=prev_event.clone() 96 + prev_event=prev_event.cloned() 97 event=event.clone() 98 room=self.props.current_room.clone() 99 notice_event=notice_event.clone() 100 @@ -209,7 +216,7 @@ impl EventList { 101 MessageEventContent::Image(image_event) => { 102 html! { 103 <Image 104 - prev_event=prev_event.clone() 105 + prev_event=prev_event.cloned() 106 event=event.clone() 107 room=self.props.current_room.clone() 108 image_event=image_event.clone() 109 @@ -219,7 +226,7 @@ impl EventList { 110 MessageEventContent::Video(video_event) => { 111 html! { 112 <Video 113 - prev_event=prev_event.clone() 114 + prev_event=prev_event.cloned() 115 event=event.clone() 116 room=self.props.current_room.clone() 117 video_event=video_event.clone() 118 diff --git a/src/app/components/events/image.rs b/src/app/components/events/image.rs 119 index 1adc7fe..7ad8264 100644 120 --- a/src/app/components/events/image.rs 121 +++ b/src/app/components/events/image.rs 122 @@ -4,7 +4,6 @@ use crate::app::components::events::{EventExt, RoomExt}; 123 use matrix_sdk::{ 124 events::{room::message::ImageMessageEventContent, AnyMessageEventStub}, 125 Room, 126 - js_int::UInt 127 }; 128 use rand::random; 129 use yew::prelude::*; 130 @@ -72,8 +71,8 @@ impl Component for Image { 131 html! { 132 <div> 133 <p><displayname>{sender_displayname}{": "}</displayname></p> 134 - <a href={lightbox_href_full.clone()}><div class="thumbnail-container"><img src=thumbnail/></div></a> 135 - <div class="lightbox short-animate" id={lightbox_id_full.clone()}> 136 + <a href=lightbox_href_full><div class="thumbnail-container"><img src=thumbnail/></div></a> 137 + <div class="lightbox short-animate" id=lightbox_id_full> 138 <img class="long-animate" src=image_url/> 139 </div> 140 <div id="lightbox-controls" class="short-animate"> 141 @@ -84,8 +83,8 @@ impl Component for Image { 142 } else { 143 html! { 144 <div> 145 - <a href={lightbox_href_full.clone()}><img src=thumbnail/></a> 146 - <div class="lightbox short-animate" id={lightbox_id_full.clone()}> 147 + <a href=lightbox_href_full><img src=thumbnail/></a> 148 + <div class="lightbox short-animate" id=lightbox_id_full> 149 <img class="long-animate" src=image_url/> 150 </div> 151 <div id="lightbox-controls" class="short-animate"> 152 diff --git a/src/app/components/input.rs b/src/app/components/input.rs 153 index 3ba40a4..ce11c76 100644 154 --- a/src/app/components/input.rs 155 +++ b/src/app/components/input.rs 156 @@ -46,7 +46,7 @@ impl Component for Input { 157 if data.key() == "Enter" { 158 self.props 159 .on_submit 160 - .emit(self.state.value.as_ref().unwrap_or(&"".to_string()).clone()); 161 + .emit(self.state.value.as_deref().unwrap_or("").to_owned()); 162 self.state.value = None; 163 return true; 164 } 165 @@ -64,7 +64,7 @@ impl Component for Input { 166 <div class="uk-inline message-input"> 167 <span class="material-icons" id="ma-icon">{"create"}</span> 168 <input class="uk-input" type="text" 169 - value=&self.state.value.as_ref().unwrap_or(&"".to_string()) 170 + value=&self.state.value.as_deref().unwrap_or("") 171 oninput=&self.on_input 172 onkeypress=&self.on_submit 173 /> 174 diff --git a/src/app/components/room_list/item.rs b/src/app/components/room_list/item.rs 175 index f3041aa..1c317c1 100644 176 --- a/src/app/components/room_list/item.rs 177 +++ b/src/app/components/room_list/item.rs 178 @@ -52,18 +52,19 @@ impl Component for RoomItem { 179 180 // TODO placeholder for encrypted rooms 181 let last_message = match room.messages.iter().last() { 182 - None => "".to_string(), 183 + None => "", 184 Some(m) => { 185 if let AnyMessageEventContent::RoomMessage(MessageEventContent::Text(text_event)) = 186 - m.content.clone() 187 + &m.content 188 { 189 - text_event.body 190 + &text_event.body 191 } else { 192 - "".to_string() 193 + "" 194 } 195 } 196 }; 197 198 + let room = room.clone(); 199 let display_name = room.display_name(); 200 201 html! {