import { useSyncExternalStore } from "react"; import { Spinner } from "@nous-research/ui/ui/components/spinner"; import { getPluginComponent, getPluginLoadError, onPluginRegistered, } from "./registry"; import { useI18n } from "@/i18n"; import { cn } from "@/lib/utils"; import type { Translations } from "@/i18n/types"; /** Renders a plugin tab once its bundle has called `register()`. */ export function PluginPage({ name }: { name: string }) { const { t } = useI18n(); // Subscribe in render (via useSyncExternalStore) so we never miss // `register()` if the script loads before a useEffect would run. const Component = useSyncExternalStore( (onChange) => onPluginRegistered(onChange), () => getPluginComponent(name) ?? null, () => null, ); const loadError = useSyncExternalStore( (onChange) => onPluginRegistered(onChange), () => getPluginLoadError(name) ?? null, () => null, ); if (Component) { return ; } if (loadError) { const message = formatPluginError(loadError, t); return (
{message}
); } return (
{t.common.loading}
); } function formatPluginError(code: string, t: Translations): string { if (code === "LOAD_FAILED") return t.common.pluginLoadFailed; if (code === "NO_REGISTER") return t.common.pluginNotRegistered; return code; }