App.tsx 4.0 KB

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