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
|
self.remoteImageURL = url
|
||||||
}
|
}
|
||||||
|
|
||||||
|
nonisolated
|
||||||
func downloadImage() async throws {
|
func downloadImage() async throws {
|
||||||
if let data = try? await Data(contentsOf: localImageURL),
|
if let data = try? await Data(contentsOf: localImageURL),
|
||||||
let uiimage = UIImage(data: data) {
|
let uiimage = UIImage(data: data) {
|
||||||
|
|||||||
@@ -16,8 +16,9 @@ class TrieNode: ObservableObject {
|
|||||||
|
|
||||||
class Trie: ObservableObject {
|
class Trie: ObservableObject {
|
||||||
@Published var root: TrieNode = TrieNode()
|
@Published var root: TrieNode = TrieNode()
|
||||||
|
@Published var dict: [String:Emoji] = [:]
|
||||||
|
|
||||||
func insert(word: String) {
|
func insert(word: String, emoji: Emoji) {
|
||||||
let word = word.lowercased()
|
let word = word.lowercased()
|
||||||
var currentNode = root
|
var currentNode = root
|
||||||
let indices = word.indices
|
let indices = word.indices
|
||||||
@@ -100,20 +101,12 @@ struct TrieTestingView: View {
|
|||||||
Button("add emojis!") {
|
Button("add emojis!") {
|
||||||
let start = Date().timeIntervalSince1970
|
let start = Date().timeIntervalSince1970
|
||||||
for emoji in hoarder.emojis {
|
for emoji in hoarder.emojis {
|
||||||
trie.insert(word: emoji.name)
|
trie.insert(word: emoji.name, emoji: emoji)
|
||||||
}
|
}
|
||||||
print("done!", Date().timeIntervalSince1970-start)
|
print("done!", Date().timeIntervalSince1970-start)
|
||||||
}
|
}
|
||||||
.buttonStyle(.borderedProminent)
|
.buttonStyle(.borderedProminent)
|
||||||
|
|
||||||
TextField("", text: $newWord)
|
|
||||||
.textFieldStyle(.roundedBorder)
|
|
||||||
.border(.red)
|
|
||||||
Button("add word") {
|
|
||||||
trie.insert(word: newWord)
|
|
||||||
id = UUID()
|
|
||||||
}
|
|
||||||
|
|
||||||
TextField("", text: $searchTerm)
|
TextField("", text: $searchTerm)
|
||||||
.textFieldStyle(.roundedBorder)
|
.textFieldStyle(.roundedBorder)
|
||||||
.border(.orange)
|
.border(.orange)
|
||||||
|
|||||||
@@ -20,7 +20,7 @@ class EmojiHoarder: ObservableObject {
|
|||||||
@Published var emojis: [Emoji] = []
|
@Published var emojis: [Emoji] = []
|
||||||
|
|
||||||
@Published var trie: Trie = Trie()
|
@Published var trie: Trie = Trie()
|
||||||
@Published var filteredEmojis: [Emoji] = []
|
@Published var filteredEmojis: [String] = []
|
||||||
|
|
||||||
init(localOnly: Bool = false) {
|
init(localOnly: Bool = false) {
|
||||||
let localDB = loadLocalDB()
|
let localDB = loadLocalDB()
|
||||||
@@ -67,12 +67,23 @@ class EmojiHoarder: ObservableObject {
|
|||||||
|
|
||||||
func buildTrie() {
|
func buildTrie() {
|
||||||
let start = Date().timeIntervalSince1970
|
let start = Date().timeIntervalSince1970
|
||||||
|
trie.root = TrieNode()
|
||||||
for emoji in emojis {
|
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)
|
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
|
nonisolated
|
||||||
func loadLocalDB() -> [Emoji] {
|
func loadLocalDB() -> [Emoji] {
|
||||||
if let localEmojiDB = try? Data(contentsOf: EmojiHoarder.localEmojiDB) {
|
if let localEmojiDB = try? Data(contentsOf: EmojiHoarder.localEmojiDB) {
|
||||||
@@ -110,18 +121,8 @@ class EmojiHoarder: ObservableObject {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// func filterEmojis(by searchTerm: String) {
|
func filterEmojis(by searchTerm: String) {
|
||||||
// filteredEmojis = trie.search(prefix: searchTerm)
|
withAnimation { 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(byCategory category: FilterCategory, searchTerm: String) {
|
// func filterEmojis(byCategory category: FilterCategory, searchTerm: String) {
|
||||||
|
|||||||
@@ -42,8 +42,8 @@ struct ContentView: View {
|
|||||||
|
|
||||||
Text("\(hoarder.filteredEmojis.count) Emoji")
|
Text("\(hoarder.filteredEmojis.count) Emoji")
|
||||||
|
|
||||||
// if searchTerm.isEmpty {
|
if searchTerm.isEmpty {
|
||||||
ForEach($hoarder.filteredEmojis, id: \.self) { $emoji in
|
ForEach($hoarder.emojis, id: \.self) { $emoji in
|
||||||
HStack {
|
HStack {
|
||||||
EmojiPreview(
|
EmojiPreview(
|
||||||
hoarder: hoarder,
|
hoarder: hoarder,
|
||||||
@@ -70,16 +70,25 @@ struct ContentView: View {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// } else {
|
} else {
|
||||||
// ForEach(hoarder.filteredEmojis, id: \.self) { name in
|
ForEach(hoarder.filteredEmojis, id: \.self) { name in
|
||||||
// Text(name)
|
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")
|
.navigationTitle("StickerSlack")
|
||||||
.onChange(of: searchTerm) { _ in
|
.onChange(of: searchTerm) { _ in
|
||||||
// hoarder.filterEmojis(by: searchTerm)
|
hoarder.filterEmojis(by: searchTerm)
|
||||||
hoarder.results(for: searchTerm)
|
|
||||||
}
|
}
|
||||||
.refreshable {
|
.refreshable {
|
||||||
Task.detached {
|
Task.detached {
|
||||||
|
|||||||
Reference in New Issue
Block a user