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:
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;
+ });
+
+ }
}
}