App.tsx 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  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 { Button } from '@alifd/next';
  6. import './App.css';
  7. import '../../assets/tailwind.css'
  8. import '@alifd/next/dist/next.css';
  9. import '@alifd/next/dist/next.min.css';
  10. import Login from './pages/Login'
  11. import DesignPic from './pages/DesignPic';
  12. import { useLoading } from '@/components/LoadingContext';
  13. // 创建一个保护路由组件
  14. function ProtectedRoute({ children }: { children: React.ReactNode }) {
  15. const isLoggedIn = localStorage.getItem('isLoggedIn');
  16. return isLoggedIn ? <>{children}</> : <Navigate to="/login" replace />;
  17. }
  18. // 创建带登出功能的导航组件
  19. function Navigation({ onLogout, userinfo }: { onLogout: () => void, userinfo: any }) {
  20. const navigate = useNavigate();
  21. const handleLogout = () => {
  22. onLogout();
  23. navigate('/login');
  24. };
  25. return (
  26. <div className="flex gap-4 items-center justify-between">
  27. <div className='font-bold'>{userinfo && userinfo.nickname ? <div>
  28. <span className='mr-4'>等级: {userinfo.version_custom_name}</span>
  29. <span>账户: {userinfo.nickname}</span>
  30. </div> : <>未获取到用户信息</>}</div>
  31. <nav className="flex gap-4 items-center">
  32. {/* <Link to="/" className="text-blue-500 hover:underline">首页</Link> */}
  33. <Button
  34. type="normal" warning
  35. onClick={handleLogout}
  36. >
  37. 退出登录
  38. </Button>
  39. </nav>
  40. </div>
  41. );
  42. }
  43. function App() {
  44. const [count, setCount] = useState(0);
  45. const [isLoggedIn, setIsLoggedIn] = useState(false);
  46. const [userinfo, setUserinfo] = useState<any>(null);
  47. const { showLoading, hideLoading } = useLoading();
  48. // 检查登录状态
  49. useEffect(() => {
  50. const loggedIn = localStorage.getItem('isLoggedIn') === 'true';
  51. setIsLoggedIn(loggedIn);
  52. }, []);
  53. useEffect(() => {
  54. // 获取用户信息
  55. if (isLoggedIn) {
  56. if (localStorage.getItem('userinfo')) {
  57. let userinfoStr = localStorage.getItem('userinfo');
  58. try {
  59. // 尝试解析用户信息
  60. const parsedUserinfo = userinfoStr ? JSON.parse(userinfoStr) : null;
  61. setUserinfo(parsedUserinfo);
  62. } catch (e) {
  63. // 如果解析失败,可能是字符串格式
  64. setUserinfo({ nickname: userinfoStr });
  65. }
  66. }
  67. }
  68. }, [isLoggedIn])
  69. // 处理登出逻辑
  70. const handleLogout = () => {
  71. showLoading("退出登录中...")
  72. setTimeout(() => {
  73. hideLoading()
  74. localStorage.removeItem('isLoggedIn');
  75. localStorage.removeItem('access_token');
  76. localStorage.removeItem('userinfo');
  77. setIsLoggedIn(false);
  78. }, 500)
  79. };
  80. return (
  81. <Router>
  82. {/* 只在登录后显示导航栏 */}
  83. {isLoggedIn && <Navigation onLogout={handleLogout} userinfo={userinfo} />}
  84. <Routes>
  85. <Route path="/login" element={<Login setIsLoggedIn={setIsLoggedIn} />} />
  86. <Route path="/" element={
  87. <ProtectedRoute>
  88. <DesignPic />
  89. </ProtectedRoute>
  90. } />
  91. {/* <Route path="/about" element={
  92. <ProtectedRoute>
  93. <About />
  94. </ProtectedRoute>
  95. } />
  96. <Route path="/home" element={
  97. <ProtectedRoute>
  98. <Home />
  99. </ProtectedRoute>
  100. } /> */}
  101. </Routes>
  102. </Router>
  103. );
  104. }
  105. export default App;