refactor: 枚举移入Models目录,命名空间更新为Rainbow.Entity.Models
大石头 authored at 2026-07-02 12:54:58
2.65 KiB
RainbowBridge
import { useState, useEffect, createContext, useContext } from 'react'
import { BrowserRouter, Routes, Route, Navigate } from 'react-router-dom'
import { AppLayout } from './components/layout/AppLayout'
import { AppSkeleton } from './components/common/AppSkeleton'
import { useSettingsStore } from './stores/settingsStore'
import { fetchUserProfile, logout, type UserProfile } from './lib/api'
import { Dashboard } from './pages/Dashboard'
import { Devices } from './pages/Devices'
import { WanPage } from './pages/WanPage'
import { FirewallPage } from './pages/FirewallPage'
import { PppoePage } from './pages/PppoePage'
import { DhcpPage } from './pages/DhcpPage'
import { DnsPage } from './pages/DnsPage'
import { SettingsPage } from './pages/SettingsPage'
import { MembersPage } from './pages/MembersPage'
import { StatsPage } from './pages/StatsPage'

// ── Auth Context ──

interface AuthState {
  user: UserProfile | null
  loading: boolean
  isAdmin: boolean
}

const AuthContext = createContext<AuthState>({ user: null, loading: true, isAdmin: false })
export const useAuth = () => useContext(AuthContext)

// ── App ──

export default function App() {
  const [user, setUser] = useState<UserProfile | null>(null)
  const [loading, setLoading] = useState(true)
  const loadSettings = useSettingsStore((s) => s.load)

  useEffect(() => {
    loadSettings()
  }, [loadSettings])

  useEffect(() => {
    fetchUserProfile()
      .then((profile: UserProfile) => {
        setUser(profile)
        setLoading(false)
      })
      .catch(() => {
        setLoading(false)
      })
  }, [])

  const isAdmin = user?.roles?.some((r: { name: string; isSystem: boolean }) => r.isSystem) ?? false

  if (loading) return <AppSkeleton />

  return (
    <AuthContext.Provider value={{ user, loading, isAdmin }}>
      <BrowserRouter>
        <AppLayout userProfile={user} onLogout={logout}>
          <Routes>
            <Route path="/" element={<Dashboard />} />
            <Route path="/devices" element={<Devices />} />
            <Route path="/wan" element={<WanPage />} />
            <Route path="/wan/pppoe" element={<PppoePage />} />
            <Route path="/wan/dhcp" element={<DhcpPage />} />
            <Route path="/firewall" element={<FirewallPage />} />
            <Route path="/firewall/dns" element={<DnsPage />} />
            <Route path="/members" element={<MembersPage />} />
            <Route path="/stats" element={<StatsPage />} />
            <Route path="/settings" element={<SettingsPage />} />
            <Route path="*" element={<Navigate to="/" replace />} />
          </Routes>
        </AppLayout>
      </BrowserRouter>
    </AuthContext.Provider>
  )
}