import { useEffect, useState } from 'react'; import { useTranslation } from 'react-i18next'; import { cn } from '../../../../lib/utils'; import SessionProviderLogo from '../../../llm-logo-provider/SessionProviderLogo'; type ClaudeStatusProps = { status: { text?: string; tokens?: number; can_interrupt?: boolean; } | null; onAbort?: () => void; isLoading: boolean; provider?: string; }; const ACTION_KEYS = [ 'claudeStatus.actions.thinking', 'claudeStatus.actions.processing', 'claudeStatus.actions.analyzing', 'claudeStatus.actions.working', 'claudeStatus.actions.computing', 'claudeStatus.actions.reasoning', ]; const DEFAULT_ACTION_WORDS = ['Thinking', 'Processing', 'Analyzing', 'Working', 'Computing', 'Reasoning']; const PROVIDER_LABEL_KEYS: Record = { claude: 'messageTypes.claude', codex: 'messageTypes.codex', cursor: 'messageTypes.cursor', gemini: 'messageTypes.gemini', opencode: 'messageTypes.opencode', }; function formatElapsedTime(totalSeconds: number) { const mins = Math.floor(totalSeconds / 60); const secs = totalSeconds % 60; return mins < 1 ? `${secs}s` : `${mins}m ${secs}s`; } export default function ClaudeStatus({ status, onAbort, isLoading, provider = 'claude', }: ClaudeStatusProps) { const { t } = useTranslation('chat'); const [elapsedTime, setElapsedTime] = useState(0); const [dots, setDots] = useState(''); useEffect(() => { if (!isLoading) { setElapsedTime(0); return; } const startTime = Date.now(); const timer = setInterval(() => { setElapsedTime(Math.floor((Date.now() - startTime) / 1000)); }, 1000); const dotTimer = setInterval(() => { setDots((prev) => (prev.length >= 3 ? '' : prev + '.')); }, 500); return () => { clearInterval(timer); clearInterval(dotTimer); }; }, [isLoading]); if (!isLoading && !status) return null; const actionWords = ACTION_KEYS.map((key, i) => t(key, { defaultValue: DEFAULT_ACTION_WORDS[i] })); const statusText = (status?.text || actionWords[Math.floor(elapsedTime / 3) % actionWords.length]).replace(/[.]+$/, ''); const providerLabel = t(PROVIDER_LABEL_KEYS[provider] || 'claudeStatus.providers.assistant', { defaultValue: 'Assistant' }); return (
{/* Left Side: Identity & Status */}
{isLoading && ( )}
{providerLabel}

{statusText}{isLoading ? dots : ''}

{/* Right Side: Metrics & Actions */}
{isLoading && status?.can_interrupt !== false && onAbort && ( <>
{formatElapsedTime(elapsedTime)}
)}
); }