Spaces:
Running
Running
File size: 1,405 Bytes
f098874 1ce4fbf 3717d81 f098874 98a4631 f098874 98a4631 1ce4fbf 3717d81 f098874 1ce4fbf f098874 1ce4fbf 3717d81 1ce4fbf 3717d81 1ce4fbf 3717d81 f098874 1ce4fbf 3717d81 1ce4fbf f098874 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 | import Text from "../Text/Text";
import styles from "./Message.module.css";
import React from "react";
import { marked } from "marked";
import DOMPurify from "dompurify";
interface MessageProps {
key: number;
textContent: string;
sender: "user" | "system";
openFileViewer?: (fileUrl: string, fileName: string) => void;
isStreaming?: boolean;
}
function Message(props: Readonly<MessageProps>) {
const { textContent, sender, openFileViewer } = props;
const messageStyle: string = `${styles.messageBox} ${sender === "user" ? styles.userMessageBox : styles.systemMessageBox}`;
const handleContentClick = (event: React.MouseEvent<HTMLDivElement>) => {
const target = event.target as HTMLElement;
if (target.tagName === "A" && target.hasAttribute("href")) {
event.preventDefault();
const fileUrl = target.getAttribute("href");
const fileName = target.textContent || "";
if (fileUrl) {
if (openFileViewer) {
openFileViewer(fileUrl, fileName);
}
}
}
};
const parsed = React.useMemo(() => {
const html = marked.parse(textContent);
return DOMPurify.sanitize(html);
}, [textContent]);
return (
<div className={messageStyle} onClick={handleContentClick}>
<Text interactable={true}>
<span dangerouslySetInnerHTML={{ __html: parsed }} />
</Text>
</div>
);
}
export default Message;
|