Skip to content

Commit 44170b5

Browse files
committed
#5228 - update work with abort controller for bulk upload
1 parent 086d191 commit 44170b5

File tree

5 files changed

+57
-23
lines changed

5 files changed

+57
-23
lines changed

redisinsight/ui/src/pages/browser/components/bulk-actions/BulkUpload/BulkUpload.spec.tsx

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,8 @@ import { render, screen, fireEvent, act, mockedStore, cleanup } from 'uiSrc/util
55
import {
66
bulkActionsUploadOverviewSelector,
77
bulkUpload,
8-
setBulkUploadStartAgain
8+
setBulkUploadStartAgain,
9+
uploadController
910
} from 'uiSrc/slices/browser/bulkActions'
1011
import { sendEventTelemetry, TelemetryEvent } from 'uiSrc/telemetry'
1112
import { BulkActionsType } from 'uiSrc/constants'
@@ -24,6 +25,9 @@ jest.mock('uiSrc/slices/browser/bulkActions', () => ({
2425
}),
2526
bulkActionsUploadOverviewSelector: jest.fn().mockReturnValue(null),
2627
bulkActionsUploadSummarySelector: jest.fn().mockReturnValue(null),
28+
uploadController: {
29+
abort: jest.fn()
30+
}
2731
}))
2832

2933
let store: typeof mockedStore
@@ -47,6 +51,18 @@ describe('BulkUpload', () => {
4751
expect(onCancel).toBeCalled()
4852
})
4953

