@@ -32,24 +32,66 @@ export const useServersStore = defineStore('servers', () => {
3232 servers . value . reduce ( ( sum , server ) => sum + server . tool_count , 0 )
3333 )
3434
35+ // Helper: Smart merge servers to preserve object references and avoid full re-renders
36+ function mergeServers ( existing : Server [ ] , incoming : Server [ ] ) : Server [ ] {
37+ const existingMap = new Map ( existing . map ( s => [ s . name , s ] ) )
38+ const incomingMap = new Map ( incoming . map ( s => [ s . name , s ] ) )
39+ const result : Server [ ] = [ ]
40+
41+ // Update existing servers in-place or add new ones
42+ incoming . forEach ( incomingServer => {
43+ const existingServer = existingMap . get ( incomingServer . name )
44+
45+ if ( existingServer ) {
46+ // Update existing server in-place (preserves object reference)
47+ // Only update properties that have changed
48+ let hasChanges = false
49+ Object . assign ( existingServer , incomingServer )
50+ hasChanges = true
51+
52+ if ( hasChanges ) {
53+ console . log ( `Server ${ existingServer . name } updated with changes` )
54+ }
55+
56+ result . push ( existingServer )
57+ } else {
58+ // Add new server
59+ console . log ( `New server added: ${ incomingServer . name } ` )
60+ result . push ( incomingServer )
61+ }
62+ } )
63+
64+ // Log removed servers
65+ existing . forEach ( existingServer => {
66+ if ( ! incomingMap . has ( existingServer . name ) ) {
67+ console . log ( `Server removed: ${ existingServer . name } ` )
68+ }
69+ } )
70+
71+ // Sort alphabetically by name to match tray menu order
72+ return result . sort ( ( a , b ) => a . name . localeCompare ( b . name ) )
73+ }
74+
3575 // Actions
36- async function fetchServers ( ) {
37- loading . value = { loading : true , error : null }
76+ async function fetchServers ( silent = false ) {
77+ if ( ! silent ) {
78+ loading . value = { loading : true , error : null }
79+ }
3880
3981 try {
4082 const response = await api . getServers ( )
4183 if ( response . success && response . data ) {
42- // Sort servers alphabetically by name to match tray menu order
43- servers . value = response . data . servers . sort ( ( a , b ) =>
44- a . name . localeCompare ( b . name )
45- )
84+ // Use smart merge to preserve object references and avoid unnecessary re-renders
85+ servers . value = mergeServers ( servers . value , response . data . servers )
4686 } else {
4787 loading . value . error = response . error || 'Failed to fetch servers'
4888 }
4989 } catch ( error ) {
5090 loading . value . error = error instanceof Error ? error . message : 'Unknown error'
5191 } finally {
52- loading . value . loading = false
92+ if ( ! silent ) {
93+ loading . value . loading = false
94+ }
5395 }
5496 }
5597
@@ -249,16 +291,16 @@ export const useServersStore = defineStore('servers', () => {
249291
250292 function handleServersChanged ( event : Event ) {
251293 const customEvent = event as CustomEvent
252- console . log ( 'Servers changed event received, refreshing server list ...' , customEvent . detail )
253- // Refresh server list to get latest state
254- fetchServers ( )
294+ console . log ( 'Servers changed event received, updating in background ...' , customEvent . detail )
295+ // Silent background refresh to avoid scroll jumps and loading states
296+ fetchServers ( true )
255297 }
256298
257299 function handleConfigReloaded ( event : Event ) {
258300 const customEvent = event as CustomEvent
259- console . log ( 'Config reloaded event received, refreshing server list ...' , customEvent . detail )
260- // Refresh server list after config reload
261- fetchServers ( )
301+ console . log ( 'Config reloaded event received, updating in background ...' , customEvent . detail )
302+ // Silent background refresh to avoid scroll jumps and loading states
303+ fetchServers ( true )
262304 }
263305
264306 // Initialize event listeners
0 commit comments