Skip to content

Commit 785d08e

Browse files
Merge pull request #3438 from RedisInsight/fe/bugfix/RI-5792_test_connections_abort_controller
#RI-5792 - abort test connections request
2 parents 10e076a + 3c263cf commit 785d08e

File tree

2 files changed

+47
-12
lines changed

2 files changed

+47
-12
lines changed

redisinsight/ui/src/pages/rdi/pipeline-management/pages/config/Config.tsx

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ import { FileChangeType, IPipeline, RdiPipelineTabs } from 'uiSrc/slices/interfa
1414
import MonacoYaml from 'uiSrc/components/monaco-editor/components/monaco-yaml'
1515
import TestConnectionsPanel from 'uiSrc/pages/rdi/pipeline-management/components/test-connections-panel'
1616
import TemplatePopover from 'uiSrc/pages/rdi/pipeline-management/components/template-popover'
17-
import { testConnectionsAction, rdiTestConnectionsSelector } from 'uiSrc/slices/rdi/testConnections'
17+
import { testConnectionsAction, rdiTestConnectionsSelector, testConnectionsController } from 'uiSrc/slices/rdi/testConnections'
1818
import { appContextPipelineManagement } from 'uiSrc/slices/app/context'
1919
import { isEqualPipelineFile } from 'uiSrc/utils'
2020

@@ -37,6 +37,10 @@ const Config = () => {
3737
sendPageViewTelemetry({
3838
name: TelemetryPageView.RDI_CONFIG,
3939
})
40+
41+
return () => {
42+
testConnectionsController?.abort()
43+
}
4044
}, [])
4145

4246
useEffect(() => {
@@ -81,6 +85,11 @@ const Config = () => {
8185
checkIsFileUpdated(value)
8286
}
8387

88+
const handleClosePanel = () => {
89+
testConnectionsController?.abort()
90+
setIsPanelOpen(false)
91+
}
92+
8493
return (
8594
<>
8695
<div className={cx('content', 'rdi__wrapper', { [styles.isPanelOpen]: isPanelOpen })}>
@@ -137,7 +146,7 @@ const Config = () => {
137146
</div>
138147
</div>
139148
{isPanelOpen && (
140-
<TestConnectionsPanel onClose={() => setIsPanelOpen(false)} />
149+
<TestConnectionsPanel onClose={handleClosePanel} />
141150
)}
142151
</>
143152
)

redisinsight/ui/src/slices/rdi/testConnections.ts

Lines changed: 36 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,15 @@
11
import { createSlice, PayloadAction } from '@reduxjs/toolkit'
2-
import { AxiosError } from 'axios'
2+
import axios, { AxiosError } from 'axios'
33
import { apiService, } from 'uiSrc/services'
44
import { addErrorNotification } from 'uiSrc/slices/app/notifications'
5-
import { getApiErrorMessage, getRdiUrl, isStatusSuccessful, transformConnectionResults } from 'uiSrc/utils'
5+
import {
6+
getApiErrorMessage,
7+
getRdiUrl,
8+
isStatusSuccessful,
9+
Maybe,
10+
Nullable,
11+
transformConnectionResults
12+
} from 'uiSrc/utils'
613
import {
714
IStateRdiTestConnections,
815
TestConnectionsResponse,
@@ -31,10 +38,13 @@ const rdiTestConnectionsSlice = createSlice({
3138
state.results = payload
3239
state.error = ''
3340
},
34-
testConnectionsFailure: (state, { payload }) => {
41+
testConnectionsFailure: (state, { payload }: PayloadAction<Maybe<string>>) => {
3542
state.loading = false
36-
state.error = payload
3743
state.results = null
44+
45+
if (payload) {
46+
state.error = payload
47+
}
3848
},
3949
}
4050
})
@@ -50,6 +60,9 @@ export const {
5060
// The reducer
5161
export default rdiTestConnectionsSlice.reducer
5262

63+
// eslint-disable-next-line import/no-mutable-exports
64+
export let testConnectionsController: Nullable<AbortController> = null
65+
5366
// Asynchronous thunk action
5467
export function testConnectionsAction(
5568
rdiInstanceId: string,
@@ -58,23 +71,36 @@ export function testConnectionsAction(
5871
onFailAction?: () => void,
5972
) {
6073
return async (dispatch: AppDispatch) => {
74+
dispatch(testConnections())
75+
6176
try {
62-
dispatch(testConnections())
77+
testConnectionsController?.abort()
78+
testConnectionsController = new AbortController()
79+
6380
const { status, data } = await apiService.post<TestConnectionsResponse>(
6481
getRdiUrl(rdiInstanceId, ApiEndpoints.RDI_TEST_CONNECTIONS),
6582
config,
83+
{
84+
signal: testConnectionsController.signal
85+
}
6686
)
6787

88+
testConnectionsController = null
89+
6890
if (isStatusSuccessful(status)) {
6991
dispatch(testConnectionsSuccess(transformConnectionResults(data?.sources)))
7092
onSuccessAction?.()
7193
}
7294
} catch (_err) {
73-
const error = _err as AxiosError
74-
const errorMessage = getApiErrorMessage(error)
75-
dispatch(addErrorNotification(error))
76-
dispatch(testConnectionsFailure(errorMessage))
77-
onFailAction?.()
95+
if (!axios.isCancel(_err)) {
96+
const error = _err as AxiosError
97+
const errorMessage = getApiErrorMessage(error)
98+
dispatch(addErrorNotification(error))
99+
dispatch(testConnectionsFailure(errorMessage))
100+
onFailAction?.()
101+
} else {
102+
dispatch(testConnectionsFailure())
103+
}
78104
}
79105
}
80106
}

0 commit comments

Comments
 (0)