diff --git a/src/frontend/src/components/SanitizedDiv/index.tsx b/src/frontend/src/components/SanitizedDiv/index.tsx new file mode 100644 index 000000000..e76105c00 --- /dev/null +++ b/src/frontend/src/components/SanitizedDiv/index.tsx @@ -0,0 +1,21 @@ +import DOMPurify from "dompurify"; + +const SanitizedHTMLWrapper = ({ + className, + content, + onClick, + suppressWarning = false, +}) => { + const sanitizedHTML = DOMPurify.sanitize(content); + + return ( +
+ ); +}; + +export default SanitizedHTMLWrapper; diff --git a/src/frontend/src/modals/chatModal/chatMessage/index.tsx b/src/frontend/src/modals/chatModal/chatMessage/index.tsx index f90396198..3a9749b72 100644 --- a/src/frontend/src/modals/chatModal/chatMessage/index.tsx +++ b/src/frontend/src/modals/chatModal/chatMessage/index.tsx @@ -1,5 +1,4 @@ import Convert from "ansi-to-html"; -import DOMPurify from "dompurify"; import { MessageCircle, User2 } from "lucide-react"; import { useEffect, useRef, useState } from "react"; import ReactMarkdown from "react-markdown"; @@ -8,6 +7,7 @@ import remarkGfm from "remark-gfm"; import remarkMath from "remark-math"; import AiIcon from "../../../assets/Gooey Ring-5s-271px.svg"; import AiIconStill from "../../../assets/froze-flow.png"; +import SanitizedHTMLWrapper from "../../../components/SanitizedDiv"; import { ChatMessageType } from "../../../types/chat"; import { classNames } from "../../../utils"; import { CodeBlock } from "../../formModal/chatMessage/codeBlock"; @@ -68,13 +68,12 @@ export default function ChatMessage({
)} {chat.thought && chat.thought !== "" && !hidden && ( -
setHidden((prev) => !prev)} +
+ content={convert.toHtml(chat.thought)} + suppressWarning={false} + onClick={() => setHidden((prev) => !prev)} + /> )} {chat.thought && chat.thought !== "" && !hidden &&

}
diff --git a/src/frontend/src/modals/formModal/chatMessage/index.tsx b/src/frontend/src/modals/formModal/chatMessage/index.tsx index 3e3cf2dd5..66981be5e 100644 --- a/src/frontend/src/modals/formModal/chatMessage/index.tsx +++ b/src/frontend/src/modals/formModal/chatMessage/index.tsx @@ -1,5 +1,4 @@ import Convert from "ansi-to-html"; -import DOMPurify from "dompurify"; import { ChevronDown } from "lucide-react"; import { useState } from "react"; import ReactMarkdown from "react-markdown"; @@ -8,6 +7,7 @@ import remarkGfm from "remark-gfm"; import remarkMath from "remark-math"; import MaleTechnology from "../../../assets/male-technologist.png"; import Robot from "../../../assets/robot.png"; +import SanitizedHTMLWrapper from "../../../components/SanitizedDiv"; import { THOUGHTS_ICON } from "../../../constants"; import { ChatMessageType } from "../../../types/chat"; import { classNames } from "../../../utils"; @@ -57,13 +57,11 @@ export default function ChatMessage({
)} {chat.thought && chat.thought !== "" && !hidden && ( -
setHidden((prev) => !prev)} - className=" form-modal-chat-thought " - dangerouslySetInnerHTML={{ - __html: DOMPurify.sanitize(convert.toHtml(chat.thought)), - }} - >
+ /> )} {chat.thought && chat.thought !== "" && !hidden &&

}
diff --git a/src/frontend/src/modals/genericModal/index.tsx b/src/frontend/src/modals/genericModal/index.tsx index 9eb714c9b..efd7dcd22 100644 --- a/src/frontend/src/modals/genericModal/index.tsx +++ b/src/frontend/src/modals/genericModal/index.tsx @@ -1,6 +1,6 @@ -import DOMPurify from "dompurify"; import { FileText, Variable } from "lucide-react"; import { useContext, useEffect, useRef, useState } from "react"; +import SanitizedHTMLWrapper from "../../components/SanitizedDiv"; import ShadTooltip from "../../components/ShadTooltipComponent"; import { Badge } from "../../components/ui/badge"; import { Button } from "../../components/ui/button"; @@ -15,7 +15,7 @@ import { } from "../../components/ui/dialog"; import { Textarea } from "../../components/ui/textarea"; import { - HIGHLIGH_CSS, + HIGHLIGHT_CSS, PROMPT_DIALOG_SUBTITLE, TEXT_DIALOG_SUBTITLE, } from "../../constants"; @@ -120,13 +120,13 @@ export default function GenericModal({ const TextAreaContentView = () => { return ( -
{ setIsEdit(true); }} + suppressWarning={true} /> ); };