import { useEffect, useRef, useState } from "react"; import { Check, CircleDashed } from "lucide-react"; import { useTranslation } from "react-i18next"; import { MarkdownText, preloadMarkdownText } from "@/components/MarkdownText"; import { cn } from "@/lib/utils"; import { ActivityStep } from "./ActivityStep"; export function ReasoningRow({ text, streaming, }: { text: string; streaming: boolean; }) { const { t } = useTranslation(); useEffect(() => { if (text.length > 0) preloadMarkdownText(); }, [text.length]); return ( } active={streaming} tone={streaming ? "active" : "success"} label={streaming ? t("message.reasoningStreaming", { defaultValue: "Thinking…" }) : t("message.reasoning", { defaultValue: "Thinking" })} > {text.trim() ? ( {text} ) : null} ); } function ReasoningMarker({ streaming }: { streaming: boolean }) { const wasStreamingRef = useRef(streaming); const [justCompleted, setJustCompleted] = useState(false); useEffect(() => { if (wasStreamingRef.current && !streaming) { setJustCompleted(true); const timeout = window.setTimeout(() => setJustCompleted(false), 650); wasStreamingRef.current = streaming; return () => window.clearTimeout(timeout); } wasStreamingRef.current = streaming; return undefined; }, [streaming]); if (streaming) { return ( ); } return ( ); }