redid ui with tabs

added downloadedEmojis
make sure stuff is rebuilt on refresh
This commit is contained in:
neon443
2025-11-04 10:43:23 +00:00
parent 44b24dd615
commit 63a979d796
2 changed files with 61 additions and 24 deletions

View File

@@ -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()
}
}

View File

@@ -14,27 +14,36 @@ 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
EmojiRow(hoarder: hoarder, emoji: emoji)
}
} else {
ForEach(hoarder.filteredEmojis, id: \.self) { name in
ForEach(hoarder.downloadedEmojis, id: \.self) { name in
if let emoji = hoarder.trie.dict[name] {
EmojiRow(hoarder: hoarder, emoji: emoji)
}
}
}
.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
@@ -47,6 +56,17 @@ struct ContentView: View {
searchTerm = ""
}
}
.tabItem {
Label("Search", systemImage: "magnifyingglass")
}
TrieTestingView(
hoarder: hoarder,
)
.tabItem {
Label("Tree", systemImage: "tree.fill")
}
}
.searchable(text: $searchTerm, placement: .automatic)
}
}