54+
it('should call abort controller', () => {
55+
const onCancel = jest.fn()
56+
const abortMock = jest.fn();
57+
(uploadController as any).abort = abortMock
58+
59+
render(<BulkUpload onCancel={onCancel} />)
60+
61+
fireEvent.click(screen.getByTestId('bulk-action-cancel-btn'))
62+
63+
expect(abortMock).toBeCalled()
64+
})
65+
5066
it('submit btn should be disabled without file', () => {
5167
render(<BulkUpload onCancel={jest.fn()} />)
5268

redisinsight/ui/src/pages/browser/components/bulk-actions/BulkUpload/BulkUpload.tsx

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,8 @@ import {
2020
bulkActionsUploadSelector,
2121
bulkActionsUploadSummarySelector,
2222
bulkUploadDataAction,
23-
setBulkUploadStartAgain
23+
setBulkUploadStartAgain,
24+
uploadController
2425
} from 'uiSrc/slices/browser/bulkActions'
2526

2627
import BulkActionsInfo from 'uiSrc/pages/browser/components/bulk-actions/BulkActionsInfo'
@@ -88,6 +89,11 @@ const BulkUpload = (props: Props) => {
8889
}
8990
}
9091

92+
const handleClickCancel = () => {
93+
uploadController?.abort()
94+
onCancel?.()
95+
}
96+
9197
return (
9298
<div className={styles.container} data-testid="bulk-upload-container">
9399
{!isCompleted ? (
@@ -147,7 +153,7 @@ const BulkUpload = (props: Props) => {
147153
<div className={styles.footer}>
148154
<EuiButton
149155
color="secondary"
150-
onClick={onCancel}
156+
onClick={handleClickCancel}
151157
className={styles.cancelBtn}
152158
data-testid="bulk-action-cancel-btn"
153159
>

redisinsight/ui/src/pages/instance/InstancePage.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ import BottomGroupComponents from 'uiSrc/components/bottom-group-components/Bott
2929
import LiveTimeRecommendations from 'uiSrc/components/live-time-recommendations'
3030
import { monitorSelector, setMonitorInitialState } from 'uiSrc/slices/cli/monitor'
3131
import { setInitialPubSubState } from 'uiSrc/slices/pubsub/pubsub'
32-
import { setBulkActionsInitialState } from 'uiSrc/slices/browser/bulkActions'
32+
import { resetBulkActions } from 'uiSrc/slices/browser/bulkActions'
3333
import { setClusterDetailsInitialState } from 'uiSrc/slices/analytics/clusterDetails'
3434
import { setDatabaseAnalysisInitialState } from 'uiSrc/slices/analytics/dbAnalysis'
3535
import { resetRedisearchKeysData, setRedisearchInitialState } from 'uiSrc/slices/browser/redisearch'
@@ -122,7 +122,7 @@ const InstancePage = ({ routes = [] }: Props) => {
122122
dispatch(resetKeys())
123123
dispatch(setMonitorInitialState())
124124
dispatch(setInitialPubSubState())
125-
dispatch(setBulkActionsInitialState())
125+
dispatch(resetBulkActions())
126126
dispatch(setAppContextInitialState())
127127
dispatch(resetPatternKeysData())
128128
dispatch(resetCliHelperSettings())

redisinsight/ui/src/slices/browser/bulkActions.ts

Lines changed: 30 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
import { createSlice, PayloadAction } from '@reduxjs/toolkit'
22

3-
import { AxiosError } from 'axios'
3+
import axios, { AxiosError } from 'axios'
44
import { ApiEndpoints, BulkActionsType, MAX_BULK_ACTION_ERRORS_LENGTH } from 'uiSrc/constants'
55
import { apiService } from 'uiSrc/services'
6-
import { getApiErrorMessage, getUrl, isStatusSuccessful } from 'uiSrc/utils'
6+
import { getApiErrorMessage, getUrl, isStatusSuccessful, Maybe, Nullable } from 'uiSrc/utils'
77

88
import { addErrorNotification } from 'uiSrc/slices/app/notifications'
99
import { AppDispatch, RootState } from '../store'
@@ -37,11 +37,7 @@ const bulkActionsSlice = createSlice({
3737
name: 'bulkActions',
3838
initialState,
3939
reducers: {
40-
setBulkActionsInitialState: (state) => {
41-
state.bulkUpload?.abortController?.abort()
42-
43-
return initialState
44-
},
40+
setBulkActionsInitialState: () => initialState,
4541

4642
setBulkDeleteStartAgain: (state) => {
4743
state.bulkDelete = initialState.bulkDelete
@@ -107,10 +103,9 @@ const bulkActionsSlice = createSlice({
107103
state.bulkDelete.loading = false
108104
},
109105

110-
bulkUpload: (state, { payload }: PayloadAction<{ abortController: AbortController }>) => {
106+
bulkUpload: (state) => {
111107
state.bulkUpload.loading = true
112108
state.bulkUpload.error = ''
113-
state.bulkUpload.abortController = payload.abortController
114109
},
115110

116111
bulkUploadSuccess: (state, { payload }: PayloadAction<{ data: IBulkActionOverview, fileName?: string }>) => {
@@ -119,9 +114,12 @@ const bulkActionsSlice = createSlice({
119114
state.bulkUpload.fileName = payload.fileName
120115
},
121116

122-
bulkUploadFailed: (state, { payload }) => {
117+
bulkUploadFailed: (state, { payload }: PayloadAction<Maybe<string>>) => {
123118
state.bulkUpload.loading = false
124-
state.bulkUpload.error = payload
119+
120+
if (payload) {
121+
state.bulkUpload.error = payload
122+
}
125123
},
126124
},
127125
})
@@ -162,6 +160,9 @@ export const bulkActionsUploadSummarySelector = (state: RootState) =>
162160
// The reducer
163161
export default bulkActionsSlice.reducer
164162

163+
// eslint-disable-next-line import/no-mutable-exports
164+
export let uploadController: Nullable<AbortController> = null
165+
165166
// Thunk actions
166167
// Asynchronous thunk action
167168
export function bulkUploadDataAction(
@@ -171,11 +172,12 @@ export function bulkUploadDataAction(
171172
onFailAction?: () => void
172173
) {
173174
return async (dispatch: AppDispatch) => {
174-
const abortController = new AbortController()
175-
176-
dispatch(bulkUpload({ abortController }))
175+
dispatch(bulkUpload())
177176

178177
try {
178+
uploadController?.abort()
179+
uploadController = new AbortController()
180+
179181
const { status, data } = await apiService.post(
180182
getUrl(
181183
id,
@@ -187,22 +189,33 @@ export function bulkUploadDataAction(
187189
Accept: 'application/json',
188190
'Content-Type': 'multipart/form-data'
189191
},
190-
signal: abortController.signal
192+
signal: uploadController.signal
191193
}
192194
)
193195

196+
uploadController = null
197+
194198
if (isStatusSuccessful(status)) {
195199
dispatch(bulkUploadSuccess({ data, fileName: uploadFile.fileName }))
196200
onSuccessAction?.()
197201
}
198202
} catch (error) {
199-
// show error when request wasn't aborted only
200-
if (!abortController.signal.aborted) {
203+
// show error when request wasn't aborted
204+
if (!axios.isCancel(error)) {
201205
const errorMessage = getApiErrorMessage(error as AxiosError)
202206
dispatch(addErrorNotification(error as AxiosError))
203207
dispatch(bulkUploadFailed(errorMessage))
204208
onFailAction?.()
209+
} else {
210+
dispatch(bulkUploadFailed())
205211
}
206212
}
207213
}
208214
}
215+
216+
export function resetBulkActions() {
217+
return async (dispatch: AppDispatch) => {
218+
uploadController?.abort()
219+
dispatch(setBulkActionsInitialState())
220+
}
221+
}

redisinsight/ui/src/slices/interfaces/bulkActions.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,6 @@ export interface StateBulkActions {
2323
error: string
2424
overview: Nullable<IBulkActionOverview>
2525
fileName?: string
26-
abortController?: AbortController
2726
}
2827
}
2928

0 commit comments

Comments
 (0)