import { streamingMessage } from '@/utils/streamingMessageSignal' import { For, createEffect, createSignal } from 'solid-js' import { marked } from 'marked' import domPurify from 'dompurify' import { isNotEmpty } from '@indite.io/lib' import { persist } from '@/utils/persist' import { BotContext } from '@/types' type Props = { streamingMessageId: string context: BotContext } export const StreamingBubble = (props: Props) => { const [content, setContent] = persist(createSignal([]), { key: `bot-streaming-message-${props.streamingMessageId}`, storage: props.context.storage, }) marked.use({ renderer: { link: (href, _title, text) => { return `${text}` }, }, }) createEffect(() => { if (streamingMessage()?.id !== props.streamingMessageId) return [] setContent( streamingMessage() ?.content.split('```') .map((block, index) => { if (index % 2 === 0) { return block.split('\n\n').map((line) => domPurify.sanitize( marked.parse(line.replace(/【.+】/g, ''), { breaks: true, }), { ADD_ATTR: ['target'], } ) ) } else { return [ domPurify.sanitize( marked.parse('```' + block + '```', { breaks: true, }), { ADD_ATTR: ['target'], } ), ] } }) .flat() .filter(isNotEmpty) ?? [] ) }) return (
{(line) => }
) }