// // ContentView.swift // vrtnu // // Created by Jens Timmerman on 23/09/2020. // import SwiftUI import AVKit import AVFoundation import Combine import TVUIKit struct ContentView: View { @ViewBuilder var body: some View { VRTNuView(vrtNu: VRTNu()) } } struct LoginView: View{ var vrtNu: VRTNu @State private var password: String = "" @State private var username: String = "" @State var authenticationDidFail: Bool = false // needed to update parent view when login was succesful @Binding var loginaction: Bool var body: some View { if authenticationDidFail { Text("Information not correct. Try again.") .offset(y: -10) .foregroundColor(.red) } TextField("VRTNu username", text: $username) SecureField("VRTNu password", text: $password) Button("Inloggen", action: { let loginok = vrtNu.login(username: username, password: password) if loginok{ // reload parent view here withAnimation { self.loginaction.toggle() } }else{ authenticationDidFail = true } }) } } struct VRTNuView: View{ var vrtNu: VRTNu var body: some View { NavigationView(){ List(vrtNu.getShows(), id: \.title){ show in NavigationLink(destination: ShowView(show: show)){ HStack{ AsyncImage(url: show.imageURL,placeholder: { //Image(name: "loading") Text("Loading...") }, image:{ Image(uiImage:$0) .resizable() }).aspectRatio(contentMode: .fit).frame(width: 480, height:300) VStack(alignment: .leading){ Text(show.title) .padding() Text(show.showURL.absoluteString) } } } }.navigationBarTitle("Browse VRT Nu") } } } struct ShowView: View { var show: Show var body: some View { NavigationView(){ List{ ForEach(show.getSeasons(), id: \.self){ season in Section(header: Text(season.seasonName).font(.largeTitle)) { ForEach(season.getEpisodes(), id:\.self){ episode in NavigationLink(destination: VideoView(episode: episode)){ HStack{ AsyncImage(url: episode.imageURL,placeholder: { //Image(name: "loading") Text("Loading...") },image:{Image(uiImage:$0).resizable() }).aspectRatio(contentMode: .fit).frame(width: 480, height:300) VStack(alignment: .leading){ Text(episode.title).padding() Text(episode.episodeurl) } } } } }} } } } } struct VisibleShowView: View { var show: Show var body: some View { NavigationView(){ List(show.getSeasons(), id: \.self){ season in NavigationLink(destination: SeasonView(season: season)){ Text(season.seasonName) } } } } } //not used at the moment, we have an integrated view of seasons in the episode list struct SeasonView: View { var season: Season var body: some View { NavigationView(){ List(season.getEpisodes(), id:\.self){ episode in NavigationLink(destination: VideoView(episode: episode)){ HStack{ AsyncImage(url: episode.imageURL,placeholder: { //Image(name: "loading") Text("Loading...") },image:{Image(uiImage:$0).resizable() }).aspectRatio(contentMode: .fit).frame(width: 480, height:300) Text(episode.name) } } } } } } struct VideoView: View { var episode: Episode @State var loginaction: Bool = false var body: some View { if episode.authenticated() || loginaction { let player = AVPlayer(url: episode.getVideo().hlsUrl); VideoPlayer(player: player).fixedSize().onAppear(){ player.play() } }else{ LoginView(vrtNu: episode.season.show.vrtNu, loginaction: $loginaction) } }; } struct ContentView_Previews: PreviewProvider { static var previews: some View { //ShowView(show: VRTNu().getShows()[0]) ContentView() } }