// // MAThemeManager.swift // Mobile Music Assistant // // Created by Sven Hanold on 26.03.26. // import SwiftUI @Observable class MAThemeManager { var colorScheme: AppColorScheme { didSet { UserDefaults.standard.set(colorScheme.rawValue, forKey: "appColorScheme") } } init() { let savedValue = UserDefaults.standard.string(forKey: "appColorScheme") ?? "dark" colorScheme = AppColorScheme(rawValue: savedValue) ?? .dark } var preferredColorScheme: ColorScheme? { switch colorScheme { case .system: return nil case .light: return .light case .dark: return .dark } } } enum AppColorScheme: String, CaseIterable, Identifiable { case system = "system" case light = "light" case dark = "dark" var id: String { rawValue } var displayName: String { switch self { case .system: return "System" case .light: return "Light" case .dark: return "Dark" } } var description: String { switch self { case .system: return "Follows your device's appearance" case .light: return "Always use light mode" case .dark: return "Always use dark mode" } } var icon: String { switch self { case .system: return "circle.lefthalf.filled" case .light: return "sun.max.fill" case .dark: return "moon.fill" } } } // MARK: - Environment Key private struct ThemeManagerKey: EnvironmentKey { static let defaultValue = MAThemeManager() } extension EnvironmentValues { var themeManager: MAThemeManager { get { self[ThemeManagerKey.self] } set { self[ThemeManagerKey.self] = newValue } } } // MARK: - Theme Applied Modifier struct ThemeAppliedModifier: ViewModifier { @Environment(\.themeManager) var themeManager func body(content: Content) -> some View { content .preferredColorScheme(themeManager.preferredColorScheme) .id(themeManager.colorScheme) // Force refresh when theme changes } } extension View { func applyTheme() -> some View { modifier(ThemeAppliedModifier()) } }