import React from 'react'; import { HStack, Input, Text, Icon, Tooltip, useColorModeValue, } from '@chakra-ui/react'; import { InfoIcon } from '@chakra-ui/icons'; import { FaCalendarAlt } from 'react-icons/fa'; export interface TradeDatePickerProps { /** 当前选中的日期 */ value: Date | null; /** 日期变化回调 */ onChange: (date: Date) => void; /** 默认日期(组件初始化时使用) */ defaultDate?: Date; /** 最新交易日期(用于显示提示) */ latestTradeDate?: Date | null; /** 最小可选日期 */ minDate?: Date; /** 最大可选日期,默认今天 */ maxDate?: Date; /** 标签文字,默认"交易日期" */ label?: string; /** 输入框宽度 */ inputWidth?: string | object; /** 是否显示标签图标 */ showIcon?: boolean; /** 是否使用深色模式(强制覆盖 Chakra 颜色模式) */ isDarkMode?: boolean; } /** * 交易日期选择器组件 * * 提供日期输入框和最新交易日期提示,供概念中心、个股中心等页面复用。 * 快捷按钮(今天、昨天等)由各页面自行实现。 */ const TradeDatePicker: React.FC = ({ value, onChange, defaultDate, latestTradeDate, minDate, maxDate, label = '交易日期', inputWidth = { base: '100%', lg: '200px' }, showIcon = true, isDarkMode = false, }) => { // 颜色主题 - 支持 isDarkMode 强制覆盖 const defaultLabelColor = useColorModeValue('purple.700', 'purple.300'); const defaultIconColor = useColorModeValue('purple.500', 'purple.400'); const defaultInputBorderColor = useColorModeValue('purple.200', 'purple.600'); const defaultTipBg = useColorModeValue('blue.50', 'blue.900'); const defaultTipBorderColor = useColorModeValue('blue.200', 'blue.600'); const defaultTipTextColor = useColorModeValue('blue.600', 'blue.200'); const defaultTipIconColor = useColorModeValue('blue.500', 'blue.300'); // 深色模式专用颜色 const darkModeColors = { labelColor: 'white', iconColor: 'cyan.400', inputBorderColor: 'whiteAlpha.300', inputBg: 'whiteAlpha.50', inputColor: 'white', tipBg: 'rgba(59, 130, 246, 0.15)', tipBorderColor: 'blue.500', tipTextColor: 'blue.200', tipIconColor: 'blue.300', }; // 根据 isDarkMode 选择颜色 const labelColor = isDarkMode ? darkModeColors.labelColor : defaultLabelColor; const iconColor = isDarkMode ? darkModeColors.iconColor : defaultIconColor; const inputBorderColor = isDarkMode ? darkModeColors.inputBorderColor : defaultInputBorderColor; const tipBg = isDarkMode ? darkModeColors.tipBg : defaultTipBg; const tipBorderColor = isDarkMode ? darkModeColors.tipBorderColor : defaultTipBorderColor; const tipTextColor = isDarkMode ? darkModeColors.tipTextColor : defaultTipTextColor; const tipIconColor = isDarkMode ? darkModeColors.tipIconColor : defaultTipIconColor; // 使用默认日期初始化(仅在 value 为 null 且有 defaultDate 时) React.useEffect(() => { if (value === null && defaultDate) { onChange(defaultDate); } }, []); // eslint-disable-line react-hooks/exhaustive-deps // 处理日期变化 const handleDateChange = (e: React.ChangeEvent) => { const dateStr = e.target.value; if (dateStr) { const date = new Date(dateStr); onChange(date); } }; // 格式化日期为 YYYY-MM-DD const formatDateValue = (date: Date | null): string => { if (!date) return ''; return date.toISOString().split('T')[0]; }; // 计算日期范围 const minDateStr = minDate ? formatDateValue(minDate) : undefined; const maxDateStr = maxDate ? formatDateValue(maxDate) : new Date().toISOString().split('T')[0]; return ( <> {/* 标签 */} {showIcon && } {label}: {/* 日期输入框 */} {/* 最新交易日期提示 */} {latestTradeDate && ( 最新: {latestTradeDate.toLocaleDateString('zh-CN')} )} ); }; export default TradeDatePicker;