import { createContext, type ReactNode, useContext, useMemo } from "react"; import type { PlatformWebModule } from "../types"; import { moduleInstalled, uiCapabilities, uiCapability } from "./modules"; import { useEffectiveView, useViewSurfaces } from "./ViewContext"; import { isViewSurfaceVisible, moduleViewSurfaceId } from "./views"; const PlatformModulesContext = createContext([]); export function PlatformModulesProvider({ modules, children }: { modules: PlatformWebModule[]; children: ReactNode }) { return {children}; } export function usePlatformModules(): PlatformWebModule[] { return useContext(PlatformModulesContext); } export function usePlatformModuleInstalled(moduleId: string): boolean { return moduleInstalled(moduleId, usePlatformModules()); } export function usePlatformUiCapability(capabilityName: string): T | null { const modules = useViewVisibleModules(); return useMemo( () => uiCapability(capabilityName, modules), [capabilityName, modules] ); } export function usePlatformUiCapabilities(capabilityName: string): T[] { const modules = useViewVisibleModules(); return useMemo( () => uiCapabilities(capabilityName, modules), [capabilityName, modules] ); } function useViewVisibleModules(): PlatformWebModule[] { const modules = usePlatformModules(); const projection = useEffectiveView(); const surfaces = useViewSurfaces(); return useMemo( () => modules.filter((module) => isViewSurfaceVisible( projection, moduleViewSurfaceId(module.id), surfaces ) ), [modules, projection, surfaces] ); }