mirror of
https://github.com/neon443/StickerSlack.git
synced 2026-03-11 05:19:13 +00:00
ui updates
downloaded emojis is a grid rewrote deleteAllStickers added downloadEmoji
This commit is contained in:
@@ -9,6 +9,7 @@ import Foundation
|
||||
import SwiftUI
|
||||
import Combine
|
||||
import UniformTypeIdentifiers
|
||||
import Haptics
|
||||
|
||||
class EmojiHoarder: ObservableObject {
|
||||
static let container = FileManager.default.containerURL(forSecurityApplicationGroupIdentifier: "group.com.neon443.StickerSlack")!.appendingPathComponent("Library", conformingTo: .directory)
|
||||
@@ -45,17 +46,10 @@ class EmojiHoarder: ObservableObject {
|
||||
}
|
||||
}
|
||||
|
||||
func deleteAllStickers() async {
|
||||
await withTaskGroup { group in
|
||||
func deleteAllStickers() {
|
||||
for i in emojis.indices {
|
||||
group.addTask {
|
||||
guard await self.emojis[i].isLocal else { return }
|
||||
await self.emojis[i].deleteImage()
|
||||
DispatchQueue.main.sync {
|
||||
self.emojis[i].refresh()
|
||||
}
|
||||
}
|
||||
}
|
||||
guard downloadedEmojis.contains(emojis[i].name) else { continue }
|
||||
delete(emoji: emojis[i])
|
||||
}
|
||||
}
|
||||
|
||||
@@ -150,6 +144,25 @@ class EmojiHoarder: ObservableObject {
|
||||
withAnimation { filteredEmojis = trie.search(prefix: searchTerm) }
|
||||
}
|
||||
|
||||
func download(emoji: Emoji) {
|
||||
Task.detached {
|
||||
try? await emoji.downloadImage()
|
||||
await MainActor.run {
|
||||
self.downloadedEmojis.insert(emoji.name)
|
||||
self.trie.dict[emoji.name]?.refresh()
|
||||
Haptic.success.trigger()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@MainActor
|
||||
func delete(emoji: Emoji) {
|
||||
emoji.deleteImage()
|
||||
downloadedEmojis.remove(emoji.name)
|
||||
self.trie.dict[emoji.name]?.refresh()
|
||||
Haptic.heavy.trigger()
|
||||
}
|
||||
|
||||
// func filterEmojis(byCategory category: FilterCategory, searchTerm: String) {
|
||||
// guard category != .none else {
|
||||
// filterEmojis(by: searchTerm)
|
||||
|
||||
@@ -13,12 +13,14 @@ struct ContentView: View {
|
||||
|
||||
@State var searchTerm: String = ""
|
||||
|
||||
var col: GridItem = GridItem(.fixed(100), spacing: 0, alignment: .center)
|
||||
var body: some View {
|
||||
TabView {
|
||||
List {
|
||||
ForEach(hoarder.downloadedEmojis, id: \.self) { name in
|
||||
LazyHGrid(rows: Array(repeating: col, count: 4), spacing: 10) {
|
||||
ForEach(hoarder.downloadedEmojis.sorted(by: <), id: \.self) { name in
|
||||
if let emoji = hoarder.trie.dict[name] {
|
||||
EmojiRow(hoarder: hoarder, emoji: emoji)
|
||||
EmojiPreview(hoarder: hoarder, emoji: emoji)
|
||||
.aspectRatio(1, contentMode: .fit)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -16,8 +16,6 @@ struct EmojiPreview: View {
|
||||
@State private var delay: TimeInterval = 0
|
||||
|
||||
var body: some View {
|
||||
VStack(alignment: .leading) {
|
||||
Text(emoji.name)
|
||||
Group {
|
||||
if let image = emoji.image {
|
||||
Image(uiImage: image)
|
||||
@@ -54,7 +52,6 @@ struct EmojiPreview: View {
|
||||
}
|
||||
.id(id)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#Preview {
|
||||
|
||||
@@ -14,28 +14,26 @@ struct EmojiRow: View {
|
||||
|
||||
var body: some View {
|
||||
HStack {
|
||||
VStack {
|
||||
HStack(spacing: .zero) {
|
||||
// Text
|
||||
Text(emoji.name)
|
||||
}
|
||||
EmojiPreview(
|
||||
hoarder: hoarder,
|
||||
emoji: emoji
|
||||
)
|
||||
}
|
||||
.frame(maxWidth: 100, maxHeight: 100)
|
||||
Spacer()
|
||||
if hoarder.downloadedEmojis.contains(emoji.name) {
|
||||
Button("", systemImage: "trash") {
|
||||
emoji.deleteImage()
|
||||
emoji.refresh()
|
||||
Haptic.heavy.trigger()
|
||||
hoarder.delete(emoji: emoji)
|
||||
}
|
||||
.buttonStyle(.plain)
|
||||
} else {
|
||||
Button("", systemImage: "arrow.down.circle") {
|
||||
Task.detached {
|
||||
try? await emoji.downloadImage()
|
||||
await MainActor.run {
|
||||
emoji.refresh()
|
||||
Haptic.success.trigger()
|
||||
}
|
||||
}
|
||||
hoarder.download(emoji: emoji)
|
||||
}
|
||||
.buttonStyle(.plain)
|
||||
}
|
||||
|
||||
@@ -46,32 +46,25 @@ struct EmojiCollectionView: UIViewRepresentable {
|
||||
|
||||
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
|
||||
let emojiName = items[indexPath.row]
|
||||
let emoji = hoarder.trie.dict[emojiName]!
|
||||
let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath)
|
||||
|
||||
cell.contentConfiguration = UIHostingConfiguration {
|
||||
HStack {
|
||||
EmojiPreview(
|
||||
hoarder: hoarder,
|
||||
emoji: hoarder.trie.dict[emojiName]!
|
||||
emoji: emoji
|
||||
)
|
||||
.frame(maxWidth: 100, maxHeight: 100)
|
||||
Spacer()
|
||||
if hoarder.downloadedEmojis.contains(emojiName) {
|
||||
Button("", systemImage: "trash") {
|
||||
self.hoarder.trie.dict[emojiName]!.deleteImage()
|
||||
self.hoarder.trie.dict[emojiName]!.refresh()
|
||||
Haptic.heavy.trigger()
|
||||
fatalError()
|
||||
}
|
||||
.buttonStyle(.plain)
|
||||
} else {
|
||||
Button("", systemImage: "arrow.down.circle") {
|
||||
Task.detached {
|
||||
try? await self.hoarder.trie.dict[emojiName]!.downloadImage()
|
||||
await MainActor.run {
|
||||
self.hoarder.trie.dict[emojiName]!.refresh()
|
||||
Haptic.success.trigger()
|
||||
}
|
||||
}
|
||||
self.hoarder.download(emoji: emoji)
|
||||
}
|
||||
.buttonStyle(.plain)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user