commit 5904c5c97812db400f3a74c0304072c58cead008
parent cae92d2c5ad5caae149cadbac7048ad7535bcf61
Author: Marcel <mtrnord1@gmail.com>
Date: Fri, 29 May 2020 07:09:57 +0200
Set clicked room elements to active and fix minor bugs
Took 43 minutes
Diffstat:
4 files changed, 61 insertions(+), 25 deletions(-)
diff --git a/src/app/components/event_list.rs b/src/app/components/event_list.rs
@@ -1,6 +1,6 @@
use linked_hash_set::LinkedHashSet;
use log::*;
-use matrix_sdk::identifiers::{RoomId, EventId};
+use matrix_sdk::identifiers::{EventId, RoomId};
use serde::{Deserialize, Serialize};
use yew::prelude::*;
use yewtil::NeqAssign;
@@ -18,6 +18,7 @@ pub struct EventList {
#[derive(Serialize, Deserialize, Default)]
pub struct State {
// TODO handle all events
+ // TODO use roomId based hashmap
pub events: LinkedHashSet<MessageWrapper>,
pub message: Option<String>,
}
@@ -29,7 +30,7 @@ pub enum Msg {
Nope,
}
-#[derive(Clone, PartialEq, Properties)]
+#[derive(Clone, PartialEq, Properties, Debug)]
pub struct Props {
#[prop_or_default]
pub current_room: Option<RoomId>,
@@ -47,7 +48,7 @@ impl Component for EventList {
let state = State {
events: Default::default(),
- message: None
+ message: None,
};
if props.clone().current_room.is_some() {
@@ -81,7 +82,7 @@ impl Component for EventList {
.state
.events
.iter()
- .map(|x|x.event_id.clone())
+ .map(|x| x.event_id.clone())
.collect::<Vec<EventId>>()
.contains(&msg.event_id.clone()))
{
@@ -91,14 +92,17 @@ impl Component for EventList {
}
Response::OldMessages(messages) => {
// TODO this doesn't seem smart
- let mut new_events_map = LinkedHashSet::new();
- for event in self.state.events.clone().into_iter() {
+ // let mut new_events_map = LinkedHashSet::new();
+ info!("{}", self.state.events.len());
+ self.state.events = self.state.events.clone().into_iter().chain(messages).collect();
+ info!("{}", self.state.events.len());
+ /*for event in self.state.events.clone().into_iter() {
new_events_map.insert(event);
}
- for event in messages.into_iter() {
+ for event in messages.clone().into_iter() {
new_events_map.insert(event);
}
- self.state.events = new_events_map;
+ self.state.events = new_events_map.clone();*/
true
}
@@ -112,20 +116,40 @@ impl Component for EventList {
Msg::SendMessage => {
info!("Sending Message");
if self.state.message.is_some() {
- self.matrix_agent.send(Request::SendMessage((self.props.current_room.clone().unwrap(), self.state.message.clone().unwrap())));
+ self.matrix_agent.send(Request::SendMessage((
+ self.props.current_room.clone().unwrap(),
+ self.state.message.clone().unwrap(),
+ )));
self.state.message = None;
}
true
}
- Msg::Nope => {
- false
- }
+ Msg::Nope => false,
}
}
fn change(&mut self, props: Self::Properties) -> bool {
- self.props.neq_assign(props)
+ if self.props != props {
+ info!("{:#?}", props);
+ if props.clone().current_room.is_some() {
+ let room_id = props.clone().current_room.clone().unwrap();
+ if self
+ .state
+ .events
+ .iter()
+ .filter(|x| x.room_id.clone().unwrap() == room_id)
+ .collect::<LinkedHashSet<&MessageWrapper>>()
+ .is_empty()
+ {
+ self.matrix_agent.send(Request::GetOldMessages((room_id.clone(), None)));
+ }
+ }
+ self.props = props;
+ true
+ } else {
+ false
+ }
}
fn view(&self) -> Html {
diff --git a/src/app/components/room_list.rs b/src/app/components/room_list.rs
@@ -26,7 +26,7 @@ pub enum Msg {
#[derive(Serialize, Deserialize, Default)]
pub struct State {
rooms: HashMap<RoomId, SmallRoom>,
- current_room: Option<RoomId>,
+ current_room: Option<String>,
loading: bool,
search_query: Option<String>,
}
@@ -96,8 +96,9 @@ impl Component for RoomList {
.filter(|(id, _)| **id == room)
.map(|(_, room)| room.name.clone())
.collect::<String>();
- self.props.change_room_callback.emit((displayname, room));
- false
+ self.props.change_room_callback.emit((displayname, room.clone()));
+ self.state.current_room = Some(room);
+ true
}
Msg::SetFilter(query) => {
self.state.search_query = Some(query);
@@ -153,9 +154,19 @@ impl RoomList {
fn get_room(&self, room: SmallRoom) -> Html {
// TODO better linking than onlclick (yew limitation?)
+ let classes = if self.state.current_room.clone().is_some() {
+ if self.state.current_room.clone().unwrap() == room.id.to_string() {
+ "uk-active"
+ } else {
+ ""
+ }
+ } else {
+ ""
+ };
+
let room_id = room.clone().id.to_string();
html! {
- <li>
+ <li class=classes>
<a onclick=self.link.callback(move |e: MouseEvent| Msg::ChangeRoom(room_id.clone()))>
{room.name.clone()}
{
diff --git a/src/app/matrix.rs b/src/app/matrix.rs
@@ -65,7 +65,7 @@ pub enum Request {
StartSync,
GetJoinedRooms,
GetJoinedRoom(RoomId),
- SendMessage((RoomId,String))
+ SendMessage((RoomId, String)),
}
#[derive(Serialize, Deserialize, Debug, Clone)]
@@ -333,15 +333,13 @@ impl Agent for MatrixAgent {
}
});
}
- Request::SendMessage((room_id,message)) => {
+ Request::SendMessage((room_id, message)) => {
let client = self.matrix_client.clone().unwrap();
- let content = MessageEventContent::Text(TextMessageEventContent::new_plain(
- message.clone()
- ));
+ let content =
+ MessageEventContent::Text(TextMessageEventContent::new_plain(message.clone()));
spawn_local(async move {
client.room_send(&room_id, content, None).await;
});
-
}
}
}
diff --git a/src/app/matrix/types.rs b/src/app/matrix/types.rs
@@ -4,7 +4,7 @@ use std::sync::Arc;
use futures_locks::RwLock;
use matrix_sdk::{
events::room::message::{MessageEvent, MessageEventContent, TextMessageEventContent},
- identifiers::{RoomId, UserId, EventId},
+ identifiers::{EventId, RoomId, UserId},
js_int::UInt,
Client, Room,
};
@@ -36,7 +36,10 @@ impl MessageWrapper {
.await
.unwrap();
let room = room.read().await;
- let member = room.members.get(&self.sender.clone()).unwrap();
+ let member = match room.members.get(&self.sender.clone()) {
+ None => {return self.sender.clone().to_string();},
+ Some(v) => {v},
+ };
member
.display_name
.as_ref()