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