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;