diff --git a/apple/OmnivoreKit/Sources/App/AppExtensions/Share/Views/ShareExtensionView.swift b/apple/OmnivoreKit/Sources/App/AppExtensions/Share/Views/ShareExtensionView.swift index ecba3393b..b7b7d39f0 100644 --- a/apple/OmnivoreKit/Sources/App/AppExtensions/Share/Views/ShareExtensionView.swift +++ b/apple/OmnivoreKit/Sources/App/AppExtensions/Share/Views/ShareExtensionView.swift @@ -73,19 +73,21 @@ public struct ShareExtensionView: View { HStack { if let iconURLStr = viewModel.iconURL, let iconURL = URL(string: iconURLStr) { if !iconURL.isFileURL { - AsyncLoadingImage(url: iconURL) { imageStatus in - if case let AsyncImageStatus.loaded(image) = imageStatus { + AsyncImage( + url: iconURL, + content: { image in image .resizable() .aspectRatio(contentMode: .fill) .frame(width: 61, height: 61) .clipped() - } else { + }, + placeholder: { Color.appButtonBackground .aspectRatio(contentMode: .fill) .frame(width: 61, height: 61) } - } + ) } else { if let localImage = localImage(from: iconURL) { localImage diff --git a/apple/OmnivoreKit/Sources/Views/AsyncLoadingImage.swift b/apple/OmnivoreKit/Sources/Views/AsyncLoadingImage.swift deleted file mode 100644 index b25e732aa..000000000 --- a/apple/OmnivoreKit/Sources/Views/AsyncLoadingImage.swift +++ /dev/null @@ -1,81 +0,0 @@ -import Foundation -import Models -import SwiftUI -import Utils - -public enum AsyncImageStatus { - case loading - case loaded(image: Image) - case error -} - -public struct AsyncLoadingImage: View { - let viewBuilder: (AsyncImageStatus) -> Content - let url: URL - @StateObject private var imageLoader = ImageLoader() - - public init(url: URL, @ViewBuilder viewBuilder: @escaping (AsyncImageStatus) -> Content) { - self.url = url - self.viewBuilder = viewBuilder - } - - public var body: some View { - viewBuilder(imageLoader.status) - .task { await imageLoader.load(fromUrl: url) } - } -} - -@MainActor private final class ImageLoader: ObservableObject { - @Published var status: AsyncImageStatus = .loading - var loadStarted = false - - func load(fromUrl url: URL) async { - guard !loadStarted else { return } - loadStarted = true - - if let cachedImage = ImageCache.shared[url] { - #if os(iOS) - status = .loaded(image: Image(uiImage: cachedImage)) - #else - status = .loaded(image: Image(nsImage: cachedImage)) - #endif - return - } - - if let imageData = try? await fetchImageData(url: url) { - #if os(iOS) - let fetchedImage = UIImage(data: imageData) - #else - let fetchedImage = NSImage(data: imageData) - #endif - - guard let fetchedImage = fetchedImage else { - status = .error - return - } - ImageCache.shared[url] = fetchedImage - - #if os(iOS) - status = .loaded(image: Image(uiImage: fetchedImage)) - #else - status = .loaded(image: Image(nsImage: fetchedImage)) - #endif - } else { - status = .error - } - } -} - -private func fetchImageData(url: URL) async throws -> Data { - do { - let (data, response) = try await URLSession.shared.data(from: url) - - if let httpResponse = response as? HTTPURLResponse, 200 ..< 300 ~= httpResponse.statusCode { - return data - } else { - throw BasicError.message(messageText: "failed") - } - } catch { - throw BasicError.message(messageText: "failed") - } -}