fix uh building the tree like 5 times too many

This commit is contained in:
neon443
2025-11-11 20:29:12 +00:00
parent 97a8515ba7
commit 336dd16744
10 changed files with 33 additions and 31 deletions

View File

@@ -12,7 +12,6 @@ import UniformTypeIdentifiers
import Haptics import Haptics
class EmojiHoarder: ObservableObject { class EmojiHoarder: ObservableObject {
static let shared: EmojiHoarder = EmojiHoarder()
static let container = FileManager.default.containerURL(forSecurityApplicationGroupIdentifier: "group.com.neon443.StickerSlack")!.appendingPathComponent("Library", conformingTo: .directory) static let container = FileManager.default.containerURL(forSecurityApplicationGroupIdentifier: "group.com.neon443.StickerSlack")!.appendingPathComponent("Library", conformingTo: .directory)
nonisolated static let localEmojiDB: URL = EmojiHoarder.container.appendingPathComponent("_localEmojiDB.json", conformingTo: .fileURL) nonisolated static let localEmojiDB: URL = EmojiHoarder.container.appendingPathComponent("_localEmojiDB.json", conformingTo: .fileURL)
private let endpoint: URL = URL(string: "https://cachet.dunkirk.sh/emojis")! private let endpoint: URL = URL(string: "https://cachet.dunkirk.sh/emojis")!
@@ -37,7 +36,9 @@ class EmojiHoarder: ObservableObject {
print("start loading remote db") print("start loading remote db")
await self.loadRemoteDB() await self.loadRemoteDB()
print("end") print("end")
if !skipIndex { await self.buildTrie() } if !skipIndex {
await self.buildTrie()
}
} }
} }
@@ -74,7 +75,7 @@ class EmojiHoarder: ObservableObject {
let start = Date().timeIntervalSince1970 let start = Date().timeIntervalSince1970
trie.root = TrieNode() trie.root = TrieNode()
for emoji in emojis { for emoji in emojis {
trie.insert(word: emoji.name, emoji: emoji) trie.insert(word: emoji.name)
} }
buildTrieDict() buildTrieDict()
print("done building trie in", Date().timeIntervalSince1970-start) print("done building trie in", Date().timeIntervalSince1970-start)

View File

@@ -8,17 +8,17 @@
import SwiftUI import SwiftUI
struct BrowseView: View { struct BrowseView: View {
@ObservedObject var hoarder: EmojiHoarder = .shared @ObservedObject var hoarder: EmojiHoarder
var body: some View { var body: some View {
List { List {
ForEach(hoarder.emojis, id: \.self) { emoji in ForEach(hoarder.emojis, id: \.self) { emoji in
EmojiRow(emoji: emoji) EmojiRow(hoarder: hoarder, emoji: emoji)
} }
} }
} }
} }
#Preview { #Preview {
BrowseView() BrowseView(hoarder: EmojiHoarder(localOnly: true))
} }

View File

