diff options
Diffstat (limited to 'Sora')
| -rw-r--r-- | Sora/Data/Booru/BooruManager.swift | 18 | ||||
| -rw-r--r-- | Sora/Data/Booru/BooruProvider.swift | 2 | ||||
| -rw-r--r-- | Sora/Data/Settings/Bookmark.swift | 4 | ||||
| -rw-r--r-- | Sora/Data/Settings/Settings.swift | 4 | ||||
| -rw-r--r-- | Sora/Views/BookmarksView.swift | 7 | ||||
| -rw-r--r-- | Sora/Views/MainView.swift | 18 | ||||
| -rw-r--r-- | Sora/Views/Post/PostGridBookmarkButtonView.swift | 24 |
7 files changed, 52 insertions, 25 deletions
diff --git a/Sora/Data/Booru/BooruManager.swift b/Sora/Data/Booru/BooruManager.swift index 1beb795..3c5f49b 100644 --- a/Sora/Data/Booru/BooruManager.swift +++ b/Sora/Data/Booru/BooruManager.swift @@ -12,7 +12,7 @@ class BooruManager: ObservableObject { @Published var selectedPost: BooruPost? #endif private var currentTask: Task<Void, Never>? - private let booruProvider: BooruProvider? + let provider: BooruProvider? var tags: [String] { if searchText.isEmpty { return [] @@ -25,14 +25,14 @@ class BooruManager: ObservableObject { } init(_ provider: BooruProvider? = nil) { - self.booruProvider = provider + self.provider = provider fetchAllTags() } func fetchPosts(page: Int = 1, limit: Int = 100, tags: [String] = [], replace: Bool = false) async { guard !isLoading else { return } - guard booruProvider != nil else { return } + guard provider != nil else { return } currentTask?.cancel() @@ -46,7 +46,7 @@ class BooruManager: ObservableObject { self.currentPage = 1 } - guard let url = urlForPosts(page: self.booruProvider == .safebooru ? page - 1 : page, limit: limit, tags: tags) else { + guard let url = urlForPosts(page: self.provider == .safebooru ? page - 1 : page, limit: limit, tags: tags) else { return } @@ -75,7 +75,9 @@ class BooruManager: ObservableObject { } func performSearch() { - Task { + currentTask?.cancel() + + currentTask = Task { await fetchPosts(page: 1, tags: tags, replace: true) } } @@ -93,7 +95,7 @@ class BooruManager: ObservableObject { } func fetchAllTags(limit: Int = 100_000) { - guard booruProvider != nil else { return } + guard provider != nil else { return } Task { guard let url = urlForTags(limit: limit) else { return } @@ -119,7 +121,7 @@ class BooruManager: ObservableObject { private func urlForPosts(page: Int, limit: Int, tags: [String]) -> URL? { let tagString = tags.joined(separator: "+") - switch booruProvider { + switch provider { case .yandere: return URL(string: "https://yande.re/post.xml?page=\(page)&limit=\(limit)&tags=\(tagString)") case .safebooru: @@ -130,7 +132,7 @@ class BooruManager: ObservableObject { } private func urlForTags(limit: Int) -> URL? { - switch booruProvider { + switch provider { case .yandere: return URL(string: "https://yande.re/tag.xml?limit=\(limit)") case .safebooru: diff --git a/Sora/Data/Booru/BooruProvider.swift b/Sora/Data/Booru/BooruProvider.swift index 18cfd64..e742fef 100644 --- a/Sora/Data/Booru/BooruProvider.swift +++ b/Sora/Data/Booru/BooruProvider.swift @@ -1,4 +1,4 @@ -enum BooruProvider: String, CaseIterable { +enum BooruProvider: String, CaseIterable, Decodable, Encodable { case yandere case safebooru } diff --git a/Sora/Data/Settings/Bookmark.swift b/Sora/Data/Settings/Bookmark.swift index 2e6fc93..16f1e50 100644 --- a/Sora/Data/Settings/Bookmark.swift +++ b/Sora/Data/Settings/Bookmark.swift @@ -4,10 +4,12 @@ struct Bookmark: Codable, Identifiable, Hashable { let id: UUID let tags: [String] let createdAt: Date + let provider: BooruProvider - init(id: UUID = UUID(), tags: [String]) { + init(id: UUID = UUID(), provider: BooruProvider, tags: [String]) { createdAt = Date() self.id = id self.tags = tags + self.provider = provider } } diff --git a/Sora/Data/Settings/Settings.swift b/Sora/Data/Settings/Settings.swift index e8d1510..3ffa114 100644 --- a/Sora/Data/Settings/Settings.swift +++ b/Sora/Data/Settings/Settings.swift @@ -43,10 +43,10 @@ class Settings: ObservableObject { showNSFWPosts = false } - func addBookmark(tags: [String]) { + func addBookmark(provider: BooruProvider, tags: [String]) { var currentBookmarks = bookmarks - currentBookmarks.append(Bookmark(tags: tags.map { $0.lowercased() })) + currentBookmarks.append(Bookmark(provider: provider, tags: tags.map { $0.lowercased() })) bookmarks = currentBookmarks } diff --git a/Sora/Views/BookmarksView.swift b/Sora/Views/BookmarksView.swift index d1c5776..5d27b6a 100644 --- a/Sora/Views/BookmarksView.swift +++ b/Sora/Views/BookmarksView.swift @@ -34,17 +34,20 @@ struct BookmarksView: View { ForEach(filteredBookmarks, id: \.self) { bookmark in Button(action: { + settings.preferredBooru = bookmark.provider manager.searchText = bookmark.tags.joined(separator: " ") - manager.performSearch() selectedTab = 0 }) { + let badgeView = Text(bookmark.provider.rawValue.capitalized) + HStack { Text(bookmark.tags.joined(separator: ", ")) + .foregroundStyle(.primary) Text(bookmark.createdAt.formatted()) .foregroundColor(.secondary) - .font(.caption) } + .badge(badgeView) } } .onDelete(perform: settings.removeBookmark) diff --git a/Sora/Views/MainView.swift b/Sora/Views/MainView.swift index 949e024..60e0689 100644 --- a/Sora/Views/MainView.swift +++ b/Sora/Views/MainView.swift @@ -11,10 +11,17 @@ struct MainView: View { .environmentObject(settings) .environmentObject(manager) .onChange(of: settings.preferredBooru) { _, newState in + let previousSearchText = manager.searchText + self.manager = BooruManager(newState) + self.manager.searchText = previousSearchText Task { - await self.manager.fetchPosts() + if self.manager.searchText.isEmpty { + await self.manager.fetchPosts() + } else { + self.manager.performSearch() + } } } .onAppear { @@ -54,10 +61,17 @@ struct MainView: View { } .environmentObject(settings) .onChange(of: settings.preferredBooru) { _, newState in + let previousSearchText = manager.searchText + self.manager = BooruManager(newState) + self.manager.searchText = previousSearchText Task { - await self.manager.fetchPosts() + if self.manager.searchText.isEmpty { + await self.manager.fetchPosts() + } else { + self.manager.performSearch() + } } } .onAppear { diff --git a/Sora/Views/Post/PostGridBookmarkButtonView.swift b/Sora/Views/Post/PostGridBookmarkButtonView.swift index 531eefe..90336f9 100644 --- a/Sora/Views/Post/PostGridBookmarkButtonView.swift +++ b/Sora/Views/Post/PostGridBookmarkButtonView.swift @@ -6,17 +6,23 @@ struct PostGridBookmarkButtonView: View { var contained: Bool { settings.bookmarks - .contains(where: { $0.tags == manager.tags.map { $0.lowercased() } }) + .contains(where: { $0.tags == manager.tags.map { $0.lowercased() } && $0.provider == manager.provider ?? settings.preferredBooru }) } var body: some View { - Button(action: { - contained ? settings.removeBookmark(withTags: manager.tags) : settings.addBookmark(tags: manager.tags) - }) { - Label("Bookmark", systemImage: - contained ? - "bookmark.fill" : - "bookmark") - } + Button( + action: { + contained ? settings + .removeBookmark(withTags: manager.tags) : settings + .addBookmark( + provider: manager.provider ?? settings.preferredBooru, + tags: manager.tags + ) + }) { + Label("Bookmark", systemImage: + contained ? + "bookmark.fill" : + "bookmark") + } } } |