Mercurial > libervia-web
annotate libervia/web/pages/chat/_browser/__init__.py @ 1541:3c384b51b2a1
browser (chat): URL previews implementation
author | Goffi <goffi@goffi.org> |
---|---|
date | Wed, 28 Jun 2023 10:09:14 +0200 |
parents | b4342176fa0a |
children | fb31d3dba0c3 |
rev | line source |
---|---|
1536 | 1 import json |
1541
3c384b51b2a1
browser (chat): URL previews implementation
Goffi <goffi@goffi.org>
parents:
1540
diff
changeset
|
2 import re |
1536 | 3 |
4 from bridge import AsyncBridge as Bridge | |
1541
3c384b51b2a1
browser (chat): URL previews implementation
Goffi <goffi@goffi.org>
parents:
1540
diff
changeset
|
5 from browser import DOMNode, aio, bind, console as log, document, window, html |
3c384b51b2a1
browser (chat): URL previews implementation
Goffi <goffi@goffi.org>
parents:
1540
diff
changeset
|
6 from cache import cache, identities |
3c384b51b2a1
browser (chat): URL previews implementation
Goffi <goffi@goffi.org>
parents:
1540
diff
changeset
|
7 import dialog |
3c384b51b2a1
browser (chat): URL previews implementation
Goffi <goffi@goffi.org>
parents:
1540
diff
changeset
|
8 from file_uploader import FileUploader |
3c384b51b2a1
browser (chat): URL previews implementation
Goffi <goffi@goffi.org>
parents:
1540
diff
changeset
|
9 import jid |
1536 | 10 from template import Template, safe |
11 | |
12 log.warning = log.warn | |
13 profile = window.profile or "" | |
14 own_jid = jid.JID(window.own_jid) | |
15 target_jid = jid.JID(window.target_jid) | |
16 bridge = Bridge() | |
17 | |
18 # Sensible value to consider that user is at the bottom | |
19 SCROLL_SENSITIVITY = 200 | |
20 | |
21 | |
22 class LiberviaWebChat: | |
23 def __init__(self): | |
24 self.message_tpl = Template("chat/message.html") | |
1541
3c384b51b2a1
browser (chat): URL previews implementation
Goffi <goffi@goffi.org>
parents:
1540
diff
changeset
|
25 self.url_preview_control_tpl = Template("components/url_preview_control.html") |
3c384b51b2a1
browser (chat): URL previews implementation
Goffi <goffi@goffi.org>
parents:
1540
diff
changeset
|
26 self.url_preview_tpl = Template("components/url_preview.html") |
3c384b51b2a1
browser (chat): URL previews implementation
Goffi <goffi@goffi.org>
parents:
1540
diff
changeset
|
27 |
1536 | 28 self.messages_elt = document["messages"] |
29 | |
30 # attachments | |
31 self.file_uploader = FileUploader( | |
32 "", "chat/attachment_preview.html", on_delete_cb=self.on_attachment_delete | |
33 ) | |
34 self.attachments_elt = document["attachments"] | |
35 self.message_input = document["message_input"] | |
36 | |
37 # hide/show attachments | |
38 MutationObserver = window.MutationObserver | |
39 observer = MutationObserver.new(lambda *__: self.update_attachments_visibility()) | |
40 observer.observe(self.attachments_elt, {"childList": True}) | |
41 | |
42 # we want the message scroll to be initially at the bottom | |
43 self.messages_elt.scrollTop = self.messages_elt.scrollHeight | |
44 | |
45 @property | |
46 def is_at_bottom(self): | |
47 return ( | |
48 self.messages_elt.scrollHeight | |
49 - self.messages_elt.scrollTop | |
50 - self.messages_elt.clientHeight | |
51 <= SCROLL_SENSITIVITY | |
52 ) | |
53 | |
54 def send_message(self): | |
55 """Send message currently in input area | |
56 | |
57 The message and corresponding attachment will be sent | |
58 """ | |
59 message = self.message_input.value.rstrip() | |
60 log.info(f"{message=}") | |
61 | |
62 # attachments | |
63 attachments = [] | |
64 for attachment_elt in self.attachments_elt.children: | |
65 file_data = json.loads(attachment_elt.getAttribute("data-file")) | |
66 attachments.append(file_data) | |
67 | |
68 if message or attachments: | |
69 extra = {} | |
70 | |
71 if attachments: | |
72 extra["attachments"] = attachments | |
73 | |
74 # now we send the message | |
75 try: | |
76 aio.run( | |
77 bridge.message_send( | |
78 str(target_jid), {"": message}, {}, "auto", json.dumps(extra) | |
79 ) | |
80 ) | |
81 except Exception as e: | |
82 dialog.notification.show(f"Can't send message: {e}", "error") | |
83 else: | |
84 self.message_input.value = "" | |
85 self.attachments_elt.clear() | |
86 | |
87 def _on_message_new( | |
88 self, | |
89 uid: str, | |
90 timestamp: float, | |
91 from_jid: str, | |
92 to_jid: str, | |
93 message: dict, | |
94 subject: dict, | |
95 mess_type: str, | |
96 extra_s: str, | |
97 profile: str, | |
98 ) -> None: | |
99 if ( | |
100 jid.JID(from_jid).bare == window.target_jid | |
101 or jid.JID(to_jid).bare == window.target_jid | |
102 ): | |
103 aio.run( | |
104 self.on_message_new( | |
105 uid, | |
106 timestamp, | |
107 from_jid, | |
108 to_jid, | |
109 message, | |
110 subject, | |
111 mess_type, | |
112 json.loads(extra_s), | |
113 profile, | |
114 ) | |
115 ) | |
116 | |
117 async def on_message_new( | |
118 self, | |
119 uid: str, | |
120 timestamp: float, | |
121 from_jid: str, | |
122 to_jid: str, | |
123 message_data: dict, | |
124 subject_data: dict, | |
125 mess_type: str, | |
126 extra: dict, | |
127 profile: str, | |
128 ) -> None: | |
129 log.info(f"on_message_new: [{from_jid} -> {to_jid}] {message_data}, {extra=}") | |
130 xhtml_data = extra.get("xhtml") | |
131 if not xhtml_data: | |
132 xhtml = None | |
133 else: | |
134 try: | |
135 xhtml = xhtml_data[""] | |
136 except KeyError: | |
137 xhtml = next(iter(xhtml_data.values())) | |
138 | |
139 await cache.fill_identities([from_jid]) | |
140 | |
141 msg_data = { | |
142 "id": uid, | |
143 "timestamp": timestamp, | |
144 "type": mess_type, | |
145 "from_": from_jid, | |
146 "text": message_data.get("") or next(iter(message_data.values()), ""), | |
147 "subject": subject_data.get("") or next(iter(subject_data.values()), ""), | |
148 "type": mess_type, | |
149 "thread": extra.get("thread"), | |
150 "thread_parent": extra.get("thread_parent"), | |
151 "reeceived": extra.get("received_timestamp") or timestamp, | |
152 "delay_sender": extra.get("delay_sender"), | |
153 "info_type": extra.get("info_type"), | |
154 "html": safe(xhtml) if xhtml else None, | |
155 "encrypted": extra.get("encrypted", False), | |
156 "received": extra.get("received", False), | |
157 "edited": extra.get("edited", False), | |
158 "attachments": extra.get("attachments", []), | |
159 } | |
160 message_elt = self.message_tpl.get_elt( | |
161 { | |
162 "own_jid": own_jid, | |
163 "msg": msg_data, | |
164 "identities": identities, | |
165 } | |
166 ) | |
167 | |
168 # Check if user is viewing older messages or is at the bottom | |
169 is_at_bottom = self.is_at_bottom | |
170 | |
171 self.messages_elt <= message_elt | |
172 self.make_attachments_dynamic(message_elt) | |
1541
3c384b51b2a1
browser (chat): URL previews implementation
Goffi <goffi@goffi.org>
parents:
1540
diff
changeset
|
173 # we add preview in parallel on purpose, as they can be slow to get |
3c384b51b2a1
browser (chat): URL previews implementation
Goffi <goffi@goffi.org>
parents:
1540
diff
changeset
|
174 self.handle_url_previews(message_elt) |
1536 | 175 |
176 # If user was at the bottom, keep the scroll at the bottom | |
177 if is_at_bottom: | |
178 self.messages_elt.scrollTop = self.messages_elt.scrollHeight | |
179 | |
180 def auto_resize_message_input(self): | |
181 """Resize the message input field according to content.""" | |
182 | |
183 is_at_bottom = self.is_at_bottom | |
184 | |
185 # The textarea's height is first reset to 'auto' to ensure it's not influenced by | |
186 # the previous content. | |
187 self.message_input.style.height = "auto" | |
188 | |
189 # Then the height is set to the scrollHeight of the textarea (which is the height | |
190 # of the content), plus the vertical border, resulting in a textarea that grows as | |
191 # more lines of text are added. | |
192 self.message_input.style.height = f"{self.message_input.scrollHeight + 2}px" | |
193 | |
194 if is_at_bottom: | |
195 # we want the message are to still display the last message | |
196 self.messages_elt.scrollTop = self.messages_elt.scrollHeight | |
197 | |
198 def on_message_keydown(self, evt): | |
199 """Handle the 'keydown' event of the message input field | |
200 | |
201 @param evt: The event object. 'target' refers to the textarea element. | |
202 """ | |
203 if evt.keyCode == 13: # <Enter> key | |
204 if not window.navigator.maxTouchPoints: | |
205 # we have a non touch device, we send message on <Enter> | |
206 if not evt.shiftKey: | |
207 evt.preventDefault() # Prevents line break | |
208 self.send_message() | |
209 | |
210 def update_attachments_visibility(self): | |
211 if len(self.attachments_elt.children): | |
212 self.attachments_elt.classList.remove("is-contracted") | |
213 else: | |
214 self.attachments_elt.classList.add("is-contracted") | |
215 | |
216 def on_file_selected(self, evt): | |
217 """Handle file selection""" | |
218 log.info("file selected") | |
219 files = evt.currentTarget.files | |
220 self.file_uploader.upload_files(files, self.attachments_elt) | |
221 self.message_input.focus() | |
222 | |
223 def on_attachment_delete(self, evt): | |
224 evt.stopPropagation() | |
225 target = evt.currentTarget | |
1540
b4342176fa0a
browser (chat): minor reformatting
Goffi <goffi@goffi.org>
parents:
1536
diff
changeset
|
226 item_elt = DOMNode(target.closest(".attachment-preview")) |
1536 | 227 item_elt.remove() |
228 | |
229 def on_attach_button_click(self, evt): | |
230 document["file_input"].click() | |
231 | |
1540
b4342176fa0a
browser (chat): minor reformatting
Goffi <goffi@goffi.org>
parents:
1536
diff
changeset
|
232 @bind(document["attachments"], "wheel") |
1536 | 233 def wheel_event(evt): |
234 """Make the mouse wheel to act on horizontal scrolling for attachments | |
235 | |
236 Attachments don't have vertical scrolling, thus is makes sense to use the wheel | |
237 for horizontal scrolling | |
238 """ | |
239 if evt.deltaY != 0: | |
1540
b4342176fa0a
browser (chat): minor reformatting
Goffi <goffi@goffi.org>
parents:
1536
diff
changeset
|
240 document["attachments"].scrollLeft += evt.deltaY * 0.8 |
1536 | 241 evt.preventDefault() |
242 | |
1540
b4342176fa0a
browser (chat): minor reformatting
Goffi <goffi@goffi.org>
parents:
1536
diff
changeset
|
243 def make_attachments_dynamic(self, parent_elt=None): |
1536 | 244 """Make attachments dynamically clickable""" |
245 # FIXME: only handle images for now, and display them in a modal | |
246 if parent_elt is None: | |
247 parent_elt = document | |
1540
b4342176fa0a
browser (chat): minor reformatting
Goffi <goffi@goffi.org>
parents:
1536
diff
changeset
|
248 img_elts = parent_elt.select(".message-attachment img") |
1536 | 249 for img_elt in img_elts: |
1540
b4342176fa0a
browser (chat): minor reformatting
Goffi <goffi@goffi.org>
parents:
1536
diff
changeset
|
250 img_elt.bind("click", self.open_modal) |
b4342176fa0a
browser (chat): minor reformatting
Goffi <goffi@goffi.org>
parents:
1536
diff
changeset
|
251 img_elt.style.cursor = "pointer" |
1536 | 252 |
1540
b4342176fa0a
browser (chat): minor reformatting
Goffi <goffi@goffi.org>
parents:
1536
diff
changeset
|
253 close_button = document.select_one(".modal-close") |
b4342176fa0a
browser (chat): minor reformatting
Goffi <goffi@goffi.org>
parents:
1536
diff
changeset
|
254 close_button.bind("click", self.close_modal) |
1536 | 255 |
1541
3c384b51b2a1
browser (chat): URL previews implementation
Goffi <goffi@goffi.org>
parents:
1540
diff
changeset
|
256 def find_links(self, message_elt): |
3c384b51b2a1
browser (chat): URL previews implementation
Goffi <goffi@goffi.org>
parents:
1540
diff
changeset
|
257 """Find all http and https links within the body of a message.""" |
3c384b51b2a1
browser (chat): URL previews implementation
Goffi <goffi@goffi.org>
parents:
1540
diff
changeset
|
258 msg_body_elt = message_elt.select_one(".msg_body") |
3c384b51b2a1
browser (chat): URL previews implementation
Goffi <goffi@goffi.org>
parents:
1540
diff
changeset
|
259 if not msg_body_elt: |
3c384b51b2a1
browser (chat): URL previews implementation
Goffi <goffi@goffi.org>
parents:
1540
diff
changeset
|
260 return |
3c384b51b2a1
browser (chat): URL previews implementation
Goffi <goffi@goffi.org>
parents:
1540
diff
changeset
|
261 |
3c384b51b2a1
browser (chat): URL previews implementation
Goffi <goffi@goffi.org>
parents:
1540
diff
changeset
|
262 # Extracting links from text content |
3c384b51b2a1
browser (chat): URL previews implementation
Goffi <goffi@goffi.org>
parents:
1540
diff
changeset
|
263 text = msg_body_elt.text |
3c384b51b2a1
browser (chat): URL previews implementation
Goffi <goffi@goffi.org>
parents:
1540
diff
changeset
|
264 raw_urls = re.findall( |
3c384b51b2a1
browser (chat): URL previews implementation
Goffi <goffi@goffi.org>
parents:
1540
diff
changeset
|
265 r"http[s]?://(?:[a-zA-Z]|[0-9]|[$-_@.&+]|[!*\\(\\),]|(?:%[0-9a-fA-F][0-9a-fA-F])|#)+", |
3c384b51b2a1
browser (chat): URL previews implementation
Goffi <goffi@goffi.org>
parents:
1540
diff
changeset
|
266 text, |
3c384b51b2a1
browser (chat): URL previews implementation
Goffi <goffi@goffi.org>
parents:
1540
diff
changeset
|
267 ) |
3c384b51b2a1
browser (chat): URL previews implementation
Goffi <goffi@goffi.org>
parents:
1540
diff
changeset
|
268 |
3c384b51b2a1
browser (chat): URL previews implementation
Goffi <goffi@goffi.org>
parents:
1540
diff
changeset
|
269 # Extracting links from <a> elements |
3c384b51b2a1
browser (chat): URL previews implementation
Goffi <goffi@goffi.org>
parents:
1540
diff
changeset
|
270 a_elements = msg_body_elt.select("a") |
3c384b51b2a1
browser (chat): URL previews implementation
Goffi <goffi@goffi.org>
parents:
1540
diff
changeset
|
271 for a_elt in a_elements: |
3c384b51b2a1
browser (chat): URL previews implementation
Goffi <goffi@goffi.org>
parents:
1540
diff
changeset
|
272 href = a_elt.attrs.get("href", "") |
3c384b51b2a1
browser (chat): URL previews implementation
Goffi <goffi@goffi.org>
parents:
1540
diff
changeset
|
273 if href.startswith("http://") or href.startswith("https://"): |
3c384b51b2a1
browser (chat): URL previews implementation
Goffi <goffi@goffi.org>
parents:
1540
diff
changeset
|
274 raw_urls.append(href) |
3c384b51b2a1
browser (chat): URL previews implementation
Goffi <goffi@goffi.org>
parents:
1540
diff
changeset
|
275 |
3c384b51b2a1
browser (chat): URL previews implementation
Goffi <goffi@goffi.org>
parents:
1540
diff
changeset
|
276 # we remove duplicates |
3c384b51b2a1
browser (chat): URL previews implementation
Goffi <goffi@goffi.org>
parents:
1540
diff
changeset
|
277 urls = list(dict.fromkeys(raw_urls)) |
3c384b51b2a1
browser (chat): URL previews implementation
Goffi <goffi@goffi.org>
parents:
1540
diff
changeset
|
278 |
3c384b51b2a1
browser (chat): URL previews implementation
Goffi <goffi@goffi.org>
parents:
1540
diff
changeset
|
279 return urls |
3c384b51b2a1
browser (chat): URL previews implementation
Goffi <goffi@goffi.org>
parents:
1540
diff
changeset
|
280 |
3c384b51b2a1
browser (chat): URL previews implementation
Goffi <goffi@goffi.org>
parents:
1540
diff
changeset
|
281 async def add_url_previews(self, url_previews_elt, urls) -> None: |
3c384b51b2a1
browser (chat): URL previews implementation
Goffi <goffi@goffi.org>
parents:
1540
diff
changeset
|
282 """Add URL previews to the .url-previews element of a message.""" |
3c384b51b2a1
browser (chat): URL previews implementation
Goffi <goffi@goffi.org>
parents:
1540
diff
changeset
|
283 url_previews_elt.clear() |
3c384b51b2a1
browser (chat): URL previews implementation
Goffi <goffi@goffi.org>
parents:
1540
diff
changeset
|
284 for url in urls: |
3c384b51b2a1
browser (chat): URL previews implementation
Goffi <goffi@goffi.org>
parents:
1540
diff
changeset
|
285 try: |
3c384b51b2a1
browser (chat): URL previews implementation
Goffi <goffi@goffi.org>
parents:
1540
diff
changeset
|
286 url_preview_data_s = await bridge.url_preview_get(url, "") |
3c384b51b2a1
browser (chat): URL previews implementation
Goffi <goffi@goffi.org>
parents:
1540
diff
changeset
|
287 except Exception as e: |
3c384b51b2a1
browser (chat): URL previews implementation
Goffi <goffi@goffi.org>
parents:
1540
diff
changeset
|
288 log.warning(f"Couldn't get URL preview for {url}: {e}") |
3c384b51b2a1
browser (chat): URL previews implementation
Goffi <goffi@goffi.org>
parents:
1540
diff
changeset
|
289 continue |
3c384b51b2a1
browser (chat): URL previews implementation
Goffi <goffi@goffi.org>
parents:
1540
diff
changeset
|
290 |
3c384b51b2a1
browser (chat): URL previews implementation
Goffi <goffi@goffi.org>
parents:
1540
diff
changeset
|
291 if not url_preview_data_s: |
3c384b51b2a1
browser (chat): URL previews implementation
Goffi <goffi@goffi.org>
parents:
1540
diff
changeset
|
292 log.warning(f"No preview could be found for URL: {url}") |
3c384b51b2a1
browser (chat): URL previews implementation
Goffi <goffi@goffi.org>
parents:
1540
diff
changeset
|
293 continue |
3c384b51b2a1
browser (chat): URL previews implementation
Goffi <goffi@goffi.org>
parents:
1540
diff
changeset
|
294 |
3c384b51b2a1
browser (chat): URL previews implementation
Goffi <goffi@goffi.org>
parents:
1540
diff
changeset
|
295 url_preview_data = json.loads(url_preview_data_s) |
3c384b51b2a1
browser (chat): URL previews implementation
Goffi <goffi@goffi.org>
parents:
1540
diff
changeset
|
296 |
3c384b51b2a1
browser (chat): URL previews implementation
Goffi <goffi@goffi.org>
parents:
1540
diff
changeset
|
297 url_preview_elt = self.url_preview_tpl.get_elt( |
3c384b51b2a1
browser (chat): URL previews implementation
Goffi <goffi@goffi.org>
parents:
1540
diff
changeset
|
298 {"url_preview": url_preview_data} |
3c384b51b2a1
browser (chat): URL previews implementation
Goffi <goffi@goffi.org>
parents:
1540
diff
changeset
|
299 ) |
3c384b51b2a1
browser (chat): URL previews implementation
Goffi <goffi@goffi.org>
parents:
1540
diff
changeset
|
300 url_previews_elt <= url_preview_elt |
3c384b51b2a1
browser (chat): URL previews implementation
Goffi <goffi@goffi.org>
parents:
1540
diff
changeset
|
301 |
3c384b51b2a1
browser (chat): URL previews implementation
Goffi <goffi@goffi.org>
parents:
1540
diff
changeset
|
302 |
3c384b51b2a1
browser (chat): URL previews implementation
Goffi <goffi@goffi.org>
parents:
1540
diff
changeset
|
303 def handle_url_previews(self, parent_elt=None): |
3c384b51b2a1
browser (chat): URL previews implementation
Goffi <goffi@goffi.org>
parents:
1540
diff
changeset
|
304 """Check if URL are presents in a message and show appropriate element |
3c384b51b2a1
browser (chat): URL previews implementation
Goffi <goffi@goffi.org>
parents:
1540
diff
changeset
|
305 |
3c384b51b2a1
browser (chat): URL previews implementation
Goffi <goffi@goffi.org>
parents:
1540
diff
changeset
|
306 According to settings, either a preview control panel will be shown to wait for |
3c384b51b2a1
browser (chat): URL previews implementation
Goffi <goffi@goffi.org>
parents:
1540
diff
changeset
|
307 user click, or directly the previews, or nothing at all. |
3c384b51b2a1
browser (chat): URL previews implementation
Goffi <goffi@goffi.org>
parents:
1540
diff
changeset
|
308 """ |
3c384b51b2a1
browser (chat): URL previews implementation
Goffi <goffi@goffi.org>
parents:
1540
diff
changeset
|
309 |
3c384b51b2a1
browser (chat): URL previews implementation
Goffi <goffi@goffi.org>
parents:
1540
diff
changeset
|
310 if parent_elt is None: |
3c384b51b2a1
browser (chat): URL previews implementation
Goffi <goffi@goffi.org>
parents:
1540
diff
changeset
|
311 parent_elt = document |
3c384b51b2a1
browser (chat): URL previews implementation
Goffi <goffi@goffi.org>
parents:
1540
diff
changeset
|
312 chat_message_elts = parent_elt.select(".is-chat-message") |
3c384b51b2a1
browser (chat): URL previews implementation
Goffi <goffi@goffi.org>
parents:
1540
diff
changeset
|
313 else: |
3c384b51b2a1
browser (chat): URL previews implementation
Goffi <goffi@goffi.org>
parents:
1540
diff
changeset
|
314 chat_message_elts = [parent_elt] |
3c384b51b2a1
browser (chat): URL previews implementation
Goffi <goffi@goffi.org>
parents:
1540
diff
changeset
|
315 for message_elt in chat_message_elts: |
3c384b51b2a1
browser (chat): URL previews implementation
Goffi <goffi@goffi.org>
parents:
1540
diff
changeset
|
316 urls = self.find_links(message_elt) |
3c384b51b2a1
browser (chat): URL previews implementation
Goffi <goffi@goffi.org>
parents:
1540
diff
changeset
|
317 if urls: |
3c384b51b2a1
browser (chat): URL previews implementation
Goffi <goffi@goffi.org>
parents:
1540
diff
changeset
|
318 url_previews_elt = message_elt.select_one(".url-previews") |
3c384b51b2a1
browser (chat): URL previews implementation
Goffi <goffi@goffi.org>
parents:
1540
diff
changeset
|
319 url_previews_elt.classList.remove("is-hidden") |
3c384b51b2a1
browser (chat): URL previews implementation
Goffi <goffi@goffi.org>
parents:
1540
diff
changeset
|
320 preview_control_elt = self.url_preview_control_tpl.get_elt() |
3c384b51b2a1
browser (chat): URL previews implementation
Goffi <goffi@goffi.org>
parents:
1540
diff
changeset
|
321 fetch_preview_btn = preview_control_elt.select_one(".action_fetch_preview") |
3c384b51b2a1
browser (chat): URL previews implementation
Goffi <goffi@goffi.org>
parents:
1540
diff
changeset
|
322 fetch_preview_btn.bind( |
3c384b51b2a1
browser (chat): URL previews implementation
Goffi <goffi@goffi.org>
parents:
1540
diff
changeset
|
323 "click", |
3c384b51b2a1
browser (chat): URL previews implementation
Goffi <goffi@goffi.org>
parents:
1540
diff
changeset
|
324 lambda __, previews_elt=url_previews_elt, preview_urls=urls: aio.run( |
3c384b51b2a1
browser (chat): URL previews implementation
Goffi <goffi@goffi.org>
parents:
1540
diff
changeset
|
325 self.add_url_previews(previews_elt, preview_urls) |
3c384b51b2a1
browser (chat): URL previews implementation
Goffi <goffi@goffi.org>
parents:
1540
diff
changeset
|
326 ) |
3c384b51b2a1
browser (chat): URL previews implementation
Goffi <goffi@goffi.org>
parents:
1540
diff
changeset
|
327 ) |
3c384b51b2a1
browser (chat): URL previews implementation
Goffi <goffi@goffi.org>
parents:
1540
diff
changeset
|
328 url_previews_elt <= preview_control_elt |
3c384b51b2a1
browser (chat): URL previews implementation
Goffi <goffi@goffi.org>
parents:
1540
diff
changeset
|
329 |
1536 | 330 def open_modal(self, evt): |
1540
b4342176fa0a
browser (chat): minor reformatting
Goffi <goffi@goffi.org>
parents:
1536
diff
changeset
|
331 modal_image = document.select_one("#modal-image") |
1536 | 332 modal_image.src = evt.target.src |
333 modal_image.alt = evt.target.alt | |
1540
b4342176fa0a
browser (chat): minor reformatting
Goffi <goffi@goffi.org>
parents:
1536
diff
changeset
|
334 modal = document.select_one("#modal") |
b4342176fa0a
browser (chat): minor reformatting
Goffi <goffi@goffi.org>
parents:
1536
diff
changeset
|
335 modal.classList.add("is-active") |
1536 | 336 |
337 def close_modal(self, evt): | |
1540
b4342176fa0a
browser (chat): minor reformatting
Goffi <goffi@goffi.org>
parents:
1536
diff
changeset
|
338 modal = document.select_one("#modal") |
b4342176fa0a
browser (chat): minor reformatting
Goffi <goffi@goffi.org>
parents:
1536
diff
changeset
|
339 modal.classList.remove("is-active") |
1536 | 340 |
341 | |
342 libervia_web_chat = LiberviaWebChat() | |
1540
b4342176fa0a
browser (chat): minor reformatting
Goffi <goffi@goffi.org>
parents:
1536
diff
changeset
|
343 |
1536 | 344 document["message_input"].bind( |
345 "input", lambda __: libervia_web_chat.auto_resize_message_input() | |
346 ) | |
347 document["message_input"].bind("keydown", libervia_web_chat.on_message_keydown) | |
348 document["send_button"].bind("click", lambda __: libervia_web_chat.send_message()) | |
1540
b4342176fa0a
browser (chat): minor reformatting
Goffi <goffi@goffi.org>
parents:
1536
diff
changeset
|
349 document["attach_button"].bind("click", libervia_web_chat.on_attach_button_click) |
1536 | 350 document["file_input"].bind("change", libervia_web_chat.on_file_selected) |
351 bridge.register_signal("message_new", libervia_web_chat._on_message_new) | |
1540
b4342176fa0a
browser (chat): minor reformatting
Goffi <goffi@goffi.org>
parents:
1536
diff
changeset
|
352 |
1536 | 353 libervia_web_chat.make_attachments_dynamic() |
1541
3c384b51b2a1
browser (chat): URL previews implementation
Goffi <goffi@goffi.org>
parents:
1540
diff
changeset
|
354 libervia_web_chat.handle_url_previews() |