From 632fdcbf27e2af8f3ea68d08fce6a15c5939527b Mon Sep 17 00:00:00 2001 From: ankit Date: Fri, 14 Jun 2024 13:32:44 +0530 Subject: [PATCH 1/4] sentry-fix --- vite.config.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/vite.config.ts b/vite.config.ts index b27ec713ae..9d2fcb77fc 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -148,10 +148,10 @@ export default defineConfig(({ mode }) => { port: 3000, proxy: { '/orchestrator': { - target: 'https://preview.devtron.ai/', + target: 'https://devtron-13.devtron.info/', changeOrigin: true, }, - '/grafana': 'https://preview.devtron.ai/', + '/grafana': 'https://devtron-13.devtron.info/', }, }, } From 02161ccfda7ae9998260d67fadb22d65ee156b40 Mon Sep 17 00:00:00 2001 From: ankit Date: Mon, 17 Jun 2024 15:00:51 +0530 Subject: [PATCH 2/4] sentry-fix-length --- src/components/ClusterNodes/ClusterTerminal.tsx | 2 +- src/components/app/create/CreateApp.tsx | 2 +- src/components/app/details/appConfig/AppConfig.tsx | 3 ++- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/components/ClusterNodes/ClusterTerminal.tsx b/src/components/ClusterNodes/ClusterTerminal.tsx index 6378ffa25b..961de86f7d 100644 --- a/src/components/ClusterNodes/ClusterTerminal.tsx +++ b/src/components/ClusterNodes/ClusterTerminal.tsx @@ -535,7 +535,7 @@ const ClusterTerminal = ({ `user/terminal/get?namespace=${selectedNamespace.value}&shellName=${ selectedTerminalType.value }&terminalAccessId=${terminalAccessIdRef.current}&containerName=${ - resourceData?.containers?.[0].containerName || '' + resourceData?.containers?.[0]?.containerName || '' }`, terminalAccessIdRef.current, window?._env_?.CLUSTER_TERMINAL_CONNECTION_RETRY_COUNT || 7, diff --git a/src/components/app/create/CreateApp.tsx b/src/components/app/create/CreateApp.tsx index 012a630462..3c3ab7916f 100644 --- a/src/components/app/create/CreateApp.tsx +++ b/src/components/app/create/CreateApp.tsx @@ -414,7 +414,7 @@ export class AddNewApp extends Component { onChange={this.handleCloneAppChange} styles={this._multiSelectStyles} components={{ - IndicatorSeparator: null, + IndicatorSeparator: null, LoadingIndicator: null, Option, }} diff --git a/src/components/app/details/appConfig/AppConfig.tsx b/src/components/app/details/appConfig/AppConfig.tsx index 194b1fab8c..4c0327ef43 100644 --- a/src/components/app/details/appConfig/AppConfig.tsx +++ b/src/components/app/details/appConfig/AppConfig.tsx @@ -172,10 +172,11 @@ export default function AppConfig({ appName, isJobView, filteredEnvIds }: AppCon function reloadWorkflows() { getWorkflowList(appId).then((response) => { + setState((prevState) => { return { ...prevState, - canDeleteApp: response.result.workflows.length === 0, + canDeleteApp: response.result.workflows?.length === 0,//# here is the fix workflowsRes: response.result, } }) From 0a829ac53579da3d98c4262d881cc4daa29d955f Mon Sep 17 00:00:00 2001 From: ankit Date: Mon, 17 Jun 2024 15:09:45 +0530 Subject: [PATCH 3/4] sentry-fix-length --- src/components/ClusterNodes/ClusterTerminal.tsx | 2 +- src/components/app/create/CreateApp.tsx | 2 +- src/components/app/details/appConfig/AppConfig.tsx | 1 - src/components/app/details/appDetails/AppDetails.tsx | 1 + vite.config.ts | 4 ++-- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/components/ClusterNodes/ClusterTerminal.tsx b/src/components/ClusterNodes/ClusterTerminal.tsx index 961de86f7d..20f25bd192 100644 --- a/src/components/ClusterNodes/ClusterTerminal.tsx +++ b/src/components/ClusterNodes/ClusterTerminal.tsx @@ -535,7 +535,7 @@ const ClusterTerminal = ({ `user/terminal/get?namespace=${selectedNamespace.value}&shellName=${ selectedTerminalType.value }&terminalAccessId=${terminalAccessIdRef.current}&containerName=${ - resourceData?.containers?.[0]?.containerName || '' + resourceData.containers?.[0]?.containerName || '' }`, terminalAccessIdRef.current, window?._env_?.CLUSTER_TERMINAL_CONNECTION_RETRY_COUNT || 7, diff --git a/src/components/app/create/CreateApp.tsx b/src/components/app/create/CreateApp.tsx index 3c3ab7916f..012a630462 100644 --- a/src/components/app/create/CreateApp.tsx +++ b/src/components/app/create/CreateApp.tsx @@ -414,7 +414,7 @@ export class AddNewApp extends Component { onChange={this.handleCloneAppChange} styles={this._multiSelectStyles} components={{ - IndicatorSeparator: null, + IndicatorSeparator: null, LoadingIndicator: null, Option, }} diff --git a/src/components/app/details/appConfig/AppConfig.tsx b/src/components/app/details/appConfig/AppConfig.tsx index 4c0327ef43..fce6698be9 100644 --- a/src/components/app/details/appConfig/AppConfig.tsx +++ b/src/components/app/details/appConfig/AppConfig.tsx @@ -172,7 +172,6 @@ export default function AppConfig({ appName, isJobView, filteredEnvIds }: AppCon function reloadWorkflows() { getWorkflowList(appId).then((response) => { - setState((prevState) => { return { ...prevState, diff --git a/src/components/app/details/appDetails/AppDetails.tsx b/src/components/app/details/appDetails/AppDetails.tsx index 3a67400796..6c06e5bb9e 100644 --- a/src/components/app/details/appDetails/AppDetails.tsx +++ b/src/components/app/details/appDetails/AppDetails.tsx @@ -539,6 +539,7 @@ export const Details: React.FC = ({ }, [isPollingRequired]) async function handleHibernate(e) { + try { setHibernating(true) const isUnHibernateReq = ['hibernating', 'hibernated'].includes( diff --git a/vite.config.ts b/vite.config.ts index 9d2fcb77fc..b27ec713ae 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -148,10 +148,10 @@ export default defineConfig(({ mode }) => { port: 3000, proxy: { '/orchestrator': { - target: 'https://devtron-13.devtron.info/', + target: 'https://preview.devtron.ai/', changeOrigin: true, }, - '/grafana': 'https://devtron-13.devtron.info/', + '/grafana': 'https://preview.devtron.ai/', }, }, } From 146708497e437386677bb9a6242575c04110fb9f Mon Sep 17 00:00:00 2001 From: ankit Date: Tue, 18 Jun 2024 17:49:48 +0530 Subject: [PATCH 4/4] sentry-fix --- src/App.tsx | 62 +++++---- .../ClusterNodes/ClusterTerminal.tsx | 2 +- .../DeploymentTemplateOverride.tsx | 18 ++- src/components/app/Overview/Overview.tsx | 2 +- .../app/details/appConfig/AppConfig.tsx | 2 +- src/components/app/details/main.tsx | 119 +++++++++++------- src/components/common/helpers/Helpers.tsx | 5 +- 7 files changed, 125 insertions(+), 85 deletions(-) diff --git a/src/App.tsx b/src/App.tsx index 715ca399e9..9e979b69ad 100755 --- a/src/App.tsx +++ b/src/App.tsx @@ -180,41 +180,49 @@ export default function App() { } }, []) - const serviceWorkerTimeout = (()=> { - const parsedTimeout = parseInt(window._env_.SERVICE_WORKER_TIMEOUT, 10) - + const serviceWorkerTimeout = (() => { + const parsedTimeout = parseInt(window._env_.SERVICE_WORKER_TIMEOUT, 10); + if (parsedTimeout) { - return parsedTimeout + return parsedTimeout; } - - return 1 - })() - - const { + + return 1; + })(); + + const { needRefresh: [needRefresh], updateServiceWorker, - } = useRegisterSW({ + } = useRegisterSW({ onRegisteredSW(swUrl, r) { - console.log(`Service Worker at: ${swUrl}`) - r && - setInterval(async () => { - if (!(!r.installing && navigator)) return - if ('connection' in navigator && !navigator.onLine) return - const resp = await fetch(swUrl, { - cache: 'no-store', - headers: { - cache: 'no-store', - 'cache-control': 'no-cache', - }, - }) - - if (resp?.status === 200) await r.update() - }, serviceWorkerTimeout * 1000 * 60) + console.log(`Service Worker at: ${swUrl}`); + if (r) { + setInterval(async () => { + if (!r.installing && navigator) { + if ('connection' in navigator && !navigator.onLine) return; + + try { //added try and catch for error handling + const resp = await fetch(swUrl, { + cache: 'no-store', + headers: { + cache: 'no-store', + 'cache-control': 'no-cache', + }, + }); + + if (resp?.status === 200) await r.update(); + } catch (error) { + console.error('Error updating service worker:', error); + } + } + }, serviceWorkerTimeout * 1000 * 60); + } }, onRegisterError(error) { - console.log('SW registration error', error) + console.log('SW registration error', error); }, - }) + }); + function update() { updateServiceWorker(true) diff --git a/src/components/ClusterNodes/ClusterTerminal.tsx b/src/components/ClusterNodes/ClusterTerminal.tsx index 20f25bd192..f310eb5d4a 100644 --- a/src/components/ClusterNodes/ClusterTerminal.tsx +++ b/src/components/ClusterNodes/ClusterTerminal.tsx @@ -535,7 +535,7 @@ const ClusterTerminal = ({ `user/terminal/get?namespace=${selectedNamespace.value}&shellName=${ selectedTerminalType.value }&terminalAccessId=${terminalAccessIdRef.current}&containerName=${ - resourceData.containers?.[0]?.containerName || '' + resourceData?.containers?.[0]?.containerName || '' // this is the extra check for the case when we have no containers in the pod }`, terminalAccessIdRef.current, window?._env_?.CLUSTER_TERMINAL_CONNECTION_RETRY_COUNT || 7, diff --git a/src/components/EnvironmentOverride/DeploymentTemplateOverride.tsx b/src/components/EnvironmentOverride/DeploymentTemplateOverride.tsx index 32492bdf7a..2d54d5c004 100644 --- a/src/components/EnvironmentOverride/DeploymentTemplateOverride.tsx +++ b/src/components/EnvironmentOverride/DeploymentTemplateOverride.tsx @@ -92,12 +92,18 @@ export default function DeploymentTemplateOverride({ useEffect(() => { const fetchOptionsList = async () => { - const { result } = await getOptions(+appId, +envId) - const _groupedData = groupDataByType(result) - setGroupedOptionsDataOverride(_groupedData) - } - fetchOptionsList() - }, [environments]) + try { //adding try and catch block to handle error + const { result } = await getOptions(+appId, +envId); + const _groupedData = groupDataByType(result); + setGroupedOptionsDataOverride(_groupedData); + } catch (error) { + console.error('Error fetching options:', error); + // You can also display an error message to the user or take any other necessary action + } + }; + + fetchOptionsList(); + }, [environments]); useEffect(() => { dispatch({ type: DeploymentConfigStateActionTypes.reset }) diff --git a/src/components/app/Overview/Overview.tsx b/src/components/app/Overview/Overview.tsx index d863fb26c2..07ab63d2a0 100644 --- a/src/components/app/Overview/Overview.tsx +++ b/src/components/app/Overview/Overview.tsx @@ -306,7 +306,7 @@ export default function AppOverview({ appMetaInfo, getAppMetaInfoRes, filteredEn {createdBy} - {appType === 'app' && gitMaterials.length > 0 && ( + {appType === 'app' && gitMaterials && gitMaterials.length > 0 && (
Code source
diff --git a/src/components/app/details/appConfig/AppConfig.tsx b/src/components/app/details/appConfig/AppConfig.tsx index fce6698be9..b94a657d73 100644 --- a/src/components/app/details/appConfig/AppConfig.tsx +++ b/src/components/app/details/appConfig/AppConfig.tsx @@ -175,7 +175,7 @@ export default function AppConfig({ appName, isJobView, filteredEnvIds }: AppCon setState((prevState) => { return { ...prevState, - canDeleteApp: response.result.workflows?.length === 0,//# here is the fix + canDeleteApp: response.result.workflows?.length === 0,//# here is the extra check workflowsRes: response.result, } }) diff --git a/src/components/app/details/main.tsx b/src/components/app/details/main.tsx index ca4cc40de6..40a8ee35c8 100644 --- a/src/components/app/details/main.tsx +++ b/src/components/app/details/main.tsx @@ -88,65 +88,88 @@ export default function AppDetailsPage({ isV2 }: AppDetailsProps) { }, [appId]) const getSavedFilterData = async (groupId?: number): Promise => { - setSelectedAppList([]) - setAppListLoading(true) - setGroupFilterOptions([]) - const { result } = await getEnvGroupList(+appId, FilterParentType.app) - if (result) { - const _groupFilterOption = [] - let _selectedGroup + setSelectedAppList([]); + setAppListLoading(true); + setGroupFilterOptions([]); + + try { + const { result } = await getEnvGroupList(+appId, FilterParentType.app); + + if (result) { + const _groupFilterOption = []; + let _selectedGroup; + for (const group of result) { - const processedGroupData = { - value: group.id.toString(), - label: group.name, - // @ts-ignore - appIds: group.resourceIds, - description: group.description, - } - _groupFilterOption.push(processedGroupData) - if (groupId && groupId === group.id) { - _selectedGroup = processedGroupData - } + const processedGroupData = { + value: group.id.toString(), + label: group.name, + // @ts-ignore + appIds: group.resourceIds, + description: group.description, + }; + + _groupFilterOption.push(processedGroupData); + + if (groupId && groupId === group.id) { + _selectedGroup = processedGroupData; + } } + if (_selectedGroup) { - const selectedAppsMap: Record = {} - const groupAppIds = _selectedGroup?.appIds || [] - for (const appId of groupAppIds) { - selectedAppsMap[appId] = true - } - setSelectedAppList(appListOptions.filter((app) => selectedAppsMap[app.value])) - setSelectedGroupFilter([_selectedGroup]) + const selectedAppsMap: Record = {}; + const groupAppIds = _selectedGroup?.appIds || []; + + for (const appId of groupAppIds) { + selectedAppsMap[appId] = true; + } + + setSelectedAppList(appListOptions.filter((app) => selectedAppsMap[app.value])); + setSelectedGroupFilter([_selectedGroup]); } else { - setSelectedAppList([]) - setSelectedGroupFilter([]) + setSelectedAppList([]); + setSelectedGroupFilter([]); } - _groupFilterOption.sort(sortOptionsByLabel) - setGroupFilterOptions(_groupFilterOption) + + _groupFilterOption.sort(sortOptionsByLabel); + setGroupFilterOptions(_groupFilterOption); + } + } catch (error) { + console.error('Error fetching environment group list:', error); + // Handle the error appropriately, e.g., show an error message to the user + } finally { + setAppListLoading(false); } - setAppListLoading(false) - } + }; + - const getAppListData = async (): Promise => { - setSelectedAppList([]) - setAppListLoading(true) - const { result } = await getAppOtherEnvironmentMin(appId) - if (result?.length) { + const getAppListData = async (): Promise => { + setSelectedAppList([]); + setAppListLoading(true); + try { //added try and catch block for error handling + const { result } = await getAppOtherEnvironmentMin(appId); + + if (result?.length) { setAppListOptions( - result - .map((app): OptionType => { - return { - value: `${app.environmentId}`, - label: app.environmentName, - } - }) - .sort(sortOptionsByLabel), - ) + result + .map((app): OptionType => { + return { + value: `${app.environmentId}`, + label: app.environmentName, + }; + }) + .sort(sortOptionsByLabel) + ); + } + } catch (error) { + console.error('Error fetching app list data:', error); + // You can also display an error message to the user or take any other necessary action + } finally { + setAppListLoading(false); } - setAppListLoading(false) - } + }; const getAppMetaInfoRes = async (): Promise => { - try { + try { //added try and catch block const { result } = await getAppMetaInfo(Number(appId)) if (result) { setAppName(result.appName) diff --git a/src/components/common/helpers/Helpers.tsx b/src/components/common/helpers/Helpers.tsx index 43aa395007..ac0488786b 100644 --- a/src/components/common/helpers/Helpers.tsx +++ b/src/components/common/helpers/Helpers.tsx @@ -1194,7 +1194,10 @@ export const getDeploymentAppType = ( return allowedDeploymentTypes[0] } -export const hasApproverAccess = (email: string, approverList: string[]): boolean => { +export const hasApproverAccess = (email: string = '', approverList: string[]= []): boolean => {// added null check for email and approverList + if(!email ||!approverList) { + return false + } let hasAccess = false if (approverList?.length > 0) { for (const approver of approverList) {