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:
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! {