Files
Edu/packages/ui-components/src/require-permission.tsx
SpecialX faaaf29f67 docs: ai 协作文档体系重构与多 ai 仲裁结果落地
1.AI 协作文档体系重构(objections/worklines/contracts+matrix.md)

2.coord 仲裁文档(final-decisions/cross-review/final-rulings/orchestration)

3.各服务 01/02 文档补全

4.共享包初始化(shared-ts/shared-go/hooks/ui-components/ui-tokens)

5.Proto 契约补全

6.004 架构影响地图更新

7.端口分配表

8.设计规格文档
2026-07-10 12:58:22 +08:00

49 lines
1.5 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import type { ReactNode } from "react";
/**
* RequirePermission - L3 组件级视口控制
*
* 用途:根据当前用户权限点决定是否渲染 children。
* 无权限时不渲染 children返回 null 或自定义 fallback
*
* 权限点命名遵循 F7 裁决:`<RESOURCE>_<ACTION>`(如 `EXAM_READ`、`GRADE_READ_CHILD`)。
* 数据范围用后缀 `_OWN`/`_CHILD`(如 `GRADE_READ_CHILD`)。
*
* 注意:本组件依赖 `@edu/hooks` 的 `usePermission()`。为避免循环依赖,
* 权限检查函数通过 props 注入由调用方apps/*)从 usePermission() 获取后传入。
*
* @example
* import { usePermission } from "@edu/hooks";
* const { hasPermission } = usePermission();
*
* <RequirePermission perm="EXAM_CREATE" hasPermission={hasPermission}>
* <Button>新建考试</Button>
* </RequirePermission>
*/
export interface RequirePermissionProps {
/** 权限点F7 规范:<RESOURCE>_<ACTION> */
perm: string;
/**
* 权限检查函数(由 @edu/hooks 的 usePermission().hasPermission 注入)
* 返回 true 渲染 childrenfalse 渲染 fallback。
*/
hasPermission: (perm: string) => boolean;
/** 子节点(有权限时渲染) */
children: ReactNode;
/** 无权限时的降级 UI未提供时返回 null */
fallback?: ReactNode;
}
export function RequirePermission({
perm,
hasPermission,
children,
fallback = null,
}: RequirePermissionProps): ReactNode {
if (!hasPermission(perm)) {
return fallback;
}
return children;
}