// 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={

{
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;