fix(dynamic load): make sure required extensions are loaded (#3377)

* fixes some bugs

* make cornerstone default for now
This commit is contained in:
Alireza 2023-05-09 12:26:16 -04:00 committed by GitHub
parent 98d966514a
commit 0b4c3649e7
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 36 additions and 19 deletions

View File

@ -5,7 +5,6 @@
}, },
{ {
"packageName": "@ohif/extension-cornerstone", "packageName": "@ohif/extension-cornerstone",
"default": false,
"version": "3.0.0" "version": "3.0.0"
}, },
{ {

View File

@ -103,7 +103,10 @@ export default function ModeRoute({
const [studyInstanceUIDs, setStudyInstanceUIDs] = useState(); const [studyInstanceUIDs, setStudyInstanceUIDs] = useState();
const [refresh, setRefresh] = useState(false); const [refresh, setRefresh] = useState(false);
const [allExtensionsLoaded, setAllExtensionsLoaded] = useState(false); const [
ExtensionDependenciesLoaded,
setExtensionDependenciesLoaded,
] = useState(false);
const layoutTemplateData = useRef(false); const layoutTemplateData = useRef(false);
const locationRef = useRef(null); const locationRef = useRef(null);
@ -169,6 +172,23 @@ export default function ModeRoute({
return ViewportGrid({ ...props, dataSource }); return ViewportGrid({ ...props, dataSource });
} }
useEffect(() => {
const loadExtensions = async () => {
const loadedExtensions = await loadModules(Object.keys(extensions));
for (const extension of loadedExtensions) {
const { id: extensionId } = extension;
if (
extensionManager.registeredExtensionIds.indexOf(extensionId) === -1
) {
await extensionManager.registerExtension(extension);
}
}
setExtensionDependenciesLoaded(true);
};
loadExtensions();
}, []);
useEffect(() => { useEffect(() => {
// Preventing state update for unmounted component // Preventing state update for unmounted component
isMounted.current = true; isMounted.current = true;
@ -178,6 +198,10 @@ export default function ModeRoute({
}, []); }, []);
useEffect(() => { useEffect(() => {
if (!ExtensionDependenciesLoaded) {
return;
}
// Todo: this should not be here, data source should not care about params // Todo: this should not be here, data source should not care about params
const initializeDataSource = async (params, query) => { const initializeDataSource = async (params, query) => {
const studyInstanceUIDs = await dataSource.initialize({ const studyInstanceUIDs = await dataSource.initialize({
@ -191,9 +215,13 @@ export default function ModeRoute({
return () => { return () => {
layoutTemplateData.current = null; layoutTemplateData.current = null;
}; };
}, [location]); }, [location, ExtensionDependenciesLoaded]);
useEffect(() => { useEffect(() => {
if (!ExtensionDependenciesLoaded) {
return;
}
const retrieveLayoutData = async () => { const retrieveLayoutData = async () => {
const layoutData = await route.layoutTemplate({ const layoutData = await route.layoutTemplate({
location, location,
@ -211,10 +239,10 @@ export default function ModeRoute({
return () => { return () => {
layoutTemplateData.current = null; layoutTemplateData.current = null;
}; };
}, [studyInstanceUIDs]); }, [studyInstanceUIDs, ExtensionDependenciesLoaded]);
useEffect(() => { useEffect(() => {
if (!hotkeys) { if (!hotkeys || !ExtensionDependenciesLoaded) {
return; return;
} }
@ -231,25 +259,14 @@ export default function ModeRoute({
return () => { return () => {
hotkeysManager.destroy(); hotkeysManager.destroy();
}; };
}, []); }, [ExtensionDependenciesLoaded]);
useEffect(() => { useEffect(() => {
if (!layoutTemplateData.current) { if (!layoutTemplateData.current || !ExtensionDependenciesLoaded) {
return; return;
} }
const setupRouteInit = async () => { const setupRouteInit = async () => {
const loadedExtensions = await loadModules(Object.keys(extensions));
for (const extension of loadedExtensions) {
const { id: extensionId } = extension;
if (
extensionManager.registeredExtensionIds.indexOf(extensionId) === -1
) {
await extensionManager.registerExtension(extension);
}
}
setAllExtensionsLoaded(true);
// TODO: For some reason this is running before the Providers // TODO: For some reason this is running before the Providers
// are calling setServiceImplementation // are calling setServiceImplementation
// TODO -> iterate through services. // TODO -> iterate through services.
@ -370,6 +387,7 @@ export default function ModeRoute({
mode, mode,
dataSourceName, dataSourceName,
location, location,
ExtensionDependenciesLoaded,
route, route,
servicesManager, servicesManager,
extensionManager, extensionManager,
@ -397,7 +415,7 @@ export default function ModeRoute({
<DragAndDropProvider> <DragAndDropProvider>
{layoutTemplateData.current && {layoutTemplateData.current &&
studyInstanceUIDs?.[0] !== undefined && studyInstanceUIDs?.[0] !== undefined &&
allExtensionsLoaded && ExtensionDependenciesLoaded &&
renderLayoutData({ renderLayoutData({
...layoutTemplateData.current.props, ...layoutTemplateData.current.props,
ViewportGridComp: ViewportGridWithDataSource, ViewportGridComp: ViewportGridWithDataSource,