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 8590e3b1fc3d0e9c6d62096126dad2083666b273
parent 0a9e8a09ce25b5672b20f18e068d66136d756d28
Author: Jonas Platte <jplatte+git@posteo.de>
Date:   Fri,  3 Jul 2020 20:32:09 +0200

Simplify random code

Diffstat:
Msrc/app/components/events/mod.rs | 17+++++++----------
Msrc/app/components/events/notice.rs | 11++++-------
Msrc/app/components/events/text.rs | 25+++++++------------------
Msrc/app/components/room_list/item.rs | 6++++--
Msrc/app/matrix/sync.rs | 57+++++++++++++++++++++++++++------------------------------
Msrc/app/views/main_view.rs | 20+++++++++-----------
6 files changed, 58 insertions(+), 78 deletions(-)

diff --git a/src/app/components/events/mod.rs b/src/app/components/events/mod.rs @@ -28,14 +28,11 @@ pub fn get_sender_displayname(room: Room, event: MessageEvent) -> String { } pub fn get_sender_avatar(homeserver_url: Url, room: Room, event: MessageEvent) -> Option<String> { - match room.members.get(&event.sender) { - None => None, - Some(member) => { - let avatar_url_mxc = member.avatar_url.as_ref().map(ToString::to_string); - match avatar_url_mxc { - None => None, - Some(v) => Some(get_media_download_url(&homeserver_url, v)), - } - } - } + room.members.get(&event.sender).and_then(|member| { + member + .avatar_url + .as_ref() + .map(ToString::to_string) + .map(|v| get_media_download_url(&homeserver_url, v)) + }) } diff --git a/src/app/components/events/notice.rs b/src/app/components/events/notice.rs @@ -68,20 +68,17 @@ impl Component for Notice { let pure_content_clone = pure_content.clone(); let links: Vec<_> = finder.links(&pure_content_clone).collect(); - let content = if !links.is_empty() { + if !links.is_empty() { for link in links { let html_link = format!("<a href={}>{}</a>", link.as_str(), link.as_str()); pure_content.replace_range(link.start()..link.end(), &html_link); } - pure_content - } else { - pure_content - }; + } if new_user { let full_html = format!( "<p style=\"opacity: .6;\"><displayname>{}: </displayname>{}</p>", - sender_displayname, content + sender_displayname, pure_content ); let js_text_event = { let div = web_sys::window() @@ -96,7 +93,7 @@ impl Component for Notice { let node = Node::from(js_text_event); VNode::VRef(node) } else { - let full_html = format!("<p style=\"opacity: .6;\">{}</p>", content); + let full_html = format!("<p style=\"opacity: .6;\">{}</p>", pure_content); let js_text_event = { let div = web_sys::window() .unwrap() diff --git a/src/app/components/events/text.rs b/src/app/components/events/text.rs @@ -77,27 +77,16 @@ impl Component for Text { pure_content }; - if self.props.text_event.clone().unwrap().formatted.is_some() { + if let Some(formatted) = &self.props.text_event.as_ref().unwrap().formatted { + let format_slot; let message = if new_user { - format!( + format_slot = format!( "<displayname>{}:</displayname> {}", - sender_displayname, - self.props - .text_event - .clone() - .unwrap() - .formatted - .unwrap() - .body - ) + sender_displayname, formatted.body + ); + &format_slot } else { - self.props - .text_event - .clone() - .unwrap() - .formatted - .unwrap() - .body + &formatted.body }; let js_text_event = { let div = web_sys::window() diff --git a/src/app/components/room_list/item.rs b/src/app/components/room_list/item.rs @@ -46,7 +46,7 @@ impl Component for RoomItem { let room = self.props.room.clone().unwrap(); // TODO placeholder for encrypted rooms - let last_message = match self.props.room.as_ref().unwrap().messages.iter().last() { + let last_message = match room.messages.iter().last() { None => "".to_string(), Some(m) => { if let MessageEventContent::Text(text_event) = &m.content { @@ -57,6 +57,8 @@ impl Component for RoomItem { } }; + let display_name = room.display_name(); + html! { <div class="room-list-item"> <a onclick=self.link.callback(move |e: MouseEvent| Msg::ChangeRoom(room.clone()))> @@ -64,7 +66,7 @@ impl Component for RoomItem { // TODO remove placeholder <img class="avatar" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAYAAACM/rhtAAAARUlEQVRYhe3OMQ0AIADAMBKUowmBoIKMo0f/jrnX+dmoA4KCdUBQsA4ICtYBQcE6IChYBwQF64CgYB0QFKwDgoJ1QPC1C8gY0kSgNLTWAAAAAElFTkSuQmCC"/> <div> - <h5 class="name">{self.props.room.as_ref().unwrap().display_name()}</h5> + <h5 class="name">{display_name}</h5> <p class="latest-msg">{last_message}</p> </div> </div> diff --git a/src/app/matrix/sync.rs b/src/app/matrix/sync.rs @@ -1,3 +1,4 @@ +use std::mem; use std::sync::Arc; use std::sync::Mutex; use std::time::Duration; @@ -124,47 +125,43 @@ impl Sync { }); } } - if let MessageEventContent::Image(mut image_event) = event.clone().content { - if image_event.url.is_some() { - let new_url = Some(get_media_download_url( + if let MessageEventContent::Image(image_event) = &mut event.content { + if let Some(image_url) = &mut image_event.url { + let old_image_url = mem::take(image_url); + *image_url = get_media_download_url( self.matrix_client.clone().homeserver(), - image_event.url.unwrap(), - )); - image_event.url = new_url; + old_image_url, + ); } - if image_event.info.is_some() { - let mut info = image_event.info.unwrap(); - if info.thumbnail_url.is_some() { - let new_url = Some(get_media_download_url( + + if let Some(info) = &mut image_event.info { + if let Some(thumbnail_url) = &mut info.thumbnail_url { + let old_thumbnail_url = mem::take(thumbnail_url); + *thumbnail_url = get_media_download_url( self.matrix_client.clone().homeserver(), - info.thumbnail_url.unwrap(), - )); - info.thumbnail_url = new_url; + old_thumbnail_url, + ); } - image_event.info = Some(info); } - event.content = MessageEventContent::Image(image_event); } - if let MessageEventContent::Video(mut video_event) = event.content { - if video_event.url.is_some() { - let new_url = Some(get_video_media_download_url( + if let MessageEventContent::Video(video_event) = &mut event.content { + if let Some(video_url) = &mut video_event.url { + let old_video_url = mem::take(video_url); + *video_url = get_video_media_download_url( self.matrix_client.clone().homeserver(), - video_event.url.unwrap(), - )); - video_event.url = new_url; + old_video_url, + ); } - if video_event.info.is_some() { - let mut info = video_event.info.unwrap(); - if info.thumbnail_url.is_some() { - let new_url = Some(get_media_download_url( + + if let Some(info) = &mut video_event.info { + if let Some(thumbnail_url) = &mut info.thumbnail_url { + let old_thumbnail_url = mem::take(thumbnail_url); + *thumbnail_url = get_media_download_url( self.matrix_client.clone().homeserver(), - info.thumbnail_url.unwrap(), - )); - info.thumbnail_url = new_url; + old_thumbnail_url, + ); } - video_event.info = Some(info); } - event.content = MessageEventContent::Video(video_event); } let serialized_event = EventJson::from(event); diff --git a/src/app/views/main_view.rs b/src/app/views/main_view.rs @@ -55,8 +55,8 @@ impl Component for MainView { //noinspection RsTypeCheck fn view(&self) -> Html { - if self.state.current_room.is_none() { - html! { + match &self.state.current_room { + None => html! { <div class="uk-flex auto-scrollable-container uk-background-default" style="height: 100%"> <RoomList change_room_callback=self.link.callback(Msg::ChangeRoom)/> @@ -66,13 +66,12 @@ impl Component for MainView { </div> </div> </div> - } - } else if self.state.current_room.as_ref().unwrap().is_encrypted() { - html! { + }, + Some(room) if room.is_encrypted() => html! { <div class="uk-flex auto-scrollable-container" style="height: 100%"> <RoomList change_room_callback=self.link.callback(Msg::ChangeRoom)/> <div class="event-list"> - <div class="room-title"><h1>{ self.state.current_room.as_ref().unwrap().display_name() }</h1></div> + <div class="room-title"><h1>{ room.display_name() }</h1></div> <h4> { tr!( @@ -83,14 +82,13 @@ impl Component for MainView { </h4> </div> </div> - } - } else { - html! { + }, + Some(room) => html! { <div class="uk-flex auto-scrollable-container" style="height: 100%"> <RoomList change_room_callback=self.link.callback(Msg::ChangeRoom)/> - <EventList current_room=self.state.current_room.as_ref().unwrap() /> + <EventList current_room=room /> </div> - } + }, } } }