diff --git a/src/views/Concept/ConceptTimelineModal.js b/src/views/Concept/ConceptTimelineModal.js index 489da341..96ed35d6 100644 --- a/src/views/Concept/ConceptTimelineModal.js +++ b/src/views/Concept/ConceptTimelineModal.js @@ -105,6 +105,68 @@ const ConceptTimelineModal = ({ const [selectedNews, setSelectedNews] = useState(null); const [isNewsModalOpen, setIsNewsModalOpen] = useState(false); + // 辅助函数:格式化日期显示(包含年份) + const formatDateDisplay = (dateStr) => { + const date = new Date(dateStr); + const today = new Date(); + const diffTime = today - date; + const diffDays = Math.floor(diffTime / (1000 * 60 * 60 * 24)); + + const year = date.getFullYear(); + const month = String(date.getMonth() + 1).padStart(2, '0'); + const day = String(date.getDate()).padStart(2, '0'); + const formatted = `${year}-${month}-${day}`; + + if (diffDays === 0) return `今天 ${formatted}`; + if (diffDays === 1) return `昨天 ${formatted}`; + if (diffDays < 7) return `${diffDays}天前 ${formatted}`; + if (diffDays < 30) return `${Math.floor(diffDays / 7)}周前 ${formatted}`; + if (diffDays < 365) return `${Math.floor(diffDays / 30)}月前 ${formatted}`; + return formatted; + }; + + // 辅助函数:格式化完整时间(YYYY-MM-DD HH:mm) + const formatDateTime = (dateTimeStr) => { + if (!dateTimeStr) return '-'; + const normalized = typeof dateTimeStr === 'string' ? dateTimeStr.replace(' ', 'T') : dateTimeStr; + const dt = new Date(normalized); + if (isNaN(dt.getTime())) return '-'; + const y = dt.getFullYear(); + const m = String(dt.getMonth() + 1).padStart(2, '0'); + const d = String(dt.getDate()).padStart(2, '0'); + const hh = String(dt.getHours()).padStart(2, '0'); + const mm = String(dt.getMinutes()).padStart(2, '0'); + return `${y}-${m}-${d} ${hh}:${mm}`; + }; + + // 辅助函数:获取涨跌幅颜色和图标 + const getPriceInfo = (price) => { + if (!price || price.avg_change_pct === null) { + return { color: 'gray', icon: null, text: '无数据' }; + } + + const value = price.avg_change_pct; + if (value > 0) { + return { + color: 'red', + icon: FaArrowUp, + text: `+${value.toFixed(2)}%` + }; + } else if (value < 0) { + return { + color: 'green', + icon: FaArrowDown, + text: `${value.toFixed(2)}%` + }; + } else { + return { + color: 'gray', + icon: null, + text: '0.00%' + }; + } + }; + // 转换时间轴数据为日历事件格式 const calendarEvents = useMemo(() => { return timelineData.map(item => { @@ -170,68 +232,6 @@ const ConceptTimelineModal = ({ } }; - // 辅助函数:格式化日期显示(包含年份) - const formatDateDisplay = (dateStr) => { - const date = new Date(dateStr); - const today = new Date(); - const diffTime = today - date; - const diffDays = Math.floor(diffTime / (1000 * 60 * 60 * 24)); - - const year = date.getFullYear(); - const month = String(date.getMonth() + 1).padStart(2, '0'); - const day = String(date.getDate()).padStart(2, '0'); - const formatted = `${year}-${month}-${day}`; - - if (diffDays === 0) return `今天 ${formatted}`; - if (diffDays === 1) return `昨天 ${formatted}`; - if (diffDays < 7) return `${diffDays}天前 ${formatted}`; - if (diffDays < 30) return `${Math.floor(diffDays / 7)}周前 ${formatted}`; - if (diffDays < 365) return `${Math.floor(diffDays / 30)}月前 ${formatted}`; - return formatted; - }; - - // 辅助函数:格式化完整时间(YYYY-MM-DD HH:mm) - const formatDateTime = (dateTimeStr) => { - if (!dateTimeStr) return '-'; - const normalized = typeof dateTimeStr === 'string' ? dateTimeStr.replace(' ', 'T') : dateTimeStr; - const dt = new Date(normalized); - if (isNaN(dt.getTime())) return '-'; - const y = dt.getFullYear(); - const m = String(dt.getMonth() + 1).padStart(2, '0'); - const d = String(dt.getDate()).padStart(2, '0'); - const hh = String(dt.getHours()).padStart(2, '0'); - const mm = String(dt.getMinutes()).padStart(2, '0'); - return `${y}-${m}-${d} ${hh}:${mm}`; - }; - - // 辅助函数:获取涨跌幅颜色和图标 - const getPriceInfo = (price) => { - if (!price || price.avg_change_pct === null) { - return { color: 'gray', icon: null, text: '无数据' }; - } - - const value = price.avg_change_pct; - if (value > 0) { - return { - color: 'red', - icon: FaArrowUp, - text: `+${value.toFixed(2)}%` - }; - } else if (value < 0) { - return { - color: 'green', - icon: FaArrowDown, - text: `${value.toFixed(2)}%` - }; - } else { - return { - color: 'gray', - icon: null, - text: '0.00%' - }; - } - }; - // 获取时间轴数据 const fetchTimelineData = async () => { setLoading(true);