Skip to content

Commit fdf26bb

Browse files
authored
feat: improve dashboard monitoring & reset cache feature flags (#557)
1 parent 750c234 commit fdf26bb

File tree

5 files changed

+60
-41
lines changed

5 files changed

+60
-41
lines changed

api/api/versions.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
{
44
"version": "v1",
55
"status": "active",
6-
"release_date": "2025-10-30T23:05:56.030438+05:30",
6+
"release_date": "2025-11-02T07:52:11.101731+05:30",
77
"end_of_life": "0001-01-01T00:00:00Z",
88
"changes": [
99
"Initial API version"

view/app/dashboard/components/system/disk-usage.tsx

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -101,13 +101,16 @@ function DiskMountsTable({ mounts }: { mounts: MountData[] }) {
101101
];
102102

103103
return (
104-
<DataTable
105-
data={mounts}
106-
columns={columns}
107-
tableClassName="min-w-full overflow-x-hidden"
108-
showBorder={false}
109-
hoverable={false}
110-
striped={false}
111-
/>
104+
<div className="max-h-[300px] overflow-y-auto overflow-x-hidden">
105+
<DataTable
106+
data={mounts}
107+
columns={columns}
108+
tableClassName="min-w-full"
109+
containerClassName="overflow-x-hidden"
110+
showBorder={false}
111+
hoverable={false}
112+
striped={false}
113+
/>
114+
</div>
112115
);
113116
}

view/app/dashboard/hooks/use-monitor.ts

Lines changed: 43 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
'use client';
22
import { useWebSocket } from '@/hooks/socket-provider';
33
import { ContainerData, SystemStatsType } from '@/redux/types/monitor';
4-
import { useEffect, useState, useRef } from 'react';
4+
import { useEffect, useState, useRef, useCallback } from 'react';
55

66
function use_monitor() {
77
const { sendJsonMessage, message, isReady } = useWebSocket();
@@ -12,6 +12,33 @@ function use_monitor() {
1212
const reconnectTimeoutRef = useRef<NodeJS.Timeout | undefined>(undefined);
1313
const isInitializedRef = useRef(false);
1414

15+
const startMonitoring = useCallback(() => {
16+
if (!isReady) {
17+
console.log('WebSocket not ready, skipping monitoring start');
18+
return;
19+
}
20+
21+
console.log('Starting dashboard monitoring');
22+
sendJsonMessage({
23+
action: 'dashboard_monitor',
24+
data: {
25+
interval: 10,
26+
operations: ['get_containers', 'get_system_stats']
27+
}
28+
});
29+
setIsMonitoring(true);
30+
setLastError(null);
31+
}, [isReady, sendJsonMessage]);
32+
33+
const stopMonitoring = useCallback(() => {
34+
console.log('Stopping dashboard monitoring');
35+
sendJsonMessage({
36+
action: 'stop_dashboard_monitor'
37+
});
38+
setIsMonitoring(false);
39+
}, [sendJsonMessage]);
40+
41+
// Handle incoming WebSocket messages
1542
useEffect(() => {
1643
if (message) {
1744
try {
@@ -30,65 +57,50 @@ function use_monitor() {
3057
setLastError(null);
3158
} else if (parsedMessage.action === 'error') {
3259
setLastError(parsedMessage.error || 'Unknown error occurred');
33-
if (isMonitoring) {
34-
stopMonitoring();
35-
setTimeout(startMonitoring, 5000);
36-
}
60+
// Retry after error
61+
setTimeout(() => {
62+
if (isReady) {
63+
startMonitoring();
64+
}
65+
}, 5000);
3766
}
3867
} catch (error) {
3968
console.error('Error parsing WebSocket message:', error);
4069
setLastError('Failed to parse message');
4170
}
4271
}
43-
}, [message]);
44-
45-
const startMonitoring = () => {
46-
if (!isMonitoring) {
47-
sendJsonMessage({
48-
action: 'dashboard_monitor',
49-
data: {
50-
interval: 10,
51-
operations: ['get_containers', 'get_system_stats']
52-
}
53-
});
54-
setIsMonitoring(true);
55-
setLastError(null);
56-
}
57-
};
58-
59-
const stopMonitoring = () => {
60-
if (isMonitoring) {
61-
sendJsonMessage({
62-
action: 'stop_dashboard_monitor'
63-
});
64-
setIsMonitoring(false);
65-
}
66-
};
72+
}, [message, isReady, startMonitoring]);
6773

74+
// Initialize monitoring when WebSocket is ready
6875
useEffect(() => {
6976
if (isReady && !isInitializedRef.current) {
77+
console.log('WebSocket ready, initializing monitoring');
7078
startMonitoring();
7179
isInitializedRef.current = true;
7280
}
81+
7382
return () => {
7483
if (reconnectTimeoutRef.current) {
7584
clearTimeout(reconnectTimeoutRef.current);
7685
}
7786
};
78-
}, [isReady]);
87+
}, [isReady, startMonitoring]);
7988

