daydream.meta

Issues/PRs archive for daydream-mx/Daydream
git clone git://archive.git.mtrnord.blog/daydream-mx/daydream.meta.git
Log | Files | Refs

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