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

notice.rs (3078B)


      1 use std::rc::Rc;
      2 
      3 use linkify::LinkFinder;
      4 use matrix_sdk::{
      5     events::{room::message::NoticeMessageEventContent, AnySyncMessageEvent},
      6     Room,
      7 };
      8 use web_sys::Node;
      9 use yew::prelude::*;
     10 use yew::virtual_dom::VNode;
     11 
     12 use crate::app::components::events::{EventExt, RoomExt};
     13 
     14 pub(crate) struct Notice {
     15     props: Props,
     16 }
     17 
     18 #[derive(Clone, Properties, Debug)]
     19 pub struct Props {
     20     #[prop_or_default]
     21     pub prev_event: Option<AnySyncMessageEvent>,
     22     pub event: AnySyncMessageEvent,
     23     pub notice_event: NoticeMessageEventContent,
     24     pub room: Rc<Room>,
     25 }
     26 
     27 impl Component for Notice {
     28     type Message = ();
     29     type Properties = Props;
     30 
     31     fn create(props: Self::Properties, _link: ComponentLink<Self>) -> Self {
     32         Notice { props }
     33     }
     34 
     35     fn update(&mut self, _msg: Self::Message) -> bool {
     36         false
     37     }
     38 
     39     fn change(&mut self, _props: Self::Properties) -> bool {
     40         // TODO fix the PartialEq hack
     41         /*if format!("{:?}", self.props) != format!("{:?}", props) {
     42             self.props = props;
     43             true
     44         } else {
     45             false
     46         }*/
     47         true
     48     }
     49 
     50     //noinspection RsTypeCheck
     51     fn view(&self) -> Html {
     52         let new_user = self.props.event.is_new_user(self.props.prev_event.as_ref());
     53         let sender_displayname = if new_user {
     54             self.props.room.get_sender_displayname(&self.props.event)
     55         } else {
     56             ""
     57         };
     58 
     59         let mut pure_content = self.props.notice_event.body.clone();
     60         let finder = LinkFinder::new();
     61         let pure_content_clone = pure_content.clone();
     62         let links: Vec<_> = finder.links(&pure_content_clone).collect();
     63 
     64         if !links.is_empty() {
     65             for link in links {
     66                 let html_link = format!("<a href={}>{}</a>", link.as_str(), link.as_str());
     67                 pure_content.replace_range(link.start()..link.end(), &html_link);
     68             }
     69         }
     70 
     71         if new_user {
     72             let full_html = format!(
     73                 "<p style=\"opacity: .6;\"><displayname>{}: </displayname>{}</p>",
     74                 sender_displayname, pure_content
     75             );
     76             let js_text_event = {
     77                 let div = web_sys::window()
     78                     .unwrap()
     79                     .document()
     80                     .unwrap()
     81                     .create_element("p")
     82                     .unwrap();
     83                 div.set_inner_html(full_html.as_str());
     84                 div
     85             };
     86             let node = Node::from(js_text_event);
     87             VNode::VRef(node)
     88         } else {
     89             let full_html = format!("<p style=\"opacity: .6;\">{}</p>", pure_content);
     90             let js_text_event = {
     91                 let div = web_sys::window()
     92                     .unwrap()
     93                     .document()
     94                     .unwrap()
     95                     .create_element("p")
     96                     .unwrap();
     97                 div.set_inner_html(full_html.as_str());
     98                 div
     99             };
    100             let node = Node::from(js_text_event);
    101             VNode::VRef(node)
    102         }
    103     }
    104 }