| | |
| | | import React, { useState } from 'react'; |
| | | import React, { useState, useRef } from 'react'; |
| | | import { Spin } from 'antd'; |
| | | import './App.css'; |
| | | |
| | | // Context |
| | | import { CaseDataProvider, useCaseData } from './contexts/CaseDataContext'; |
| | | |
| | | // 调解看板组件 |
| | | import TopSection from './components/dashboard/TopSection'; |
| | |
| | | |
| | | // 弹窗组件 |
| | | import ToolModal from './components/common/ToolModal'; |
| | | import OutboundCallWidget from './components/common/OutboundCallWidget'; |
| | | |
| | | // 工具内容组件 |
| | | import WageCalculatorContent from './components/tools/WageCalculatorContent'; |
| | |
| | | import SimilarCaseContent from './components/tools/SimilarCaseContent'; |
| | | |
| | | function App() { |
| | | return ( |
| | | <CaseDataProvider> |
| | | <AppContent /> |
| | | </CaseDataProvider> |
| | | ); |
| | | } |
| | | |
| | | function AppContent() { |
| | | const [activeModal, setActiveModal] = useState(null); |
| | | const [currentStep, setCurrentStep] = useState(1); |
| | | const { loading, refreshData } = useCaseData(); |
| | | |
| | | // TabContainer ref - 用于切换Tab |
| | | const tabContainerRef = useRef(null); |
| | | |
| | | // 工具配置 |
| | | const toolConfig = { |
| | |
| | | setActiveModal(null); |
| | | }; |
| | | |
| | | /** |
| | | * 切换Tab页签 |
| | | * @param {string} tabKey - Tab键名 |
| | | */ |
| | | const handleSwitchTab = (tabKey) => { |
| | | if (tabContainerRef.current) { |
| | | tabContainerRef.current.switchTab(tabKey); |
| | | } |
| | | }; |
| | | |
| | | /** |
| | | * 刷新案件数据 |
| | | */ |
| | | const handleRefreshData = () => { |
| | | if (refreshData) { |
| | | refreshData(); |
| | | } |
| | | }; |
| | | |
| | | const renderModalContent = () => { |
| | | if (!activeModal || !toolConfig[activeModal]) return null; |
| | | const Component = toolConfig[activeModal].component; |
| | |
| | | }; |
| | | |
| | | return ( |
| | | <div className="app"> |
| | | {/* Font Awesome CDN */} |
| | | <link |
| | | rel="stylesheet" |
| | | href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css" |
| | | /> |
| | | <Spin spinning={loading} tip="加载案件数据中..."> |
| | | <div className="app"> |
| | | {/* Font Awesome CDN */} |
| | | <link |
| | | rel="stylesheet" |
| | | href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css" |
| | | /> |
| | | |
| | | {/* 顶部区域 */} |
| | | <TopSection /> |
| | | {/* 顶部区域 */} |
| | | <TopSection /> |
| | | |
| | | {/* 中间区域 */} |
| | | <section className="middle-section"> |
| | | {/* A区域:左侧主要内容 */} |
| | | <div className="area-a"> |
| | | {/* AI调解进度 */} |
| | | <MediationProgress currentStep={currentStep} /> |
| | | {/* 中间区域 */} |
| | | <section className="middle-section"> |
| | | {/* A区域:左侧主要内容 */} |
| | | <div className="area-a"> |
| | | {/* AI调解进度 */} |
| | | <MediationProgress /> |
| | | |
| | | {/* 选项卡容器 */} |
| | | <TabContainer /> |
| | | </div> |
| | | {/* 选项卡容器 */} |
| | | <TabContainer ref={tabContainerRef} /> |
| | | </div> |
| | | |
| | | {/* B区域:右侧工具栏 */} |
| | | <ToolsPanel onToolClick={handleToolClick} /> |
| | | </section> |
| | | {/* B区域:右侧工具栏 */} |
| | | <ToolsPanel onToolClick={handleToolClick} /> |
| | | </section> |
| | | |
| | | {/* 底部悬浮控制看板 */} |
| | | <FloatingControlPanel currentStep={currentStep} elapsedTime="25分钟" /> |
| | | {/* 底部悬浮控制看板 */} |
| | | <FloatingControlPanel /> |
| | | |
| | | {/* 工具弹窗 */} |
| | | {activeModal && toolConfig[activeModal] && ( |
| | | <ToolModal |
| | | visible={true} |
| | | title={toolConfig[activeModal].title} |
| | | icon={toolConfig[activeModal].icon} |
| | | onClose={handleCloseModal} |
| | | > |
| | | {renderModalContent()} |
| | | </ToolModal> |
| | | )} |
| | | </div> |
| | | {/* 工具弹窗 */} |
| | | {activeModal && toolConfig[activeModal] && ( |
| | | <ToolModal |
| | | visible={true} |
| | | title={toolConfig[activeModal].title} |
| | | icon={toolConfig[activeModal].icon} |
| | | onClose={handleCloseModal} |
| | | > |
| | | {renderModalContent()} |
| | | </ToolModal> |
| | | )} |
| | | |
| | | {/* 智能外呼通话显示组件 - 默认隐藏,可主动触发显示 */} |
| | | <OutboundCallWidget |
| | | onSwitchTab={handleSwitchTab} |
| | | onRefreshData={handleRefreshData} |
| | | /> |
| | | </div> |
| | | </Spin> |
| | | ); |
| | | } |
| | | |