import React, { useState, useEffect, useRef } from 'react'; import { LogOut, User, Calendar, Users, TrendingUp, Clock, MessageSquare, Plus, ChevronDown, KeyRound, Shield, Filter, X } from 'lucide-react'; import apiClient from '../utils/apiClient'; import { Link } from 'react-router-dom'; import { buildApiUrl, API_ENDPOINTS } from '../config/api'; import MeetingTimeline from '../components/MeetingTimeline'; import TagCloud from '../components/TagCloud'; import './Dashboard.css'; const Dashboard = ({ user, onLogout }) => { const [userInfo, setUserInfo] = useState(null); const [meetings, setMeetings] = useState([]); const [filteredMeetings, setFilteredMeetings] = useState([]); const [selectedTags, setSelectedTags] = useState([]); const [filterType, setFilterType] = useState('all'); // 'all', 'created', 'attended' const [loading, setLoading] = useState(true); const [error, setError] = useState(''); const [dropdownOpen, setDropdownOpen] = useState(false); const [showChangePasswordModal, setShowChangePasswordModal] = useState(false); const [oldPassword, setOldPassword] = useState(''); const [newPassword, setNewPassword] = useState(''); const [confirmPassword, setConfirmPassword] = useState(''); const [passwordChangeError, setPasswordChangeError] = useState(''); const [passwordChangeSuccess, setPasswordChangeSuccess] = useState(''); const dropdownRef = useRef(null); useEffect(() => { fetchUserData(); }, [user.user_id]); // 过滤会议 useEffect(() => { filterMeetings(); }, [meetings, selectedTags, filterType]); const filterMeetings = () => { let filtered = [...meetings]; // 根据创建/参与类型过滤 if (filterType === 'created') { filtered = filtered.filter(meeting => String(meeting.creator_id) === String(user.user_id)); } else if (filterType === 'attended') { filtered = filtered.filter(meeting => String(meeting.creator_id) !== String(user.user_id)); } // 根据选中的标签过滤 if (selectedTags.length > 0) { filtered = filtered.filter(meeting => { if (!meeting.tags || meeting.tags.length === 0) return false; const meetingTags = meeting.tags.map(tag => typeof tag === 'string' ? tag : tag.name); return selectedTags.some(selectedTag => meetingTags.includes(selectedTag)); }); } setFilteredMeetings(filtered); }; const handleTagClick = (tagName) => { setSelectedTags(prev => { if (prev.includes(tagName)) { return prev.filter(tag => tag !== tagName); } else { return [...prev, tagName]; } }); }; const handleFilterTypeChange = (type) => { setFilterType(type); }; const clearFilters = () => { setSelectedTags([]); setFilterType('all'); }; useEffect(() => { const handleClickOutside = (event) => { if (dropdownRef.current && !dropdownRef.current.contains(event.target)) { setDropdownOpen(false); } }; document.addEventListener("mousedown", handleClickOutside); return () => { document.removeEventListener("mousedown", handleClickOutside); }; }, [dropdownRef]); const fetchUserData = async () => { try { setLoading(true); console.log('Fetching user data for user_id:', user.user_id); const userResponse = await apiClient.get(buildApiUrl(API_ENDPOINTS.USERS.DETAIL(user.user_id))); console.log('User response:', userResponse.data); setUserInfo(userResponse.data); const meetingsResponse = await apiClient.get(buildApiUrl(`${API_ENDPOINTS.MEETINGS.LIST}?user_id=${user.user_id}`)); //console.log('Meetings response:', meetingsResponse.data); setMeetings(meetingsResponse.data); } catch (err) { console.error('Error fetching data:', err); setError('获取数据失败,请刷新重试'); } finally { setLoading(false); } }; const handleDeleteMeeting = async (meetingId) => { try { await apiClient.delete(buildApiUrl(API_ENDPOINTS.MEETINGS.DELETE(meetingId))); // Refresh meetings list const meetingsResponse = await apiClient.get(buildApiUrl(`${API_ENDPOINTS.MEETINGS.LIST}?user_id=${user.user_id}`)); setMeetings(meetingsResponse.data); } catch (err) { console.error('Error deleting meeting:', err); // You might want to show an error message to the user here } }; const handlePasswordChange = async (e) => { e.preventDefault(); if (newPassword !== confirmPassword) { setPasswordChangeError('新密码不匹配'); return; } if (newPassword.length < 6) { setPasswordChangeError('新密码长度不能少于6位'); return; } setPasswordChangeError(''); setPasswordChangeSuccess(''); try { await apiClient.put(buildApiUrl(API_ENDPOINTS.USERS.UPDATE_PASSWORD(user.user_id)), { old_password: oldPassword, new_password: newPassword, }); setPasswordChangeSuccess('密码修改成功!'); // 清空输入框并准备关闭模态框 setOldPassword(''); setNewPassword(''); setConfirmPassword(''); setTimeout(() => { setShowChangePasswordModal(false); setPasswordChangeSuccess(''); }, 2000); } catch (err) { setPasswordChangeError(err.response?.data?.detail || '密码修改失败'); } }; const groupMeetingsByDate = (meetingsToGroup) => { return meetingsToGroup.reduce((acc, meeting) => { const date = new Date(meeting.meeting_time || meeting.created_at).toISOString().split('T')[0]; if (!acc[date]) { acc[date] = []; } acc[date].push(meeting); return acc; }, {}); }; const formatDate = (dateString) => { const date = new Date(dateString); return date.toLocaleDateString('zh-CN', { year: 'numeric', month: 'long', day: 'numeric' }); }; if (loading) { return (

加载中...

); } if (error) { return (

{error}

); } const groupedMeetings = groupMeetingsByDate(filteredMeetings); // 计算统计数据 const createdMeetings = meetings.filter(m => String(m.creator_id) === String(user.user_id)); const attendedMeetings = meetings.filter(m => String(m.creator_id) !== String(user.user_id)); return (
{/* Header */}
iMeeting
setDropdownOpen(!dropdownOpen)}> 欢迎,{userInfo?.caption}
{dropdownOpen && (
{user.role_id === 1 && ( setDropdownOpen(false)}> 平台管理 )}
)}
{/* 用户信息、统计和标签云一行布局 */}

{userInfo?.caption}

{userInfo?.email}

加入时间:{formatDate(userInfo?.created_at)}

{/* 统一的统计卡片 */}

会议统计

handleFilterTypeChange('created')} >
我创建的会议 {createdMeetings.length}
handleFilterTypeChange('attended')} >
我参加的会议 {attendedMeetings.length}
handleFilterTypeChange('all')} >
全部会议 {meetings.length}
{/* 标签云卡片 */}
{/* Meetings Timeline Section */}

会议时间轴

按时间顺序展示您参与的所有会议

新建会议纪要
{showChangePasswordModal && (

修改密码

{passwordChangeError &&

{passwordChangeError}

} {passwordChangeSuccess &&

{passwordChangeSuccess}

}
setOldPassword(e.target.value)} required />
setNewPassword(e.target.value)} required />
setConfirmPassword(e.target.value)} required />
)}
); }; export default Dashboard;