// // LibraryIconView.swift // Jel // // Created by zerocool on 12/15/23. // import SwiftUI import JellyfinKit import NukeUI struct LibraryIconView: View { @EnvironmentObject var jellyfinClient: JellyfinClientController var library: 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 @State var placeHolder: AnyView? var shouldShowCaption: Bool = true var imageCornerRadius: CGFloat = 5 var body: some View { VStack { 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 = library.imageBlurHashes?.primary?[library.imageTags?[imageType] ?? ""] ?? "" blurHashImage = UIImage(blurHash: blurhash, size: CGSize(width: 32, height: 32)) ?? UIImage() let imageId = library.id ?? "" let request = Paths.getItemImage(itemID: imageId, imageType: imageType) imageUrl = jellyfinClient.getUrl()?.appending(path: request.url?.absoluteString ?? "") } if shouldShowCaption { Text(library.name ?? "Unknown") .font(.subheadline) } } } func hideCaption(_ isHidden: Bool = true) -> Self { var copy = self copy.shouldShowCaption = !isHidden 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()) //}