import SwiftUI import UIKit import SwiftData /// Wie `AsyncImage`, aber offline-fähig: zeigt zuerst ein lokal gecachtes Bild /// (CachedImage in SwiftData); fehlt es, wird es remote geladen und dabei gleich /// in den Offline-Cache geschrieben. `path` ist der relative Medienpfad /// (z. B. "/media/routes/x.jpg"), die Basis-URL hängt OfflineCache an. struct CachedAsyncImage: View { private let path: String? private let content: (Image) -> Content private let placeholder: () -> Placeholder @Environment(\.modelContext) private var ctx @State private var uiImage: UIImage? init( path: String?, @ViewBuilder content: @escaping (Image) -> Content, @ViewBuilder placeholder: @escaping () -> Placeholder ) { self.path = path self.content = content self.placeholder = placeholder } var body: some View { Group { if let uiImage { content(Image(uiImage: uiImage)) } else { placeholder() } } .task(id: path) { await load() } } private func load() async { uiImage = nil guard let path, !path.isEmpty else { return } if let data = OfflineCache.imageData(path: path, in: ctx), let img = UIImage(data: data) { uiImage = img return } guard let url = URL(string: OfflineCache.mediaBase + path) else { return } if let (data, _) = try? await URLSession.shared.data(from: url), let img = UIImage(data: data) { uiImage = img OfflineCache.storeImage(path: path, data: data, in: ctx) } } }