diff --git a/react-chat/src/components/CreateMessage.tsx b/react-chat/src/components/CreateMessage.tsx index cecac9a..e109b9d 100644 --- a/react-chat/src/components/CreateMessage.tsx +++ b/react-chat/src/components/CreateMessage.tsx @@ -7,6 +7,8 @@ type CreateMessageOptions = { export const CreateMessage = ({ onSubmit }: CreateMessageOptions) => { const [text, setText] = useState('') const handleSubmit = async () => { + if (text === "") return; + onSubmit(text) setText('') } diff --git a/react-chat/src/components/MessageList.tsx b/react-chat/src/components/MessageList.tsx index 36504e6..5b2a6ba 100644 --- a/react-chat/src/components/MessageList.tsx +++ b/react-chat/src/components/MessageList.tsx @@ -1,9 +1,41 @@ import { useEffect, useRef } from "react" import { ChatDocument, Message, User } from "../utils" import { DocHandle } from "@automerge/automerge-repo" -import { marked } from 'marked'; +import { marked, type Tokens} from 'marked'; import DOMPurify from 'dompurify'; +marked.use({ + renderer: { + /* This is basically what marked is doing, just inlined */ + link({ href, title, tokens }: Tokens.Link): string { + const text = this.parser.parseInline(tokens); + + let cleanHref + + try { + cleanHref = encodeURI(href).replace(/%25/g, '%'); + } catch { + cleanHref = null + } + + if (cleanHref === null) { + return text; + } + + let out = '' + text + ''; + + return out; + } + + } +}) + type MessageListProps = { messages: Message[] users: User[] @@ -28,7 +60,7 @@ export const MessageList = ({ messages, users, user, handle }: MessageListProps) return message.likes?.length || 0; } - // Update the message's Like + // Update the message's Like const createLike = (messageId: string) => { if (handle && user) { handle.change(doc => { @@ -64,7 +96,7 @@ export const MessageList = ({ messages, users, user, handle }: MessageListProps)
+ dangerouslySetInnerHTML={{__html: DOMPurify.sanitize(marked.parse(message.text, { async: false }), { ADD_ATTR: ['target'] })}} />