diff options
author | Shav Kinderlehrer <[email protected]> | 2024-02-27 14:22:42 -0500 |
---|---|---|
committer | Shav Kinderlehrer <[email protected]> | 2024-02-27 14:22:42 -0500 |
commit | aaf02071642a59ae375906bd9b9bcff1e8c33e92 (patch) | |
tree | 9084cdf9cab4054a6e3108b2f3db50a9343bd874 /Jel/Views/Item/Series | |
parent | be11eed89ded59949a790aa09f20908779155443 (diff) | |
download | jel-aaf02071642a59ae375906bd9b9bcff1e8c33e92.tar.gz jel-aaf02071642a59ae375906bd9b9bcff1e8c33e92.zip |
Diffstat (limited to 'Jel/Views/Item/Series')
4 files changed, 118 insertions, 19 deletions
diff --git a/Jel/Views/Item/Series/ItemSeriesEpisodeIconView.swift b/Jel/Views/Item/Series/ItemSeriesEpisodeIconView.swift index c198e66..46a5f5b 100644 --- a/Jel/Views/Item/Series/ItemSeriesEpisodeIconView.swift +++ b/Jel/Views/Item/Series/ItemSeriesEpisodeIconView.swift @@ -37,7 +37,6 @@ struct ItemSeriesEpisodeIconView: View { ExpandableText((item.overviewNL ?? "").replacingOccurrences(of: "<br>", with: "\n")) .foregroundColor(.secondary) } - .padding(.vertical) } } diff --git a/Jel/Views/Item/Series/ItemSeriesEpisodesView.swift b/Jel/Views/Item/Series/ItemSeriesEpisodesView.swift index 338f8a7..f0d95cf 100644 --- a/Jel/Views/Item/Series/ItemSeriesEpisodesView.swift +++ b/Jel/Views/Item/Series/ItemSeriesEpisodesView.swift @@ -10,36 +10,46 @@ import JellyfinKit struct ItemSeriesEpisodesView: View { @EnvironmentObject var jellyfinClient: JellyfinClientController - @EnvironmentObject var size: ScreenSize - @ObservedObject var authState: AuthStateController = AuthStateController.shared var item: BaseItemDto @State var episodeItems: [BaseItemDto] = [] + @State var loading: Bool = true var body: some View { - VStack(alignment: .leading) { + LazyVStack(alignment: .leading) { ForEach(episodeItems) {episode in ItemSeriesEpisodeIconView(item: episode) } } + .if(loading) {view in + view + .redacted(reason: .placeholder) + } + .onChange(of: item) { + self.loadEpisodes() + } .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) - episodeItems = res.value.items ?? [] - } catch {} - } + self.loadEpisodes() } } -} + + func loadEpisodes() { + 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) + episodeItems = res.value.items ?? [] + loading = false + } catch {} + } + }} //#Preview { // ItemSeriesEpisodesView() diff --git a/Jel/Views/Item/Series/ItemSeriesSeasonsView.swift b/Jel/Views/Item/Series/ItemSeriesSeasonsView.swift index d5c269b..c1d2fd9 100644 --- a/Jel/Views/Item/Series/ItemSeriesSeasonsView.swift +++ b/Jel/Views/Item/Series/ItemSeriesSeasonsView.swift @@ -15,6 +15,7 @@ struct ItemSeriesSeasonsView: View { @ObservedObject var authState: AuthStateController = AuthStateController.shared @State var seriesItems: [BaseItemDto] = [] + @State var loading: Bool = true var body: some View { VStack(alignment: .leading) { @@ -34,9 +35,12 @@ struct ItemSeriesSeasonsView: View { } } }.padding(.horizontal) - } + }.scrollIndicators(.hidden) + } + .if(loading) {view in + view.redacted(reason: .placeholder) } - .onAppear{ + .onAppear { Task { let parameters = Paths.GetItemsParameters( userID: authState.userId ?? "", @@ -48,6 +52,8 @@ struct ItemSeriesSeasonsView: View { let res = try await jellyfinClient.send(req) seriesItems = res.value.items ?? [] } catch {} + + loading = false } } } diff --git a/Jel/Views/Item/Series/ItemSeriesSelectableEpisodesView.swift b/Jel/Views/Item/Series/ItemSeriesSelectableEpisodesView.swift new file mode 100644 index 0000000..30cb97d --- /dev/null +++ b/Jel/Views/Item/Series/ItemSeriesSelectableEpisodesView.swift @@ -0,0 +1,84 @@ +// +// 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() +//} |