// src/components/ChatBot/PlanCard.js // 执行计划展示卡片 import React from 'react'; import { Box, VStack, HStack, Text, Badge, Accordion, AccordionItem, AccordionButton, AccordionPanel, AccordionIcon, Icon, useColorModeValue, Divider, } from '@chakra-ui/react'; import { FiTarget, FiCheckCircle, FiXCircle, FiClock, FiTool } from 'react-icons/fi'; /** * 执行计划卡片组件 */ export const PlanCard = ({ plan, stepResults }) => { const cardBg = useColorModeValue('blue.50', 'blue.900'); const borderColor = useColorModeValue('blue.200', 'blue.700'); const successColor = useColorModeValue('green.500', 'green.300'); const errorColor = useColorModeValue('red.500', 'red.300'); const pendingColor = useColorModeValue('gray.400', 'gray.500'); const getStepStatus = (stepIndex) => { if (!stepResults || stepResults.length === 0) return 'pending'; const result = stepResults.find(r => r.step_index === stepIndex); return result ? result.status : 'pending'; }; const getStepIcon = (status) => { switch (status) { case 'success': return FiCheckCircle; case 'failed': return FiXCircle; default: return FiClock; } }; const getStepColor = (status) => { switch (status) { case 'success': return successColor; case 'failed': return errorColor; default: return pendingColor; } }; return ( {/* 目标 */} 执行目标 {plan.goal} {/* 规划思路 */} {plan.reasoning && ( <> 规划思路: {plan.reasoning} )} {/* 执行步骤 */} 执行步骤 {plan.steps.length} 步 {plan.steps.map((step, index) => { const status = getStepStatus(index); const StepIcon = getStepIcon(status); const stepColor = getStepColor(status); return ( 步骤 {index + 1}: {step.tool} {status === 'success' ? '✓ 完成' : status === 'failed' ? '✗ 失败' : '⏳ 等待'} {step.reason} ); })} ); }; export default PlanCard;