Fixes #2314 - Tweak avatar animations to increase perceived load times

This commit is contained in:
Stefan Ceriu
2024-01-10 15:40:52 +02:00
parent dde4b6cd7e
commit f8fb77017a
4 changed files with 19 additions and 5 deletions

View File

@@ -20,6 +20,7 @@ import Kingfisher
extension ImageCache {
static var onlyInMemory: ImageCache {
let result = ImageCache.default
result.memoryStorage.config.keepWhenEnteringBackground = true
result.diskStorage.config.sizeLimit = 1
return result
}

View File

@@ -46,6 +46,7 @@ struct LoadableAvatarImage: View {
var avatar: some View {
if let url {
LoadableImage(url: url,
mediaType: .avatar,
size: avatarSize.scaledSize,
imageProvider: imageProvider) { image in
image

View File

@@ -17,8 +17,15 @@
import Kingfisher
import SwiftUI
/// Used to configure animations
enum LoadableImageMediaType {
case avatar
case generic
}
struct LoadableImage<TransformerView: View, PlaceholderView: View>: View {
private let mediaSource: MediaSourceProxy
private let mediaType: LoadableImageMediaType
private let blurhash: String?
private let size: CGSize?
private let imageProvider: ImageProviderProtocol?
@@ -34,12 +41,14 @@ struct LoadableImage<TransformerView: View, PlaceholderView: View>: View {
/// - transformer: entry point for configuring the resulting image view
/// - placeholder: a view to show while the image or blurhash are not available
init(mediaSource: MediaSourceProxy,
mediaType: LoadableImageMediaType = .generic,
blurhash: String? = nil,
size: CGSize? = nil,
imageProvider: ImageProviderProtocol?,
transformer: @escaping (AnyView) -> TransformerView = { $0 },
placeholder: @escaping () -> PlaceholderView) {
self.mediaSource = mediaSource
self.mediaType = mediaType
self.blurhash = blurhash
self.size = size
self.imageProvider = imageProvider
@@ -48,12 +57,14 @@ struct LoadableImage<TransformerView: View, PlaceholderView: View>: View {
}
init(url: URL,
mediaType: LoadableImageMediaType = .generic,
blurhash: String? = nil,
size: CGSize? = nil,
imageProvider: ImageProviderProtocol?,
transformer: @escaping (AnyView) -> TransformerView = { $0 },
placeholder: @escaping () -> PlaceholderView) {
self.init(mediaSource: MediaSourceProxy(url: url, mimeType: nil),
mediaType: mediaType,
blurhash: blurhash,
size: size,
imageProvider: imageProvider,
@@ -63,6 +74,7 @@ struct LoadableImage<TransformerView: View, PlaceholderView: View>: View {
var body: some View {
LoadableImageContent(mediaSource: mediaSource,
mediaType: mediaType,
blurhash: blurhash,
size: size,
imageProvider: imageProvider,
@@ -76,6 +88,7 @@ struct LoadableImage<TransformerView: View, PlaceholderView: View>: View {
private struct LoadableImageContent<TransformerView: View, PlaceholderView: View>: View, ImageDataProvider {
private let mediaSource: MediaSourceProxy
private let mediaType: LoadableImageMediaType
private let blurhash: String?
private let transformer: (AnyView) -> TransformerView
private let placeholder: () -> PlaceholderView
@@ -83,12 +96,14 @@ private struct LoadableImageContent<TransformerView: View, PlaceholderView: View
@StateObject private var contentLoader: ContentLoader
init(mediaSource: MediaSourceProxy,
mediaType: LoadableImageMediaType,
blurhash: String? = nil,
size: CGSize? = nil,
imageProvider: ImageProviderProtocol?,
transformer: @escaping (AnyView) -> TransformerView,
placeholder: @escaping () -> PlaceholderView) {
self.mediaSource = mediaSource
self.mediaType = mediaType
self.blurhash = blurhash
self.transformer = transformer
self.placeholder = placeholder
@@ -122,7 +137,7 @@ private struct LoadableImageContent<TransformerView: View, PlaceholderView: View
}
}
}
.animation(.elementDefault, value: contentLoader.content)
.animation(mediaType == .avatar ? .noAnimation : .elementDefault, value: contentLoader.content)
}
// MARK: - ImageDataProvider

View File

@@ -91,11 +91,8 @@ class UserSessionStore: UserSessionStoreProtocol {
// MARK: - Private
private func buildUserSessionWithClient(_ clientProxy: ClientProxyProtocol) -> UserSessionProtocol {
let imageCache = ImageCache.onlyInMemory
imageCache.memoryStorage.config.keepWhenEnteringBackground = true
let mediaProvider = MediaProvider(mediaLoader: clientProxy,
imageCache: imageCache,
imageCache: .onlyInMemory,
backgroundTaskService: backgroundTaskService)
let voiceMessageMediaManager = VoiceMessageMediaManager(mediaProvider: mediaProvider,