Skip to content

Commit c77d31a

Browse files
committed
refactor: enhance API calls with abort controller support and improve error handling in RouterComponent
1 parent cc2d088 commit c77d31a

File tree

2 files changed

+44
-14
lines changed

2 files changed

+44
-14
lines changed

src/components/v2/appDetails/appDetails.api.ts

Lines changed: 18 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -14,25 +14,35 @@
1414
* limitations under the License.
1515
*/
1616

17-
import { get, post, ROUTES } from '@devtron-labs/devtron-fe-common-lib'
17+
import { APIOptions, get, post, ROUTES } from '@devtron-labs/devtron-fe-common-lib'
1818
import { Routes } from '../../../config/constants'
1919
import { AppType } from './appDetails.type'
2020
import { getAppId, generateDevtronAppIdentiferForK8sRequest } from './k8Resource/nodeDetail/nodeDetail.api'
2121
import { getDeploymentType, getK8sResourcePayloadAppType } from './k8Resource/nodeDetail/nodeDetail.util'
2222

23-
export const getInstalledChartDetail = (_appId: number, _envId: number) => {
24-
return get(`${Routes.APP_STORE_INSTALLED_APP}/detail/v2?installed-app-id=${_appId}&env-id=${_envId}`)
25-
}
23+
export const getInstalledChartDetail = (
24+
_appId: number,
25+
_envId: number,
26+
abortControllerRef?: APIOptions['abortControllerRef'],
27+
) =>
28+
get(`${Routes.APP_STORE_INSTALLED_APP}/detail/v2?installed-app-id=${_appId}&env-id=${_envId}`, {
29+
abortControllerRef,
30+
})
2631

27-
export const getInstalledChartResourceTree = (_appId: number, _envId: number) => {
28-
return get(`${Routes.APP_STORE_INSTALLED_APP}/detail/resource-tree?installed-app-id=${_appId}&env-id=${_envId}`)
29-
}
32+
export const getInstalledChartResourceTree = (
33+
_appId: number,
34+
_envId: number,
35+
abortControllerRef?: APIOptions['abortControllerRef'],
36+
) =>
37+
get(`${Routes.APP_STORE_INSTALLED_APP}/detail/resource-tree?installed-app-id=${_appId}&env-id=${_envId}`, {
38+
abortControllerRef,
39+
})
3040

3141
export const getInstalledChartNotesDetail = (_appId: number, _envId: number) => {
3242
if (isNaN(Number(_appId)) || isNaN(Number(_envId))) {
3343
return null
3444
}
35-
45+
3646
return get(`${Routes.APP_STORE_INSTALLED_APP}/notes?installed-app-id=${_appId}&env-id=${_envId}`)
3747
}
3848

src/components/v2/index.tsx

Lines changed: 26 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,14 @@
1414
* limitations under the License.
1515
*/
1616

17-
import React, { Suspense, useEffect, useRef, useState } from 'react'
17+
import { Suspense, useEffect, useRef, useState } from 'react'
1818
import { useRouteMatch, useParams, Redirect, useLocation, useHistory, Switch, Route } from 'react-router-dom'
19-
import { ErrorScreenManager, DetailsProgressing, showError } from '@devtron-labs/devtron-fe-common-lib'
19+
import {
20+
ErrorScreenManager,
21+
DetailsProgressing,
22+
showError,
23+
getIsRequestAborted,
24+
} from '@devtron-labs/devtron-fe-common-lib'
2025
import { URLS } from '../../config'
2126
import { sortOptionsByValue } from '../common'
2227
import ValuesComponent from './values/ChartValues.component'
@@ -45,6 +50,8 @@ const RouterComponent = ({ envType }) => {
4550
const { path } = useRouteMatch()
4651
const location = useLocation()
4752
const history = useHistory()
53+
const abortControllerRef = useRef<AbortController>(new AbortController())
54+
4855
const [errorResponseCode, setErrorResponseCode] = useState(undefined)
4956
const [externalLinksAndTools, setExternalLinksAndTools] = useState<ExternalLinksAndToolsType>({
5057
externalLinks: [],
@@ -78,6 +85,12 @@ const RouterComponent = ({ envType }) => {
7885
}
7986
}, [params.appId, params.envId])
8087

88+
useEffect(() => {
89+
return () => {
90+
abortControllerRef.current.abort()
91+
}
92+
}, [])
93+
8194
// clearing the timer on component unmount
8295
useEffect(() => {
8396
return (): void => {
@@ -105,6 +118,11 @@ const RouterComponent = ({ envType }) => {
105118
}
106119

107120
const handleAppDetailsCallError = (e: any) => {
121+
if (getIsRequestAborted(e)) {
122+
// FIXME: initTimer
123+
return
124+
}
125+
108126
setErrorResponseCode(e.code)
109127
if (e.code === 404 && initTimer) {
110128
clearTimeout(initTimer)
@@ -124,7 +142,7 @@ const RouterComponent = ({ envType }) => {
124142
const _getAndSetAppDetail = async (fetchExternalLinks: boolean) => {
125143
if (envType === EnvType.CHART) {
126144
// Get App Details
127-
getInstalledChartDetail(+params.appId, +params.envId)
145+
getInstalledChartDetail(+params.appId, +params.envId, abortControllerRef)
128146
.then((response) => {
129147
handlePublishAppDetails(response)
130148
isVirtualRef.current = response.result?.isVirtualEnvironment
@@ -139,7 +157,7 @@ const RouterComponent = ({ envType }) => {
139157
})
140158

141159
// Get App Resource Tree
142-
getInstalledChartResourceTree(+params.appId, +params.envId)
160+
getInstalledChartResourceTree(+params.appId, +params.envId, abortControllerRef)
143161
.then(handlePublishAppDetails)
144162
.catch(handleAppDetailsCallError)
145163
.finally(() => {
@@ -162,10 +180,12 @@ const RouterComponent = ({ envType }) => {
162180
const handleReloadResourceTree = () => {
163181
if (envType === EnvType.CHART) {
164182
setIsReloadResourceTreeInProgress(true)
165-
getInstalledChartResourceTree(+params.appId, +params.envId)
183+
getInstalledChartResourceTree(+params.appId, +params.envId, abortControllerRef)
166184
.then(handlePublishAppDetails)
167185
.catch((err) => {
168-
showError(err)
186+
if (!getIsRequestAborted(err)) {
187+
showError(err)
188+
}
169189
})
170190
.finally(() => {
171191
setLoadingResourceTree(false)

0 commit comments

Comments
 (0)