// src/components/ChatBot/StepResultCard.js // 步骤结果展示卡片(可折叠) import React, { useState } from 'react'; import { Box, VStack, HStack, Text, Badge, Collapse, Icon, IconButton, Code, useColorModeValue, Divider, } from '@chakra-ui/react'; import { FiChevronDown, FiChevronUp, FiCheckCircle, FiXCircle, FiClock, FiDatabase } from 'react-icons/fi'; /** * 步骤结果卡片组件 */ export const StepResultCard = ({ stepResult }) => { const [isExpanded, setIsExpanded] = useState(false); const cardBg = useColorModeValue('white', 'rgba(40, 45, 50, 0.8)'); const borderColor = useColorModeValue('gray.200', 'rgba(255, 215, 0, 0.2)'); const successColor = useColorModeValue('green.500', 'green.300'); const errorColor = useColorModeValue('red.500', 'red.300'); const getStatusIcon = () => { switch (stepResult.status) { case 'success': return FiCheckCircle; case 'failed': return FiXCircle; default: return FiClock; } }; const getStatusColor = () => { switch (stepResult.status) { case 'success': return 'green'; case 'failed': return 'red'; default: return 'gray'; } }; const StatusIcon = getStatusIcon(); const statusColorScheme = getStatusColor(); // 格式化数据以便展示 const formatResult = (data) => { if (typeof data === 'string') return data; if (Array.isArray(data)) { return `找到 ${data.length} 条记录`; } if (typeof data === 'object') { return JSON.stringify(data, null, 2); } return String(data); }; return ( {/* 头部 - 始终可见 */} setIsExpanded(!isExpanded)} _hover={{ bg: useColorModeValue('gray.50', 'rgba(50, 55, 60, 0.7)') }} > 步骤 {stepResult.step_index + 1}: {stepResult.tool} {stepResult.status === 'success' ? '成功' : stepResult.status === 'failed' ? '失败' : '执行中'} 耗时: {stepResult.execution_time?.toFixed(2)}s } size="sm" variant="ghost" aria-label={isExpanded ? "收起" : "展开"} /> {/* 内容 - 可折叠 */} {/* 参数 */} {stepResult.arguments && Object.keys(stepResult.arguments).length > 0 && ( 请求参数: {JSON.stringify(stepResult.arguments, null, 2)} )} {/* 结果或错误 */} {stepResult.status === 'success' && stepResult.result && ( 执行结果: {typeof stepResult.result === 'string' ? ( {stepResult.result} ) : Array.isArray(stepResult.result) ? ( 找到 {stepResult.result.length} 条记录: {stepResult.result.slice(0, 3).map((item, idx) => ( {JSON.stringify(item, null, 2)} ))} {stepResult.result.length > 3 && ( ...还有 {stepResult.result.length - 3} 条记录 )} ) : ( {JSON.stringify(stepResult.result, null, 2)} )} )} {stepResult.status === 'failed' && stepResult.error && ( 错误信息: {stepResult.error} )} ); }; export default StepResultCard;