71 lines
1.6 KiB
Swift
71 lines
1.6 KiB
Swift
//
|
|
// ItemPersonIconView.swift
|
|
// Jel
|
|
//
|
|
// Created by zerocool on 1/8/24.
|
|
//
|
|
|
|
import SwiftUI
|
|
import JellyfinKit
|
|
import NukeUI
|
|
|
|
struct ItemPersonIconPlaceholderView: View {
|
|
var body: some View {
|
|
VStack {
|
|
Image(systemName: "person")
|
|
.resizable()
|
|
.padding()
|
|
.scaledToFit()
|
|
}
|
|
}
|
|
}
|
|
|
|
struct ItemPersonIconView: View {
|
|
@StateObject var authState: AuthStateController = AuthStateController.shared
|
|
@EnvironmentObject var jellyfinClient: JellyfinClientController
|
|
|
|
var person: BaseItemPerson
|
|
|
|
@State var personImageUrl: URL?
|
|
@State var loading: Bool = true
|
|
|
|
var body: some View {
|
|
VStack() {
|
|
LazyImage(url: personImageUrl) {state in
|
|
if let image = state.image {
|
|
image
|
|
.resizable()
|
|
.clipShape(RoundedRectangle(cornerRadius: 5))
|
|
} else {
|
|
ItemPersonIconPlaceholderView()
|
|
}
|
|
}
|
|
.aspectRatio(contentMode: .fit)
|
|
.frame(width: 100, height: 170)
|
|
|
|
VStack {
|
|
Text(person.name ?? "---")
|
|
.font(.callout)
|
|
Text(person.role ?? "---")
|
|
.font(.caption)
|
|
.foregroundStyle(.gray)
|
|
}
|
|
.frame(width: 100)
|
|
}
|
|
// .redacted(reason: loading ? .placeholder : [])
|
|
.onAppear {
|
|
Task {
|
|
let request = Paths.getItemImage(itemID: person.id ?? "", imageType: "Primary")
|
|
|
|
let serverUrl = jellyfinClient.getUrl()
|
|
personImageUrl = serverUrl?.appending(path: request.url?.absoluteString ?? "")
|
|
// loading = false
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
//#Preview {
|
|
// ItemPersonView()
|
|
//}
|