remove AsyncLoadingImage struct

This commit is contained in:
Satindar Dhillon 2022-08-25 21:45:33 -07:00
parent 357ed7a8ec
commit b70a8a8585
2 changed files with 6 additions and 85 deletions

View file

@ -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

View file

@ -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<Content: View>: 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")
}
}