89+
// Retry monitoring on error
8090
useEffect(() => {
8191
if (isReady && !isMonitoring && lastError) {
92+
console.log('Retrying monitoring after error');
8293
reconnectTimeoutRef.current = setTimeout(() => {
8394
startMonitoring();
8495
}, 5000);
8596
}
97+
8698
return () => {
8799
if (reconnectTimeoutRef.current) {
88100
clearTimeout(reconnectTimeoutRef.current);
89101
}
90102
};
91-
}, [isReady, isMonitoring, lastError]);
103+
}, [isReady, isMonitoring, lastError, startMonitoring]);
92104

93105
return {
94106
containersData,

view/hooks/use-app-sidebar.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import { GithubConnectorApi } from '@/redux/services/connector/githubConnectorAp
1414
import { deployApi } from '@/redux/services/deploy/applicationsApi';
1515
import { fileManagersApi } from '@/redux/services/file-manager/fileManagersApi';
1616
import { auditApi } from '@/redux/services/audit';
17+
import { FeatureFlagsApi } from '@/redux/services/feature-flags/featureFlagsApi';
1718
import { useState, useMemo, useEffect } from 'react';
1819
import { Folder, Home, Package, SettingsIcon, Container, Puzzle } from 'lucide-react';
1920

@@ -132,7 +133,8 @@ export function useAppSidebar() {
132133
GithubConnectorApi,
133134
deployApi,
134135
fileManagersApi,
135-
auditApi
136+
auditApi,
137+
FeatureFlagsApi
136138
];
137139
apis.forEach((api) => dispatch(api.util.resetApiState()));
138140
};

view/hooks/use-team-switcher.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import { domainsApi } from '@/redux/services/settings/domainsApi';
1010
import { GithubConnectorApi } from '@/redux/services/connector/githubConnectorApi';
1111
import { deployApi } from '@/redux/services/deploy/applicationsApi';
1212
import { notificationApi } from '@/redux/services/settings/notificationApi';
13+
import { FeatureFlagsApi } from '@/redux/services/feature-flags/featureFlagsApi';
1314
import { UserOrganization } from '@/redux/types/orgs';
1415

1516
const ACTIVE_ORGANIZATION_KEY = 'active_organization';
@@ -49,6 +50,7 @@ function useTeamSwitcher() {
4950
dispatch(GithubConnectorApi.util.invalidateTags([{ type: 'GithubConnector', id: 'LIST' }]));
5051
dispatch(deployApi.util.invalidateTags([{ type: 'Deploy', id: 'LIST' }]));
5152
dispatch(notificationApi.util.invalidateTags([{ type: 'Notification', id: 'LIST' }]));
53+
dispatch(FeatureFlagsApi.util.invalidateTags([{ type: 'FeatureFlags', id: 'LIST' }]));
5254
} catch (error) {
5355
console.error('Failed to invalidate cache:', error);
5456
}

0 commit comments

Comments
 (0)