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 }