import SwiftUI class Settings: ObservableObject { @AppStorage("detailViewType") var detailViewType: BooruPostFileType = .original @AppStorage("thumbnailType") var thumbnailType: BooruPostFileType = .preview @AppStorage("searchSuggestions") var searchSuggestions = false @AppStorage("columns") var columns = 2 @AppStorage("blurNSFWThumbnails") var blurNSFWThumbnails = true @AppStorage("showNSFWPosts") var showNSFWPosts = false @AppStorage("bookmarks") private var bookmarksData = Data() @AppStorage("preferredBooru") var preferredBooru: BooruProvider = .safebooru @AppStorage("enableShareShortcut") var enableShareShortcut = false @AppStorage("displayRatings") private var displayRatingsData = Settings.defaultRatingsData() @AppStorage("blurRatings") private var blurRatingsData = Settings.defaultRatingsData() @AppStorage("displayDetailsInformationBar") var displayDetailsInformationBar = true #if os(macOS) @AppStorage("saveTagsToFile") var saveTagsToFile = true #endif 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 defaultRatingsData() -> 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 } }