Skip to content

Commit 6ab1f43

Browse files
authored
Merge pull request #111 from dcSpark/devin/1741832187-update-installed-servers
Optimize server list refresh to only update changed servers
2 parents cc412b9 + 03e9eeb commit 6ab1f43

File tree

1 file changed

+68
-13
lines changed

1 file changed

+68
-13
lines changed

apps/mcp-dockmaster/src/components/InstalledServers.tsx

Lines changed: 68 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -86,13 +86,30 @@ const InstalledServers: React.FC = () => {
8686
// Helper function to check if any server needs refresh based on status/enabled mismatch
8787
const checkServersNeedRefresh = () => {
8888
// Check if any server has a mismatch between status and enabled state
89-
const needsRefresh = servers.some(server =>
89+
const serversNeedingRefresh = servers.filter(server =>
9090
(server.status !== 'running' && server.enabled) || // Not running but should be running
9191
(server.status !== 'stopped' && !server.enabled) // Not stopped but should be stopped
9292
);
9393

94-
if (needsRefresh) {
95-
loadData();
94+
if (serversNeedingRefresh.length > 0) {
95+
// Only refresh servers that need it
96+
MCPClient.listServers().then(newServers => {
97+
setServers(prevServers => {
98+
// Create a map of servers needing refresh
99+
const refreshIds = new Set(serversNeedingRefresh.map(s => s.id));
100+
101+
// Update only servers that need refresh
102+
return prevServers.map(server => {
103+
if (refreshIds.has(server.id)) {
104+
const updatedServer = newServers.find(s => s.id === server.id);
105+
return updatedServer || server;
106+
}
107+
return server;
108+
}).sort((a, b) => a.id.localeCompare(b.id)); // Maintain consistent order
109+
});
110+
}).catch(error => {
111+
console.error("Failed to refresh servers:", error);
112+
});
96113
}
97114
};
98115

@@ -135,10 +152,23 @@ const InstalledServers: React.FC = () => {
135152
return;
136153
}
137154

138-
// Otherwise, just refresh the specific tool
155+
// Otherwise, just refresh the specific server
139156
const server = servers.find((s) => s.id === serverId);
140157
if (server) {
141-
loadData();
158+
// Get updated server data
159+
MCPClient.listServers().then(newServers => {
160+
const updatedServer = newServers.find(s => s.id === serverId);
161+
if (updatedServer) {
162+
// Update only the changed server
163+
setServers(prevServers =>
164+
prevServers.map(s =>
165+
s.id === serverId ? updatedServer : s
166+
)
167+
);
168+
}
169+
}).catch(error => {
170+
console.error("Failed to update server status:", error);
171+
});
142172
}
143173
};
144174

@@ -147,8 +177,10 @@ const InstalledServers: React.FC = () => {
147177
const { toolId } = event.detail;
148178
console.log("Server uninstalled:", toolId);
149179

150-
// Refresh all data
151-
loadData();
180+
// Remove the uninstalled server from the list
181+
setServers(prevServers =>
182+
prevServers.filter(server => server.id !== toolId)
183+
);
152184
};
153185

154186
document.addEventListener(
@@ -180,13 +212,36 @@ const InstalledServers: React.FC = () => {
180212
setLoading(true);
181213
try {
182214
// Get servers and tools data separately
183-
const servers = await MCPClient.listServers();
215+
const newServers = await MCPClient.listServers();
184216
const allServerTools = await MCPClient.listAllServerTools();
185-
186-
// Set servers
187-
const sortedServers = [...servers].sort((a, b) => a.id.localeCompare(b.id));
188-
setServers(sortedServers);
189-
217+
218+
// Update servers using a diff-based approach
219+
setServers(prevServers => {
220+
// Create a map of existing servers by ID for quick lookup
221+
const existingServersMap = new Map(
222+
prevServers.map(server => [server.id, server])
223+
);
224+
225+
// Process new servers and update only what changed
226+
const updatedServers = newServers.map(newServer => {
227+
const existingServer = existingServersMap.get(newServer.id);
228+
229+
// If server doesn't exist or has changes, use the new server data
230+
if (!existingServer ||
231+
existingServer.status !== newServer.status ||
232+
existingServer.enabled !== newServer.enabled ||
233+
existingServer.tool_count !== newServer.tool_count) {
234+
return newServer;
235+
}
236+
237+
// Otherwise, keep the existing server to prevent unnecessary re-renders
238+
return existingServer;
239+
});
240+
241+
// Sort servers to maintain consistent order
242+
return [...updatedServers].sort((a, b) => a.id.localeCompare(b.id));
243+
});
244+
190245
// Set server tools
191246
setServerTools(allServerTools);
192247
} catch (error) {

0 commit comments

Comments
 (0)