refactor(web): Tab 权限映射集中化 — 消除硬编码
- routeConfig.ts 新增 TAB_PERMISSIONS 配置(单一真相源) - 新增 usePermFilteredTabs hook,通用 Tab 权限过滤 - PatientDetail.tsx 移除内联 TAB_PERMISSIONS,改用 hook - 未声明 Tab 安全默认隐藏,DEV 模式 console.warn 提示
This commit is contained in:
38
apps/web/src/hooks/usePermFilteredTabs.ts
Normal file
38
apps/web/src/hooks/usePermFilteredTabs.ts
Normal file
@@ -0,0 +1,38 @@
|
||||
import { useAuthStore } from '../stores/auth';
|
||||
import { TAB_PERMISSIONS } from '../routeConfig';
|
||||
|
||||
export interface TabItem {
|
||||
key: string;
|
||||
[prop: string]: unknown;
|
||||
}
|
||||
|
||||
/**
|
||||
* 根据权限过滤详情页 Tab 列表。
|
||||
*
|
||||
* @param prefix - Tab 权限映射前缀(如 "patient"),对应 routeConfig.ts 中 "patient#tabKey"
|
||||
* @param tabs - 完整 Tab 列表
|
||||
* @returns 过滤后有权限可见的 Tab 列表
|
||||
*/
|
||||
export function usePermFilteredTabs<T extends TabItem>(prefix: string, tabs: T[]): T[] {
|
||||
const permissions = useAuthStore((s) => s.permissions);
|
||||
|
||||
return tabs.filter((tab) => {
|
||||
const lookupKey = `${prefix}#${tab.key}`;
|
||||
const requiredPerm = TAB_PERMISSIONS[lookupKey];
|
||||
|
||||
// 未在 TAB_PERMISSIONS 中声明的 Tab,安全默认:不显示
|
||||
if (requiredPerm === undefined && !(lookupKey in TAB_PERMISSIONS)) {
|
||||
if (import.meta.env.DEV) {
|
||||
console.warn(
|
||||
`[usePermFilteredTabs] Tab "${lookupKey}" 未在 routeConfig.ts TAB_PERMISSIONS 中声明,已隐藏。请添加声明。`,
|
||||
);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
// 显式声明为 undefined(无需权限)→ 始终可见
|
||||
if (requiredPerm === undefined) return true;
|
||||
|
||||
return permissions.includes(requiredPerm);
|
||||
});
|
||||
}
|
||||
Reference in New Issue
Block a user