mirror of
https://github.com/neon443/StickerSlack.git
synced 2026-03-11 13:26:17 +00:00
trying to otptimise shit 😭
trying to undo stuff from before
This commit is contained in:
@@ -71,6 +71,7 @@ struct Emoji: Codable, Identifiable, Hashable {
|
||||
self.remoteImageURL = url
|
||||
}
|
||||
|
||||
nonisolated
|
||||
func downloadImage() async throws {
|
||||
if let data = try? await Data(contentsOf: localImageURL),
|
||||
let uiimage = UIImage(data: data) {
|
||||
|
||||
@@ -16,8 +16,9 @@ class TrieNode: ObservableObject {
|
||||
|
||||
class Trie: ObservableObject {
|
||||
@Published var root: TrieNode = TrieNode()
|
||||
@Published var dict: [String:Emoji] = [:]
|
||||
|
||||
func insert(word: String) {
|
||||
func insert(word: String, emoji: Emoji) {
|
||||
let word = word.lowercased()
|
||||
var currentNode = root
|
||||
let indices = word.indices
|
||||
@@ -100,20 +101,12 @@ struct TrieTestingView: View {
|
||||
Button("add emojis!") {
|
||||
let start = Date().timeIntervalSince1970
|
||||
for emoji in hoarder.emojis {
|
||||
trie.insert(word: emoji.name)
|
||||
trie.insert(word: emoji.name, emoji: emoji)
|
||||
}
|
||||
print("done!", Date().timeIntervalSince1970-start)
|
||||
}
|
||||
.buttonStyle(.borderedProminent)
|
||||
|
||||
TextField("", text: $newWord)
|
||||
.textFieldStyle(.roundedBorder)
|
||||
.border(.red)
|
||||
Button("add word") {
|
||||
trie.insert(word: newWord)
|
||||
id = UUID()
|
||||
}
|
||||
|
||||
TextField("", text: $searchTerm)
|
||||
.textFieldStyle(.roundedBorder)
|
||||
.border(.orange)
|
||||
|
||||
@@ -20,7 +20,7 @@ class EmojiHoarder: ObservableObject {
|
||||
@Published var emojis: [Emoji] = []
|
||||
|
||||
@Published var trie: Trie = Trie()
|
||||
@Published var filteredEmojis: [Emoji] = []
|
||||
@Published var filteredEmojis: [String] = []
|
||||
|
||||
init(localOnly: Bool = false) {
|
||||
let localDB = loadLocalDB()
|
||||
@@ -67,12 +67,23 @@ class EmojiHoarder: ObservableObject {
|
||||
|
||||
func buildTrie() {
|
||||
let start = Date().timeIntervalSince1970
|
||||
trie.root = TrieNode()
|
||||
for emoji in emojis {
|
||||
trie.insert(word: emoji.name)
|
||||
trie.insert(word: emoji.name, emoji: emoji)
|
||||
}
|
||||
buildTrieDict()
|
||||
print("done building trie in", Date().timeIntervalSince1970-start)
|
||||
}
|
||||
|
||||
func buildTrieDict() {
|
||||
var dict: [String:Emoji] = [:]
|
||||
for emoji in emojis {
|
||||
dict[emoji.name] = emoji
|
||||
}
|
||||
self.filteredEmojis = dict.map { $0.key }
|
||||
self.trie.dict = dict
|
||||
}
|
||||
|
||||
nonisolated
|
||||
func loadLocalDB() -> [Emoji] {
|
||||
if let localEmojiDB = try? Data(contentsOf: EmojiHoarder.localEmojiDB) {
|
||||
@@ -110,18 +121,8 @@ class EmojiHoarder: ObservableObject {
|
||||
}
|
||||
}
|
||||
|
||||
// func filterEmojis(by searchTerm: String) {
|
||||
// filteredEmojis = trie.search(prefix: searchTerm)
|
||||
// }
|
||||
|
||||
func results(for query: String) -> [Emoji] {
|
||||
guard !query.isEmpty else {
|
||||
filteredEmojis = emojis
|
||||
return emojis
|
||||
}
|
||||
let names = Set(trie.search(prefix: query))
|
||||
filteredEmojis = emojis.filter { names.contains($0.name) }
|
||||
return filteredEmojis
|
||||
func filterEmojis(by searchTerm: String) {
|
||||
withAnimation { filteredEmojis = trie.search(prefix: searchTerm) }
|
||||
}
|
||||
|
||||
// func filterEmojis(byCategory category: FilterCategory, searchTerm: String) {
|
||||
|
||||
@@ -42,8 +42,8 @@ struct ContentView: View {
|
||||
|
||||
Text("\(hoarder.filteredEmojis.count) Emoji")
|
||||
|
||||
// if searchTerm.isEmpty {
|
||||
ForEach($hoarder.filteredEmojis, id: \.self) { $emoji in
|
||||
if searchTerm.isEmpty {
|
||||
ForEach($hoarder.emojis, id: \.self) { $emoji in
|
||||
HStack {
|
||||
EmojiPreview(
|
||||
hoarder: hoarder,
|
||||
@@ -70,16 +70,25 @@ struct ContentView: View {
|
||||
}
|
||||
}
|
||||
}
|
||||
// } else {
|
||||
// ForEach(hoarder.filteredEmojis, id: \.self) { name in
|
||||
// Text(name)
|
||||
// }
|
||||
// }
|
||||
} else {
|
||||
ForEach(hoarder.filteredEmojis, id: \.self) { name in
|
||||
if let emoji = hoarder.trie.dict[name] {
|
||||
EmojiPreview(hoarder: hoarder, emoji: emoji)
|
||||
.onTapGesture {
|
||||
Task.detached {
|
||||
try? await hoarder.trie.dict[name]!.downloadImage()
|
||||
await MainActor.run {
|
||||
hoarder.trie.dict[name]!.refresh()
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
.navigationTitle("StickerSlack")
|
||||
.onChange(of: searchTerm) { _ in
|
||||
// hoarder.filterEmojis(by: searchTerm)
|
||||
hoarder.results(for: searchTerm)
|
||||
hoarder.filterEmojis(by: searchTerm)
|
||||
}
|
||||
.refreshable {
|
||||
Task.detached {
|
||||
|
||||
Reference in New Issue
Block a user