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.设计规格文档
66 lines
1.6 KiB
TypeScript
66 lines
1.6 KiB
TypeScript
import { useMemo } from "react";
|
||
import type { Viewport } from "./types.js";
|
||
|
||
/**
|
||
* useViewports - 视口列表查询
|
||
*
|
||
* 用途:按 scope 过滤当前用户的可用视口(iam 4 层视口模型)。
|
||
* 视口数据由调用方注入(apps/* 从 iam /iam/viewports 获取后传入)。
|
||
*
|
||
* iam 视口 4 层:admin / teacher / student / parent
|
||
*
|
||
* @example
|
||
* const { viewports, getByType, hasViewport } = useViewports({ viewports });
|
||
* const teacherViewports = getByType("teacher");
|
||
*/
|
||
|
||
export interface UseViewportsProps {
|
||
/** 当前用户的视口列表(从 iam 获取) */
|
||
viewports: Viewport[] | null;
|
||
}
|
||
|
||
export interface UseViewportsReturn {
|
||
/** 全部视口 */
|
||
viewports: Viewport[];
|
||
/** 按类型过滤 */
|
||
getByType: (type: Viewport["type"]) => Viewport[];
|
||
/** 检查是否拥有指定类型视口 */
|
||
hasViewport: (type: Viewport["type"]) => boolean;
|
||
/** 按 ID 查找 */
|
||
getById: (id: string) => Viewport | undefined;
|
||
}
|
||
|
||
export function useViewports({
|
||
viewports: input,
|
||
}: UseViewportsProps): UseViewportsReturn {
|
||
const viewports = useMemo(() => input ?? [], [input]);
|
||
|
||
const getByType = useMemo(
|
||
() =>
|
||
(type: Viewport["type"]): Viewport[] =>
|
||
viewports.filter((v) => v.type === type),
|
||
[viewports],
|
||
);
|
||
|
||
const hasViewport = useMemo(
|
||
() =>
|
||
(type: Viewport["type"]): boolean =>
|
||
viewports.some((v) => v.type === type),
|
||
[viewports],
|
||
);
|
||
|
||
const getById = useMemo(
|
||
() =>
|
||
(id: string): Viewport | undefined =>
|
||
viewports.find((v) => v.id === id),
|
||
[viewports],
|
||
);
|
||
|
||
return {
|
||
viewports,
|
||
getByType,
|
||
hasViewport,
|
||
getById,
|
||
};
|
||
}
|