import React, { useEffect, useState } from 'react'; import { toast } from 'react-hot-toast'; import { datasourceService } from '@/_services'; import { useTranslation } from 'react-i18next'; import { ButtonSolid } from '@/_ui/AppButton/AppButton'; import { DATA_SOURCE_TYPE } from '@/_helpers/constants'; import posthogHelper from '@/modules/common/helpers/posthogHelper'; export const TestConnection = ({ kind, options, pluginId, onConnectionTestFailed, environmentId, dataSourceId, dataSourceType, appId, }) => { const [isTesting, setTestingStatus] = useState(false); const [connectionStatus, setConnectionStatus] = useState('unknown'); const [buttonText, setButtonText] = useState('Test connection'); const { t } = useTranslation(); useEffect(() => { if (isTesting) { setButtonText('Testing connection...'); } else if (connectionStatus === 'success') { setButtonText('Connection verified'); } else { setButtonText('Test connection'); } }, [isTesting, connectionStatus]); useEffect(() => { setConnectionStatus('unknown'); }, [options]); function testDataSource() { setTestingStatus(true); posthogHelper.captureEvent('test_connection_datasource', { dataSource: kind, appId }); //posthog event const testConnectionBody = { kind, options, plugin_id: pluginId, environment_id: environmentId, dataSourceId: dataSourceId, }; const sampleDbTestConnection = { kind, options, plugin_id: pluginId, environment_id: environmentId, dataSourceId, }; const body = dataSourceType === DATA_SOURCE_TYPE.SAMPLE ? sampleDbTestConnection : testConnectionBody; const testFunction = dataSourceType === DATA_SOURCE_TYPE.SAMPLE ? datasourceService.testSampleDb : datasourceService.test; testFunction(body).then( (data) => { setTestingStatus(false); if (data.status === 'ok') { setConnectionStatus('success'); } else { setConnectionStatus('failed'); onConnectionTestFailed(data); } }, ({ error }) => { setTestingStatus(false); setConnectionStatus('failed'); toast.error(error, { position: 'top-center' }); } ); } return (
{connectionStatus === 'failed' && ( {t('globals.noConnection', 'could not connect')} )} {connectionStatus === 'success' && ( {t('globals.connectionVerified', 'connection verified')} )} {connectionStatus === 'unknown' && ( testDataSource()} data-cy={`test-connection-button`} variant="tertiary" leftIcon="arrowsort" > {buttonText} )}
); };