// // ItemSeriesSelectableEpisodesView.swift // Jel // // Created by zerocool on 2/24/24. // import SwiftUI import JellyfinKit struct Season: Identifiable, Hashable { var name: String var id: String var season: BaseItemDto } extension Season { static let emptySelection = Season(name: "", id: "", season: BaseItemDto()) } struct ItemSeriesSelectableEpisodesView: View { @EnvironmentObject var jellyfinClient: JellyfinClientController @StateObject var authState: AuthStateController = AuthStateController.shared var item: BaseItemDto // series @State var seasons: [Season] = [] @State var currentSeason: Season = .emptySelection @State var currentSeasonCopy: Season = .emptySelection @State var loading: Bool = true var body: some View { VStack(alignment: .leading) { HStack { Text("Episodes") .font(.title2) .padding(.horizontal) Picker("Season", selection: $currentSeason) { ForEach(seasons, id: \.self) {season in Text(season.name).tag(season) } } } ItemSeriesEpisodesView(item: currentSeasonCopy.season) .padding(.horizontal) } .if(loading) {view in view.redacted(reason: .placeholder) } .onChange(of: currentSeason) { currentSeasonCopy = currentSeason } .onAppear { Task { let parameters = Paths.GetItemsParameters( userID: authState.userId ?? "", parentID: item.id ?? "" ) let req = Paths.getItems(parameters: parameters) do { let res = try await jellyfinClient.send(req) seasons = [] for season in res.value.items ?? [] { let newSeason = Season( name: season.name ?? "---", id: season.id ?? "", season: season ) seasons.append(newSeason) currentSeason = seasons.first ?? .emptySelection loading = false } } catch {} } } } } //#Preview { // ItemSeriesSelectableEpisodesView() //}