Files
steipete--codexbar/Sources/CodexBar/PreferencesSelection.swift
T
2026-07-13 12:22:33 +08:00

62 lines
1.9 KiB
Swift

import CodexBarCore
import Foundation
import Observation
extension SettingsPane {
/// Stable token used to remember the selected pane across launches.
var persistenceToken: String {
switch self {
case .general: "general"
case .notifications: "notifications"
case .menuBar: "menuBar"
case .menu: "menu"
case .advanced: "advanced"
case .about: "about"
case .debug: "debug"
case let .provider(provider): "provider:\(provider.rawValue)"
}
}
init?(persistenceToken: String) {
switch persistenceToken {
case "general": self = .general
case "notifications": self = .notifications
case "menuBar": self = .menuBar
// Pre-0.41.1 releases persisted the retired Display pane; its contents moved to Menu Bar.
case "display": self = .menuBar
case "menu": self = .menu
case "advanced": self = .advanced
case "about": self = .about
case "debug": self = .debug
default:
let providerPrefix = "provider:"
guard persistenceToken.hasPrefix(providerPrefix),
let provider = UsageProvider(rawValue: String(persistenceToken.dropFirst(providerPrefix.count)))
else {
return nil
}
self = .provider(provider)
}
}
}
@MainActor
@Observable
final class PreferencesSelection {
static let paneDefaultsKey = "settingsSelectedPane"
private let userDefaults: UserDefaults
var pane: SettingsPane {
didSet {
self.userDefaults.set(self.pane.persistenceToken, forKey: Self.paneDefaultsKey)
}
}
init(userDefaults: UserDefaults = .standard) {
self.userDefaults = userDefaults
let token = userDefaults.string(forKey: Self.paneDefaultsKey) ?? ""
self.pane = SettingsPane(persistenceToken: token) ?? .general
}
}