// @ts-nocheck import React, { memo, useMemo } from 'react'; import { useTranslation } from 'react-i18next'; import SessionProviderLogo from '../../SessionProviderLogo'; import type { ChatMessage, Provider } from '../types'; import { Markdown } from '../markdown/Markdown'; import { formatUsageLimitText } from '../utils/chatFormatting'; import { getClaudePermissionSuggestion } from '../utils/chatPermissions'; import type { Project } from '../../../types/app'; import { ToolRenderer, shouldHideToolResult } from '../tools'; type DiffLine = { type: string; content: string; lineNum: number; }; interface MessageComponentProps { message: ChatMessage; index: number; prevMessage: ChatMessage | null; createDiff: (oldStr: string, newStr: string) => DiffLine[]; onFileOpen?: (filePath: string, diffInfo?: any) => void; onShowSettings?: () => void; onGrantToolPermission?: (suggestion: any) => any; autoExpandTools?: boolean; showRawParameters?: boolean; showThinking?: boolean; selectedProject?: Project | null; provider: Provider | string; } const MessageComponent = memo(({ message, index, prevMessage, createDiff, onFileOpen, onShowSettings, onGrantToolPermission, autoExpandTools, showRawParameters, showThinking, selectedProject, provider }: MessageComponentProps) => { const { t } = useTranslation('chat'); const isGrouped = prevMessage && prevMessage.type === message.type && ((prevMessage.type === 'assistant') || (prevMessage.type === 'user') || (prevMessage.type === 'tool') || (prevMessage.type === 'error')); const messageRef = React.useRef(null); const [isExpanded, setIsExpanded] = React.useState(false); const permissionSuggestion = getClaudePermissionSuggestion(message, provider); const [permissionGrantState, setPermissionGrantState] = React.useState('idle'); React.useEffect(() => { setPermissionGrantState('idle'); }, [permissionSuggestion?.entry, message.toolId]); React.useEffect(() => { const node = messageRef.current; if (!autoExpandTools || !node || !message.isToolUse) return; const observer = new IntersectionObserver( (entries) => { entries.forEach((entry) => { if (entry.isIntersecting && !isExpanded) { setIsExpanded(true); const details = node.querySelectorAll('details'); details.forEach(detail => { detail.open = true; }); } }); }, { threshold: 0.1 } ); observer.observe(node); return () => { observer.unobserve(node); }; }, [autoExpandTools, isExpanded, message.isToolUse]); const selectedProvider = useMemo(() => localStorage.getItem('selected-provider') || 'claude', []); const formattedTime = useMemo(() => new Date(message.timestamp).toLocaleTimeString(), [message.timestamp]); return (
{questionLine}
{/* Option buttons */}⏳ Waiting for your response in the CLI
Please select an option in your terminal where Claude is running.
{formatted}