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 0c787d4938f1f8e227ac4daf262875e4dfdaa0de
parent a51af1b923c57868391034d1fdae5034b8224599
Author: Jonas Platte <jplatte+git@posteo.de>
Date:   Fri,  3 Jul 2020 21:39:34 +0200

Make some properties not `Option`al

Diffstat:
Msrc/app/components/event_list.rs | 61++++++++++++++++++++++++++++---------------------------------
Msrc/app/components/events/image.rs | 23++++++-----------------
Msrc/app/components/events/notice.rs | 21++++++---------------
Msrc/app/components/events/text.rs | 23+++++++----------------
Msrc/app/components/events/video.rs | 29+++++++----------------------
Msrc/app/components/room_list/item.rs | 5++---
6 files changed, 56 insertions(+), 106 deletions(-)

diff --git a/src/app/components/event_list.rs b/src/app/components/event_list.rs @@ -36,8 +36,7 @@ pub enum Msg { #[derive(Clone, PartialEq, Properties, Debug)] pub struct Props { - #[prop_or_default] - pub current_room: Option<Rc<Room>>, + pub current_room: Rc<Room>, } impl Component for EventList { @@ -52,11 +51,9 @@ impl Component for EventList { events: Default::default(), }; - if props.current_room.is_some() { - let room_id = props.current_room.as_ref().unwrap().room_id.clone(); - if !state.events.contains_key(&room_id) { - matrix_agent.send(Request::GetOldMessages((room_id, None))); - } + let room_id = props.current_room.room_id.clone(); + if !state.events.contains_key(&room_id) { + matrix_agent.send(Request::GetOldMessages((room_id, None))); } EventList { @@ -80,15 +77,14 @@ impl Component for EventList { .any(|x| x.event_id == msg.event_id)) { self.state.events.get_mut(&room_id).unwrap().push(msg); - room_id - == self.props.current_room.as_ref().unwrap().room_id + room_id == self.props.current_room.room_id } else { false } } else { let msgs = vec![msg]; self.state.events.insert(room_id.clone(), msgs); - room_id == self.props.current_room.as_ref().unwrap().room_id + room_id == self.props.current_room.room_id } } else { false @@ -121,7 +117,7 @@ impl Component for EventList { Msg::SendMessage(message) => { info!("Sending Message"); self.matrix_agent.send(Request::SendMessage(( - self.props.current_room.as_ref().unwrap().room_id.clone(), + self.props.current_room.room_id.clone(), message, ))); false @@ -132,13 +128,12 @@ impl Component for EventList { fn change(&mut self, props: Self::Properties) -> bool { if self.props != props { - if props.current_room.is_some() { - let room_id = props.current_room.as_ref().unwrap().room_id.clone(); - if !self.state.events.contains_key(&room_id) { - self.matrix_agent - .send(Request::GetOldMessages((room_id, None))); - } + let room_id = props.current_room.room_id.clone(); + if !self.state.events.contains_key(&room_id) { + self.matrix_agent + .send(Request::GetOldMessages((room_id, None))); } + self.props = props; true } else { @@ -149,14 +144,14 @@ impl Component for EventList { fn view(&self) -> Html { return html! { <div class="event-list"> - <div class="room-title"><h1>{ self.props.current_room.as_ref().unwrap().display_name() }</h1></div> + <div class="room-title"><h1>{ self.props.current_room.display_name() }</h1></div> <div class="scrollable" style="height: auto; flex-grow: 1;"> <div class="message-container"> { - if self.state.events.contains_key(&self.props.current_room.as_ref().unwrap().room_id) { - let events = self.state.events[&self.props.current_room.as_ref().unwrap().room_id].clone(); + if self.state.events.contains_key(&self.props.current_room.room_id) { + let events = self.state.events[&self.props.current_room.room_id].clone(); let mut elements: Vec<Html> = Vec::new(); - for (pos, event) in self.state.events[&self.props.current_room.as_ref().unwrap().room_id].iter().enumerate() { + for (pos, event) in self.state.events[&self.props.current_room.room_id].iter().enumerate() { if pos == 0 { elements.push(self.get_event(None, event)); } else { @@ -188,9 +183,9 @@ impl EventList { html! { <Text prev_event=prev_event.clone() - event=Some(event.clone()) - room=Some(self.props.current_room.clone().unwrap()) - text_event=Some(text_event.clone()) + event=event.clone() + room=self.props.current_room.clone() + text_event=text_event.clone() /> } } @@ -198,9 +193,9 @@ impl EventList { html! { <Notice prev_event=prev_event.clone() - event=Some(event.clone()) - room=Some(self.props.current_room.clone().unwrap()) - notice_event=Some(notice_event.clone()) + event=event.clone() + room=self.props.current_room.clone() + notice_event=notice_event.clone() /> } } @@ -208,9 +203,9 @@ impl EventList { html! { <Image prev_event=prev_event.clone() - event=Some(event.clone()) - room=Some(self.props.current_room.clone().unwrap()) - image_event=Some(image_event.clone()) + event=event.clone() + room=self.props.current_room.clone() + image_event=image_event.clone() /> } } @@ -218,9 +213,9 @@ impl EventList { html! { <Video prev_event=prev_event.clone() - event=Some(event.clone()) - room=Some(self.props.current_room.clone().unwrap()) - video_event=Some(video_event.clone()) + event=event.clone() + room=self.props.current_room.clone() + video_event=video_event.clone() /> } } diff --git a/src/app/components/events/image.rs b/src/app/components/events/image.rs @@ -16,12 +16,9 @@ pub(crate) struct Image { pub struct Props { #[prop_or_default] pub prev_event: Option<MessageEvent>, - #[prop_or_default] - pub event: Option<MessageEvent>, - #[prop_or_default] - pub image_event: Option<ImageMessageEventContent>, - #[prop_or_default] - pub room: Option<Rc<Room>>, + pub event: MessageEvent, + pub image_event: ImageMessageEventContent, + pub room: Rc<Room>, } impl Component for Image { @@ -49,25 +46,17 @@ impl Component for Image { //noinspection RsTypeCheck fn view(&self) -> Html { - let new_user = is_new_user( - self.props.prev_event.as_ref(), - self.props.event.as_ref().unwrap(), - ); + let new_user = is_new_user(self.props.prev_event.as_ref(), &self.props.event); let sender_displayname = if new_user { - get_sender_displayname( - self.props.room.as_ref().unwrap(), - self.props.event.as_ref().unwrap(), - ) + get_sender_displayname(&self.props.room, &self.props.event) } else { "".to_string() }; - if let Some(image_url) = &self.props.image_event.as_ref().unwrap().url { + if let Some(image_url) = &self.props.image_event.url { let thumbnail = self .props .image_event - .as_ref() - .unwrap() .info .as_ref() .unwrap() diff --git a/src/app/components/events/notice.rs b/src/app/components/events/notice.rs @@ -19,12 +19,9 @@ pub(crate) struct Notice { pub struct Props { #[prop_or_default] pub prev_event: Option<MessageEvent>, - #[prop_or_default] - pub event: Option<MessageEvent>, - #[prop_or_default] - pub notice_event: Option<NoticeMessageEventContent>, - #[prop_or_default] - pub room: Option<Rc<Room>>, + pub event: MessageEvent, + pub notice_event: NoticeMessageEventContent, + pub room: Rc<Room>, } impl Component for Notice { @@ -52,20 +49,14 @@ impl Component for Notice { //noinspection RsTypeCheck fn view(&self) -> Html { - let new_user = is_new_user( - self.props.prev_event.as_ref(), - self.props.event.as_ref().unwrap(), - ); + let new_user = is_new_user(self.props.prev_event.as_ref(), &self.props.event); let sender_displayname = if new_user { - get_sender_displayname( - self.props.room.as_ref().unwrap(), - self.props.event.as_ref().unwrap(), - ) + get_sender_displayname(&self.props.room, &self.props.event) } else { "".to_string() }; - let mut pure_content = self.props.notice_event.as_ref().unwrap().body.clone(); + let mut pure_content = self.props.notice_event.body.clone(); let finder = LinkFinder::new(); let pure_content_clone = pure_content.clone(); let links: Vec<_> = finder.links(&pure_content_clone).collect(); diff --git a/src/app/components/events/text.rs b/src/app/components/events/text.rs @@ -18,12 +18,9 @@ pub struct Text { pub struct Props { #[prop_or_default] pub prev_event: Option<MessageEvent>, - #[prop_or_default] - pub event: Option<MessageEvent>, - #[prop_or_default] - pub text_event: Option<TextMessageEventContent>, - #[prop_or_default] - pub room: Option<Rc<Room>>, + pub event: MessageEvent, + pub text_event: TextMessageEventContent, + pub room: Rc<Room>, } impl Component for Text { @@ -51,20 +48,14 @@ impl Component for Text { //noinspection RsTypeCheck fn view(&self) -> Html { - let new_user = is_new_user( - self.props.prev_event.as_ref(), - self.props.event.as_ref().unwrap(), - ); + let new_user = is_new_user(self.props.prev_event.as_ref(), &self.props.event); let sender_displayname = if new_user { - get_sender_displayname( - self.props.room.as_ref().unwrap(), - self.props.event.as_ref().unwrap(), - ) + get_sender_displayname(&self.props.room, &self.props.event) } else { "".to_string() }; - let mut pure_content = self.props.text_event.as_ref().unwrap().body.clone(); + let mut pure_content = self.props.text_event.body.clone(); let finder = LinkFinder::new(); let pure_content_clone = pure_content.clone(); let links: Vec<_> = finder.links(&pure_content_clone).collect(); @@ -79,7 +70,7 @@ impl Component for Text { pure_content }; - if let Some(formatted) = &self.props.text_event.as_ref().unwrap().formatted { + if let Some(formatted) = &self.props.text_event.formatted { let format_slot; let message = if new_user { format_slot = format!( diff --git a/src/app/components/events/video.rs b/src/app/components/events/video.rs @@ -16,12 +16,9 @@ pub(crate) struct Video { pub struct Props { #[prop_or_default] pub prev_event: Option<MessageEvent>, - #[prop_or_default] - pub event: Option<MessageEvent>, - #[prop_or_default] - pub video_event: Option<VideoMessageEventContent>, - #[prop_or_default] - pub room: Option<Rc<Room>>, + pub event: MessageEvent, + pub video_event: VideoMessageEventContent, + pub room: Rc<Room>, } impl Component for Video { @@ -49,31 +46,19 @@ impl Component for Video { //noinspection RsTypeCheck fn view(&self) -> Html { - let new_user = is_new_user( - self.props.prev_event.as_ref(), - self.props.event.as_ref().unwrap(), - ); + let new_user = is_new_user(self.props.prev_event.as_ref(), &self.props.event); let sender_displayname = if new_user { - get_sender_displayname( - self.props.room.as_ref().unwrap(), - self.props.event.as_ref().unwrap(), - ) + get_sender_displayname(&self.props.room, &self.props.event) } else { "".to_string() }; - let _caption = format!( - "{}: {}", - sender_displayname, - self.props.video_event.as_ref().unwrap().body - ); + let _caption = format!("{}: {}", sender_displayname, self.props.video_event.body); - if let Some(video_url) = self.props.video_event.as_ref().unwrap().url.as_ref() { + if let Some(video_url) = self.props.video_event.url.as_ref() { let thumbnail = self .props .video_event - .as_ref() - .unwrap() .info .as_ref() .unwrap() diff --git a/src/app/components/room_list/item.rs b/src/app/components/room_list/item.rs @@ -15,8 +15,7 @@ pub enum Msg { #[derive(Clone, Properties, Debug, PartialEq)] pub struct Props { - #[prop_or_default] - pub room: Option<Rc<Room>>, + pub room: Rc<Room>, #[prop_or_default] pub change_room_callback: Callback<RoomId>, @@ -45,7 +44,7 @@ impl Component for RoomItem { //noinspection RsTypeCheck fn view(&self) -> Html { - let room = self.props.room.clone().unwrap(); + let room = self.props.room.clone(); // TODO placeholder for encrypted rooms let last_message = match room.messages.iter().last() {