Files
Edu/packages/hooks/src/use-viewports.ts
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

66 lines
1.6 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 { 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,
};
}