You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
48 lines
1.7 KiB
48 lines
1.7 KiB
import html |
|
from typing import List, Optional, Union |
|
|
|
from ..element import Element |
|
|
|
|
|
class ChatMessage(Element, component='chat_message.js'): |
|
|
|
def __init__(self, |
|
text: Union[str, List[str]], *, |
|
name: Optional[str] = None, |
|
label: Optional[str] = None, |
|
stamp: Optional[str] = None, |
|
avatar: Optional[str] = None, |
|
sent: bool = False, |
|
text_html: bool = False, |
|
) -> None: |
|
"""Chat Message |
|
|
|
Based on Quasar's `Chat Message <https://quasar.dev/vue-components/chat/>`_ component. |
|
|
|
:param text: the message body (can be a list of strings for multiple message parts) |
|
:param name: the name of the message author |
|
:param label: renders a label header/section only |
|
:param stamp: timestamp of the message |
|
:param avatar: URL to an avatar |
|
:param sent: render as a sent message (so from current user) (default: False) |
|
:param text_html: render text as HTML (default: False) |
|
""" |
|
super().__init__() |
|
|
|
if isinstance(text, str): |
|
text = [text] |
|
if not text_html: |
|
text = [html.escape(part) for part in text] |
|
text = [part.replace('\n', '<br />') for part in text] |
|
self._props['text'] = text |
|
self._props['text-html'] = True |
|
|
|
if name is not None: |
|
self._props['name'] = name |
|
if label is not None: |
|
self._props['label'] = label |
|
if stamp is not None: |
|
self._props['stamp'] = stamp |
|
if avatar is not None: |
|
self._props['avatar'] = avatar |
|
self._props['sent'] = sent
|
|
|