import React from 'react'; import { useNavigate } from 'react-router-dom'; import { App, Avatar, Button, Card, Divider, Dropdown, Space, Tag, Timeline, Typography, } from 'antd'; import { ArrowRightOutlined, CalendarOutlined, ClockCircleOutlined, DeleteOutlined, EditOutlined, FileTextOutlined, MoreOutlined, TeamOutlined, UserOutlined, } from '@ant-design/icons'; import MarkdownRenderer from './MarkdownRenderer'; import tools from '../utils/tools'; const { Title, Text, Paragraph } = Typography; const formatDateMeta = (date) => { const parsed = new Date(date); if (Number.isNaN(parsed.getTime())) { return { main: date, sub: '' }; } return { main: tools.formatDateLong(date), sub: parsed.toLocaleDateString('zh-CN', { weekday: 'long' }), }; }; const MeetingTimeline = ({ meetingsByDate, currentUser, onDeleteMeeting, hasMore = false, onLoadMore, loadingMore = false, filterType = 'all', searchQuery = '', selectedTags = [], }) => { const { modal } = App.useApp(); const navigate = useNavigate(); const handleEditClick = (event, meetingId) => { event.preventDefault(); event.stopPropagation(); navigate(`/meetings/edit/${meetingId}`); }; const handleDeleteClick = (event, meeting) => { event.preventDefault(); event.stopPropagation(); modal.confirm({ title: '删除会议', content: `确定要删除会议“${meeting.title}”吗?此操作无法撤销。`, okText: '删除', okType: 'danger', onOk: () => onDeleteMeeting(meeting.meeting_id), }); }; const sortedDates = Object.keys(meetingsByDate).sort((a, b) => new Date(b) - new Date(a)); const timelineItems = sortedDates.map((date) => { const dateMeta = formatDateMeta(date); return { label: (
{dateMeta.main} {dateMeta.sub ? {dateMeta.sub} : null}
), children: (
{meetingsByDate[date].map((meeting) => { const isCreator = String(meeting.creator_id) === String(currentUser.user_id); const menuItems = [ { key: 'edit', label: '编辑', icon: , onClick: ({ domEvent }) => handleEditClick(domEvent, meeting.meeting_id) }, { key: 'delete', label: '删除', icon: , danger: true, onClick: ({ domEvent }) => handleDeleteClick(domEvent, meeting) }, ]; return ( navigate(`/meetings/${meeting.meeting_id}`, { state: { filterContext: { filterType, searchQuery, selectedTags } }, })} >
{meeting.title} } wrap> {tools.formatTime(meeting.meeting_time)} {meeting.attendees?.length || 0} 人 {meeting.tags?.slice(0, 4).map((tag) => ( {tag.name} ))} {isCreator ? (
{meeting.summary ? (
会议摘要
) : null}
} /> {meeting.creator_username}
); })}
), }; }); return (
{hasMore ? ( ) : ( 已加载全部会议 )}
); }; export default MeetingTimeline;