Files
MobileMusicAssistant/Mobile Music Assistant/ServicesMAThemeManager.swift
T

99 lines
2.2 KiB
Swift

//
// 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: LocalizedStringKey {
switch self {
case .system: return "System"
case .light: return "Light"
case .dark: return "Dark"
}
}
var description: LocalizedStringKey {
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)
}
}
extension View {
func applyTheme() -> some View {
modifier(ThemeAppliedModifier())
}
}