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 && (
)}
);
}