commit 7b90ee745d7d2805c7edcd9eb408b8043dfdde33
parent 6dcaaa1d8a153712aab188d11dea80885bca358d
Author: Marcel <mtrnord1@gmail.com>
Date: Fri, 10 Jul 2020 17:31:40 +0200
Some more migration to the monorepo
Took 39 minutes
Diffstat:
10 files changed, 136 insertions(+), 97 deletions(-)
diff --git a/src/app/components/event_list.rs b/src/app/components/event_list.rs
@@ -2,7 +2,7 @@ use std::{collections::HashMap, rc::Rc};
use log::*;
use matrix_sdk::{
- events::room::message::{MessageEvent, MessageEventContent},
+ events::{room::message::MessageEventContent, AnyMessageEventContent, AnyMessageEventStub},
identifiers::RoomId,
Room,
};
@@ -24,7 +24,7 @@ pub struct EventList {
#[derive(Default)]
pub struct State {
// TODO handle all events
- pub events: HashMap<RoomId, Vec<MessageEvent>>,
+ pub events: HashMap<RoomId, Vec<AnyMessageEventStub>>,
}
#[allow(clippy::large_enum_variant)]
@@ -74,7 +74,7 @@ impl Component for EventList {
if self.state.events.contains_key(&room_id) {
if !(self.state.events[&room_id]
.iter()
- .any(|x| x.event_id == msg.event_id))
+ .any(|x| x.event_id() == msg.event_id()))
{
self.state.events.get_mut(&room_id).unwrap().push(msg);
room_id == self.props.current_room.room_id
@@ -91,7 +91,7 @@ impl Component for EventList {
}
}
Response::OldMessages((room_id, messages)) => {
- let mut deserialized_messages: Vec<MessageEvent> = messages
+ let mut deserialized_messages: Vec<AnyMessageEventStub> = messages
.iter()
.map(|x| x.deserialize())
.filter_map(Result::ok)
@@ -175,53 +175,58 @@ impl Component for EventList {
impl EventList {
// Typeinspection of IDEA breaks with this :D
//noinspection RsTypeCheck
- fn get_event(&self, prev_event: Option<MessageEvent>, event: &MessageEvent) -> Html {
+ fn get_event(
+ &self,
+ prev_event: Option<AnyMessageEventStub>,
+ event: &AnyMessageEventStub,
+ ) -> Html {
// TODO make encryption supported
- match &event.content {
- MessageEventContent::Text(text_event) => {
- html! {
- <Text
- prev_event=prev_event.clone()
- event=event.clone()
- room=self.props.current_room.clone()
- text_event=text_event.clone()
- />
+ match &event.content() {
+ AnyMessageEventContent::RoomMessage(room_message) => match room_message {
+ MessageEventContent::Text(text_event) => {
+ html! {
+ <Text
+ prev_event=prev_event.clone()
+ event=event.clone()
+ room=self.props.current_room.clone()
+ text_event=text_event.clone()
+ />
+ }
}
- }
- MessageEventContent::Notice(notice_event) => {
- html! {
- <Notice
- prev_event=prev_event.clone()
- event=event.clone()
- room=self.props.current_room.clone()
- notice_event=notice_event.clone()
- />
+ MessageEventContent::Notice(notice_event) => {
+ html! {
+ <Notice
+ prev_event=prev_event.clone()
+ event=event.clone()
+ room=self.props.current_room.clone()
+ notice_event=notice_event.clone()
+ />
+ }
}
- }
- MessageEventContent::Image(image_event) => {
- html! {
- <Image
- prev_event=prev_event.clone()
- event=event.clone()
- room=self.props.current_room.clone()
- image_event=image_event.clone()
- />
+ MessageEventContent::Image(image_event) => {
+ html! {
+ <Image
+ prev_event=prev_event.clone()
+ event=event.clone()
+ room=self.props.current_room.clone()
+ image_event=image_event.clone()
+ />
+ }
}
- }
- MessageEventContent::Video(video_event) => {
- html! {
- <Video
- prev_event=prev_event.clone()
- event=event.clone()
- room=self.props.current_room.clone()
- video_event=video_event.clone()
- />
+ MessageEventContent::Video(video_event) => {
+ html! {
+ <Video
+ prev_event=prev_event.clone()
+ event=event.clone()
+ room=self.props.current_room.clone()
+ video_event=video_event.clone()
+ />
+ }
}
- }
- _ => {
- html! {}
- }
+ _ => html! {},
+ },
+ _ => html! {},
}
}
}
diff --git a/src/app/components/events/image.rs b/src/app/components/events/image.rs
@@ -2,7 +2,10 @@ use std::rc::Rc;
use crate::app::components::events::{get_sender_displayname, is_new_user};
use matrix_sdk::{
- events::room::message::{ImageMessageEventContent, MessageEvent},
+ events::{
+ room::message::{ImageMessageEventContent, MessageEvent},
+ AnyMessageEventStub,
+ },
Room,
};
use rand::random;
@@ -15,8 +18,8 @@ pub(crate) struct Image {
#[derive(Clone, Properties, Debug)]
pub struct Props {
#[prop_or_default]
- pub prev_event: Option<MessageEvent>,
- pub event: MessageEvent,
+ pub prev_event: Option<AnyMessageEventStub>,
+ pub event: AnyMessageEventStub,
pub image_event: ImageMessageEventContent,
pub room: Rc<Room>,
}
diff --git a/src/app/components/events/mod.rs b/src/app/components/events/mod.rs
@@ -1,34 +1,42 @@
-use crate::app::matrix::types::get_media_download_url;
-use matrix_sdk::events::{MessageEventStub, MessageEventContent};
+use matrix_sdk::events::AnyMessageEventStub;
use matrix_sdk::Room;
use url::Url;
+use crate::app::matrix::types::get_media_download_url;
+
pub mod image;
pub mod notice;
pub mod text;
pub mod video;
-pub fn is_new_user<C: MessageEventContent>(prev_event: Option<&MessageEventStub<C>>, event: &MessageEventStub<C>) -> bool {
+pub fn is_new_user(prev_event: Option<&AnyMessageEventStub>, event: &AnyMessageEventStub) -> bool {
if let Some(prev_event) = prev_event {
- prev_event.sender != event.sender
+ prev_event.sender() != event.sender()
} else {
true
}
}
-pub fn get_sender_displayname<'a, C: MessageEventContent>(room: &'a Room, event: &'a MessageEventStub<C>) -> &'a str {
+pub fn get_sender_displayname<'a>(room: &'a Room, event: &'a AnyMessageEventStub) -> &'a str {
room.joined_members
- .get(&event.sender)
- .or_else(|| room.invited_members.get(&event.sender))
+ .get(&event.sender())
+ .or_else(|| room.invited_members.get(&event.sender()))
.and_then(|member| member.display_name.as_deref())
- .unwrap_or_else(|| event.sender.as_deref())
+ .unwrap_or_else(|| event.sender().as_str())
}
-pub fn get_sender_avatar<'a, C: MessageEventContent>(homeserver_url: &'a Url, room: &'a Room, event: &'a MessageEventStub<C>) -> Option<Url> {
+pub fn get_sender_avatar<'a>(
+ homeserver_url: &'a Url,
+ room: &'a Room,
+ event: &'a AnyMessageEventStub,
+) -> Option<Url> {
let member = room
.joined_members
- .get(&event.sender)
- .or_else(|| room.invited_members.get(&event.sender))?;
+ .get(&event.sender())
+ .or_else(|| room.invited_members.get(&event.sender()))?;
- Some(get_media_download_url(homeserver_url, member.avatar_url.as_deref()?))
+ Some(get_media_download_url(
+ homeserver_url,
+ member.avatar_url.as_deref()?,
+ ))
}
diff --git a/src/app/components/events/notice.rs b/src/app/components/events/notice.rs
@@ -2,7 +2,10 @@ use std::rc::Rc;
use linkify::LinkFinder;
use matrix_sdk::{
- events::room::message::{MessageEvent, NoticeMessageEventContent},
+ events::{
+ room::message::{MessageEvent, NoticeMessageEventContent},
+ AnyMessageEventStub,
+ },
Room,
};
use web_sys::Node;
@@ -18,8 +21,8 @@ pub(crate) struct Notice {
#[derive(Clone, Properties, Debug)]
pub struct Props {
#[prop_or_default]
- pub prev_event: Option<MessageEvent>,
- pub event: MessageEvent,
+ pub prev_event: Option<AnyMessageEventStub>,
+ pub event: AnyMessageEventStub,
pub notice_event: NoticeMessageEventContent,
pub room: Rc<Room>,
}
diff --git a/src/app/components/events/text.rs b/src/app/components/events/text.rs
@@ -3,7 +3,10 @@ use std::rc::Rc;
use crate::app::components::events::{get_sender_displayname, is_new_user};
use linkify::LinkFinder;
use matrix_sdk::{
- events::room::message::{MessageEvent, TextMessageEventContent},
+ events::{
+ room::message::{MessageEvent, TextMessageEventContent},
+ AnyMessageEventStub,
+ },
Room,
};
use web_sys::Node;
@@ -17,8 +20,8 @@ pub struct Text {
#[derive(Clone, Properties, Debug)]
pub struct Props {
#[prop_or_default]
- pub prev_event: Option<MessageEvent>,
- pub event: MessageEvent,
+ pub prev_event: Option<AnyMessageEventStub>,
+ pub event: AnyMessageEventStub,
pub text_event: TextMessageEventContent,
pub room: Rc<Room>,
}
diff --git a/src/app/components/events/video.rs b/src/app/components/events/video.rs
@@ -2,7 +2,10 @@ use std::rc::Rc;
use crate::app::components::events::{get_sender_displayname, is_new_user};
use matrix_sdk::{
- events::room::message::{MessageEvent, VideoMessageEventContent},
+ events::{
+ room::message::{MessageEvent, VideoMessageEventContent},
+ AnyMessageEventStub,
+ },
Room,
};
use rand::random;
@@ -15,8 +18,8 @@ pub(crate) struct Video {
#[derive(Clone, Properties, Debug)]
pub struct Props {
#[prop_or_default]
- pub prev_event: Option<MessageEvent>,
- pub event: MessageEvent,
+ pub prev_event: Option<AnyMessageEventStub>,
+ pub event: AnyMessageEventStub,
pub video_event: VideoMessageEventContent,
pub room: Rc<Room>,
}
diff --git a/src/app/components/room_list/item.rs b/src/app/components/room_list/item.rs
@@ -1,6 +1,10 @@
use std::rc::Rc;
-use matrix_sdk::{events::room::message::MessageEventContent, identifiers::RoomId, Room};
+use matrix_sdk::{
+ events::{room::message::MessageEventContent, AnyMessageEventContent},
+ identifiers::RoomId,
+ Room,
+};
use yew::prelude::*;
use yewtil::NeqAssign;
@@ -50,7 +54,9 @@ impl Component for RoomItem {
let last_message = match room.messages.iter().last() {
None => "".to_string(),
Some(m) => {
- if let MessageEventContent::Text(text_event) = m.content.clone() {
+ if let AnyMessageEventContent::RoomMessage(MessageEventContent::Text(text_event)) =
+ m.content.clone()
+ {
text_event.body.clone()
} else {
"".to_string()
diff --git a/src/app/matrix/mod.rs b/src/app/matrix/mod.rs
@@ -5,12 +5,11 @@ use log::*;
use matrix_sdk::{
api::r0::{filter::RoomEventFilter, message::get_message_events::Direction},
events::{
- AnyRoomEvent,
room::message::{
FormattedBody, MessageEvent, MessageEventContent, MessageFormat,
TextMessageEventContent,
},
- EventJson,
+ AnyMessageEventStub, AnyRoomEvent, EventJson, AnyMessageEvent,
},
identifiers::RoomId,
locks::RwLock,
@@ -66,7 +65,7 @@ pub enum Response {
Error(MatrixError),
LoggedIn(bool),
// TODO properly handle sync events
- Sync((RoomId, EventJson<MessageEvent>)),
+ Sync((RoomId, EventJson<AnyMessageEventStub>)),
JoinedRoomSync(RoomId),
SyncPing,
OldMessages((RoomId, Vec<EventJson<MessageEvent>>)),
@@ -256,13 +255,16 @@ impl Agent for MatrixAgent {
spawn_local(async move {
let mut builder = match from {
Some(from) => MessagesRequestBuilder::new(room_id.clone(), from),
- None => MessagesRequestBuilder::new(room_id.clone(), agent
- .matrix_client
- .as_ref()
- .unwrap()
- .sync_token()
- .await
- .unwrap()),
+ None => MessagesRequestBuilder::new(
+ room_id.clone(),
+ agent
+ .matrix_client
+ .as_ref()
+ .unwrap()
+ .sync_token()
+ .await
+ .unwrap(),
+ ),
};
let filter = RoomEventFilter {
types: Some(vec!["m.room.message".to_string()]),
@@ -272,7 +274,8 @@ impl Agent for MatrixAgent {
builder = (*builder
.filter(filter)
.direction(Direction::Backward)
- .limit(30)).clone();
+ .limit(30))
+ .clone();
// TODO handle error gracefully
let messsages = agent
@@ -296,7 +299,7 @@ impl Agent for MatrixAgent {
for event in deserialized_events.into_iter().rev() {
// TODO deduplicate betweeen this and sync
- if let AnyRoomEvent::RoomMessage(mut event) = event {
+ if let AnyRoomEvent::Message(AnyMessageEvent::RoomMessage(mut event)) = event {
if let MessageEventContent::Image(mut image_event) =
event.clone().content
{
@@ -332,7 +335,8 @@ impl Agent for MatrixAgent {
let new_url = Some(get_media_download_url(
agent.matrix_client.as_ref().unwrap().homeserver(),
&thumbnail_url,
- )).unwrap();
+ ))
+ .unwrap();
info.thumbnail_url = Some(new_url.to_string());
}
video_event.info = Some(info);
diff --git a/src/app/matrix/sync.rs b/src/app/matrix/sync.rs
@@ -7,11 +7,8 @@ use log::*;
use matrix_sdk::{
api::r0::sync::sync_events::Response as SyncResponse,
events::{
- AnyRoomEventStub,
- AnyStateEventStub,
- AnyMessageEventStub,
- room::message::MessageEventContent,
- EventJson,
+ room::message::MessageEventContent, AnyMessageEventStub, AnyRoomEventStub,
+ AnyStateEventStub, EventJson,
},
identifiers::RoomId,
locks::RwLock,
@@ -84,7 +81,8 @@ impl Sync {
async fn on_room_message(&self, room_id: &RoomId, event: AnyRoomEventStub) {
// TODO handle all messages...
- if let AnyRoomEventStub::State(AnyStateEventStub::RoomCreate(_create_event)) = event.clone() {
+ if let AnyRoomEventStub::State(AnyStateEventStub::RoomCreate(_create_event)) = event.clone()
+ {
info!("Sent JoinedRoomSync Timeline");
let resp = Response::JoinedRoomSync(room_id.clone());
self.callback.emit(resp);
@@ -133,7 +131,8 @@ impl Sync {
*image_url = get_media_download_url(
self.matrix_client.clone().homeserver(),
&old_image_url,
- ).to_string();
+ )
+ .to_string();
}
if let Some(info) = &mut image_event.info {
@@ -142,7 +141,8 @@ impl Sync {
*thumbnail_url = get_media_download_url(
self.matrix_client.clone().homeserver(),
&old_thumbnail_url,
- ).to_string();
+ )
+ .to_string();
}
}
}
@@ -152,7 +152,8 @@ impl Sync {
*video_url = get_video_media_download_url(
self.matrix_client.clone().homeserver(),
old_video_url,
- ).to_string();
+ )
+ .to_string();
}
if let Some(info) = &mut video_event.info {
@@ -161,7 +162,8 @@ impl Sync {
*thumbnail_url = get_media_download_url(
self.matrix_client.clone().homeserver(),
&old_thumbnail_url,
- ).to_string();
+ )
+ .to_string();
}
}
}
diff --git a/src/utils/notifications.rs b/src/utils/notifications.rs
@@ -1,7 +1,7 @@
+use url::Url;
use wasm_bindgen::prelude::*;
use wasm_bindgen::JsCast;
use web_sys::{Notification, NotificationOptions, NotificationPermission};
-use url::Url;
#[derive(Clone)]
pub(crate) struct Notifications {
@@ -35,7 +35,9 @@ impl Notifications {
}
}) as Box<dyn FnMut()>);
- if let Err(_e) = Notification::request_permission_with_permission_callback(cb.as_ref().unchecked_ref()) {
+ if let Err(_e) = Notification::request_permission_with_permission_callback(
+ cb.as_ref().unchecked_ref(),
+ ) {
// Noop to please clippy/rust compiler
}
cb.forget();
@@ -52,7 +54,7 @@ impl Notifications {
Some(avatar) => {
let url = avatar.to_string();
options_1.icon(&url)
- },
+ }
};
if let Err(_e) = Notification::new_with_options(&self.displayname, &options) {
// Noop to please clippy/rust compiler