Spaces:
Paused
Paused
File size: 1,454 Bytes
b152fd5 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 | type PluginBridgeRegistry = {
react?: {
createElement?: (type: unknown, props?: Record<string, unknown> | null) => unknown;
} | null;
sdkUi?: Record<string, unknown> | null;
};
type GlobalBridge = typeof globalThis & {
__paperclipPluginBridge__?: PluginBridgeRegistry;
};
function getBridgeRegistry(): PluginBridgeRegistry | undefined {
return (globalThis as GlobalBridge).__paperclipPluginBridge__;
}
function missingBridgeValueError(name: string): Error {
return new Error(
`Paperclip plugin UI runtime is not initialized for "${name}". ` +
'Ensure the host loaded the plugin bridge before rendering this UI module.',
);
}
export function getSdkUiRuntimeValue<T>(name: string): T {
const value = getBridgeRegistry()?.sdkUi?.[name];
if (value === undefined) {
throw missingBridgeValueError(name);
}
return value as T;
}
export function renderSdkUiComponent<TProps>(
name: string,
props: TProps,
): unknown {
const registry = getBridgeRegistry();
const component = registry?.sdkUi?.[name];
if (component === undefined) {
throw missingBridgeValueError(name);
}
const createElement = registry?.react?.createElement;
if (typeof createElement === "function") {
return createElement(component, props as Record<string, unknown>);
}
if (typeof component === "function") {
return component(props);
}
throw new Error(`Paperclip plugin UI component "${name}" is not callable`);
}
|