App_20250812135312.tsx 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. // entrypoints/popup/App.tsx
  2. import { useState, useEffect } from 'react';
  3. import { HashRouter as Router, Routes, Route, Navigate } from 'react-router-dom';
  4. import { Link, useNavigate } from 'react-router-dom';
  5. import './App.css';
  6. import '../../assets/tailwind.css'
  7. // import BtnTest from './src/Components/BtnTest.jsx'
  8. // import Home from './pages/Home'
  9. // import About from './pages/About'
  10. import Login from './pages/Login'
  11. // 创建一个保护路由组件
  12. function ProtectedRoute({ children }: { children: React.ReactNode }) {
  13. const isLoggedIn = localStorage.getItem('isLoggedIn');
  14. return isLoggedIn ? <>{children}</> : <Navigate to="/login" replace />;
  15. }
  16. // 创建带登出功能的导航组件
  17. function Navigation({ onLogout }: { onLogout: () => void }) {
  18. const navigate = useNavigate();
  19. const handleLogout = () => {
  20. onLogout();
  21. navigate('/login');
  22. };
  23. return (
  24. <nav className="flex gap-4 p-4 items-center">
  25. <Link to="/" className="text-blue-500 hover:underline">首页</Link>
  26. {/* <Link to="/about" className="text-blue-500 hover:underline">关于</Link>
  27. <Link to="/home" className="text-blue-500 hover:underline">主页</Link> */}
  28. <button
  29. onClick={handleLogout}
  30. className="ml-auto text-red-500 hover:underline"
  31. >
  32. 退出登录
  33. </button>
  34. </nav>
  35. );
  36. }
  37. function App() {
  38. const [count, setCount] = useState(0);
  39. const [isLoggedIn, setIsLoggedIn] = useState(false);
  40. // 检查登录状态
  41. useEffect(() => {
  42. const loggedIn = localStorage.getItem('isLoggedIn') === 'true';
  43. setIsLoggedIn(loggedIn);
  44. }, []);
  45. // 处理登出逻辑
  46. const handleLogout = () => {
  47. localStorage.removeItem('isLoggedIn');
  48. localStorage.removeItem('access_token');
  49. setIsLoggedIn(false);
  50. };
  51. return (
  52. <Router>
  53. {/* 只在登录后显示导航栏 */}
  54. {isLoggedIn && <Navigation onLogout={handleLogout} />}
  55. <Routes>
  56. <Route path="/login" element={<Login setIsLoggedIn={setIsLoggedIn} />} />
  57. <Route path="/" element={
  58. <ProtectedRoute>
  59. <div>
  60. <button className='text-red-300'>按钮</button>
  61. </div>
  62. </ProtectedRoute>
  63. } />
  64. {/* <Route path="/about" element={
  65. <ProtectedRoute>
  66. <About />
  67. </ProtectedRoute>
  68. } />
  69. <Route path="/home" element={
  70. <ProtectedRoute>
  71. <Home />
  72. </ProtectedRoute>
  73. } /> */}
  74. </Routes>
  75. </Router>
  76. );
  77. }
  78. export default App;