Handle media source validation more gracefully. (#3571)

* Handle media source validation more gracefully.

* Fix unit tests.
This commit is contained in:
Doug
2024-11-29 12:42:27 +00:00
committed by GitHub
parent c8627cfd64
commit 49a94e0bdb
13 changed files with 95 additions and 90 deletions
@@ -21,7 +21,7 @@ enum LoadableImageMediaType: Equatable {
}
struct LoadableImage<TransformerView: View, PlaceholderView: View>: View {
private let mediaSource: MediaSourceProxy
private let mediaSource: MediaSourceProxy?
private let mediaType: LoadableImageMediaType
private let blurhash: String?
private let size: CGSize?
@@ -60,27 +60,31 @@ struct LoadableImage<TransformerView: View, PlaceholderView: View>: View {
mediaProvider: MediaProviderProtocol?,
transformer: @escaping (AnyView) -> TransformerView = { $0 },
placeholder: @escaping () -> PlaceholderView) {
self.init(mediaSource: MediaSourceProxy(url: url, mimeType: nil),
mediaType: mediaType,
blurhash: blurhash,
size: size,
mediaProvider: mediaProvider,
transformer: transformer,
placeholder: placeholder)
mediaSource = try? MediaSourceProxy(url: url, mimeType: nil)
self.mediaType = mediaType
self.blurhash = blurhash
self.size = size
self.mediaProvider = mediaProvider
self.transformer = transformer
self.placeholder = placeholder
}
var body: some View {
LoadableImageContent(mediaSource: mediaSource,
mediaType: mediaType,
blurhash: blurhash,
size: size,
mediaProvider: mediaProvider,
transformer: transformer,
placeholder: placeholder)
.id(stableMediaIdentifier)
if let mediaSource {
LoadableImageContent(mediaSource: mediaSource,
mediaType: mediaType,
blurhash: blurhash,
size: size,
mediaProvider: mediaProvider,
transformer: transformer,
placeholder: placeholder)
.id(stableMediaIdentifier)
} else {
placeholder()
}
}
private var stableMediaIdentifier: String {
private var stableMediaIdentifier: String? {
switch mediaType {
case .timelineItem(let uniqueID):
// Consider media for the same item to be the same view
@@ -88,7 +92,7 @@ struct LoadableImage<TransformerView: View, PlaceholderView: View>: View {
default:
// 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.
mediaSource.url.absoluteString
mediaSource?.url.absoluteString
}
}
}