ThemeManager.swift 800 B

12345678910111213141516171819202122232425262728293031
  1. import Combine
  2. import Foundation
  3. import SwiftUI
  4. extension Notification.Name {
  5. static let themeDidChange = Notification.Name("themeDidChange")
  6. }
  7. @MainActor
  8. final class ThemeManager: ObservableObject {
  9. static let storageKey = "isDarkMode"
  10. @Published var isDarkMode: Bool {
  11. didSet {
  12. guard isDarkMode != oldValue else { return }
  13. defaults.set(isDarkMode, forKey: Self.storageKey)
  14. NotificationCenter.default.post(name: .themeDidChange, object: nil)
  15. }
  16. }
  17. private let defaults: UserDefaults
  18. init(defaults: UserDefaults = .standard) {
  19. self.defaults = defaults
  20. self.isDarkMode = defaults.bool(forKey: Self.storageKey)
  21. }
  22. var preferredColorScheme: ColorScheme? {
  23. isDarkMode ? .dark : .light
  24. }
  25. }