feat(scheduling): restrict scheduling module to allowed users only
Only userId 1105261382487539712 and 1116631120763437056 can see the scheduling tab. Other users see only assets + mileage modules. - Add userId to frontend AuthState.user type - App.tsx conditionally includes scheduling module based on user ID - Backend already returns userId in auth exchange response Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
24
src/App.tsx
24
src/App.tsx
@@ -1,3 +1,4 @@
|
|||||||
|
import { useMemo } from 'react';
|
||||||
import { Truck, Route, Activity } from 'lucide-react';
|
import { Truck, Route, Activity } from 'lucide-react';
|
||||||
import { Shell, type ModuleConfig } from './components/Shell';
|
import { Shell, type ModuleConfig } from './components/Shell';
|
||||||
import AssetsModule from './modules/assets/AssetsModule';
|
import AssetsModule from './modules/assets/AssetsModule';
|
||||||
@@ -7,14 +8,29 @@ import AuthProvider from './auth/AuthProvider';
|
|||||||
import { useAuth } from './auth/useAuth';
|
import { useAuth } from './auth/useAuth';
|
||||||
import UnauthorizedPage from './auth/UnauthorizedPage';
|
import UnauthorizedPage from './auth/UnauthorizedPage';
|
||||||
|
|
||||||
const MODULES: ModuleConfig[] = [
|
const SCHEDULING_ALLOWED_USERS = new Set([
|
||||||
|
'1105261382487539712',
|
||||||
|
'1116631120763437056',
|
||||||
|
]);
|
||||||
|
|
||||||
|
const BASE_MODULES: ModuleConfig[] = [
|
||||||
{ id: 'assets', label: '资产管理', icon: Truck, component: AssetsModule },
|
{ id: 'assets', label: '资产管理', icon: Truck, component: AssetsModule },
|
||||||
{ id: 'mileage', label: '里程管理', icon: Route, component: MileageModule },
|
{ id: 'mileage', label: '里程管理', icon: Route, component: MileageModule },
|
||||||
{ id: 'scheduling', label: '智能调度', icon: Activity, component: SchedulingModule },
|
|
||||||
];
|
];
|
||||||
|
|
||||||
|
const SCHEDULING_MODULE: ModuleConfig = {
|
||||||
|
id: 'scheduling', label: '智能调度', icon: Activity, component: SchedulingModule,
|
||||||
|
};
|
||||||
|
|
||||||
function AuthGate() {
|
function AuthGate() {
|
||||||
const { isLoading, isAuthenticated, error } = useAuth();
|
const { isLoading, isAuthenticated, error, user } = useAuth();
|
||||||
|
|
||||||
|
const modules = useMemo(() => {
|
||||||
|
if (user?.userId && SCHEDULING_ALLOWED_USERS.has(user.userId)) {
|
||||||
|
return [...BASE_MODULES, SCHEDULING_MODULE];
|
||||||
|
}
|
||||||
|
return BASE_MODULES;
|
||||||
|
}, [user?.userId]);
|
||||||
|
|
||||||
if (isLoading) {
|
if (isLoading) {
|
||||||
return (
|
return (
|
||||||
@@ -31,7 +47,7 @@ function AuthGate() {
|
|||||||
return <UnauthorizedPage message={error || undefined} />;
|
return <UnauthorizedPage message={error || undefined} />;
|
||||||
}
|
}
|
||||||
|
|
||||||
return <Shell modules={MODULES} />;
|
return <Shell modules={modules} />;
|
||||||
}
|
}
|
||||||
|
|
||||||
export default function App() {
|
export default function App() {
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ import { createContext, useContext } from 'react';
|
|||||||
export interface AuthState {
|
export interface AuthState {
|
||||||
isLoading: boolean;
|
isLoading: boolean;
|
||||||
isAuthenticated: boolean;
|
isAuthenticated: boolean;
|
||||||
user: { userName: string; permissionLevel: string; depName: string } | null;
|
user: { userId: string; userName: string; permissionLevel: string; depName: string } | null;
|
||||||
error: string | null;
|
error: string | null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user