52 lines
1.4 KiB
TypeScript
52 lines
1.4 KiB
TypeScript
import { PluginLoaderManagerProps } from './types';
|
|
import { useEffect } from 'react';
|
|
import logger from '/imports/startup/client/logger';
|
|
|
|
const PluginLoaderManager = (props: PluginLoaderManagerProps) => {
|
|
const {
|
|
uuid,
|
|
containerRef,
|
|
setNumberOfLoadedPlugins,
|
|
setLastLoadedPlugin,
|
|
pluginConfig: plugin,
|
|
} = props;
|
|
|
|
useEffect(() => {
|
|
if (!plugin || !containerRef) {
|
|
return;
|
|
}
|
|
|
|
const div = document.createElement('div');
|
|
div.id = uuid;
|
|
containerRef.current?.appendChild(div);
|
|
|
|
const script: HTMLScriptElement = document.createElement('script');
|
|
script.onload = () => {
|
|
setNumberOfLoadedPlugins((current) => current + 1);
|
|
setLastLoadedPlugin(script);
|
|
logger.info({
|
|
logCode: 'plugin_loaded',
|
|
}, `Loaded plugin ${plugin.name}`);
|
|
};
|
|
script.onerror = () => {
|
|
logger.error({
|
|
logCode: 'plugin_load_error',
|
|
extraInfo: {
|
|
pluginName: plugin.name,
|
|
pluginUrl: plugin.url,
|
|
},
|
|
}, `Error when loading plugin ${plugin.name}`);
|
|
};
|
|
script.src = plugin.url;
|
|
script.setAttribute('uuid', div.id);
|
|
script.setAttribute('pluginName', plugin.name);
|
|
if (plugin.javascriptEntrypointChecksum) {
|
|
script.setAttribute('integrity', plugin.javascriptEntrypointChecksum);
|
|
}
|
|
document.head.appendChild(script);
|
|
}, [plugin, containerRef]);
|
|
return null;
|
|
};
|
|
|
|
export default PluginLoaderManager;
|