ccccccc / client /src /App.tsx
cnmksjs's picture
Upload 49 files
24fd742 verified
import React, { useState, useEffect } from 'react';
import { BrowserRouter as Router, Routes, Route, Navigate } from 'react-router-dom';
import Login from './components/Login';
import Register from './components/Register';
import Chat from './components/Chat';
import { User } from './types';
function App() {
const [user, setUser] = useState<User | null>(null);
const [loading, setLoading] = useState(true);
useEffect(() => {
// 检查本地存储中的用户信息
const token = localStorage.getItem('token');
const userData = localStorage.getItem('user');
if (token && userData) {
try {
const parsedUser = JSON.parse(userData);
setUser(parsedUser);
} catch (error) {
console.error('解析用户数据失败:', error);
localStorage.removeItem('token');
localStorage.removeItem('user');
}
}
setLoading(false);
}, []);
const handleLogin = (userData: User, token: string) => {
setUser(userData);
localStorage.setItem('token', token);
localStorage.setItem('user', JSON.stringify(userData));
};
const handleLogout = () => {
setUser(null);
localStorage.removeItem('token');
localStorage.removeItem('user');
};
if (loading) {
return (
<div className="min-h-screen flex items-center justify-center bg-gray-50">
<div className="animate-spin rounded-full h-12 w-12 border-b-2 border-primary-600"></div>
</div>
);
}
return (
<Router>
<div className="min-h-screen bg-gray-50">
<Routes>
<Route
path="/login"
element={
user ? (
<Navigate to="/chat" replace />
) : (
<Login onLogin={handleLogin} />
)
}
/>
<Route
path="/register"
element={
user ? (
<Navigate to="/chat" replace />
) : (
<Register onRegister={handleLogin} />
)
}
/>
<Route
path="/chat"
element={
user ? (
<Chat user={user} onLogout={handleLogout} />
) : (
<Navigate to="/login" replace />
)
}
/>
<Route
path="/"
element={
<Navigate to={user ? "/chat" : "/login"} replace />
}
/>
</Routes>
</div>
</Router>
);
}
export default App;