mirror of
https://github.com/samsonjs/vibetunnel.git
synced 2026-04-27 15:17:38 +00:00
192 lines
7 KiB
Swift
192 lines
7 KiB
Swift
import Foundation
|
|
|
|
/// Central location for app-wide constants and configuration values.
|
|
///
|
|
/// Provides a single source of truth for application constants, UserDefaults keys,
|
|
/// and default values. This helps maintain consistency across the app and makes
|
|
/// configuration changes easier to manage.
|
|
enum AppConstants {
|
|
/// Current version of the welcome dialog
|
|
/// Increment this when significant changes require re-showing the welcome flow
|
|
static let currentWelcomeVersion = 5
|
|
|
|
/// UserDefaults keys
|
|
enum UserDefaultsKeys {
|
|
static let welcomeVersion = "welcomeVersion"
|
|
static let preventSleepWhenRunning = "preventSleepWhenRunning"
|
|
|
|
// Server Configuration
|
|
static let serverPort = "serverPort"
|
|
static let dashboardAccessMode = "dashboardAccessMode"
|
|
static let cleanupOnStartup = "cleanupOnStartup"
|
|
static let authenticationMode = "authenticationMode"
|
|
|
|
// Development Settings
|
|
static let debugMode = "debugMode"
|
|
static let useDevServer = "useDevServer"
|
|
static let devServerPath = "devServerPath"
|
|
static let logLevel = "logLevel"
|
|
|
|
// Application Preferences
|
|
static let preferredGitApp = "preferredGitApp"
|
|
static let preferredTerminal = "preferredTerminal"
|
|
static let showInDock = "showInDock"
|
|
static let updateChannel = "updateChannel"
|
|
|
|
// New Session keys
|
|
static let newSessionCommand = "NewSession.command"
|
|
static let newSessionWorkingDirectory = "NewSession.workingDirectory"
|
|
static let newSessionSpawnWindow = "NewSession.spawnWindow"
|
|
static let newSessionTitleMode = "NewSession.titleMode"
|
|
|
|
/// Quick Start Commands
|
|
static let quickStartCommands = "quickStartCommands"
|
|
}
|
|
|
|
/// Raw string values for DashboardAccessMode
|
|
enum DashboardAccessModeRawValues {
|
|
static let localhost = "localhost"
|
|
static let network = "network"
|
|
}
|
|
|
|
/// Default values for UserDefaults
|
|
enum Defaults {
|
|
/// Sleep prevention is enabled by default for better user experience
|
|
static let preventSleepWhenRunning = true
|
|
|
|
// Server Configuration
|
|
static let serverPort = 4_020
|
|
static let dashboardAccessMode = DashboardAccessModeRawValues.network
|
|
static let cleanupOnStartup = true
|
|
static let authenticationMode = "os"
|
|
|
|
// Development Settings
|
|
static let debugMode = false
|
|
static let useDevServer = false
|
|
static let devServerPath = ""
|
|
static let logLevel = "info"
|
|
|
|
// Application Preferences
|
|
static let showInDock = false
|
|
static let updateChannel = "stable"
|
|
}
|
|
|
|
/// Helper to get boolean value with proper default
|
|
static func boolValue(for key: String) -> Bool {
|
|
// If the key doesn't exist in UserDefaults, return our default
|
|
if UserDefaults.standard.object(forKey: key) == nil {
|
|
switch key {
|
|
case UserDefaultsKeys.preventSleepWhenRunning:
|
|
return Defaults.preventSleepWhenRunning
|
|
case UserDefaultsKeys.cleanupOnStartup:
|
|
return Defaults.cleanupOnStartup
|
|
case UserDefaultsKeys.debugMode:
|
|
return Defaults.debugMode
|
|
case UserDefaultsKeys.useDevServer:
|
|
return Defaults.useDevServer
|
|
case UserDefaultsKeys.showInDock:
|
|
return Defaults.showInDock
|
|
default:
|
|
return false
|
|
}
|
|
}
|
|
return UserDefaults.standard.bool(forKey: key)
|
|
}
|
|
|
|
/// Helper to get string value with proper default
|
|
static func stringValue(for key: String) -> String {
|
|
// First check if we have a string value
|
|
if let value = UserDefaults.standard.string(forKey: key) {
|
|
return value
|
|
}
|
|
|
|
// If the key doesn't exist at all, return our default
|
|
if UserDefaults.standard.object(forKey: key) == nil {
|
|
switch key {
|
|
case UserDefaultsKeys.dashboardAccessMode:
|
|
return Defaults.dashboardAccessMode
|
|
case UserDefaultsKeys.authenticationMode:
|
|
return Defaults.authenticationMode
|
|
case UserDefaultsKeys.devServerPath:
|
|
return Defaults.devServerPath
|
|
case UserDefaultsKeys.logLevel:
|
|
return Defaults.logLevel
|
|
case UserDefaultsKeys.updateChannel:
|
|
return Defaults.updateChannel
|
|
default:
|
|
return ""
|
|
}
|
|
}
|
|
|
|
// Key exists but contains non-string value, return empty string
|
|
return ""
|
|
}
|
|
|
|
/// Helper to get integer value with proper default
|
|
static func intValue(for key: String) -> Int {
|
|
// If the key doesn't exist in UserDefaults, return our default
|
|
if UserDefaults.standard.object(forKey: key) == nil {
|
|
switch key {
|
|
case UserDefaultsKeys.serverPort:
|
|
return Defaults.serverPort
|
|
default:
|
|
return 0
|
|
}
|
|
}
|
|
return UserDefaults.standard.integer(forKey: key)
|
|
}
|
|
}
|
|
|
|
// MARK: - Convenience Methods
|
|
|
|
extension AppConstants {
|
|
/// Check if the app is in development mode (debug or dev server enabled)
|
|
static func isInDevelopmentMode() -> Bool {
|
|
let debug = DebugConfig.current()
|
|
let devServer = DevServerConfig.current()
|
|
return debug.debugMode || devServer.useDevServer
|
|
}
|
|
|
|
/// Get development status for UI display
|
|
static func getDevelopmentStatus() -> (debugMode: Bool, useDevServer: Bool) {
|
|
let debug = DebugConfig.current()
|
|
let devServer = DevServerConfig.current()
|
|
return (debug.debugMode, devServer.useDevServer)
|
|
}
|
|
|
|
/// Preference helpers
|
|
static func getPreferredGitApp() -> String? {
|
|
UserDefaults.standard.string(forKey: UserDefaultsKeys.preferredGitApp)
|
|
}
|
|
|
|
static func setPreferredGitApp(_ app: String?) {
|
|
if let app {
|
|
UserDefaults.standard.set(app, forKey: UserDefaultsKeys.preferredGitApp)
|
|
} else {
|
|
UserDefaults.standard.removeObject(forKey: UserDefaultsKeys.preferredGitApp)
|
|
}
|
|
}
|
|
|
|
static func getPreferredTerminal() -> String? {
|
|
UserDefaults.standard.string(forKey: UserDefaultsKeys.preferredTerminal)
|
|
}
|
|
|
|
static func setPreferredTerminal(_ terminal: String?) {
|
|
if let terminal {
|
|
UserDefaults.standard.set(terminal, forKey: UserDefaultsKeys.preferredTerminal)
|
|
} else {
|
|
UserDefaults.standard.removeObject(forKey: UserDefaultsKeys.preferredTerminal)
|
|
}
|
|
}
|
|
|
|
/// Get current dashboard access mode
|
|
static func getDashboardAccessMode() -> DashboardAccessMode {
|
|
let rawValue = stringValue(for: UserDefaultsKeys.dashboardAccessMode)
|
|
return DashboardAccessMode(rawValue: rawValue) ?? .network
|
|
}
|
|
|
|
/// Set dashboard access mode
|
|
static func setDashboardAccessMode(_ mode: DashboardAccessMode) {
|
|
UserDefaults.standard.set(mode.rawValue, forKey: UserDefaultsKeys.dashboardAccessMode)
|
|
}
|
|
}
|