import React, { ReactElement, useCallback, useEffect, useState } from 'react'; import { useTranslation } from 'react-i18next'; import { Icons, useModal, Button, HoverCard, HoverCardTrigger, HoverCardContent, Card, CardHeader, CardDescription, CardContent, } 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>(); const [itemLabels, setItemLabels] = useState>([]); useEffect(() => { let shouldUpdate = true; const dataSourceChangedCallback = async () => { const activeDataSourceDef = extensionManager.getActiveDataSourceDefinition(); if (!activeDataSourceDef?.configuration?.configurationAPI) { return; } const configurationAPIFactory = customizationService.getCustomization(activeDataSourceDef.configuration.configurationAPI) ?? (() => null); if (!configurationAPIFactory) { return; } const configAPI = configurationAPIFactory(activeDataSourceDef.sourceName); setConfigurationAPI(configAPI); setItemLabels(configAPI.getItemLabels()); // 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'), containerClassName: 'max-w-3xl', 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 ? ( {t('Data Source')}:{' '} {t('Configure the server connection and storage settings')}
{itemLabels.map((label, index) => ( {t(label)} {configuredItems[index]?.name ?? '—'} ))} ) : null; } export default DataSourceConfigurationComponent;