mirror of
https://github.com/neon443/StickerSlack.git
synced 2026-03-11 05:19:13 +00:00
redid ui with tabs
added downloadedEmojis make sure stuff is rebuilt on refresh
This commit is contained in:
@@ -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()
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user