blob: 11219d3cf5bf6aac928d98f578cbb64bb7aa059e [file] [log] [blame]
Krishya6bf199c2025-06-06 21:14:23 +08001import React from 'react';
223010091e2aea72025-06-08 16:35:54 +08002import { Toaster } from 'react-hot-toast';
Krishya6bf199c2025-06-06 21:14:23 +08003import { Route, useLocation } from 'wouter';
4import { UserProvider, useUser } from './context/UserContext';
Krishyac6b24832025-06-05 20:13:20 +08005
Krishya1df05892025-04-05 21:16:30 +08006import AuthPage from './pages/AuthPage/AuthPage';
Krishya75e43c02025-04-05 21:16:30 +08007import HomePage from './pages/HomePage';
Krishyae71688a2025-04-10 21:25:17 +08008import FriendMoments from './pages/FriendMoments/FriendMoments';
Krishya7ec1dd02025-04-19 15:29:03 +08009import ForumPage from './pages/Forum/posts-main/ForumPage';
22301009ecc1c1c2025-04-09 21:56:23 +080010import SeedList from './pages/SeedList/SeedList';
Krishya7ec1dd02025-04-19 15:29:03 +080011import PostDetailPage from './pages/Forum/posts-detail/PostDetailPage';
Krishyac6b24832025-06-05 20:13:20 +080012import { GroupProvider } from './context/useGroupStore';
223010095b28c672025-04-10 20:12:45 +080013import PublishSeed from './pages/PublishSeed/PublishSeed';
Krishya8f2fec82025-06-04 21:54:46 +080014import SeedDetail from './pages/SeedList/SeedDetail/SeedDetail';
223010093a876cc2025-04-14 16:22:20 +080015import InterestGroup from './pages/InterestGroup/InterestGroup';
223010097ff51f22025-04-15 21:35:28 +080016import UserProfile from './pages/UserCenter/UserProfile';
Krishya7ec1dd02025-04-19 15:29:03 +080017import CreatePostPage from './pages/Forum/posts-create/CreatePostPage';
Krishyaf1d0ea82025-05-03 17:01:58 +080018import MessagePage from './pages/MessagePage/MessagePage';
19import CreateMoment from './pages/FriendMoments/CreateMoment';
Krishya73cd8822025-06-07 15:48:41 +080020// import LevelPage from './pages/LevelPage/LevelPage';
223010094952a0f2025-06-07 18:58:16 +080021import NewbieTasks from './pages/NewUserGuide/NewbieTasks';
Krishya6bf199c2025-06-06 21:14:23 +080022import UserDynamics from './pages/UserCenter/UserDynamics';
22301009648cb7e2025-06-04 08:54:23 +080023import UserFriends from './pages/UserCenter/UserFriends';
2230100964011632025-06-04 21:57:22 +080024import UserCollect from './pages/UserCenter/UserCollect';
Krishya7096ab12025-06-05 17:15:46 +080025import UserInvite from './pages/UserCenter/UserInvite';
Krishya767f9b92025-06-05 23:59:37 +080026import UserInfo from './pages/UserInfo/UserInfo';
Krishyac6b24832025-06-05 20:13:20 +080027import UserLayout from './pages/UserCenter/UserLayout';
223010093d8132e2025-06-07 11:34:38 +080028import NewUserGuide from './pages/NewUserGuide/NewUserGuide';
223010094952a0f2025-06-07 18:58:16 +080029import UserRecharge from './pages/UserCenter/UserRecharge';
Krishyaaffe8102025-06-08 00:44:46 +080030import GroupDetail from './pages/InterestGroup/GroupDetail';
223010091e2aea72025-06-08 16:35:54 +080031import PlaylistDetailPage from './pages/SeedList/Recommend/PlaylistDetailPage';
Krishyac6b24832025-06-05 20:13:20 +080032
Krishya8f2fec82025-06-04 21:54:46 +080033function RedirectToAuth() {
34 if (typeof window !== 'undefined') {
35 window.location.replace('/auth');
36 }
37 return null;
38}
39
Krishya6bf199c2025-06-06 21:14:23 +080040// 私有路由保护组件
41function PrivateRoute({ component: Component }) {
42 const [location, setLocation] = useLocation();
43 const { user, loading } = useUser();
44
45 if (loading) {
46 return <div>加载中...</div>;
47 }
48
49 if (!user) {
50 setLocation('/auth');
51 return null;
52 }
53
54 return <Component />;
55}
56
Krishya75e43c02025-04-05 21:16:30 +080057function App() {
58 return (
59 <UserProvider>
223010091e2aea72025-06-08 16:35:54 +080060 <Toaster />
Krishyac6b24832025-06-05 20:13:20 +080061 <GroupProvider>
Krishyab5ef96d2025-06-05 13:57:05 +080062 <>
Krishya6bf199c2025-06-06 21:14:23 +080063 {/* 公开路由 */}
Krishyab5ef96d2025-06-05 13:57:05 +080064 <Route path="/auth" component={AuthPage} />
Krishya767f9b92025-06-05 23:59:37 +080065
Krishya6bf199c2025-06-06 21:14:23 +080066 {/* 根路径跳转到登录页 */}
67 <Route path="/" component={() => <RedirectToAuth />} />
Krishyac6b24832025-06-05 20:13:20 +080068
Krishya6bf199c2025-06-06 21:14:23 +080069 {/* 私有路由用 PrivateRoute 包裹 */}
70 <Route path="/friend-moments" component={() => <PrivateRoute component={FriendMoments} />} />
71 <Route path="/friend-moments/create" component={() => <PrivateRoute component={CreateMoment} />} />
72 <Route path="/forum" component={() => <PrivateRoute component={ForumPage} />} />
73 <Route path="/forum/post/:postId" component={({ postId }) => <PrivateRoute component={() => <PostDetailPage postId={postId} />} />} />
74 <Route path="/forum/create-post" component={() => <PrivateRoute component={CreatePostPage} />} />
75 <Route path="/seed-list" component={() => <PrivateRoute component={SeedList} />} />
76 <Route path="/publish-seed" component={() => <PrivateRoute component={PublishSeed} />} />
77 <Route path="/seed/:id" component={({ id }) => <PrivateRoute component={() => <SeedDetail id={id} />} />} />
78 <Route path="/interest-groups" component={() => <PrivateRoute component={InterestGroup} />} />
79 <Route path="/messages" component={() => <PrivateRoute component={MessagePage} />} />
Krishya73cd8822025-06-07 15:48:41 +080080 {/* <Route path="/level" component={() => <PrivateRoute component={LevelPage} />} /> */}
Krishya6bf199c2025-06-06 21:14:23 +080081 <Route path="/information/:userId" component={({ userId }) => <PrivateRoute component={() => <UserInfo userId={userId} />} />} />
223010093d8132e2025-06-07 11:34:38 +080082 <Route path="/new-user-guide" component={() => <PrivateRoute component={NewUserGuide} />} />
Krishyaaffe8102025-06-08 00:44:46 +080083 <Route path="/group/:groupId" component={({ groupId }) => <PrivateRoute component={() => <GroupDetail groupId={groupId} />} />} />
223010091e2aea72025-06-08 16:35:54 +080084 <Route path="/playlist/:id" component={({ id }) => (
85 <PrivateRoute component={() => <PlaylistDetailPage id={id} />} />
86 )} />
87
Krishya6bf199c2025-06-06 21:14:23 +080088
89 {/* 用户中心路由 */}
Krishyac6b24832025-06-05 20:13:20 +080090 <Route path="/user/profile" component={() => (
Krishya6bf199c2025-06-06 21:14:23 +080091 <PrivateRoute component={() => <UserLayout><UserProfile /></UserLayout>} />
Krishyac6b24832025-06-05 20:13:20 +080092 )} />
223010094952a0f2025-06-07 18:58:16 +080093 <Route path="/user/newbie-tasks" component={() => (
Krishya6bf199c2025-06-06 21:14:23 +080094 <PrivateRoute component={() => <UserLayout><NewbieTasks /></UserLayout>} />
223010094952a0f2025-06-07 18:58:16 +080095 )} />
Krishya6bf199c2025-06-06 21:14:23 +080096 <Route path="/user/dynamics" component={() => (
97 <PrivateRoute component={() => <UserLayout><UserDynamics /></UserLayout>} />
98 )} />
Krishyac6b24832025-06-05 20:13:20 +080099 <Route path="/user/friends" component={() => (
Krishya6bf199c2025-06-06 21:14:23 +0800100 <PrivateRoute component={() => <UserLayout><UserFriends /></UserLayout>} />
Krishyac6b24832025-06-05 20:13:20 +0800101 )} />
102 <Route path="/user/collections" component={() => (
Krishya6bf199c2025-06-06 21:14:23 +0800103 <PrivateRoute component={() => <UserLayout><UserCollect /></UserLayout>} />
Krishyac6b24832025-06-05 20:13:20 +0800104 )} />
105 <Route path="/user/invite" component={() => (
Krishya6bf199c2025-06-06 21:14:23 +0800106 <PrivateRoute component={() => <UserLayout><UserInvite /></UserLayout>} />
Krishyac6b24832025-06-05 20:13:20 +0800107 )} />
223010094952a0f2025-06-07 18:58:16 +0800108 <Route path="/user/recharge" component={() => (
109 <PrivateRoute component={() => <UserLayout><UserRecharge /></UserLayout>} />
2230100901d3ff92025-06-07 16:16:26 +0800110 )} />
223010094952a0f2025-06-07 18:58:16 +0800111 </>
Krishyab5ef96d2025-06-05 13:57:05 +0800112 </GroupProvider>
Krishya75e43c02025-04-05 21:16:30 +0800113 </UserProvider>
114 );
115}
116
Krishya73cd8822025-06-07 15:48:41 +0800117export default App;