import { createBrowserRouter, Navigate } from 'react-router-dom' import { Layout } from './components/Layout' import { Watchlist } from './pages/Watchlist' import { Screener } from './pages/Screener' import { Backtest } from './pages/Backtest' import { Financials } from './pages/Financials' import { Onboarding } from './pages/Onboarding' import { Auth } from './pages/Auth' import { Data } from './pages/Data' import { Monitor } from './pages/Monitor' import { Trading } from './pages/Trading' import { Dashboard } from './pages/Dashboard' import { AnalysisDetail } from './pages/AnalysisDetail' import { ConceptAnalysis } from './pages/ConceptAnalysis' import { IndustryAnalysis } from './pages/IndustryAnalysis' import { StockAnalysis } from './pages/StockAnalysis' import { Review } from './pages/Review' import { LimitUpLadder } from './pages/LimitUpLadder' import { Branding } from './pages/Branding' import { Settings } from './pages/Settings' import { Indices } from './pages/Indices' import { Dev } from './pages/Dev' import { Sync } from './pages/Sync' import { useSettings } from './lib/useSharedQueries' import { Logo } from './components/Logo' // 首次使用守卫 —— 未完成向导则重定向到 /onboarding // 只挂在根路由上;/onboarding 本身不被守卫,避免循环重定向。 // settings 由 Layout 预取,守卫判定不产生额外请求。 function OnboardingGuard({ children }: { children: React.ReactNode }) { const settings = useSettings() // 仅首次加载(本地无缓存)时显示占位。 // 后台重取 (isFetching) 时本地已有上一份缓存可用, 直接放行, 避免切页时整屏 logo 闪烁。 // 防误重定向已由 Onboarding/AI 等处 invalidate 前的 setQueryData 同步缓存兜底。 if (settings.isLoading) { return (