feat: strengthen module contracts and shared WebUI runtime
This commit is contained in:
@@ -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]
|
||||
);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user