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 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:
Msrc/app/components/event_list.rs | 50+++++++++++++++++++++++++++++++++++++-------------
Msrc/app/components/room_list.rs | 19+++++++++++++++----
Msrc/app/matrix.rs | 10++++------
Msrc/app/matrix/types.rs | 7+++++--
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()