mirror of
https://github.com/Novaloop-AG/element-x-ios.git
synced 2026-11-03 16:10:20 +00:00
@@ -53,9 +53,6 @@ struct LoadableAvatarImage: View {
|
|||||||
} placeholder: {
|
} placeholder: {
|
||||||
PlaceholderAvatarImage(name: name, contentID: contentID)
|
PlaceholderAvatarImage(name: name, contentID: contentID)
|
||||||
}
|
}
|
||||||
// Binds the lifecycle of the LoadableImage to the associated URL.
|
|
||||||
// This fixes the problem of the cache returning old values after a change in the URL.
|
|
||||||
.id(url)
|
|
||||||
} else {
|
} else {
|
||||||
PlaceholderAvatarImage(name: name, contentID: contentID)
|
PlaceholderAvatarImage(name: name, contentID: contentID)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -17,17 +17,14 @@
|
|||||||
import Kingfisher
|
import Kingfisher
|
||||||
import SwiftUI
|
import SwiftUI
|
||||||
|
|
||||||
struct LoadableImage<TransformerView: View, PlaceholderView: View>: View, ImageDataProvider {
|
struct LoadableImage<TransformerView: View, PlaceholderView: View>: View {
|
||||||
private let mediaSource: MediaSourceProxy
|
private let mediaSource: MediaSourceProxy
|
||||||
private let blurhash: String?
|
private let blurhash: String?
|
||||||
private let size: CGSize?
|
private let size: CGSize?
|
||||||
private let imageProvider: ImageProviderProtocol?
|
private let imageProvider: ImageProviderProtocol?
|
||||||
|
private let transformer: (AnyView) -> TransformerView
|
||||||
private var transformer: (AnyView) -> TransformerView
|
|
||||||
private let placeholder: () -> PlaceholderView
|
private let placeholder: () -> PlaceholderView
|
||||||
|
|
||||||
@StateObject private var contentLoader: ContentLoader
|
|
||||||
|
|
||||||
/// A SwiftUI view that automatically fetches images
|
/// A SwiftUI view that automatically fetches images
|
||||||
/// It will try fetching the image from in-memory cache and if that's not available
|
/// It will try fetching the image from in-memory cache and if that's not available
|
||||||
/// it will fire a task to load it through the image provider
|
/// it will fire a task to load it through the image provider
|
||||||
@@ -46,11 +43,8 @@ struct LoadableImage<TransformerView: View, PlaceholderView: View>: View, ImageD
|
|||||||
self.blurhash = blurhash
|
self.blurhash = blurhash
|
||||||
self.size = size
|
self.size = size
|
||||||
self.imageProvider = imageProvider
|
self.imageProvider = imageProvider
|
||||||
|
|
||||||
self.transformer = transformer
|
self.transformer = transformer
|
||||||
self.placeholder = placeholder
|
self.placeholder = placeholder
|
||||||
|
|
||||||
_contentLoader = StateObject(wrappedValue: ContentLoader(mediaSource: mediaSource, size: size, imageProvider: imageProvider))
|
|
||||||
}
|
}
|
||||||
|
|
||||||
init(url: URL,
|
init(url: URL,
|
||||||
@@ -67,9 +61,46 @@ struct LoadableImage<TransformerView: View, PlaceholderView: View>: View, ImageD
|
|||||||
placeholder: placeholder)
|
placeholder: placeholder)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var body: some View {
|
||||||
|
LoadableImageContent(mediaSource: mediaSource,
|
||||||
|
blurhash: blurhash,
|
||||||
|
size: size,
|
||||||
|
imageProvider: imageProvider,
|
||||||
|
transformer: transformer,
|
||||||
|
placeholder: placeholder)
|
||||||
|
// Binds the lifecycle of the LoadableImage to the associated URL.
|
||||||
|
// This fixes the problem of the cache returning old values after a change in the URL.
|
||||||
|
.id(mediaSource.url)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private struct LoadableImageContent<TransformerView: View, PlaceholderView: View>: View, ImageDataProvider {
|
||||||
|
private let mediaSource: MediaSourceProxy
|
||||||
|
private let blurhash: String?
|
||||||
|
private let size: CGSize?
|
||||||
|
private let imageProvider: ImageProviderProtocol?
|
||||||
|
private let transformer: (AnyView) -> TransformerView
|
||||||
|
private let placeholder: () -> PlaceholderView
|
||||||
|
|
||||||
|
@StateObject private var contentLoader: ContentLoader
|
||||||
|
|
||||||
|
init(mediaSource: MediaSourceProxy,
|
||||||
|
blurhash: String? = nil,
|
||||||
|
size: CGSize? = nil,
|
||||||
|
imageProvider: ImageProviderProtocol?,
|
||||||
|
transformer: @escaping (AnyView) -> TransformerView,
|
||||||
|
placeholder: @escaping () -> PlaceholderView) {
|
||||||
|
self.mediaSource = mediaSource
|
||||||
|
self.blurhash = blurhash
|
||||||
|
self.size = size
|
||||||
|
self.imageProvider = imageProvider
|
||||||
|
self.transformer = transformer
|
||||||
|
self.placeholder = placeholder
|
||||||
|
_contentLoader = StateObject(wrappedValue: ContentLoader(mediaSource: mediaSource, size: size, imageProvider: imageProvider))
|
||||||
|
}
|
||||||
|
|
||||||
var body: some View {
|
var body: some View {
|
||||||
let _ = Task {
|
let _ = Task {
|
||||||
// Future improvement: Does guarding against a nil image prevent the image being updated when the URL changes?
|
|
||||||
guard contentLoader.content == nil else {
|
guard contentLoader.content == nil else {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user