@@ -86,13 +86,30 @@ const InstalledServers: React.FC = () => {
86
86
// Helper function to check if any server needs refresh based on status/enabled mismatch
87
87
const checkServersNeedRefresh = ( ) => {
88
88
// Check if any server has a mismatch between status and enabled state
89
- const needsRefresh = servers . some ( server =>
89
+ const serversNeedingRefresh = servers . filter ( server =>
90
90
( server . status !== 'running' && server . enabled ) || // Not running but should be running
91
91
( server . status !== 'stopped' && ! server . enabled ) // Not stopped but should be stopped
92
92
) ;
93
93
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
+ } ) ;
96
113
}
97
114
} ;
98
115
@@ -135,10 +152,23 @@ const InstalledServers: React.FC = () => {
135
152
return ;
136
153
}
137
154
138
- // Otherwise, just refresh the specific tool
155
+ // Otherwise, just refresh the specific server
139
156
const server = servers . find ( ( s ) => s . id === serverId ) ;
140
157
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
+ } ) ;
142
172
}
143
173
} ;
144
174
@@ -147,8 +177,10 @@ const InstalledServers: React.FC = () => {
147
177
const { toolId } = event . detail ;
148
178
console . log ( "Server uninstalled:" , toolId ) ;
149
179
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
+ ) ;
152
184
} ;
153
185
154
186
document . addEventListener (
@@ -180,13 +212,36 @@ const InstalledServers: React.FC = () => {
180
212
setLoading ( true ) ;
181
213
try {
182
214
// Get servers and tools data separately
183
- const servers = await MCPClient . listServers ( ) ;
215
+ const newServers = await MCPClient . listServers ( ) ;
184
216
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
+
190
245
// Set server tools
191
246
setServerTools ( allServerTools ) ;
192
247
} catch ( error ) {
0 commit comments