| import { useState, useEffect } from "react"; |
| import { Brain, ChevronDown } from "lucide-react"; |
|
|
| interface ReasoningBlockProps { |
| reasoning: string; |
| isThinking: boolean; |
| thinkingSeconds: number; |
| } |
|
|
| export function ReasoningBlock({ |
| reasoning, |
| isThinking, |
| thinkingSeconds, |
| }: ReasoningBlockProps) { |
| const [open, setOpen] = useState(isThinking); |
|
|
| useEffect(() => { |
| setOpen(isThinking); |
| }, [isThinking]); |
|
|
| return ( |
| <div className="mb-3"> |
| <button |
| onClick={() => setOpen((v) => !v)} |
| className="flex items-center gap-2 text-xs text-[#6d6d6d] hover:text-black transition-colors cursor-pointer" |
| > |
| <Brain className="h-3.5 w-3.5" /> |
| {isThinking ? ( |
| <span className="thinking-shimmer font-medium">Thinking…</span> |
| ) : ( |
| <span>Thought for {thinkingSeconds}s</span> |
| )} |
| <ChevronDown |
| className={`h-3 w-3 transition-transform duration-200 ${open ? "" : "-rotate-90"}`} |
| /> |
| </button> |
| {open && ( |
| <div className="mt-2 rounded-lg border border-[#0000001f] bg-[#f5f5f5] px-3 py-2 text-xs text-[#6d6d6d] whitespace-pre-wrap"> |
| {reasoning.trim()} |
| </div> |
| )} |
| </div> |
| ); |
| } |
|
|