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 9415ea83efc9ffd160e8fe628c4114a763fc8351
parent 77b3f476324d2d0b35e1942c42b33c2fe58e470d
Author: Marcel <MTRNord@users.noreply.github.com>
Date:   Sat, 25 Jul 2020 02:10:12 +0200

Merge pull request #25 from jplatte/match-refactor

Match refactor
Diffstat:
Msrc/app/components/event_list.rs | 81+++++++++++++++++++++++++++++++++++++------------------------------------------
Msrc/app/components/room_list/item.rs | 26+++++++++-----------------
Msrc/app/components/room_list/mod.rs | 17++++++++---------
Msrc/app/mod.rs | 26+++++++-------------------
Msrc/app/views/login.rs | 97++++++++++++++++++++++++++++++++++++-------------------------------------------
5 files changed, 106 insertions(+), 141 deletions(-)

diff --git a/src/app/components/event_list.rs b/src/app/components/event_list.rs @@ -67,55 +67,50 @@ impl Component for EventList { fn update(&mut self, msg: Self::Message) -> bool { match msg { - Msg::NewMessage(response) => { - match response { - Response::Sync((room_id, raw_msg)) => { - // TODO handle all events - if let Ok(msg) = raw_msg.deserialize() { - if self.state.events.contains_key(&room_id) { - if !(self.state.events[&room_id] - .iter() - .any(|x| x.event_id() == msg.event_id())) - { - self.state.events.get_mut(&room_id).unwrap().push(msg); - room_id == self.props.current_room.room_id - } else { - false - } - } else { - let msgs = vec![msg]; - self.state.events.insert(room_id.clone(), msgs); - room_id == self.props.current_room.room_id - } - } else { - false - } - } - Response::OldMessages((room_id, messages)) => { - let mut deserialized_messages: Vec<AnySyncMessageEvent> = messages + Msg::NewMessage(Response::Sync((room_id, raw_msg))) => { + // TODO handle all events + if let Ok(msg) = raw_msg.deserialize() { + if self.state.events.contains_key(&room_id) { + if !(self.state.events[&room_id] .iter() - .map(|x| x.deserialize()) - .filter_map(Result::ok) - .map(|x| x.without_room_id()) - .collect(); - // This is a clippy false positive - #[allow(clippy::map_entry)] - if self.state.events.contains_key(&room_id) { - self.state - .events - .get_mut(&room_id) - .unwrap() - .append(deserialized_messages.as_mut()); - true + .any(|x| x.event_id() == msg.event_id())) + { + self.state.events.get_mut(&room_id).unwrap().push(msg); + room_id == self.props.current_room.room_id } else { - self.state.events.insert(room_id, deserialized_messages); - true + false } + } else { + let msgs = vec![msg]; + self.state.events.insert(room_id.clone(), msgs); + room_id == self.props.current_room.room_id } - - _ => false, + } else { + false + } + } + Msg::NewMessage(Response::OldMessages((room_id, messages))) => { + let mut deserialized_messages: Vec<AnySyncMessageEvent> = messages + .iter() + .map(|x| x.deserialize()) + .filter_map(Result::ok) + .map(|x| x.without_room_id()) + .collect(); + // This is a clippy false positive + #[allow(clippy::map_entry)] + if self.state.events.contains_key(&room_id) { + self.state + .events + .get_mut(&room_id) + .unwrap() + .append(deserialized_messages.as_mut()); + true + } else { + self.state.events.insert(room_id, deserialized_messages); + true } } + Msg::NewMessage(_) => false, Msg::SendMessage(message) => { info!("Sending Message"); self.matrix_agent.send(Request::SendMessage(( diff --git a/src/app/components/room_list/item.rs b/src/app/components/room_list/item.rs @@ -3,7 +3,7 @@ use std::rc::Rc; use matrix_sdk::{ events::{ room::message::MessageEventContent, AnyPossiblyRedactedSyncMessageEvent, - AnySyncMessageEvent, + AnySyncMessageEvent, SyncMessageEvent, }, identifiers::RoomId, Room, @@ -54,22 +54,14 @@ impl Component for RoomItem { let room = self.props.room.clone(); // TODO placeholder for encrypted rooms - let last_message = match room.messages.iter().last() { - None => "", - Some(m) => { - if let AnyPossiblyRedactedSyncMessageEvent::Regular( - AnySyncMessageEvent::RoomMessage(event), - ) = &**m - { - if let MessageEventContent::Text(text_event) = &event.content { - &text_event.body - } else { - "" - } - } else { - "" - } - } + let last_message = match room.messages.iter().last().map(|m| &**m) { + Some(AnyPossiblyRedactedSyncMessageEvent::Regular( + AnySyncMessageEvent::RoomMessage(SyncMessageEvent { + content: MessageEventContent::Text(text_event), + .. + }), + )) => &text_event.body, + _ => "", }; let room = room.clone(); diff --git a/src/app/components/room_list/mod.rs b/src/app/components/room_list/mod.rs @@ -143,16 +143,15 @@ impl Component for RoomList { </div> } } else { - let rooms = if self.state.search_query.is_none() - || (self.state.search_query.as_ref().unwrap_or(&"".to_string()) == &"".to_string()) - { - self.state + let rooms: Html = match self.state.search_query.as_deref() { + None | Some("") => self + .state .rooms .iter() .map(|(_, room)| self.get_room(room)) - .collect::<Html>() - } else { - self.state + .collect(), + _ => self + .state .rooms .iter() .filter(|(_, room)| { @@ -161,7 +160,7 @@ impl Component for RoomList { .contains(&self.state.search_query.as_ref().unwrap().to_lowercase()) }) .map(|(_, room)| self.get_room(room)) - .collect::<Html>() + .collect(), }; html! { @@ -181,7 +180,7 @@ impl Component for RoomList { "Filter Rooms..." ) } - value=&self.state.search_query.as_ref().unwrap_or(&"".to_string()) + value=self.state.search_query.as_deref().unwrap_or("") oninput=self.link.callback(|e: InputData| Msg::SetFilter(e.value)) /> </div> </div> diff --git a/src/app/mod.rs b/src/app/mod.rs @@ -114,25 +114,13 @@ impl Component for App { } fn view(&self) -> Html { - html! { - { - match &self.route { - None => html! {<Login />}, - Some(route) => match AppRoute::switch(route.clone()) { - Some(AppRoute::MainView) => { - html! { - <MainView /> - } - }, - Some(AppRoute::Login) => { - html! { - <Login /> - } - }, - None => VNode::from("404") - } - } - } + match &self.route { + None => html! { <Login /> }, + Some(route) => match AppRoute::switch(route.clone()) { + Some(AppRoute::MainView) => html! { <MainView /> }, + Some(AppRoute::Login) => html! { <Login /> }, + None => VNode::from("404"), + }, } } } diff --git a/src/app/views/login.rs b/src/app/views/login.rs @@ -87,42 +87,37 @@ impl Component for Login { self.state.loading = true; true } - Msg::NewMessage(response) => { - match response { - Response::Error(error) => { - match error.clone() { - MatrixError::MissingFields(field) => { - self.state.loading = false; - self.state.error = Some(error.to_string()); - self.state.error_field = Some(field); - true - } - MatrixError::LoginTimeout => { - // If we had less than 10 tries try again - if self.state.retries < 10 { - self.state.retries += 1; - info!("Trying login again in 5 seconds"); - sleep(Duration::from_secs(5)); - self.link.send_message(Msg::Login); - false - } else { - self.state.loading = false; - self.state.error = - Some("Login failed after 10 tries.".to_string()); - true - } - } - MatrixError::SDKError(e) => { - // TODO handle login error != timeout better - error!("SDK Error: {}", e); - false - } - _ => false, + Msg::NewMessage(Response::Error(error)) => { + match &error { + MatrixError::MissingFields(field) => { + self.state.loading = false; + self.state.error = Some(error.to_string()); + self.state.error_field = Some(field.clone()); + true + } + MatrixError::LoginTimeout => { + // If we had less than 10 tries try again + if self.state.retries < 10 { + self.state.retries += 1; + info!("Trying login again in 5 seconds"); + sleep(Duration::from_secs(5)); + self.link.send_message(Msg::Login); + false + } else { + self.state.loading = false; + self.state.error = Some("Login failed after 10 tries.".to_string()); + true } } + MatrixError::SDKError(e) => { + // TODO handle login error != timeout better + error!("SDK Error: {}", e); + false + } _ => false, } } + Msg::NewMessage(_) => false, } } @@ -152,6 +147,22 @@ impl Component for Login { </div> } } else { + let error = match &self.state.error { + Some(v) => html! { + <h4 class="error"> + { + tr!( + // {0} is the Error that happened on login + // The error message of the Login page + "Error: {0}", + v + ) + } + </h4> + }, + None => html! {}, + }; + html! { <> <div class="login-page-bg"></div> @@ -168,29 +179,9 @@ impl Component for Login { ) } </h1> - { - match &self.state.error { - Some(v) => { - html! { - <h4 class="error"> - { - tr!( - // {0} is the Error that happened on login - // The error message of the Login page - "Error: {0}", - v - ) - } - </h4> - } - } - None => { - html!{} - } - } - } + { error } - <form id="login_form" onsubmit=self.link.callback(|e: FocusEvent| {e.prevent_default(); Msg::Login})> + <form id="login_form" onsubmit=self.link.callback(|e: FocusEvent| { e.prevent_default(); Msg::Login })> <div class="login-inline login-input-first"> <span class="material-icons login-icons" id="ma-icon" style="font-size: 28px !important;">{"http"}</span> <input