// src/components/StockChart/StockChartModal.tsx - 统一的股票图表组件(KLineChart 实现) import React, { useState } from 'react'; import { Modal, ModalOverlay, ModalContent, ModalHeader, ModalCloseButton, ModalBody, Button, ButtonGroup, VStack, HStack, Text, Badge, Box, Flex, CircularProgress, } from '@chakra-ui/react'; import RiskDisclaimer from '../RiskDisclaimer'; import { useKLineChart, useKLineData, useEventMarker } from './hooks'; import { Alert, AlertIcon } from '@chakra-ui/react'; /** * 图表类型 */ type ChartType = 'timeline' | 'daily'; /** * 股票信息 */ interface StockInfo { stock_code: string; stock_name?: string; } /** * StockChartModal 组件 Props */ export interface StockChartModalProps { /** 模态框是否打开 */ isOpen: boolean; /** 关闭回调 */ onClose: () => void; /** 股票信息 */ stock: StockInfo | null; /** 事件时间 */ eventTime?: string | null; /** 是否使用 Chakra UI(保留字段,当前未使用) */ isChakraUI?: boolean; /** 模态框大小 */ size?: string; /** 初始图表类型 */ initialChartType?: ChartType; } const StockChartModal: React.FC = ({ isOpen, onClose, stock, eventTime, isChakraUI = true, size = '6xl', initialChartType = 'timeline', }) => { // 状态管理 const [chartType, setChartType] = useState(initialChartType); // KLineChart Hooks const { chart, chartRef, isInitialized, error: chartError } = useKLineChart({ containerId: `kline-chart-${stock?.stock_code || 'default'}`, height: 500, autoResize: true, chartType, // ✅ 传递 chartType,让 Hook 根据类型应用不同样式 }); const { data, loading, error: dataError } = useKLineData({ chart, stockCode: stock?.stock_code || '', chartType, eventTime: eventTime || undefined, autoLoad: true, // 改为 true,让 Hook 内部根据 stockCode 和 chart 判断是否加载 }); const { marker } = useEventMarker({ chart, data, eventTime: eventTime || undefined, eventTitle: '事件发生', autoCreate: true, }); // 守卫子句 if (!stock) return null; return ( {stock.stock_name || stock.stock_code} ({stock.stock_code}) - 股票详情 {data.length > 0 && 数据点: {data.length}} {/* 重件发生标签 - 仅在有 eventTime 时显示 */} {eventTime && ( 重件发生(影响日) )} {/* 错误提示 */} {(chartError || dataError) && ( 图表加载失败:{chartError?.message || dataError?.message} )} {/* 图表区域 - 响应式高度 */} {loading && ( 加载图表数据... )}
{/* 风险提示 */} ); }; export default StockChartModal;