// src/views/Community/components/HotEvents.js import React, { useState } from 'react'; import { Card, Badge, Tag, Empty, Carousel, Tooltip } from 'antd'; import { ArrowUpOutlined, ArrowDownOutlined, LeftOutlined, RightOutlined } from '@ant-design/icons'; import { Modal, ModalOverlay, ModalContent, ModalHeader, ModalBody, ModalCloseButton, useDisclosure } from '@chakra-ui/react'; import moment from 'moment'; import './HotEvents.css'; import defaultEventImage from '../../../assets/img/default-event.jpg'; import DynamicNewsDetailPanel from './DynamicNewsDetail'; // 自定义箭头组件 const CustomArrow = ({ className, style, onClick, direction }) => { const Icon = direction === 'left' ? LeftOutlined : RightOutlined; return (
); }; const HotEvents = ({ events, onPageChange, onEventClick }) => { const [currentSlide, setCurrentSlide] = useState(0); const { isOpen: isModalOpen, onOpen: onModalOpen, onClose: onModalClose } = useDisclosure(); const [modalEvent, setModalEvent] = useState(null); const renderPriceChange = (value) => { if (value === null || value === undefined) { return --; } const isPositive = value > 0; const icon = isPositive ? : ; const color = isPositive ? '#ff4d4f' : '#52c41a'; return ( {icon} {Math.abs(value).toFixed(2)}% ); }; const getImportanceColor = (importance) => { const colors = { S: 'red', A: 'orange', B: 'blue', C: 'green' }; return colors[importance] || 'default'; }; const handleCardClick = (event) => { // 🎯 追踪热点事件点击 if (onEventClick) { onEventClick({ eventId: event.id, eventTitle: event.title, importance: event.importance, source: 'hot_events_section', timestamp: new Date().toISOString(), }); } setModalEvent(event); onModalOpen(); }; // 计算总页数 const totalPages = Math.ceil((events?.length || 0) / 4); // Carousel 配置 const carouselSettings = { dots: false, // 隐藏圆点导航 infinite: true, // 始终启用无限循环,确保箭头显示 speed: 500, slidesToShow: 4, slidesToScroll: 1, arrows: true, // 保留左右箭头 prevArrow: , nextArrow: , autoplay: false, beforeChange: (_current, next) => { // 计算实际页码(考虑无限循环) const actualPage = next % totalPages; setCurrentSlide(actualPage); // 通知父组件页码变化 if (onPageChange) { onPageChange(actualPage + 1, totalPages); } }, responsive: [ { breakpoint: 1200, settings: { slidesToShow: 3, slidesToScroll: 1, } }, { breakpoint: 992, settings: { slidesToShow: 2, slidesToScroll: 1, } }, { breakpoint: 576, settings: { slidesToShow: 1, slidesToScroll: 1, } } ] }; return (
{events && events.length > 0 ? ( {events.map((event, index) => (
handleCardClick(event)} cover={
{event.title} { e.target.onerror = null; e.target.src = defaultEventImage; }} /> {event.importance && ( )}
} > {/* Custom layout without Card.Meta */}
{event.title} {renderPriceChange(event.related_avg_chg)}
{event.description}
{event.creator?.username || 'Anonymous'} {moment(event.created_at).format('YYYY-MM-DD')} {' '} {moment(event.created_at).format('HH:mm')}
))}
) : ( )} {/* 事件详情弹窗 - 使用 Chakra UI Modal(与平铺模式一致) */} {isModalOpen ? ( {modalEvent?.title || '事件详情'} {modalEvent && } ): null}
); }; export default HotEvents;