import React, { ReactElement, useCallback, useEffect, useState } from 'react'; import { useTranslation } from 'react-i18next'; import { Icons, useModal } from '@ohif/ui-next'; import { Types } from '@ohif/core'; import DataSourceConfigurationModalComponent from './DataSourceConfigurationModalComponent'; function DataSourceConfigurationComponent({ servicesManager, extensionManager, }: withAppTypes): ReactElement { const { t } = useTranslation('DataSourceConfiguration'); const { show, hide } = useModal(); const { customizationService } = servicesManager.services; const [configurationAPI, setConfigurationAPI] = useState(); const [configuredItems, setConfiguredItems] = useState>(); useEffect(() => { let shouldUpdate = true; const dataSourceChangedCallback = async () => { const activeDataSourceDef = extensionManager.getActiveDataSourceDefinition(); if (!activeDataSourceDef.configuration.configurationAPI) { return; } const { factory: configurationAPIFactory } = customizationService.getCustomization( activeDataSourceDef.configuration.configurationAPI ) ?? { factory: () => null }; if (!configurationAPIFactory) { return; } const configAPI = configurationAPIFactory(activeDataSourceDef.sourceName); setConfigurationAPI(configAPI); // New configuration API means that the existing configured items must be cleared. setConfiguredItems(null); configAPI.getConfiguredItems().then(list => { if (shouldUpdate) { setConfiguredItems(list); } }); }; const sub = extensionManager.subscribe( extensionManager.EVENTS.ACTIVE_DATA_SOURCE_CHANGED, dataSourceChangedCallback ); dataSourceChangedCallback(); return () => { shouldUpdate = false; sub.unsubscribe(); }; }, []); const showConfigurationModal = useCallback(() => { show({ content: DataSourceConfigurationModalComponent, title: t('Configure Data Source'), contentProps: { configurationAPI, configuredItems, onHide: hide, }, }); }, [configurationAPI, configuredItems]); useEffect(() => { if (!configurationAPI || !configuredItems) { return; } if (configuredItems.length !== configurationAPI.getItemLabels().length) { // Not the correct number of configured items, so show the modal to configure the data source. showConfigurationModal(); } }, [configurationAPI, configuredItems, showConfigurationModal]); return configuredItems ? (
{configuredItems.map((item, itemIndex) => { return (
{item.name}
{itemIndex !== configuredItems.length - 1 &&
|
}
); })}
) : ( <> ); } export default DataSourceConfigurationComponent;