58 lines
1.9 KiB
TypeScript
58 lines
1.9 KiB
TypeScript
import { useMemo } from 'react';
|
|
import { Truck, Route, Activity, Zap } from 'lucide-react';
|
|
import { Shell, type ModuleConfig } from './components/Shell';
|
|
import AssetsModule from './modules/assets/AssetsModule';
|
|
import MileageModule from './modules/mileage/MileageModule';
|
|
import SchedulingModule from './modules/scheduling/SchedulingModule';
|
|
import EnergyModule from './modules/energy/EnergyModule';
|
|
import AuthProvider from './auth/AuthProvider';
|
|
import { useAuth } from './auth/useAuth';
|
|
import UnauthorizedPage from './auth/UnauthorizedPage';
|
|
import { canAccessScheduling } from './shared/auth/roles';
|
|
|
|
const BASE_MODULES: ModuleConfig[] = [
|
|
{ id: 'assets', label: '资产管理', icon: Truck, component: AssetsModule },
|
|
{ id: 'mileage', label: '里程管理', icon: Route, component: MileageModule },
|
|
{ id: 'energy', label: '能源管理', icon: Zap, component: EnergyModule },
|
|
];
|
|
|
|
const SCHEDULING_MODULE: ModuleConfig = {
|
|
id: 'scheduling', label: '智能调度', icon: Activity, component: SchedulingModule,
|
|
};
|
|
|
|
function AuthGate() {
|
|
const { isLoading, isAuthenticated, error, user } = useAuth();
|
|
|
|
const modules = useMemo(() => {
|
|
if (canAccessScheduling(user?.roles)) {
|
|
return [...BASE_MODULES, SCHEDULING_MODULE];
|
|
}
|
|
return BASE_MODULES;
|
|
}, [user?.roles]);
|
|
|
|
if (isLoading) {
|
|
return (
|
|
<div className="min-h-screen bg-[#F8F9FB] flex items-center justify-center">
|
|
<div className="text-center">
|
|
<div className="w-8 h-8 border-2 border-blue-600 border-t-transparent rounded-full animate-spin mx-auto mb-3"></div>
|
|
<p className="text-xs text-slate-400 font-bold">正在验证身份...</p>
|
|
</div>
|
|
</div>
|
|
);
|
|
}
|
|
|
|
if (!isAuthenticated) {
|
|
return <UnauthorizedPage message={error || undefined} />;
|
|
}
|
|
|
|
return <Shell modules={modules} />;
|
|
}
|
|
|
|
export default function App() {
|
|
return (
|
|
<AuthProvider>
|
|
<AuthGate />
|
|
</AuthProvider>
|
|
);
|
|
}
|