// // SettingsItem.swift // Mastodon // // Created by MainasuK Cirno on 2021-4-25. // import UIKit import CoreData import MastodonAsset import MastodonLocalization enum SettingsItem { case appearance(settingObjectID: NSManagedObjectID) case notification(settingObjectID: NSManagedObjectID, switchMode: NotificationSwitchMode) case preference(settingObjectID: NSManagedObjectID, preferenceType: PreferenceType) case boringZone(item: Link) case spicyZone(item: Link) } extension SettingsItem { enum AppearanceMode: String { case automatic case light case dark } enum NotificationSwitchMode: CaseIterable, Hashable { case favorite case follow case reblog case mention var title: String { switch self { case .favorite: return L10n.Scene.Settings.Section.Notifications.favorites case .follow: return L10n.Scene.Settings.Section.Notifications.follows case .reblog: return L10n.Scene.Settings.Section.Notifications.boosts case .mention: return L10n.Scene.Settings.Section.Notifications.mentions } } } enum PreferenceType: CaseIterable { case darkMode case disableAvatarAnimation case disableEmojiAnimation case useDefaultBrowser var title: String { switch self { case .darkMode: return L10n.Scene.Settings.Section.Preference.trueBlackDarkMode case .disableAvatarAnimation: return L10n.Scene.Settings.Section.Preference.disableAvatarAnimation case .disableEmojiAnimation: return L10n.Scene.Settings.Section.Preference.disableEmojiAnimation case .useDefaultBrowser: return L10n.Scene.Settings.Section.Preference.usingDefaultBrowser } } } enum Link: CaseIterable, Hashable { case accountSettings case github case termsOfService case privacyPolicy case clearMediaCache case signOut var title: String { switch self { case .accountSettings: return L10n.Scene.Settings.Section.BoringZone.accountSettings case .github: return "GitHub" case .termsOfService: return L10n.Scene.Settings.Section.BoringZone.terms case .privacyPolicy: return L10n.Scene.Settings.Section.BoringZone.privacy case .clearMediaCache: return L10n.Scene.Settings.Section.SpicyZone.clear case .signOut: return L10n.Scene.Settings.Section.SpicyZone.signout } } var textColor: UIColor { switch self { case .accountSettings: return Asset.Colors.brandBlue.color case .github: return Asset.Colors.brandBlue.color case .termsOfService: return Asset.Colors.brandBlue.color case .privacyPolicy: return Asset.Colors.brandBlue.color case .clearMediaCache: return .systemRed case .signOut: return .systemRed } } } } extension SettingsItem: Hashable { func hash(into hasher: inout Hasher) { switch self { case .appearance(let settingObjectID): hasher.combine(String(describing: SettingsItem.AppearanceMode.self)) hasher.combine(settingObjectID) case .notification(let settingObjectID, let switchMode): hasher.combine(String(describing: SettingsItem.notification.self)) hasher.combine(settingObjectID) hasher.combine(switchMode) case .preference(let settingObjectID, let preferenceType): hasher.combine(String(describing: SettingsItem.preference.self)) hasher.combine(settingObjectID) hasher.combine(preferenceType) case .boringZone(let link): hasher.combine(String(describing: SettingsItem.boringZone.self)) hasher.combine(link) case .spicyZone(let link): hasher.combine(String(describing: SettingsItem.spicyZone.self)) hasher.combine(link) } } }