import SwiftUI class Settings: ObservableObject { #if DEBUG @AppStorage("detailViewType") var detailViewType: BooruPostFileType = .sample #else @AppStorage("detailViewType") var detailViewType: BooruPostFileType = .original #endif @AppStorage("thumbnailType") var thumbnailType: BooruPostFileType = .preview @AppStorage("searchSuggestions") var searchSuggestions: Bool = false @AppStorage("columns") var columns: Int = 2 @AppStorage("blurNSFWThumbnails") var blurNSFWThumbnails: Bool = true @AppStorage("showNSFWPosts") var showNSFWPosts: Bool = false @AppStorage("bookmarks") private var bookmarksData: Data = .init() @AppStorage("preferredBooru") var preferredBooru: BooruProvider = .yandere @AppStorage("enableShareShortcut") var enableShareShortcut: Bool = false @AppStorage("displayRatings") private var displayRatingsData: Data = Settings.initialiseRatingsData() @AppStorage("blurRatings") private var blurRatingsData: Data = Settings.initialiseRatingsData() var bookmarks: [Bookmark] { get { if let bookmarks = try? JSONDecoder().decode([Bookmark].self, from: bookmarksData) { return bookmarks } return [] } set { if let data = try? JSONEncoder().encode(newValue) { bookmarksData = data } } } var displayRatings: [BooruRating] { get { Self.decodeRatings(from: displayRatingsData) } set { if let data = Self.encodeRatings(newValue) { displayRatingsData = data } } } var blurRatings: [BooruRating] { get { Self.decodeRatings(from: blurRatingsData) } set { if let data = Self.encodeRatings(newValue) { blurRatingsData = data } } } private static func initialiseRatingsData() -> Data { do { return try JSONEncoder().encode(BooruRating.allCases) } catch { return Data() } } private static func decodeRatings(from data: Data) -> [BooruRating] { if let ratings = try? JSONDecoder().decode([BooruRating].self, from: data) { return ratings } return BooruRating.allCases } private static func encodeRatings(_ ratings: [BooruRating]) -> Data? { try? JSONEncoder().encode(ratings) } func resetToDefaults() { #if DEBUG detailViewType = .preview #else detailViewType = .original #endif thumbnailType = .preview searchSuggestions = false columns = 2 blurNSFWThumbnails = true showNSFWPosts = false } func addBookmark(provider: BooruProvider, tags: [String]) { var currentBookmarks = bookmarks currentBookmarks.append(Bookmark(provider: provider, tags: tags.map { $0.lowercased() })) bookmarks = currentBookmarks } func removeBookmark(at index: IndexSet) { var currentBookmarks = bookmarks currentBookmarks.remove(atOffsets: index) bookmarks = currentBookmarks } func removeBookmark(withTags tags: [String]) { var currentBookmarks = bookmarks currentBookmarks.removeAll { bookmark in bookmark.tags.contains(where: tags.contains) } bookmarks = currentBookmarks } func removeBookmark(withID: UUID) { var currentBookmarks = bookmarks currentBookmarks.removeAll { bookmark in bookmark.id == withID } bookmarks = currentBookmarks } }