added a callback to refreshDB cos async returns instantly

- fixes the search not applying after a refresh sometimes
added animations to searching and stuff
remove setPrefix
This commit is contained in:
neon443
2025-10-29 18:56:57 +00:00
parent e45d8417d1
commit a102edbd4e
3 changed files with 17 additions and 17 deletions

View File

@@ -7,6 +7,7 @@
import Foundation import Foundation
import UIKit import UIKit
import SwiftUI
import UniformTypeIdentifiers import UniformTypeIdentifiers
struct Emoji: Codable, Identifiable, Hashable { struct Emoji: Codable, Identifiable, Hashable {
@@ -71,6 +72,6 @@ struct Emoji: Codable, Identifiable, Hashable {
} }
mutating func refresh() { mutating func refresh() {
self.uiID = UUID() withAnimation { self.uiID = UUID() }
} }
} }

View File

@@ -22,13 +22,13 @@ class EmojiHoarder: ObservableObject {
@Published var prefix: Int = 100 @Published var prefix: Int = 100
init() { init() {
self.emojis = loadLocalDB() withAnimation { self.emojis = loadLocalDB() }
self.filteredEmojis = self.emojis withAnimation { self.filteredEmojis = self.emojis }
Task(priority: .high) { Task(priority: .high) {
if let fetched = await self.fetchRemoteDB() { if let fetched = await self.fetchRemoteDB() {
self.emojis = fetched withAnimation { self.emojis = fetched }
self.filteredEmojis = fetched withAnimation { self.filteredEmojis = fetched }
} }
} }
} }
@@ -68,28 +68,26 @@ class EmojiHoarder: ObservableObject {
} }
} }
func refreshDB() { func refreshDB(withCallback callback: (() -> Void)? = nil) {
Task { Task {
guard let fetched = try? await fetchRemoteDB() else { return } guard let fetched = try? await fetchRemoteDB() else { return }
self.emojis = fetched withAnimation { self.emojis = fetched }
self.filteredEmojis = fetched withAnimation { self.filteredEmojis = fetched }
if let callback {
callback()
}
} }
} }
func setPrefix(to: Int) {
filterEmojis(by: "")
filteredEmojis = Array(filteredEmojis.prefix(prefix))
}
func filterEmojis(by searchTerm: String) { func filterEmojis(by searchTerm: String) {
guard !searchTerm.isEmpty else { guard !searchTerm.isEmpty else {
self.filteredEmojis = emojis withAnimation(.interactiveSpring) { self.filteredEmojis = emojis }
return return
} }
Task { Task {
let filtered = emojis.filter { $0.name.localizedCaseInsensitiveContains(searchTerm) } let filtered = emojis.filter { $0.name.localizedCaseInsensitiveContains(searchTerm) }
DispatchQueue.main.async { DispatchQueue.main.async {
self.filteredEmojis = filtered withAnimation(.interactiveSpring) { self.filteredEmojis = filtered }
} }
} }
} }

View File

@@ -60,8 +60,9 @@ struct ContentView: View {
} }
} }
.refreshable { .refreshable {
hoarder.refreshDB() hoarder.refreshDB() {
searchTerm = "" hoarder.filterEmojis(by: searchTerm)
}
} }
.searchable(text: $searchTerm) .searchable(text: $searchTerm)
.tabItem { .tabItem {