diff options
| author | Fuwn <[email protected]> | 2025-03-15 05:38:13 -0700 |
|---|---|---|
| committer | Fuwn <[email protected]> | 2025-03-15 05:38:13 -0700 |
| commit | 704bb9be1d4bdd8b9360fc1d58d6b58bc2c1d9c1 (patch) | |
| tree | 60090b645c7c7cebd58e55444a3037dac435f72a /Sora/Data | |
| parent | feat: Development commit (diff) | |
| download | sora-testing-704bb9be1d4bdd8b9360fc1d58d6b58bc2c1d9c1.tar.xz sora-testing-704bb9be1d4bdd8b9360fc1d58d6b58bc2c1d9c1.zip | |
feat: Development commit
Diffstat (limited to 'Sora/Data')
| -rw-r--r-- | Sora/Data/Booru/BooruManager.swift | 58 | ||||
| -rw-r--r-- | Sora/Data/Booru/BooruSearchQuery.swift | 16 |
2 files changed, 71 insertions, 3 deletions
diff --git a/Sora/Data/Booru/BooruManager.swift b/Sora/Data/Booru/BooruManager.swift index 1121fc1..3955b70 100644 --- a/Sora/Data/Booru/BooruManager.swift +++ b/Sora/Data/Booru/BooruManager.swift @@ -15,6 +15,8 @@ class BooruManager: ObservableObject { @Published var domain: String @Published private(set) var postIndexMap: [String: Int] = [:] @Published var provider: BooruProvider + @Published private var historyIndex: Int = 0 + @Published var searchHistory: [BooruSearchQuery] = [] // MARK: - Private Properties private var currentTask: Task<Void, Never>? @@ -42,6 +44,10 @@ class BooruManager: ObservableObject { self.domain = provider.domain pageCache.countLimit = 50 pageCache.totalCostLimit = 50 * 1_024 * 1_024 + + self.searchHistory.append( + BooruSearchQuery(provider: provider, tags: []) + ) } // MARK: - Public Methods @@ -99,9 +105,16 @@ class BooruManager: ObservableObject { } func performSearch(settings: SettingsManager? = nil) { - settings?.appendToSearchHistory( - BooruSearchQuery(provider: settings!.preferredBooru, tags: tags, searchedAt: Date()) + let query = BooruSearchQuery( + provider: settings?.preferredBooru ?? provider, + tags: tags ) + + settings?.appendToSearchHistory(query) + searchHistory.append(query) + + historyIndex = searchHistory.count - 1 + currentTask?.cancel() Task { await fetchPosts(page: 1, tags: tags, replace: true) } @@ -114,6 +127,47 @@ class BooruManager: ObservableObject { await fetchPosts(page: currentPage + 1, tags: tags) currentPage += 1 + + if historyIndex >= 0 && historyIndex < searchHistory.count { + var currentQuery = searchHistory[historyIndex] + + currentQuery.page = currentPage + searchHistory[historyIndex] = currentQuery + } + } + } + + func goBackInHistory() { + guard historyIndex > 0 else { return } + + historyIndex -= 1 + + let previousQuery = searchHistory[historyIndex] + + searchText = previousQuery.tags.joined(separator: " ") + currentPage = previousQuery.page + + Task { + await fetchPosts( + page: currentPage, + tags: previousQuery.tags, + replace: true + ) + } + } + + func goForwardInHistory() { + guard historyIndex < searchHistory.count - 1 else { return } + + historyIndex += 1 + + let nextQuery = searchHistory[historyIndex] + + searchText = nextQuery.tags.joined(separator: " ") + currentPage = nextQuery.page + + Task { + await fetchPosts(page: currentPage, tags: nextQuery.tags, replace: true) } } diff --git a/Sora/Data/Booru/BooruSearchQuery.swift b/Sora/Data/Booru/BooruSearchQuery.swift index ddab4eb..b554fbf 100644 --- a/Sora/Data/Booru/BooruSearchQuery.swift +++ b/Sora/Data/Booru/BooruSearchQuery.swift @@ -1,8 +1,22 @@ import Foundation struct BooruSearchQuery: Codable, Equatable, Identifiable, Hashable { - var id = UUID() + var id: UUID let provider: BooruProvider let tags: [String] let searchedAt: Date + var page: Int + + init( + provider: BooruProvider, + tags: [String], + searchedAt: Date = Date(), + page: Int = 1 + ) { + self.id = UUID() + self.provider = provider + self.tags = tags + self.searchedAt = searchedAt + self.page = page + } } |