import Adwaita import LuminateCore struct TVShowView: View { var item: Components.Schemas.BaseItemDto var client: JellyfinClient var userId: String @State private var seasons: [Components.Schemas.BaseItemDto] = [] @State private var selectedSeasonId: String? @State private var backdropData: Data? var view: Body { ScrollView { VStack { if let data = backdropData { Picture() .data(data) .frame(minHeight: 300, maxHeight: 300) .hexpand(true) } HStack(alignment: .top) { PosterCell(item: item, client: client) .frame(minWidth: 200, maxWidth: 200) VStack { Text(item.Name ?? "") .style("title-1") .halign(.start) if let status = item.Status { Text(status) .style("caption") .halign(.start) } if let overview = item.Overview { Text(overview) .style("body") .halign(.start) .padding(10, .vertical) } } .hexpand(true) } .padding() if !seasons.isEmpty { VStack { Text("Season") .style("caption") .halign(.start) let ids = seasons.compactMap { $0.Id } let selected = Binding(get: { selectedSeasonId ?? ids.first ?? "" }, set: { newVal in selectedSeasonId = newVal }) let items = seasons.compactMap { season -> DropDownItem? in guard let id = season.Id else { return nil } return .init(id: id, title: season.Name ?? "Unknown") } DropDown(selected: selected, items: items) } .padding(10, .horizontal) } if let seasonId = selectedSeasonId { EpisodeList( seriesId: item.Id ?? "", seasonId: seasonId, client: client, userId: userId ) } } } .onAppear { loadSeasons() loadBackdrop() } } private func loadBackdrop() { guard let tag = item.backdropImageTag, let itemId = item.Id else { return } Task { guard let url = await client.imageURL( itemId: itemId, imageType: .Backdrop, tag: tag, maxWidth: 1920 ) else { return } let service = ImageService() backdropData = try? await service.loadImage(url: url) } } private func loadSeasons() { Task { let result = try? await client.getSeasons(seriesId: item.Id ?? "", userId: userId) await MainActor.run { seasons = result ?? [] selectedSeasonId = seasons.first?.Id } } } }