imetting_frontend/src/App.jsx

115 lines
4.1 KiB
React
Raw Permalink Normal View History

2025-08-05 01:44:28 +00:00
import React, { useState, useEffect } from 'react';
import { BrowserRouter as Router, Routes, Route, Navigate } from 'react-router-dom';
2025-08-29 08:37:55 +00:00
import apiClient from './utils/apiClient';
import { buildApiUrl, API_ENDPOINTS } from './config/api';
2025-08-05 01:44:28 +00:00
import HomePage from './pages/HomePage';
import Dashboard from './pages/Dashboard';
2025-12-11 08:47:46 +00:00
import AdminDashboard from './pages/AdminDashboard';
2025-08-05 01:44:28 +00:00
import MeetingDetails from './pages/MeetingDetails';
2025-11-07 09:11:54 +00:00
import MeetingPreview from './pages/MeetingPreview';
2025-08-05 01:44:28 +00:00
import CreateMeeting from './pages/CreateMeeting';
import EditMeeting from './pages/EditMeeting';
2025-09-11 05:16:24 +00:00
import AdminManagement from './pages/AdminManagement';
2025-10-21 09:30:30 +00:00
import PromptManagementPage from './pages/PromptManagementPage';
2025-10-16 03:09:41 +00:00
import KnowledgeBasePage from './pages/KnowledgeBasePage';
2025-10-16 09:15:07 +00:00
import EditKnowledgeBase from './pages/EditKnowledgeBase';
2025-10-21 09:30:30 +00:00
import ClientDownloadPage from './pages/ClientDownloadPage';
2026-01-16 02:08:11 +00:00
import AccountSettings from './pages/AccountSettings';
2025-08-05 01:44:28 +00:00
import './App.css';
function App() {
const [user, setUser] = useState(null);
const [isLoading, setIsLoading] = useState(true);
// Load user from localStorage on app start
useEffect(() => {
const savedUser = localStorage.getItem('iMeetingUser');
console.log('Saved user from localStorage:', savedUser);
if (savedUser) {
try {
const parsedUser = JSON.parse(savedUser);
console.log('Parsed user:', parsedUser);
setUser(parsedUser);
} catch (error) {
console.error('Error parsing saved user:', error);
localStorage.removeItem('iMeetingUser');
}
}
setIsLoading(false);
}, []);
const handleLogin = (userData) => {
setUser(userData);
localStorage.setItem('iMeetingUser', JSON.stringify(userData));
};
2025-08-29 08:37:55 +00:00
const handleLogout = async () => {
try {
// 调用后端登出API撤销token
await apiClient.post(buildApiUrl(API_ENDPOINTS.AUTH.LOGOUT));
} catch (error) {
console.error('Logout API error:', error);
// 即使API调用失败也继续登出流程
} finally {
// 清除本地状态和存储
setUser(null);
localStorage.removeItem('iMeetingUser');
}
2025-08-05 01:44:28 +00:00
};
if (isLoading) {
return (
<div className="app-loading">
<div className="loading-spinner"></div>
<p>加载中...</p>
</div>
);
}
return (
<Router>
<div className="app">
<Routes>
<Route path="/" element={
user ? <Navigate to="/dashboard" /> : <HomePage onLogin={handleLogin} />
} />
<Route path="/dashboard" element={
2025-12-11 08:47:46 +00:00
user ? (
user.role_id === 1
? <AdminDashboard user={user} onLogout={handleLogout} />
: <Dashboard user={user} onLogout={handleLogout} />
) : <Navigate to="/" />
2025-08-05 01:44:28 +00:00
} />
<Route path="/meetings/:meeting_id" element={
2025-08-05 02:58:13 +00:00
user ? <MeetingDetails user={user} /> : <Navigate to="/" />
2025-08-05 01:44:28 +00:00
} />
<Route path="/meetings/create" element={
user ? <CreateMeeting user={user} /> : <Navigate to="/" />
} />
<Route path="/meetings/edit/:meeting_id" element={
user ? <EditMeeting user={user} /> : <Navigate to="/" />
} />
2025-09-11 05:16:24 +00:00
<Route path="/admin/management" element={
user && user.role_id === 1 ? <AdminManagement user={user} /> : <Navigate to="/dashboard" />
} />
2025-10-21 09:30:30 +00:00
<Route path="/prompt-management" element={
user ? <PromptManagementPage user={user} /> : <Navigate to="/" />
} />
2025-10-16 03:09:41 +00:00
<Route path="/knowledge-base" element={
user ? <KnowledgeBasePage user={user} /> : <Navigate to="/" />
} />
2025-10-16 09:15:07 +00:00
<Route path="/knowledge-base/edit/:kb_id" element={
user ? <EditKnowledgeBase user={user} /> : <Navigate to="/" />
} />
2026-01-16 02:08:11 +00:00
<Route path="/account-settings" element={
user ? <AccountSettings user={user} onUpdateUser={handleLogin} /> : <Navigate to="/" />
} />
2025-10-21 09:30:30 +00:00
<Route path="/downloads" element={<ClientDownloadPage />} />
2025-11-10 11:42:44 +00:00
<Route path="/meetings/preview/:meeting_id" element={<MeetingPreview />} />
2025-08-05 01:44:28 +00:00
</Routes>
</div>
</Router>
);
}
export default App;