// // https://mczachurski.dev // Copyright © 2023 Marcin Czachurski and the repository contributors. // Licensed under the Apache License 2.0. // import Foundation import CoreData import EnvironmentKit class ApplicationSettingsHandler { public static let shared = ApplicationSettingsHandler() private init() { } func get(viewContext: NSManagedObjectContext? = nil) -> ApplicationSettings { var settingsList: [ApplicationSettings] = [] let context = viewContext ?? CoreDataHandler.shared.container.viewContext let fetchRequest = ApplicationSettings.fetchRequest() do { settingsList = try context.fetch(fetchRequest) } catch { CoreDataError.shared.handle(error, message: "Error during fetching application settings.") } if let settings = settingsList.first { return settings } else { let settings = self.createApplicationSettingsEntity(viewContext: context) settings.avatarShape = Int32(AvatarShape.circle.rawValue) settings.theme = Int32(Theme.system.rawValue) settings.tintColor = Int32(TintColor.accentColor2.rawValue) CoreDataHandler.shared.save(viewContext: context) return settings } } func update(applicationState: ApplicationState) { let defaultSettings = ApplicationSettingsHandler.shared.get() if let tintColor = TintColor(rawValue: Int(defaultSettings.tintColor)) { applicationState.tintColor = tintColor } if let theme = Theme(rawValue: Int(defaultSettings.theme)) { applicationState.theme = theme } if let avatarShape = AvatarShape(rawValue: Int(defaultSettings.avatarShape)) { applicationState.avatarShape = avatarShape } applicationState.activeIcon = defaultSettings.activeIcon applicationState.showSensitive = defaultSettings.showSensitive applicationState.showPhotoDescription = defaultSettings.showPhotoDescription applicationState.showAvatarsOnTimeline = defaultSettings.showAvatarsOnTimeline applicationState.showFavouritesOnTimeline = defaultSettings.showFavouritesOnTimeline applicationState.showAltIconOnTimeline = defaultSettings.showAltIconOnTimeline applicationState.warnAboutMissingAlt = defaultSettings.warnAboutMissingAlt if let menuPosition = MenuPosition(rawValue: Int(defaultSettings.menuPosition)) { applicationState.menuPosition = menuPosition } applicationState.hapticTabSelectionEnabled = defaultSettings.hapticTabSelectionEnabled applicationState.hapticRefreshEnabled = defaultSettings.hapticRefreshEnabled applicationState.hapticButtonPressEnabled = defaultSettings.hapticButtonPressEnabled applicationState.hapticAnimationEnabled = defaultSettings.hapticAnimationEnabled applicationState.hapticNotificationEnabled = defaultSettings.hapticNotificationEnabled } func set(accountId: String?) { let defaultSettings = self.get() defaultSettings.currentAccount = accountId CoreDataHandler.shared.save() } func set(tintColor: TintColor) { let defaultSettings = self.get() defaultSettings.tintColor = Int32(tintColor.rawValue) CoreDataHandler.shared.save() } func set(theme: Theme) { let defaultSettings = self.get() defaultSettings.theme = Int32(theme.rawValue) CoreDataHandler.shared.save() } func set(avatarShape: AvatarShape) { let defaultSettings = self.get() defaultSettings.avatarShape = Int32(avatarShape.rawValue) CoreDataHandler.shared.save() } func set(hapticTabSelectionEnabled: Bool) { let defaultSettings = self.get() defaultSettings.hapticTabSelectionEnabled = hapticTabSelectionEnabled CoreDataHandler.shared.save() } func set(hapticRefreshEnabled: Bool) { let defaultSettings = self.get() defaultSettings.hapticRefreshEnabled = hapticRefreshEnabled CoreDataHandler.shared.save() } func set(hapticAnimationEnabled: Bool) { let defaultSettings = self.get() defaultSettings.hapticAnimationEnabled = hapticAnimationEnabled CoreDataHandler.shared.save() } func set(hapticNotificationEnabled: Bool) { let defaultSettings = self.get() defaultSettings.hapticNotificationEnabled = hapticNotificationEnabled CoreDataHandler.shared.save() } func set(hapticButtonPressEnabled: Bool) { let defaultSettings = self.get() defaultSettings.hapticButtonPressEnabled = hapticButtonPressEnabled CoreDataHandler.shared.save() } func set(showSensitive: Bool) { let defaultSettings = self.get() defaultSettings.showSensitive = showSensitive CoreDataHandler.shared.save() } func set(showPhotoDescription: Bool) { let defaultSettings = self.get() defaultSettings.showPhotoDescription = showPhotoDescription CoreDataHandler.shared.save() } func set(activeIcon: String) { let defaultSettings = self.get() defaultSettings.activeIcon = activeIcon CoreDataHandler.shared.save() } func set(menuPosition: MenuPosition) { let defaultSettings = self.get() defaultSettings.menuPosition = Int32(menuPosition.rawValue) CoreDataHandler.shared.save() } func set(showAvatarsOnTimeline: Bool) { let defaultSettings = self.get() defaultSettings.showAvatarsOnTimeline = showAvatarsOnTimeline CoreDataHandler.shared.save() } func set(showFavouritesOnTimeline: Bool) { let defaultSettings = self.get() defaultSettings.showFavouritesOnTimeline = showFavouritesOnTimeline CoreDataHandler.shared.save() } func set(showAltIconOnTimeline: Bool) { let defaultSettings = self.get() defaultSettings.showAltIconOnTimeline = showAltIconOnTimeline CoreDataHandler.shared.save() } func set(warnAboutMissingAlt: Bool) { let defaultSettings = self.get() defaultSettings.warnAboutMissingAlt = warnAboutMissingAlt CoreDataHandler.shared.save() } func set(customNavigationMenuItem1: Int) { let defaultSettings = self.get() defaultSettings.customNavigationMenuItem1 = Int32(customNavigationMenuItem1) CoreDataHandler.shared.save() } func set(customNavigationMenuItem2: Int) { let defaultSettings = self.get() defaultSettings.customNavigationMenuItem2 = Int32(customNavigationMenuItem2) CoreDataHandler.shared.save() } func set(customNavigationMenuItem3: Int) { let defaultSettings = self.get() defaultSettings.customNavigationMenuItem3 = Int32(customNavigationMenuItem3) CoreDataHandler.shared.save() } private func createApplicationSettingsEntity(viewContext: NSManagedObjectContext? = nil) -> ApplicationSettings { let context = viewContext ?? CoreDataHandler.shared.container.viewContext return ApplicationSettings(context: context) } }