import React, { useState, useEffect, useRef } from 'react'; import { LogOut, User, Calendar, Users, TrendingUp, Clock, MessageSquare, Plus, ChevronDown, KeyRound, Shield } 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 './Dashboard.css'; const Dashboard = ({ user, onLogout }) => { const [userInfo, setUserInfo] = useState(null); const [meetings, setMeetings] = useState([]); 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(() => { 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 = (meetings) => { return meetings.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 (
加载中...
{error}
{userInfo?.email}
加入时间:{formatDate(userInfo?.created_at)}
发起的会议
参加的会议
相关会议总数
按时间顺序展示您参与的所有会议