2020-10-15 07:44:01 +00:00
|
|
|
// Copyright © 2020 Metabolist. All rights reserved.
|
|
|
|
|
|
|
|
import CodableBloomFilter
|
|
|
|
import Foundation
|
2020-10-27 03:01:12 +00:00
|
|
|
import Mastodon
|
2020-10-15 07:44:01 +00:00
|
|
|
|
|
|
|
public struct AppPreferences {
|
|
|
|
private let userDefaults: UserDefaults
|
2020-10-22 22:16:06 +00:00
|
|
|
private let systemReduceMotion: () -> Bool
|
2020-10-15 07:44:01 +00:00
|
|
|
|
|
|
|
public init(environment: AppEnvironment) {
|
|
|
|
self.userDefaults = environment.userDefaults
|
2020-10-22 22:16:06 +00:00
|
|
|
self.systemReduceMotion = environment.reduceMotion
|
2020-10-15 07:44:01 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
public extension AppPreferences {
|
2021-01-31 01:43:48 +00:00
|
|
|
enum StatusWord: String, CaseIterable, Identifiable {
|
|
|
|
case toot
|
|
|
|
case post
|
|
|
|
|
|
|
|
public var id: String { rawValue }
|
|
|
|
}
|
|
|
|
|
2020-10-15 07:44:01 +00:00
|
|
|
enum AnimateAvatars: String, CaseIterable, Identifiable {
|
|
|
|
case everywhere
|
|
|
|
case profiles
|
|
|
|
case never
|
|
|
|
|
|
|
|
public var id: String { rawValue }
|
|
|
|
}
|
|
|
|
|
|
|
|
enum Autoplay: String, CaseIterable, Identifiable {
|
|
|
|
case always
|
|
|
|
case wifi
|
|
|
|
case never
|
|
|
|
|
|
|
|
public var id: String { rawValue }
|
|
|
|
}
|
|
|
|
|
2020-10-27 03:01:12 +00:00
|
|
|
enum PositionBehavior: String, CaseIterable, Identifiable {
|
|
|
|
case rememberPosition
|
|
|
|
case syncPosition
|
|
|
|
case newest
|
|
|
|
|
|
|
|
public var id: String { rawValue }
|
|
|
|
}
|
|
|
|
|
2020-10-15 07:44:01 +00:00
|
|
|
var useSystemReduceMotionForMedia: Bool {
|
|
|
|
get { self[.useSystemReduceMotionForMedia] ?? true }
|
|
|
|
set { self[.useSystemReduceMotionForMedia] = newValue }
|
|
|
|
}
|
|
|
|
|
2021-01-31 01:43:48 +00:00
|
|
|
var statusWord: StatusWord {
|
|
|
|
get {
|
|
|
|
if let rawValue = self[.statusWord] as String?,
|
|
|
|
let value = StatusWord(rawValue: rawValue) {
|
|
|
|
return value
|
|
|
|
}
|
|
|
|
|
|
|
|
return .toot
|
|
|
|
}
|
|
|
|
set { self[.statusWord] = newValue.rawValue }
|
|
|
|
}
|
|
|
|
|
2020-10-15 07:44:01 +00:00
|
|
|
var animateAvatars: AnimateAvatars {
|
|
|
|
get {
|
|
|
|
if let rawValue = self[.animateAvatars] as String?,
|
|
|
|
let value = AnimateAvatars(rawValue: rawValue) {
|
|
|
|
return value
|
|
|
|
}
|
|
|
|
|
2021-02-04 01:50:25 +00:00
|
|
|
return .everywhere
|
2020-10-15 07:44:01 +00:00
|
|
|
}
|
|
|
|
set { self[.animateAvatars] = newValue.rawValue }
|
|
|
|
}
|
|
|
|
|
|
|
|
var animateHeaders: Bool {
|
|
|
|
get { self[.animateHeaders] ?? true }
|
|
|
|
set { self[.animateHeaders] = newValue }
|
|
|
|
}
|
|
|
|
|
|
|
|
var autoplayGIFs: Autoplay {
|
|
|
|
get {
|
|
|
|
if let rawValue = self[.autoplayGIFs] as String?,
|
|
|
|
let value = Autoplay(rawValue: rawValue) {
|
|
|
|
return value
|
|
|
|
}
|
|
|
|
|
|
|
|
return .always
|
|
|
|
}
|
|
|
|
set { self[.autoplayGIFs] = newValue.rawValue }
|
|
|
|
}
|
|
|
|
|
|
|
|
var autoplayVideos: Autoplay {
|
|
|
|
get {
|
|
|
|
if let rawValue = self[.autoplayVideos] as String?,
|
|
|
|
let value = Autoplay(rawValue: rawValue) {
|
|
|
|
return value
|
|
|
|
}
|
|
|
|
|
|
|
|
return .wifi
|
|
|
|
}
|
|
|
|
set { self[.autoplayVideos] = newValue.rawValue }
|
|
|
|
}
|
2020-10-22 22:16:06 +00:00
|
|
|
|
2020-10-27 03:01:12 +00:00
|
|
|
var homeTimelineBehavior: PositionBehavior {
|
|
|
|
get {
|
|
|
|
if let rawValue = self[.homeTimelineBehavior] as String?,
|
|
|
|
let value = PositionBehavior(rawValue: rawValue) {
|
|
|
|
return value
|
|
|
|
}
|
|
|
|
|
|
|
|
return .rememberPosition
|
|
|
|
}
|
|
|
|
set { self[.homeTimelineBehavior] = newValue.rawValue }
|
|
|
|
}
|
|
|
|
|
|
|
|
var notificationsTabBehavior: PositionBehavior {
|
|
|
|
get {
|
|
|
|
if let rawValue = self[.notificationsTabBehavior] as String?,
|
|
|
|
let value = PositionBehavior(rawValue: rawValue) {
|
|
|
|
return value
|
|
|
|
}
|
|
|
|
|
|
|
|
return .newest
|
|
|
|
}
|
|
|
|
set { self[.notificationsTabBehavior] = newValue.rawValue }
|
|
|
|
}
|
|
|
|
|
2021-01-15 21:43:46 +00:00
|
|
|
var defaultEmojiSkinTone: SystemEmoji.SkinTone? {
|
|
|
|
get {
|
|
|
|
if let rawValue = self[.defaultEmojiSkinTone] as Int?,
|
|
|
|
let value = SystemEmoji.SkinTone(rawValue: rawValue) {
|
|
|
|
return value
|
|
|
|
}
|
|
|
|
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
set { self[.defaultEmojiSkinTone] = newValue?.rawValue }
|
|
|
|
}
|
|
|
|
|
2020-10-22 22:16:06 +00:00
|
|
|
var shouldReduceMotion: Bool {
|
|
|
|
systemReduceMotion() && useSystemReduceMotionForMedia
|
|
|
|
}
|
2020-10-27 03:01:12 +00:00
|
|
|
|
|
|
|
func positionBehavior(markerTimeline: Marker.Timeline) -> PositionBehavior {
|
|
|
|
switch markerTimeline {
|
|
|
|
case .home:
|
|
|
|
return homeTimelineBehavior
|
|
|
|
case .notifications:
|
|
|
|
return notificationsTabBehavior
|
|
|
|
}
|
|
|
|
}
|
2021-01-29 06:02:57 +00:00
|
|
|
|
|
|
|
var showReblogAndFavoriteCounts: Bool {
|
|
|
|
get { self[.showReblogAndFavoriteCounts] ?? false }
|
|
|
|
set { self[.showReblogAndFavoriteCounts] = newValue }
|
|
|
|
}
|
2021-01-31 19:23:33 +00:00
|
|
|
|
|
|
|
var requireDoubleTapToReblog: Bool {
|
|
|
|
get { self[.requireDoubleTapToReblog] ?? false }
|
|
|
|
set { self[.requireDoubleTapToReblog] = newValue }
|
|
|
|
}
|
|
|
|
|
|
|
|
var requireDoubleTapToFavorite: Bool {
|
|
|
|
get { self[.requireDoubleTapToFavorite] ?? false }
|
|
|
|
set { self[.requireDoubleTapToFavorite] = newValue }
|
|
|
|
}
|
2020-10-15 07:44:01 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
private extension AppPreferences {
|
|
|
|
enum Item: String {
|
2021-01-31 01:43:48 +00:00
|
|
|
case statusWord
|
2021-01-31 19:23:33 +00:00
|
|
|
case requireDoubleTapToReblog
|
|
|
|
case requireDoubleTapToFavorite
|
2020-10-15 07:44:01 +00:00
|
|
|
case useSystemReduceMotionForMedia
|
|
|
|
case animateAvatars
|
|
|
|
case animateHeaders
|
|
|
|
case autoplayGIFs
|
|
|
|
case autoplayVideos
|
2020-10-27 03:01:12 +00:00
|
|
|
case homeTimelineBehavior
|
|
|
|
case notificationsTabBehavior
|
2021-01-15 21:43:46 +00:00
|
|
|
case defaultEmojiSkinTone
|
2021-01-29 06:02:57 +00:00
|
|
|
case showReblogAndFavoriteCounts
|
2020-10-15 07:44:01 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
subscript<T>(index: Item) -> T? {
|
|
|
|
get { userDefaults.value(forKey: index.rawValue) as? T }
|
|
|
|
set { userDefaults.set(newValue, forKey: index.rawValue) }
|
|
|
|
}
|
|
|
|
}
|