feat: strengthen module contracts and shared WebUI runtime

This commit is contained in:
2026-07-29 14:16:28 +02:00
parent 53e947935a
commit 68328f3d8e
57 changed files with 4358 additions and 371 deletions
+21 -9
View File
@@ -1,4 +1,4 @@
import { createContext, type ReactNode, useContext } from "react";
import { createContext, type ReactNode, useContext, useMemo } from "react";
import type { PlatformWebModule } from "../types";
import { moduleInstalled, uiCapabilities, uiCapability } from "./modules";
import { useEffectiveView, useViewSurfaces } from "./ViewContext";
@@ -19,22 +19,34 @@ export function usePlatformModuleInstalled(moduleId: string): boolean {
}
export function usePlatformUiCapability<T = unknown>(capabilityName: string): T | null {
return uiCapability<T>(capabilityName, useViewVisibleModules());
const modules = useViewVisibleModules();
return useMemo(
() => uiCapability<T>(capabilityName, modules),
[capabilityName, modules]
);
}
export function usePlatformUiCapabilities<T = unknown>(capabilityName: string): T[] {
return uiCapabilities<T>(capabilityName, useViewVisibleModules());
const modules = useViewVisibleModules();
return useMemo(
() => uiCapabilities<T>(capabilityName, modules),
[capabilityName, modules]
);
}
function useViewVisibleModules(): PlatformWebModule[] {
const modules = usePlatformModules();
const projection = useEffectiveView();
const surfaces = useViewSurfaces();
return modules.filter((module) =>
isViewSurfaceVisible(
projection,
moduleViewSurfaceId(module.id),
surfaces
)
return useMemo(
() =>
modules.filter((module) =>
isViewSurfaceVisible(
projection,
moduleViewSurfaceId(module.id),
surfaces
)
),
[modules, projection, surfaces]
);
}