|
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; |
|
|