Show installed browser options

This commit is contained in:
Paweł Orzech 2026-02-04 14:06:53 +01:00
parent d1166d3218
commit bbeb89b9ba
No known key found for this signature in database
2 changed files with 69 additions and 9 deletions

View file

@ -7,26 +7,77 @@ enum PreferredBrowser: String, CaseIterable, Identifiable {
case firefox = "Firefox"
case edge = "Microsoft Edge"
case brave = "Brave"
case arc = "Arc"
case vivaldi = "Vivaldi"
case zen = "Zen"
case opera = "Opera"
case duckduckgo = "DuckDuckGo"
case orion = "Orion"
case tor = "Tor Browser"
case chromium = "Chromium"
case librewolf = "LibreWolf"
case waterfox = "Waterfox"
case atlas = "ChatGPT Atlas"
var id: String { rawValue }
var bundleIdentifier: String? {
var bundleIdentifiers: [String]? {
switch self {
case .system:
return nil
case .safari:
return "com.apple.Safari"
return ["com.apple.Safari"]
case .chrome:
return "com.google.Chrome"
return ["com.google.Chrome"]
case .firefox:
return "org.mozilla.firefox"
return ["org.mozilla.firefox"]
case .edge:
return "com.microsoft.edgemac"
return ["com.microsoft.edgemac"]
case .brave:
return "com.brave.Browser"
return ["com.brave.Browser"]
case .arc:
return ["company.thebrowser.Browser"]
case .vivaldi:
return ["com.vivaldi.Vivaldi"]
case .zen:
return ["app.zen-browser.zen"]
case .opera:
return ["com.operasoftware.Opera"]
case .duckduckgo:
return ["com.duckduckgo.macos.browser"]
case .orion:
return ["com.kagi.kagimacOS", "com.kagi.kagimacOS.RC"]
case .tor:
return ["com.torproject.tor"]
case .chromium:
return ["org.chromium.Chromium"]
case .librewolf:
return ["io.gitlab.librewolf-community"]
case .waterfox:
return ["net.waterfox.waterfox"]
case .atlas:
return ["com.openai.atlas"]
}
}
var installedApplicationURL: URL? {
guard let bundleIdentifiers else { return nil }
for bundleIdentifier in bundleIdentifiers {
if let appURL = NSWorkspace.shared.urlForApplication(withBundleIdentifier: bundleIdentifier) {
return appURL
}
}
return nil
}
var isInstalled: Bool {
self == .system || installedApplicationURL != nil
}
static func availableBrowsers() -> [PreferredBrowser] {
PreferredBrowser.allCases.filter { $0.isInstalled }
}
init(storedValue: String?) {
guard let storedValue,
let value = PreferredBrowser(rawValue: storedValue) else {
@ -50,8 +101,7 @@ final class BrowserManager {
}
let preference = PreferredBrowser(storedValue: UserDefaults.standard.string(forKey: "preferredBrowser"))
guard let bundleIdentifier = preference.bundleIdentifier,
let appURL = NSWorkspace.shared.urlForApplication(withBundleIdentifier: bundleIdentifier) else {
guard let appURL = preference.installedApplicationURL else {
NSWorkspace.shared.open(url)
return
}

View file

@ -7,6 +7,7 @@ struct SettingsView: View {
@AppStorage("preferredBrowser") private var preferredBrowser: String = PreferredBrowser.system.rawValue
@State private var inputKey: String = ""
@State private var showCredits: Bool = false
@State private var availableBrowsers: [PreferredBrowser] = PreferredBrowser.availableBrowsers()
// Developer ID for tip feature (bombel)
private let developerID = 2362436
@ -114,7 +115,7 @@ struct SettingsView: View {
.frame(width: 20)
Picker("Preferred Browser", selection: $preferredBrowser) {
ForEach(PreferredBrowser.allCases) { browser in
ForEach(availableBrowsers) { browser in
Text(browser.rawValue).tag(browser.rawValue)
}
}
@ -230,6 +231,15 @@ struct SettingsView: View {
.frame(width: 320)
.onAppear {
inputKey = appState.apiKey
refreshAvailableBrowsers()
}
}
private func refreshAvailableBrowsers() {
let browsers = PreferredBrowser.availableBrowsers()
availableBrowsers = browsers
if !browsers.contains(where: { $0.rawValue == preferredBrowser }) {
preferredBrowser = PreferredBrowser.system.rawValue
}
}