import { Button, Tabs, TabsProps } from 'antd'; import { MarkdownRenderer } from 'components/MarkdownRenderer/MarkdownRenderer'; import Spinner from 'components/Spinner'; import CloudServiceDashboards from 'container/CloudIntegrationPage/ServicesSection/CloudServiceDashboards'; import CloudServiceDataCollected from 'container/CloudIntegrationPage/ServicesSection/CloudServiceDataCollected'; import { IServiceStatus } from 'container/CloudIntegrationPage/ServicesSection/types'; import dayjs from 'dayjs'; import { useServiceDetails } from 'hooks/integrations/aws/useServiceDetails'; import useUrlQuery from 'hooks/useUrlQuery'; import { useMemo, useState } from 'react'; import ConfigureServiceModal from './ConfigureServiceModal'; const getStatus = ( logsLastReceivedTimestamp: number | undefined, metricsLastReceivedTimestamp: number | undefined, ): { text: string; className: string } => { if (!logsLastReceivedTimestamp && !metricsLastReceivedTimestamp) { return { text: 'No Data Yet', className: 'service-status--no-data' }; } const latestTimestamp = Math.max( logsLastReceivedTimestamp || 0, metricsLastReceivedTimestamp || 0, ); const isStale = dayjs().diff(dayjs(latestTimestamp), 'minute') > 30; if (isStale) { return { text: 'Stale Data', className: 'service-status--stale-data' }; } return { text: 'Connected', className: 'service-status--connected' }; }; function ServiceStatus({ serviceStatus, }: { serviceStatus: IServiceStatus | undefined; }): JSX.Element { const logsLastReceivedTimestamp = serviceStatus?.logs?.last_received_ts_ms; const metricsLastReceivedTimestamp = serviceStatus?.metrics?.last_received_ts_ms; const { text, className } = getStatus( logsLastReceivedTimestamp, metricsLastReceivedTimestamp, ); return
{text}
; } function ServiceDetails(): JSX.Element | null { const urlQuery = useUrlQuery(); const cloudAccountId = urlQuery.get('cloudAccountId'); const serviceId = urlQuery.get('service'); const [isConfigureServiceModalOpen, setIsConfigureServiceModalOpen] = useState( false, ); const { data: serviceDetailsData, isLoading } = useServiceDetails( serviceId || '', cloudAccountId || undefined, ); // eslint-disable-next-line @typescript-eslint/naming-convention const { config, supported_signals } = serviceDetailsData ?? {}; const totalSupportedSignals = Object.entries(supported_signals || {}).filter( ([, value]) => !!value, ).length; const enabledSignals = useMemo( () => Object.values(config || {}).filter((item) => item && item.enabled).length, [config], ); const isAnySignalConfigured = useMemo( () => !!config?.logs?.enabled || !!config?.metrics?.enabled, [config], ); if (isLoading) { return ; } if (!serviceDetailsData) { return null; } const tabItems: TabsProps['items'] = [ { key: 'dashboards', label: `Dashboards (${serviceDetailsData?.assets.dashboards.length})`, children: , }, { key: 'data-collected', label: 'Data Collected', children: ( ), }, ]; return (
Details
{isAnySignalConfigured && ( )} {!!cloudAccountId && isAnySignalConfigured ? ( ) : ( )}
{isConfigureServiceModalOpen && ( setIsConfigureServiceModalOpen(false)} serviceName={serviceDetailsData.title} serviceId={serviceId || ''} cloudAccountId={cloudAccountId || ''} initialConfig={serviceDetailsData.config} supportedSignals={serviceDetailsData.supported_signals || {}} /> )}
); } export default ServiceDetails;