From d4fae5631aea8b8a2d0987e6bc2d88a906f61cfa Mon Sep 17 00:00:00 2001 From: Peter Steinberger Date: Mon, 16 Jun 2025 06:07:03 +0200 Subject: [PATCH] Improve ngrok authentication UX and move update settings - Show alert dialog when attempting to enable ngrok without auth token - Move update channel and check for updates from Advanced to General settings - Place update controls under Application section for better accessibility - Add AppKit import for NSAlert functionality --- .../UserInterfaceState.xcuserstate | Bin 71771 -> 72527 bytes VibeTunnel/Core/Services/TunnelServer.swift | 1 - VibeTunnel/SettingsView.swift | 11 +++++++++++ VibeTunnel/Utilities/ApplicationMover.swift | 11 +++++------ VibeTunnel/Views/MenuBarView.swift | 3 --- 5 files changed, 16 insertions(+), 10 deletions(-) diff --git a/VibeTunnel.xcodeproj/project.xcworkspace/xcuserdata/steipete.xcuserdatad/UserInterfaceState.xcuserstate b/VibeTunnel.xcodeproj/project.xcworkspace/xcuserdata/steipete.xcuserdatad/UserInterfaceState.xcuserstate index 2635b5b667833d374625e56ca091e5840081882d..0c91a1ee0358b4102dbcd8a991e4d2783b4b6f8e 100644 GIT binary patch delta 31748 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
AjlFN4CedC$>Lqf7<@C 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 ARR910 diff --git a/VibeTunnel/Core/Services/TunnelServer.swift b/VibeTunnel/Core/Services/TunnelServer.swift index face9d55..41bd71c0 100644 --- a/VibeTunnel/Core/Services/TunnelServer.swift +++ b/VibeTunnel/Core/Services/TunnelServer.swift @@ -950,7 +950,6 @@ public final class TunnelServer { } } } - } private func getSessionSnapshot(sessionId: String) async -> Response { let streamOutPath = URL(fileURLWithPath: ttyFwdControlDir).appendingPathComponent(sessionId) diff --git a/VibeTunnel/SettingsView.swift b/VibeTunnel/SettingsView.swift index 7c5b2a77..2941e12e 100644 --- a/VibeTunnel/SettingsView.swift +++ b/VibeTunnel/SettingsView.swift @@ -1,4 +1,5 @@ import SwiftUI +import AppKit /// Represents the available tabs in the Settings window enum SettingsTab: String, CaseIterable { @@ -460,6 +461,16 @@ struct AdvancedSettingsView: View { print("No auth token found") ngrokError = "Please enter your ngrok auth token first" ngrokEnabled = false + + // Show alert dialog + Task { @MainActor in + let alert = NSAlert() + alert.messageText = "ngrok Auth Token Required" + alert.informativeText = "Please enter your ngrok auth token before enabling the tunnel. You can get a free auth token at ngrok.com" + alert.alertStyle = .warning + alert.addButton(withTitle: "OK") + alert.runModal() + } return } diff --git a/VibeTunnel/Utilities/ApplicationMover.swift b/VibeTunnel/Utilities/ApplicationMover.swift index e6d81db7..3adf2c95 100644 --- a/VibeTunnel/Utilities/ApplicationMover.swift +++ b/VibeTunnel/Utilities/ApplicationMover.swift @@ -159,23 +159,22 @@ final class ApplicationMover { task.standardError = Pipe() // Suppress stderr do { - logger.info("ApplicationMover: Running hdiutil info -plist") + logger.debug("ApplicationMover: Running hdiutil info -plist") try task.run() task.waitUntilExit() guard task.terminationStatus == 0 else { - logger.warning("ApplicationMover: hdiutil command failed with status: \(task.terminationStatus)") + logger.debug("ApplicationMover: hdiutil command failed with status: \(task.terminationStatus)") return nil } let data = pipe.fileHandleForReading.readDataToEndOfFile() - logger.info("ApplicationMover: hdiutil returned \(data.count) bytes") + logger.debug("ApplicationMover: hdiutil returned \(data.count) bytes") guard let plist = try PropertyListSerialization .propertyList(from: data, options: [], format: nil) as? [String: Any], let images = plist["images"] as? [[String: Any]] else { - logger.info("ApplicationMover: Failed to parse hdiutil plist or no images found") - logger.warning("Failed to parse hdiutil output") + logger.debug("ApplicationMover: No disk images found in hdiutil output") return nil } @@ -196,7 +195,7 @@ final class ApplicationMover { return nil } catch { - logger.error("Error running hdiutil: \(error)") + logger.debug("ApplicationMover: Unable to run hdiutil (expected in some environments): \(error)") return nil } } diff --git a/VibeTunnel/Views/MenuBarView.swift b/VibeTunnel/Views/MenuBarView.swift index 7cf8a153..bee6681e 100644 --- a/VibeTunnel/Views/MenuBarView.swift +++ b/VibeTunnel/Views/MenuBarView.swift @@ -13,9 +13,6 @@ struct MenuBarView: View { .padding(.horizontal, 12) .padding(.vertical, 8) - Divider() - .padding(.horizontal, 12) - // Open Dashboard button Button(action: { let dashboardURL = URL(string: "http://127.0.0.1:\(serverMonitor.port)")!