// // ItemIconView.swift // Jel // // Created by zerocool on 12/15/23. // import SwiftUI import JellyfinKit import NukeUI struct ItemIconView: View { @EnvironmentObject var jellyfinClient: JellyfinClientController var item: BaseItemDto var imageType: String = "Primary" var width: CGFloat? var height: CGFloat? @State var blurHashImage: UIImage = UIImage() @State var imageUrl: URL? @State var contentMode: ContentMode = .fit var placeHolder: AnyView? var shouldShowCaption: Bool = false var imageCornerRadius: CGFloat = 5 var body: some View { VStack(alignment: .leading) { LazyImage(url: imageUrl) {state in if let image = state.image { image .resizable() .aspectRatio(contentMode: contentMode) } else { if let content = placeHolder { content } else { Image(uiImage: blurHashImage) .resizable() .aspectRatio(contentMode: .fill) } } } .frame(width: width, height: height) .clipShape(RoundedRectangle(cornerRadius: imageCornerRadius)) .onAppear { let blurhash = getBlurHash(imageType: imageType) blurHashImage = UIImage(blurHash: blurhash, size: CGSize(width: 32, height: 32)) ?? UIImage() let imageId = item.id ?? "" let request = Paths.getItemImage(itemID: imageId, imageType: imageType) imageUrl = jellyfinClient.getUrl()?.appending(path: request.url?.absoluteString ?? "") } if shouldShowCaption { Text(item.name ?? "Unknown") .font(.subheadline) } } } private func getBlurHash(imageType: String) -> String { switch imageType { case "Primary": return item.imageBlurHashes?.primary?[item.imageTags?[imageType] ?? ""] ?? "" case "Backdrop": return item.imageBlurHashes?.backdrop?[item.backdropImageTags?[0] ?? ""] ?? "" default: return "" } } func showCaption(_ showCaption: Bool = true) -> Self { var copy = self copy.shouldShowCaption = showCaption return copy } func setCornerRadius(_ cornerRadius: CGFloat = 5) -> Self { var copy = self copy.imageCornerRadius = cornerRadius return copy } func setAspectRatio(_ aspectRatio: Double?) -> Self { var copy = self if aspectRatio == nil { return copy } if let newWidth = copy.width { copy.height = newWidth / aspectRatio! } if let newHeight = copy.height { copy.width = newHeight * aspectRatio! } return copy } } //#Preview { // LibraryIconView(library: BaseItemDto()) //}