diff --git a/StickerSlack/Emoji/Emoji.swift b/StickerSlack/Emoji/Emoji.swift index 0eaed48..45ce392 100644 --- a/StickerSlack/Emoji/Emoji.swift +++ b/StickerSlack/Emoji/Emoji.swift @@ -71,13 +71,14 @@ struct Emoji: Codable, Identifiable, Hashable { self.remoteImageURL = url } + nonisolated func downloadImage() async throws -> UIImage { - if let data = try? Data(contentsOf: localImageURL), + if let data = try? await Data(contentsOf: localImageURL), let uiimage = UIImage(data: data) { return uiimage } let (data, _) = try await URLSession.shared.data(from: remoteImageURL) - try! data.write(to: localImageURL) + try! await data.write(to: localImageURL) return UIImage(data: data)! } diff --git a/StickerSlack/EmojiHoarder.swift b/StickerSlack/EmojiHoarder.swift index 3094c64..50aafca 100644 --- a/StickerSlack/EmojiHoarder.swift +++ b/StickerSlack/EmojiHoarder.swift @@ -145,10 +145,24 @@ class EmojiHoarder: ObservableObject { } func downloadEmoji(_ toDownload: Emoji) { - + Task.detached { + if (try? await toDownload.downloadImage()) != nil { + let index = await self.emojis.firstIndex { $0 == toDownload } + guard let index else { return } + await MainActor.run { + self.localEmojis.insert(toDownload) + self.emojis[index].refresh() + } + } + } } + @MainActor func deleteEmoji(_ toDelete: Emoji) { - + toDelete.deleteImage() + let index = self.emojis.firstIndex { $0 == toDelete } + guard let index else { return } + self.localEmojis.remove(toDelete) + self.emojis[index].refresh() } } diff --git a/StickerSlack/Views/ContentView.swift b/StickerSlack/Views/ContentView.swift index 37e606a..739fbe7 100644 --- a/StickerSlack/Views/ContentView.swift +++ b/StickerSlack/Views/ContentView.swift @@ -66,16 +66,12 @@ struct ContentView: View { .buttonStyle(.plain) if hoarder.localEmojis.contains(emoji) { Button("", systemImage: "trash") { - emoji.deleteImage() - emoji.refresh() + hoarder.deleteEmoji(emoji) } .buttonStyle(.plain) } else { Button("", systemImage: "arrow.down.circle") { - Task { - let _ = try? await emoji.downloadImage() - emoji.refresh() - } + hoarder.downloadEmoji(emoji) } .buttonStyle(.plain) } @@ -83,8 +79,7 @@ struct ContentView: View { .swipeActions(edge: .trailing, allowsFullSwipe: true) { if hoarder.localEmojis.contains(emoji) { Button("Remove", systemImage: "trash") { - emoji.deleteImage() - emoji.refresh() + hoarder.deleteEmoji(emoji) } .tint(.red) }