25.diff (15888B)
1 diff --git a/src/app/components/event_list.rs b/src/app/components/event_list.rs 2 index bfdd6bb..37010f6 100644 3 --- a/src/app/components/event_list.rs 4 +++ b/src/app/components/event_list.rs 5 @@ -67,55 +67,50 @@ impl Component for EventList { 6 7 fn update(&mut self, msg: Self::Message) -> bool { 8 match msg { 9 - Msg::NewMessage(response) => { 10 - match response { 11 - Response::Sync((room_id, raw_msg)) => { 12 - // TODO handle all events 13 - if let Ok(msg) = raw_msg.deserialize() { 14 - if self.state.events.contains_key(&room_id) { 15 - if !(self.state.events[&room_id] 16 - .iter() 17 - .any(|x| x.event_id() == msg.event_id())) 18 - { 19 - self.state.events.get_mut(&room_id).unwrap().push(msg); 20 - room_id == self.props.current_room.room_id 21 - } else { 22 - false 23 - } 24 - } else { 25 - let msgs = vec![msg]; 26 - self.state.events.insert(room_id.clone(), msgs); 27 - room_id == self.props.current_room.room_id 28 - } 29 - } else { 30 - false 31 - } 32 - } 33 - Response::OldMessages((room_id, messages)) => { 34 - let mut deserialized_messages: Vec<AnySyncMessageEvent> = messages 35 + Msg::NewMessage(Response::Sync((room_id, raw_msg))) => { 36 + // TODO handle all events 37 + if let Ok(msg) = raw_msg.deserialize() { 38 + if self.state.events.contains_key(&room_id) { 39 + if !(self.state.events[&room_id] 40 .iter() 41 - .map(|x| x.deserialize()) 42 - .filter_map(Result::ok) 43 - .map(|x| x.without_room_id()) 44 - .collect(); 45 - // This is a clippy false positive 46 - #[allow(clippy::map_entry)] 47 - if self.state.events.contains_key(&room_id) { 48 - self.state 49 - .events 50 - .get_mut(&room_id) 51 - .unwrap() 52 - .append(deserialized_messages.as_mut()); 53 - true 54 + .any(|x| x.event_id() == msg.event_id())) 55 + { 56 + self.state.events.get_mut(&room_id).unwrap().push(msg); 57 + room_id == self.props.current_room.room_id 58 } else { 59 - self.state.events.insert(room_id, deserialized_messages); 60 - true 61 + false 62 } 63 + } else { 64 + let msgs = vec![msg]; 65 + self.state.events.insert(room_id.clone(), msgs); 66 + room_id == self.props.current_room.room_id 67 } 68 - 69 - _ => false, 70 + } else { 71 + false 72 + } 73 + } 74 + Msg::NewMessage(Response::OldMessages((room_id, messages))) => { 75 + let mut deserialized_messages: Vec<AnySyncMessageEvent> = messages 76 + .iter() 77 + .map(|x| x.deserialize()) 78 + .filter_map(Result::ok) 79 + .map(|x| x.without_room_id()) 80 + .collect(); 81 + // This is a clippy false positive 82 + #[allow(clippy::map_entry)] 83 + if self.state.events.contains_key(&room_id) { 84 + self.state 85 + .events 86 + .get_mut(&room_id) 87 + .unwrap() 88 + .append(deserialized_messages.as_mut()); 89 + true 90 + } else { 91 + self.state.events.insert(room_id, deserialized_messages); 92 + true 93 } 94 } 95 + Msg::NewMessage(_) => false, 96 Msg::SendMessage(message) => { 97 info!("Sending Message"); 98 self.matrix_agent.send(Request::SendMessage(( 99 diff --git a/src/app/components/room_list/item.rs b/src/app/components/room_list/item.rs 100 index 043187e..77ccbfb 100644 101 --- a/src/app/components/room_list/item.rs 102 +++ b/src/app/components/room_list/item.rs 103 @@ -3,7 +3,7 @@ use std::rc::Rc; 104 use matrix_sdk::{ 105 events::{ 106 room::message::MessageEventContent, AnyPossiblyRedactedSyncMessageEvent, 107 - AnySyncMessageEvent, 108 + AnySyncMessageEvent, SyncMessageEvent, 109 }, 110 identifiers::RoomId, 111 Room, 112 @@ -54,22 +54,14 @@ impl Component for RoomItem { 113 let room = self.props.room.clone(); 114 115 // TODO placeholder for encrypted rooms 116 - let last_message = match room.messages.iter().last() { 117 - None => "", 118 - Some(m) => { 119 - if let AnyPossiblyRedactedSyncMessageEvent::Regular( 120 - AnySyncMessageEvent::RoomMessage(event), 121 - ) = &**m 122 - { 123 - if let MessageEventContent::Text(text_event) = &event.content { 124 - &text_event.body 125 - } else { 126 - "" 127 - } 128 - } else { 129 - "" 130 - } 131 - } 132 + let last_message = match room.messages.iter().last().map(|m| &**m) { 133 + Some(AnyPossiblyRedactedSyncMessageEvent::Regular( 134 + AnySyncMessageEvent::RoomMessage(SyncMessageEvent { 135 + content: MessageEventContent::Text(text_event), 136 + .. 137 + }), 138 + )) => &text_event.body, 139 + _ => "", 140 }; 141 142 let room = room.clone(); 143 diff --git a/src/app/components/room_list/mod.rs b/src/app/components/room_list/mod.rs 144 index 1fab99f..cb06d97 100644 145 --- a/src/app/components/room_list/mod.rs 146 +++ b/src/app/components/room_list/mod.rs 147 @@ -143,16 +143,15 @@ impl Component for RoomList { 148 </div> 149 } 150 } else { 151 - let rooms = if self.state.search_query.is_none() 152 - || (self.state.search_query.as_ref().unwrap_or(&"".to_string()) == &"".to_string()) 153 - { 154 - self.state 155 + let rooms: Html = match self.state.search_query.as_deref() { 156 + None | Some("") => self 157 + .state 158 .rooms 159 .iter() 160 .map(|(_, room)| self.get_room(room)) 161 - .collect::<Html>() 162 - } else { 163 - self.state 164 + .collect(), 165 + _ => self 166 + .state 167 .rooms 168 .iter() 169 .filter(|(_, room)| { 170 @@ -161,7 +160,7 @@ impl Component for RoomList { 171 .contains(&self.state.search_query.as_ref().unwrap().to_lowercase()) 172 }) 173 .map(|(_, room)| self.get_room(room)) 174 - .collect::<Html>() 175 + .collect(), 176 }; 177 178 html! { 179 @@ -181,7 +180,7 @@ impl Component for RoomList { 180 "Filter Rooms..." 181 ) 182 } 183 - value=&self.state.search_query.as_ref().unwrap_or(&"".to_string()) 184 + value=self.state.search_query.as_deref().unwrap_or("") 185 oninput=self.link.callback(|e: InputData| Msg::SetFilter(e.value)) /> 186 </div> 187 </div> 188 diff --git a/src/app/mod.rs b/src/app/mod.rs 189 index 1de8609..bcf3e4d 100644 190 --- a/src/app/mod.rs 191 +++ b/src/app/mod.rs 192 @@ -114,25 +114,13 @@ impl Component for App { 193 } 194 195 fn view(&self) -> Html { 196 - html! { 197 - { 198 - match &self.route { 199 - None => html! {<Login />}, 200 - Some(route) => match AppRoute::switch(route.clone()) { 201 - Some(AppRoute::MainView) => { 202 - html! { 203 - <MainView /> 204 - } 205 - }, 206 - Some(AppRoute::Login) => { 207 - html! { 208 - <Login /> 209 - } 210 - }, 211 - None => VNode::from("404") 212 - } 213 - } 214 - } 215 + match &self.route { 216 + None => html! { <Login /> }, 217 + Some(route) => match AppRoute::switch(route.clone()) { 218 + Some(AppRoute::MainView) => html! { <MainView /> }, 219 + Some(AppRoute::Login) => html! { <Login /> }, 220 + None => VNode::from("404"), 221 + }, 222 } 223 } 224 } 225 diff --git a/src/app/views/login.rs b/src/app/views/login.rs 226 index 2272e14..effbfde 100644 227 --- a/src/app/views/login.rs 228 +++ b/src/app/views/login.rs 229 @@ -87,42 +87,37 @@ impl Component for Login { 230 self.state.loading = true; 231 true 232 } 233 - Msg::NewMessage(response) => { 234 - match response { 235 - Response::Error(error) => { 236 - match error.clone() { 237 - MatrixError::MissingFields(field) => { 238 - self.state.loading = false; 239 - self.state.error = Some(error.to_string()); 240 - self.state.error_field = Some(field); 241 - true 242 - } 243 - MatrixError::LoginTimeout => { 244 - // If we had less than 10 tries try again 245 - if self.state.retries < 10 { 246 - self.state.retries += 1; 247 - info!("Trying login again in 5 seconds"); 248 - sleep(Duration::from_secs(5)); 249 - self.link.send_message(Msg::Login); 250 - false 251 - } else { 252 - self.state.loading = false; 253 - self.state.error = 254 - Some("Login failed after 10 tries.".to_string()); 255 - true 256 - } 257 - } 258 - MatrixError::SDKError(e) => { 259 - // TODO handle login error != timeout better 260 - error!("SDK Error: {}", e); 261 - false 262 - } 263 - _ => false, 264 + Msg::NewMessage(Response::Error(error)) => { 265 + match &error { 266 + MatrixError::MissingFields(field) => { 267 + self.state.loading = false; 268 + self.state.error = Some(error.to_string()); 269 + self.state.error_field = Some(field.clone()); 270 + true 271 + } 272 + MatrixError::LoginTimeout => { 273 + // If we had less than 10 tries try again 274 + if self.state.retries < 10 { 275 + self.state.retries += 1; 276 + info!("Trying login again in 5 seconds"); 277 + sleep(Duration::from_secs(5)); 278 + self.link.send_message(Msg::Login); 279 + false 280 + } else { 281 + self.state.loading = false; 282 + self.state.error = Some("Login failed after 10 tries.".to_string()); 283 + true 284 } 285 } 286 + MatrixError::SDKError(e) => { 287 + // TODO handle login error != timeout better 288 + error!("SDK Error: {}", e); 289 + false 290 + } 291 _ => false, 292 } 293 } 294 + Msg::NewMessage(_) => false, 295 } 296 } 297 298 @@ -152,6 +147,22 @@ impl Component for Login { 299 </div> 300 } 301 } else { 302 + let error = match &self.state.error { 303 + Some(v) => html! { 304 + <h4 class="error"> 305 + { 306 + tr!( 307 + // {0} is the Error that happened on login 308 + // The error message of the Login page 309 + "Error: {0}", 310 + v 311 + ) 312 + } 313 + </h4> 314 + }, 315 + None => html! {}, 316 + }; 317 + 318 html! { 319 <> 320 <div class="login-page-bg"></div> 321 @@ -168,29 +179,9 @@ impl Component for Login { 322 ) 323 } 324 </h1> 325 - { 326 - match &self.state.error { 327 - Some(v) => { 328 - html! { 329 - <h4 class="error"> 330 - { 331 - tr!( 332 - // {0} is the Error that happened on login 333 - // The error message of the Login page 334 - "Error: {0}", 335 - v 336 - ) 337 - } 338 - </h4> 339 - } 340 - } 341 - None => { 342 - html!{} 343 - } 344 - } 345 - } 346 + { error } 347 348 - <form id="login_form" onsubmit=self.link.callback(|e: FocusEvent| {e.prevent_default(); Msg::Login})> 349 + <form id="login_form" onsubmit=self.link.callback(|e: FocusEvent| { e.prevent_default(); Msg::Login })> 350 <div class="login-inline login-input-first"> 351 <span class="material-icons login-icons" id="ma-icon" style="font-size: 28px !important;">{"http"}</span> 352 <input