@@ -9,14 +9,14 @@ import SwiftUI
import Haptics import Haptics
struct ContentView: View { struct ContentView: View {
@StateObject var hoarder: EmojiHoarder = .shared @ObservedObject var hoarder: EmojiHoarder = EmojiHoarder()
var body: some View { var body: some View {
NavigationSplitView { NavigationSplitView {
if #available(iOS 18, *) { if #available(iOS 18, *) {
TabView { TabView {
Tab("Browse", systemImage: "square.grid.2x2.fill") { Tab("Browse", systemImage: "square.grid.2x2.fill") {
BrowseView() BrowseView(hoarder: hoarder)
} }
// Tab { // Tab {
@@ -43,16 +43,16 @@ struct ContentView: View {
// } // }
Tab("Downloaded", systemImage: "arrow.down.circle.fill") { Tab("Downloaded", systemImage: "arrow.down.circle.fill") {
DownloadedView() DownloadedView(hoarder: hoarder)
} }
Tab("Tree", systemImage: "tree.fill") { Tab("Tree", systemImage: "tree.fill") {
TrieTestingView() TrieTestingView(hoarder: hoarder)
} }
Tab("Search", systemImage: "magnifyingglass", role: .search) { Tab("Search", systemImage: "magnifyingglass", role: .search) {
NavigationStack { NavigationStack {
SearchView() SearchView(hoarder: hoarder)
} }
} }
} }
@@ -61,19 +61,19 @@ struct ContentView: View {
// .modifier(tabViewActivationSearchActivation()) // .modifier(tabViewActivationSearchActivation())
} else { } else {
TabView { TabView {
DownloadedView() DownloadedView(hoarder: hoarder)
.tabItem { .tabItem {
Label("Downloaded", systemImage: "arrow.down.circle.fill") Label("Downloaded", systemImage: "arrow.down.circle.fill")
} }
BrowseView() BrowseView(hoarder: hoarder)
.tabItem { .tabItem {
Label("Browse", systemImage: "square.grid.2x2.fill") Label("Browse", systemImage: "square.grid.2x2.fill")
} }
TrieTestingView() TrieTestingView(hoarder: hoarder)
.tabItem { .tabItem {
Label("Trie", systemImage: "tree.fill") Label("Trie", systemImage: "tree.fill")
} }
SearchView() SearchView(hoarder: hoarder)
.tabItem { .tabItem {
Label("Search", systemImage: "magnifyingglass") Label("Search", systemImage: "magnifyingglass")
} }

View File

@@ -8,7 +8,7 @@
import SwiftUI import SwiftUI
struct DownloadedView: View { struct DownloadedView: View {
@ObservedObject var hoarder: EmojiHoarder = .shared @ObservedObject var hoarder: EmojiHoarder
@Environment(\.colorScheme) var colorScheme @Environment(\.colorScheme) var colorScheme
var isDark: Bool { colorScheme == .dark } var isDark: Bool { colorScheme == .dark }
@@ -33,7 +33,7 @@ struct DownloadedView: View {
ZStack { ZStack {
Rectangle() Rectangle()
.foregroundStyle(isDark ? .black : .white) .foregroundStyle(isDark ? .black : .white)
EmojiPreview(emoji: emoji) EmojiPreview(hoarder: hoarder, emoji: emoji)
RoundedRectangle(cornerRadius: 15) RoundedRectangle(cornerRadius: 15)
.stroke(.gray, lineWidth: 1) .stroke(.gray, lineWidth: 1)
} }
@@ -63,5 +63,5 @@ struct DownloadedView: View {
} }
#Preview { #Preview {
DownloadedView() DownloadedView(hoarder: EmojiHoarder(localOnly: true))
} }

View File

@@ -9,7 +9,7 @@ import SwiftUI
import Haptics import Haptics
struct EmojiPreview: View { struct EmojiPreview: View {
@ObservedObject var hoarder: EmojiHoarder = .shared @ObservedObject var hoarder: EmojiHoarder
@State var emoji: Emoji @State var emoji: Emoji
@State private var id: UUID = UUID() @State private var id: UUID = UUID()

View File

@@ -9,7 +9,7 @@ import SwiftUI
import Haptics import Haptics
struct EmojiRow: View { struct EmojiRow: View {
@ObservedObject var hoarder: EmojiHoarder = .shared @ObservedObject var hoarder: EmojiHoarder
@State var emoji: Emoji @State var emoji: Emoji
var body: some View { var body: some View {
@@ -19,7 +19,7 @@ struct EmojiRow: View {
// Text // Text
Text(emoji.name) Text(emoji.name)
} }
EmojiPreview(emoji: emoji) EmojiPreview(hoarder: hoarder, emoji: emoji)
} }
.frame(maxWidth: 100, maxHeight: 100) .frame(maxWidth: 100, maxHeight: 100)

View File

@@ -8,7 +8,7 @@
import SwiftUI import SwiftUI
struct SearchView: View { struct SearchView: View {
@ObservedObject var hoarder: EmojiHoarder = .shared @ObservedObject var hoarder: EmojiHoarder
var body: some View { var body: some View {
List { List {
@@ -16,7 +16,7 @@ struct SearchView: View {
ForEach(hoarder.filteredEmojis, id: \.self) { name in ForEach(hoarder.filteredEmojis, id: \.self) { name in
if let emoji = hoarder.trie.dict[name] { if let emoji = hoarder.trie.dict[name] {
EmojiRow(emoji: emoji) EmojiRow(hoarder: hoarder, emoji: emoji)
} }
} }
} }
@@ -27,5 +27,5 @@ struct SearchView: View {
} }
#Preview { #Preview {
SearchView() SearchView(hoarder: EmojiHoarder(localOnly: true))
} }

View File

@@ -18,7 +18,7 @@ class Trie: ObservableObject {
@Published var root: TrieNode = TrieNode() @Published var root: TrieNode = TrieNode()
@Published var dict: [String:Emoji] = [:] @Published var dict: [String:Emoji] = [:]
func insert(word: String, emoji: Emoji) { func insert(word: String) {
let word = word.lowercased() let word = word.lowercased()
var currentNode = root var currentNode = root
let indices = word.indices let indices = word.indices

View File

@@ -64,11 +64,11 @@ struct TrieTestingView: View {
} }
if uikit { if uikit {
EmojiCollectionView(items: filterResult) EmojiCollectionView(hoarder: hoarder, items: filterResult)
.id(filterResult) .id(filterResult)
} else { } else {
List(filterResult, id: \.self) { item in List(filterResult, id: \.self) { item in
EmojiRow(emoji: hoarder.trie.dict[item]!) EmojiRow(hoarder: hoarder, emoji: hoarder.trie.dict[item]!)
} }
} }

View File

@@ -11,7 +11,7 @@ import SwiftUI
import Haptics import Haptics
struct EmojiCollectionView: UIViewRepresentable { struct EmojiCollectionView: UIViewRepresentable {
let hoarder: EmojiHoarder = .shared let hoarder: EmojiHoarder
let items: [String] let items: [String]
func makeUIView(context: Context) -> UITableView { func makeUIView(context: Context) -> UITableView {
@@ -28,14 +28,15 @@ struct EmojiCollectionView: UIViewRepresentable {
} }
func makeCoordinator() -> Coordinator { func makeCoordinator() -> Coordinator {
Coordinator(items: items) Coordinator(hoarder: hoarder, items: items)
} }
final class Coordinator: NSObject, UITableViewDataSource { final class Coordinator: NSObject, UITableViewDataSource {
var hoarder: EmojiHoarder = .shared var hoarder: EmojiHoarder
var items: [String] var items: [String]
init(items: [String]) { init(hoarder: EmojiHoarder, items: [String]) {
self.hoarder = hoarder
self.items = items self.items = items
} }