import { useEffect } from 'react'; import { BrowserRouter, Routes, Route, Navigate, useNavigate, useLocation } from 'react-router-dom'; import { AnimatePresence, motion } from 'framer-motion'; import { Background } from './components/layout'; import Loader from './components/Loader'; import LoginPage from './pages/LoginPage'; import OnboardingPage from './pages/OnboardingPage'; import DashboardPage from './pages/DashboardPage'; import useStore from './store/useStore'; /** * 路由守卫组件 * 根据登录状态和注册完成状态进行路由重定向 * - requireAuth: 需要登录才能访问 * - requireOnboarding: 需要完成入站流程才能访问 */ const ProtectedRoute = ({ children, requireAuth = false, requireOnboarding = false }) => { const { isLoggedIn, registrationData } = useStore(); const navigate = useNavigate(); // 检查是否完成入站流程(有昵称和未来愿景即视为已完成) const hasCompletedOnboarding = !!(registrationData.nickname && registrationData.future?.vision); useEffect(() => { if (requireAuth && !isLoggedIn) { navigate('/', { replace: true }); } else if (requireOnboarding && !hasCompletedOnboarding) { navigate('/onboarding', { replace: true }); } }, [isLoggedIn, hasCompletedOnboarding, requireAuth, requireOnboarding, navigate]); if (requireAuth && !isLoggedIn) { return ; } if (requireOnboarding && !hasCompletedOnboarding) { return ; } return children; }; /** * 页面过渡动画包装器 */ const PageTransition = ({ children }) => { return ( {children} ); }; /** * 动画路由组件 */ const AnimatedRoutes = () => { const location = useLocation(); const { isLoggedIn, registrationData } = useStore(); // 检查是否完成入站流程(有昵称和未来愿景即视为已完成) const hasCompletedOnboarding = !!(registrationData.nickname && registrationData.future?.vision); return ( {/* 登录页 */} ) : ( ) ) : ( ) } /> {/* 入站流程页 - 已完成入站的用户直接跳转到首页 */} ) : hasCompletedOnboarding ? ( ) : ( ) } /> {/* 仪表盘页 */} } /> {/* 404 重定向 */} } /> ); }; /** * App 主组件 */ function App() { // 生产环境使用 /course-of-life 作为基础路径 const basename = import.meta.env.PROD ? '/course-of-life' : ''; return ( {/* 动态背景 */} {/* 主容器 */}
); } export default App;