From 63a979d796bf36d8cdbbf8d4fd31c6886a6ec2b0 Mon Sep 17 00:00:00 2001 From: neon443 <69979447+neon443@users.noreply.github.com> Date: Tue, 4 Nov 2025 10:43:23 +0000 Subject: [PATCH] redid ui with tabs added downloadedEmojis make sure stuff is rebuilt on refresh --- StickerSlack/EmojiHoarder.swift | 23 +++++++++-- StickerSlack/Views/ContentView.swift | 62 ++++++++++++++++++---------- 2 files changed, 61 insertions(+), 24 deletions(-) diff --git a/StickerSlack/EmojiHoarder.swift b/StickerSlack/EmojiHoarder.swift index 2e92859..d726ed3 100644 --- a/StickerSlack/EmojiHoarder.swift +++ b/StickerSlack/EmojiHoarder.swift @@ -21,6 +21,7 @@ class EmojiHoarder: ObservableObject { @Published var trie: Trie = Trie() @Published var filteredEmojis: [String] = [] + @Published var downloadedEmojis: [String] = [] @Published var searchTerm: String = "" init(localOnly: Bool = false) { @@ -81,8 +82,16 @@ class EmojiHoarder: ObservableObject { for emoji in emojis { dict[emoji.name] = emoji } - self.filteredEmojis = dict.map { $0.key } self.trie.dict = dict + buildDownloadedEmojis() + } + + func buildDownloadedEmojis() { + downloadedEmojis = [] + for emoji in emojis { + guard emoji.isLocal else { continue } + downloadedEmojis.append(emoji.name) + } } nonisolated @@ -116,9 +125,17 @@ class EmojiHoarder: ObservableObject { } func refreshDB() async { - guard let fetched = await self.fetchRemoteDB() else { return } - DispatchQueue.main.async { + guard let fetched = await self.fetchRemoteDB() else { + let local = loadLocalDB() + await MainActor.run { + emojis = local + buildTrie() + } + return + } + await MainActor.run { withAnimation { self.emojis = fetched } + buildTrie() } } diff --git a/StickerSlack/Views/ContentView.swift b/StickerSlack/Views/ContentView.swift index 812b3cb..91a31c7 100644 --- a/StickerSlack/Views/ContentView.swift +++ b/StickerSlack/Views/ContentView.swift @@ -14,37 +14,57 @@ struct ContentView: View { @State var searchTerm: String = "" var body: some View { - NavigationView { + TabView { List { - NavigationLink("trieTester") { - TrieTestingView( - hoarder: hoarder, - ) - } - - Text("\(searchTerm.isEmpty ? hoarder.emojis.count : hoarder.filteredEmojis.count) Emoji") - - if searchTerm.isEmpty { - ForEach($hoarder.emojis, id: \.self) { $emoji in + ForEach(hoarder.downloadedEmojis, id: \.self) { name in + if let emoji = hoarder.trie.dict[name] { EmojiRow(hoarder: hoarder, emoji: emoji) } - } else { + } + } + .tabItem { + Label("Downloaded", systemImage: "arrow.down.circle.fill") + } + + List { + ForEach(hoarder.emojis, id: \.self) { emoji in + EmojiRow(hoarder: hoarder, emoji: emoji) + } + } + .tabItem { + Label("Browse", systemImage: "square.grid.2x2.fill") + } + + NavigationView { + List { + Text("\(searchTerm.isEmpty ? hoarder.emojis.count : hoarder.filteredEmojis.count) Emoji") + ForEach(hoarder.filteredEmojis, id: \.self) { name in if let emoji = hoarder.trie.dict[name] { EmojiRow(hoarder: hoarder, emoji: emoji) } } } - } - .navigationTitle("StickerSlack") - .onChange(of: searchTerm) { _ in - hoarder.filterEmojis(by: searchTerm) - } - .refreshable { - Task.detached { - await hoarder.refreshDB() + .navigationTitle("StickerSlack") + .onChange(of: searchTerm) { _ in + hoarder.filterEmojis(by: searchTerm) } - searchTerm = "" + .refreshable { + Task.detached { + await hoarder.refreshDB() + } + searchTerm = "" + } + } + .tabItem { + Label("Search", systemImage: "magnifyingglass") + } + + TrieTestingView( + hoarder: hoarder, + ) + .tabItem { + Label("Tree", systemImage: "tree.fill") } } .searchable(text: $searchTerm, placement: .automatic)