import React, { useEffect, useMemo, useState } from 'react'; import { App, Button, Card, Empty, Input, Segmented, Space, Tag, Tooltip, Typography, } from 'antd'; import { CalendarOutlined, DeleteOutlined, EditOutlined, PlusOutlined, RightOutlined, SearchOutlined, TeamOutlined, } from '@ant-design/icons'; import { useLocation, useNavigate } from 'react-router-dom'; import apiClient from '../utils/apiClient'; import { API_ENDPOINTS, buildApiUrl } from '../config/api'; import CenterPager from '../components/CenterPager'; import MeetingFormDrawer from '../components/MeetingFormDrawer'; const { Title, Text, Paragraph } = Typography; const FILTER_OPTIONS = [ { label: '全部', value: 'all' }, { label: '我发起', value: 'created' }, { label: '我参与', value: 'attended' }, ]; const STATUS_META = { completed: { label: '已完成', tagColor: '#52c41a', tagBg: '#f6ffed', tagBorder: '#b7eb8f', accent: '#52c41a', }, failed: { label: '失败', tagColor: '#ff4d4f', tagBg: '#fff1f0', tagBorder: '#ffccc7', accent: '#ff4d4f', }, transcribing: { label: '转写中', tagColor: '#1677ff', tagBg: '#eff6ff', tagBorder: '#bfdbfe', accent: '#1677ff', }, summarizing: { label: '总结中', tagColor: '#fa8c16', tagBg: '#fff7e6', tagBorder: '#ffd591', accent: '#fa8c16', }, pending: { label: '待处理', tagColor: '#8c8c8c', tagBg: '#fafafa', tagBorder: '#d9d9d9', accent: '#d9d9d9', }, }; const getStatusMeta = (meeting) => { const status = meeting?.overall_status || 'pending'; return STATUS_META[status] || STATUS_META.pending; }; const formatMeetingTime = (value) => { if (!value) return '-'; const date = new Date(value); if (Number.isNaN(date.getTime())) return '-'; return `${date.getFullYear()}-${String(date.getMonth() + 1).padStart(2, '0')}-${String(date.getDate()).padStart(2, '0')} ${String(date.getHours()).padStart(2, '0')}:${String(date.getMinutes()).padStart(2, '0')}`; }; const MeetingCenterPage = ({ user }) => { const navigate = useNavigate(); const location = useLocation(); const { message, modal } = App.useApp(); const [meetings, setMeetings] = useState([]); const [loading, setLoading] = useState(false); const [keyword, setKeyword] = useState(''); const [searchValue, setSearchValue] = useState(''); const [filterType, setFilterType] = useState('all'); const [page, setPage] = useState(1); const [pageSize] = useState(8); const [total, setTotal] = useState(0); const [formDrawerOpen, setFormDrawerOpen] = useState(false); const [editingMeetingId, setEditingMeetingId] = useState(null); const loadMeetings = async (nextPage = page, nextKeyword = keyword, nextFilter = filterType) => { setLoading(true); try { const res = await apiClient.get(buildApiUrl(API_ENDPOINTS.MEETINGS.LIST), { params: { user_id: user.user_id, page: nextPage, page_size: pageSize, filter_type: nextFilter, search: nextKeyword || undefined, }, }); setMeetings(res.data.meetings || []); setTotal(res.data.total || 0); } catch (error) { message.error(error?.response?.data?.message || '加载会议失败'); } finally { setLoading(false); } }; useEffect(() => { loadMeetings(page, keyword, filterType); }, [page, keyword, filterType]); useEffect(() => { if (location.state?.openCreate) { setEditingMeetingId(null); setFormDrawerOpen(true); navigate(location.pathname, { replace: true, state: {} }); } }, [location.pathname, location.state, navigate]); const handleDeleteMeeting = (meeting) => { modal.confirm({ title: '删除会议', content: `确定删除「${meeting.title}」吗?`, okText: '删除', okType: 'danger', onOk: async () => { try { await apiClient.delete(buildApiUrl(API_ENDPOINTS.MEETINGS.DELETE(meeting.meeting_id))); message.success('会议已删除'); const nextPage = page > 1 && meetings.length === 1 ? page - 1 : page; setPage(nextPage); loadMeetings(nextPage, keyword, filterType); } catch (error) { message.error(error?.response?.data?.message || '删除失败'); } }, }); }; const footerText = useMemo(() => { if (!total) return '当前没有会议'; return `为您找到 ${total} 场会议`; }, [total]); return (