summaryrefslogtreecommitdiff
path: root/Sora
diff options
context:
space:
mode:
Diffstat (limited to 'Sora')
-rw-r--r--Sora/Data/Booru/BooruManager.swift18
-rw-r--r--Sora/Data/Booru/BooruProvider.swift2
-rw-r--r--Sora/Data/Settings/Bookmark.swift4
-rw-r--r--Sora/Data/Settings/Settings.swift4
-rw-r--r--Sora/Views/BookmarksView.swift7
-rw-r--r--Sora/Views/MainView.swift18
-rw-r--r--Sora/Views/Post/PostGridBookmarkButtonView.swift24
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")
+ }
}
}