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 42cf75cc7b7a18702e60711909a164880acfad23
parent 86ea5818311c83666ee3b3965f9076798e4e1999
Author: Marcel <MTRNord@users.noreply.github.com>
Date:   Sat, 11 Jul 2020 00:08:36 +0200

Merge pull request #23 from jplatte/refactor

Refactor stuff
Diffstat:
Msrc/app/components/event_list.rs | 55+++++++++++++++++++++++++++++++------------------------
Msrc/app/components/events/image.rs | 9++++-----
Msrc/app/components/input.rs | 4++--
Msrc/app/components/room_list/item.rs | 9+++++----
4 files changed, 42 insertions(+), 35 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}, @@ -144,33 +144,40 @@ impl Component for EventList { } fn view(&self) -> Html { - return html! { + let events = if self + .state + .events + .contains_key(&self.props.current_room.room_id) + { + 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)); + } + html_nodes.add_children( + events + .windows(2) + .map(|e| self.get_event(Some(&e[0]), &e[1])), + ); + + html_nodes.into() + } else { + html! {} + }; + + html! { <div class="event-list"> <div class="room-title"><div><h1>{ self.props.current_room.display_name() }</h1></div></div> <div class="scrollable message-scrollarea"> <div class="message-container"> - { - if self.state.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)); - } - } - elements.into_iter().collect::<Html>() - } else { - html! {} - } - } + { events } <div id="anchor"></div> </div> </div> <Input on_submit=&self.on_submit/> </div> - }; + } } } @@ -179,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 @@ -189,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() @@ -199,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() @@ -209,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() @@ -219,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! {