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

commit ccc68cce7e4b68ff857c54a23c62a90e9b2c5005
parent 492dab842e5308f990397c02899e2fade43a858f
Author: Jonas Platte <jplatte+git@posteo.de>
Date:   Fri, 10 Jul 2020 23:56:44 +0200

Reduce / simplify a few clones

Diffstat:
Msrc/app/components/event_list.rs | 36++++++++++++++++++------------------
Msrc/app/components/events/image.rs | 9++++-----
Msrc/app/components/input.rs | 4++--
Msrc/app/components/room_list/item.rs | 9+++++----
4 files changed, 29 insertions(+), 29 deletions(-)

diff --git a/src/app/components/event_list.rs b/src/app/components/event_list.rs @@ -7,7 +7,7 @@ use matrix_sdk::{ identifiers::RoomId, Room, }; -use yew::prelude::*; +use yew::{prelude::*, virtual_dom::VList}; use crate::app::components::{ events::{image::Image, notice::Notice, text::Text, video::Video}, @@ -149,19 +149,19 @@ impl Component for EventList { .events .contains_key(&self.props.current_room.room_id) { - let events = self.state.events[&self.props.current_room.room_id].clone(); - let mut elements: Vec<Html> = Vec::new(); - for (pos, event) in self.state.events[&self.props.current_room.room_id] - .iter() - .enumerate() - { - if pos == 0 { - elements.push(self.get_event(None, event)); - } else { - elements.push(self.get_event(Some(events[pos - 1].clone()), event)); - } + let events = &self.state.events[&self.props.current_room.room_id]; + + let mut html_nodes = VList::new(); + if let Some(event) = events.first() { + html_nodes.add_child(self.get_event(None, event)); } - elements.into_iter().collect::<Html>() + html_nodes.add_children( + events + .windows(2) + .map(|e| self.get_event(Some(&e[0]), &e[1])), + ); + + html_nodes.into() } else { html! {} }; @@ -186,7 +186,7 @@ impl EventList { //noinspection RsTypeCheck fn get_event( &self, - prev_event: Option<AnyMessageEventStub>, + prev_event: Option<&AnyMessageEventStub>, event: &AnyMessageEventStub, ) -> Html { // TODO make encryption supported @@ -196,7 +196,7 @@ impl EventList { MessageEventContent::Text(text_event) => { html! { <Text - prev_event=prev_event.clone() + prev_event=prev_event.cloned() event=event.clone() room=self.props.current_room.clone() text_event=text_event.clone() @@ -206,7 +206,7 @@ impl EventList { MessageEventContent::Notice(notice_event) => { html! { <Notice - prev_event=prev_event.clone() + prev_event=prev_event.cloned() event=event.clone() room=self.props.current_room.clone() notice_event=notice_event.clone() @@ -216,7 +216,7 @@ impl EventList { MessageEventContent::Image(image_event) => { html! { <Image - prev_event=prev_event.clone() + prev_event=prev_event.cloned() event=event.clone() room=self.props.current_room.clone() image_event=image_event.clone() @@ -226,7 +226,7 @@ impl EventList { MessageEventContent::Video(video_event) => { html! { <Video - prev_event=prev_event.clone() + prev_event=prev_event.cloned() event=event.clone() room=self.props.current_room.clone() video_event=video_event.clone() diff --git a/src/app/components/events/image.rs b/src/app/components/events/image.rs @@ -4,7 +4,6 @@ use crate::app::components::events::{EventExt, RoomExt}; use matrix_sdk::{ events::{room::message::ImageMessageEventContent, AnyMessageEventStub}, Room, - js_int::UInt }; use rand::random; use yew::prelude::*; @@ -72,8 +71,8 @@ impl Component for Image { html! { <div> <p><displayname>{sender_displayname}{": "}</displayname></p> - <a href={lightbox_href_full.clone()}><div class="thumbnail-container"><img src=thumbnail/></div></a> - <div class="lightbox short-animate" id={lightbox_id_full.clone()}> + <a href=lightbox_href_full><div class="thumbnail-container"><img src=thumbnail/></div></a> + <div class="lightbox short-animate" id=lightbox_id_full> <img class="long-animate" src=image_url/> </div> <div id="lightbox-controls" class="short-animate"> @@ -84,8 +83,8 @@ impl Component for Image { } else { html! { <div> - <a href={lightbox_href_full.clone()}><img src=thumbnail/></a> - <div class="lightbox short-animate" id={lightbox_id_full.clone()}> + <a href=lightbox_href_full><img src=thumbnail/></a> + <div class="lightbox short-animate" id=lightbox_id_full> <img class="long-animate" src=image_url/> </div> <div id="lightbox-controls" class="short-animate"> diff --git a/src/app/components/input.rs b/src/app/components/input.rs @@ -46,7 +46,7 @@ impl Component for Input { if data.key() == "Enter" { self.props .on_submit - .emit(self.state.value.as_ref().unwrap_or(&"".to_string()).clone()); + .emit(self.state.value.as_deref().unwrap_or("").to_owned()); self.state.value = None; return true; } @@ -64,7 +64,7 @@ impl Component for Input { <div class="uk-inline message-input"> <span class="material-icons" id="ma-icon">{"create"}</span> <input class="uk-input" type="text" - value=&self.state.value.as_ref().unwrap_or(&"".to_string()) + value=&self.state.value.as_deref().unwrap_or("") oninput=&self.on_input onkeypress=&self.on_submit /> diff --git a/src/app/components/room_list/item.rs b/src/app/components/room_list/item.rs @@ -52,18 +52,19 @@ impl Component for RoomItem { // TODO placeholder for encrypted rooms let last_message = match room.messages.iter().last() { - None => "".to_string(), + None => "", Some(m) => { if let AnyMessageEventContent::RoomMessage(MessageEventContent::Text(text_event)) = - m.content.clone() + &m.content { - text_event.body + &text_event.body } else { - "".to_string() + "" } } }; + let room = room.clone(); let display_name = room.display_name(); html! {