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 cae92d2c5ad5caae149cadbac7048ad7535bcf61
parent 9390564f21242d6506eb2b113791af53d83b63a4
Author: Marcel <mtrnord1@gmail.com>
Date:   Thu, 28 May 2020 21:43:13 +0200

Add basic message sending

Took 31 minutes

Diffstat:
Msrc/app/components/event_list.rs | 50++++++++++++++++++++++++++++++++++++++++++++++++--
Msrc/app/components/room_list.rs | 1-
Msrc/app/matrix.rs | 13++++++++++++-
3 files changed, 60 insertions(+), 4 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; +use matrix_sdk::identifiers::{RoomId, EventId}; use serde::{Deserialize, Serialize}; use yew::prelude::*; use yewtil::NeqAssign; @@ -19,10 +19,14 @@ pub struct EventList { pub struct State { // TODO handle all events pub events: LinkedHashSet<MessageWrapper>, + pub message: Option<String>, } pub enum Msg { NewMessage(Response), + SetMessage(String), + SendMessage, + Nope, } #[derive(Clone, PartialEq, Properties)] @@ -43,6 +47,7 @@ impl Component for EventList { let state = State { events: Default::default(), + message: None }; if props.clone().current_room.is_some() { @@ -72,7 +77,16 @@ impl Component for EventList { match response { Response::Sync(msg) => { // TODO handle all events - self.state.events.insert(msg); + if !(self + .state + .events + .iter() + .map(|x|x.event_id.clone()) + .collect::<Vec<EventId>>() + .contains(&msg.event_id.clone())) + { + self.state.events.insert(msg); + } true } Response::OldMessages(messages) => { @@ -91,6 +105,22 @@ impl Component for EventList { _ => false, } } + Msg::SetMessage(message) => { + self.state.message = Some(message); + true + } + 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.state.message = None; + } + + true + } + Msg::Nope => { + false + } } } @@ -106,6 +136,22 @@ impl Component for EventList { { self.state.events.iter().filter(|x| x.room_id.clone().unwrap() == self.props.current_room.clone().unwrap()).map(|event| self.get_event(event.clone())).collect::<Html>() } <div id="anchor"></div> </div> + <form + onsubmit=self.link.callback(|e: FocusEvent| {e.prevent_default(); Msg::Nope}) + onkeypress=self.link.callback(|e: KeyboardEvent| { + if e.key() == "Enter" { Msg::SendMessage } else { Msg::Nope } + })> + <div class="uk-margin"> + <div class="uk-inline" style="display: block !important;"> + <span class="uk-form-icon" uk-icon="icon: pencil"></span> + <input class="uk-input" type="text" + value=&self.state.message.clone().unwrap_or("".to_string()) + oninput=self.link.callback(|e: InputData| Msg::SetMessage(e.value)) + + /> + </div> + </div> + </form> </div> }; } diff --git a/src/app/components/room_list.rs b/src/app/components/room_list.rs @@ -69,7 +69,6 @@ impl Component for RoomList { } // Handle new rooms from sync Response::Sync(msg) => { - info!("room_list sync_message: {:#?}", msg); if !(self .state .rooms diff --git a/src/app/matrix.rs b/src/app/matrix.rs @@ -8,7 +8,7 @@ use log::*; use matrix_sdk::{ api::r0::{filter::RoomEventFilter, message::get_message_events::Direction}, events::collections::all::RoomEvent, - events::room::message::MessageEventContent, + events::room::message::{MessageEventContent, TextMessageEventContent}, identifiers::RoomId, js_int::UInt, Client, ClientConfig, MessagesRequestBuilder, Room, Session, @@ -65,6 +65,7 @@ pub enum Request { StartSync, GetJoinedRooms, GetJoinedRoom(RoomId), + SendMessage((RoomId,String)) } #[derive(Serialize, Deserialize, Debug, Clone)] @@ -332,6 +333,16 @@ impl Agent for MatrixAgent { } }); } + Request::SendMessage((room_id,message)) => { + let client = self.matrix_client.clone().unwrap(); + let content = MessageEventContent::Text(TextMessageEventContent::new_plain( + message.clone() + )); + spawn_local(async move { + client.room_send(&room_id, content, None).await; + }); + + } } }