yay okay ui is state-ing

added swipe actions to delete local image
slow, but i think i can fix it??
switch to gh neon443/Haptics
This commit is contained in:
neon443
2025-10-24 00:01:14 +02:00
parent bc0b46a6df
commit 2ddcd49ad0
4 changed files with 45 additions and 13 deletions

View File

@@ -0,0 +1,15 @@
{
"originHash" : "62caf5d3b5c5f962753f0e93862d5d90e6fcd2157c5fef072880f7c4ca348c7c",
"pins" : [
{
"identity" : "haptics",
"kind" : "remoteSourceControl",
"location" : "http://github.com/neon443/Haptics",
"state" : {
"branch" : "main",
"revision" : "90e080694752c1af657d2f7ac2dce22eaf439391"
}
}
],
"version" : 3
}

View File

@@ -8,9 +8,11 @@
import Foundation
import UIKit
import UniformTypeIdentifiers
import Haptics
struct Emoji: Codable, Identifiable, Hashable {
var id: UUID
var uiID: UUID
var name: String
var localImageURL: URL
var remoteImageURL: URL
@@ -31,6 +33,7 @@ struct Emoji: Codable, Identifiable, Hashable {
init(from decoder: any Decoder) throws {
let container = try decoder.container(keyedBy: CodingKeys.self)
self.id = try container.decode(UUID.self, forKey: .id)
self.uiID = UUID()
self.name = try container.decode(String.self, forKey: .name)
self.localImageURL = try container.decode(URL.self, forKey: .localImageURL)
self.remoteImageURL = try container.decode(URL.self, forKey: .remoteImageURL)
@@ -48,9 +51,12 @@ struct Emoji: Codable, Identifiable, Hashable {
id: UUID = UUID()
) {
self.id = id
self.uiID = id
self.name = apiEmoji.name
self.remoteImageURL = apiEmoji.url
self.localImageURL = EmojiHoarder.container.appendingPathComponent(id.uuidString, conformingTo: .image)
let fileExtension = String(apiEmoji.urlString.split(separator: ".").last ?? "png")
self.localImageURL = EmojiHoarder.container.appendingPathComponent(id.uuidString+"."+fileExtension, conformingTo: .image)
// Task { [weak self] in
// let (data, response) = try await URLSession.shared.data(from: apiEmoji.url)
@@ -70,4 +76,12 @@ struct Emoji: Codable, Identifiable, Hashable {
try! data.write(to: localImageURL)
return UIImage(data: data)!
}
func deleteImage() {
try? FileManager.default.removeItem(at: localImageURL)
}
mutating func refresh() {
self.uiID = UUID()
}
}

View File

@@ -15,20 +15,29 @@ struct ContentView: View {
NavigationView {
TabView {
List {
ForEach(hoarder.emojis, id: \.self) { emoji in
ForEach($hoarder.emojis, id: \.self) { $emoji in
HStack {
EmojiPreview(emoji: emoji)
EmojiPreview(emoji: emoji, image: emoji.image)
.frame(maxWidth: 100)
Spacer()
Button("", systemImage: "arrow.down.circle") {
Task {
let _ = try? await emoji.downloadImage()
Haptic.success.trigger()
try? await emoji.downloadImage()
emoji.refresh()
}
}
.buttonStyle(.plain)
}
.border(emoji.isLocal ? .red : .clear)
.id(emoji.uiID)
.swipeActions(edge: .trailing, allowsFullSwipe: true) {
if emoji.isLocal {
Button("Remove", systemImage: "trash") {
emoji.deleteImage()
emoji.refresh()
}
.tint(.red)
}
}
}
}
.tabItem {

View File

@@ -12,7 +12,7 @@ struct EmojiPreview: View {
@State var emoji: Emoji
@State private var id: UUID = UUID()
@State private var image: UIImage?
@State var image: UIImage? = nil
var body: some View {
VStack {
@@ -51,12 +51,6 @@ struct EmojiPreview: View {
}
}
}
.onTapGesture {
Task {
image = try? await emoji.downloadImage()
Haptic.success.trigger()
}
}
.id(id)
}
}