diff --git a/src/hooks/use-site-details.tsx b/src/hooks/use-site-details.tsx index cb2ab8adc..3bf64302b 100644 --- a/src/hooks/use-site-details.tsx +++ b/src/hooks/use-site-details.tsx @@ -194,6 +194,16 @@ export function SiteDetailsProvider( { children }: SiteDetailsProviderProps ) { ); } ); + useIpcListener( 'user-data-updated', async () => { + const updatedSites = await getIpcApi().getSiteDetails(); + setSites( updatedSites ); + + // Handle case where selected site was deleted externally + if ( selectedSiteId && ! updatedSites.find( ( site ) => site.id === selectedSiteId ) ) { + setSelectedSiteId( updatedSites.length ? updatedSites[ 0 ].id : '' ); + } + } ); + const toggleLoadingServerForSite = useCallback( ( siteId: string ) => { setLoadingServer( ( currentLoading ) => ( { ...currentLoading, diff --git a/src/ipc-handlers.ts b/src/ipc-handlers.ts index c159c5651..d6099973c 100644 --- a/src/ipc-handlers.ts +++ b/src/ipc-handlers.ts @@ -173,7 +173,19 @@ function mergeSiteDetailsWithRunningDetails( sites: SiteDetails[] ): SiteDetails return sites.map( ( site ) => { const server = SiteServer.get( site.id ); if ( server ) { - return server.details; + // Merge fresh data from disk with running state from server + // This ensures external changes (e.g., from CLI) are reflected + if ( server.details.running ) { + return { + ...site, + running: true as const, + url: server.details.url, + }; + } + return { + ...site, + running: false as const, + }; } return site; } );