import { useEffect, useState } from "react"; import showdown from "showdown"; const converter = new showdown.Converter(); interface ParsedContent { thinkContent: string | null; afterContent: string; isThinking: boolean; } function parseThinkTags(content: string): ParsedContent { const openTagIndex = content.indexOf(""); if (openTagIndex === -1) { return { thinkContent: null, afterContent: content, isThinking: false, }; } const closeTagIndex = content.indexOf(""); if (closeTagIndex === -1) { return { thinkContent: content.slice(openTagIndex + 7), afterContent: "", isThinking: true, }; } return { thinkContent: content.slice(openTagIndex + 7, closeTagIndex), afterContent: content.slice(closeTagIndex + 8), isThinking: false, }; } export default function MessageContent({ content }: { content: string }) { const [showThinking, setShowThinking] = useState(false); const [thinkingTime, setThinkingTime] = useState(0); const parsed = parseThinkTags(content); useEffect(() => { if (parsed.isThinking) { const startTime = Date.now(); const interval = setInterval(() => { setThinkingTime((Date.now() - startTime) / 1000); }, 100); return () => clearInterval(interval); } }, [parsed.isThinking]); if (!parsed.thinkContent) { return (
); } return (
{parsed.isThinking ? (
Thinking for {thinkingTime.toFixed(1)}s...
) : (
{showThinking && (
)}
)} {parsed.afterContent && (
)}
); }