mirror of
https://github.com/omnivore-app/omnivore.git
synced 2026-03-11 08:54:26 +00:00
remove AsyncLoadingImage struct
This commit is contained in:
parent
357ed7a8ec
commit
b70a8a8585
2 changed files with 6 additions and 85 deletions
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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")
|
||||
}
|
||||
}
|
||||
Loading…
Reference in a new issue