diff --git a/app/Jobs/RestartProxyJob.php b/app/Jobs/RestartProxyJob.php index f4554519f..96c66ccde 100644 --- a/app/Jobs/RestartProxyJob.php +++ b/app/Jobs/RestartProxyJob.php @@ -46,9 +46,11 @@ public function handle() // listener that handles UI updates and Traefik version checks $activity = StartProxy::run($this->server, force: true, restarting: true); - // Store activity ID for reference + // Store activity ID and dispatch event with it so UI can open activity monitor if ($activity && is_object($activity)) { $this->activity_id = $activity->id; + // Dispatch event with activity ID so the UI can show logs + ProxyStatusChangedUI::dispatch($this->server->team_id, $this->activity_id); } } catch (\Throwable $e) { diff --git a/app/Livewire/Server/Navbar.php b/app/Livewire/Server/Navbar.php index f630f0813..17c30e0f8 100644 --- a/app/Livewire/Server/Navbar.php +++ b/app/Livewire/Server/Navbar.php @@ -30,6 +30,8 @@ class Navbar extends Component public ?string $lastNotifiedStatus = null; + public bool $restartInitiated = false; + public function getListeners() { $teamId = auth()->user()->currentTeam()->id; @@ -65,11 +67,22 @@ public function restart() try { $this->authorize('manageProxy', $this->server); + // Prevent duplicate restart messages (e.g., from double-click or re-render) + if ($this->restartInitiated) { + return; + } + $this->restartInitiated = true; + // Always use background job for all servers RestartProxyJob::dispatch($this->server); - $this->dispatch('info', 'Proxy restart initiated. Monitor progress in activity logs.'); + $this->dispatch('info', 'Proxy restart initiated.'); + + // Reset the flag after a short delay to allow future restarts + $this->restartInitiated = false; } catch (\Throwable $e) { + $this->restartInitiated = false; + return handleError($e, $this); } }