1
0
mirror of https://github.com/yattee/yattee.git synced 2024-12-15 06:40:32 +05:30
yattee/Shared/Videos/ThumbnailView.swift

73 lines
1.9 KiB
Swift
Raw Normal View History

2022-12-17 03:07:30 +05:30
import CachedAsyncImage
2022-12-11 05:21:21 +05:30
import SDWebImageSwiftUI
import SwiftUI
struct ThumbnailView: View {
var url: URL?
private let thumbnails = ThumbnailsModel.shared
2022-12-11 05:21:21 +05:30
var body: some View {
2022-12-17 19:08:21 +05:30
if url != nil {
viewForThumbnailExtension
}
2022-12-17 03:07:30 +05:30
}
var thumbnailExtension: String? {
2022-12-17 19:08:21 +05:30
guard let url,
let urlComponents = URLComponents(url: url, resolvingAgainstBaseURL: false) else { return nil }
let pathComponents = urlComponents.path.components(separatedBy: ".")
guard pathComponents.count > 1 else { return nil }
return pathComponents.last
2022-12-17 03:07:30 +05:30
}
@ViewBuilder var viewForThumbnailExtension: some View {
if thumbnailExtension != nil {
if thumbnailExtension == "webp" {
webImage
} else {
asyncImageIfAvailable
}
} else {
2022-12-17 19:08:21 +05:30
webImage
2022-12-17 03:07:30 +05:30
}
}
var webImage: some View {
2022-12-11 18:30:46 +05:30
WebImage(url: url)
.resizable()
.onFailure { _ in
if let url {
thumbnails.insertUnloadable(url)
}
2022-12-11 05:21:21 +05:30
}
2022-12-17 03:07:30 +05:30
.placeholder { placeholder }
}
@ViewBuilder var asyncImageIfAvailable: some View {
if #available(iOS 15, macOS 12, *) {
CachedAsyncImage(url: url, urlCache: BaseCacheModel.imageCache) { phase in
switch phase {
case let .success(image):
image
.resizable()
case .failure:
placeholder.onAppear {
guard let url else { return }
thumbnails.insertUnloadable(url)
}
default:
placeholder
}
}
2022-12-17 03:07:30 +05:30
} else {
webImage
}
}
var placeholder: some View {
Rectangle().fill(Color("PlaceholderColor"))
2022-12-11 05:21:21 +05:30
}
}