diff --git a/src/PodcastsApp/PodcastsApp.xcodeproj/project.pbxproj b/src/PodcastsApp/PodcastsApp.xcodeproj/project.pbxproj index 0e21a6e..50d87b4 100644 --- a/src/PodcastsApp/PodcastsApp.xcodeproj/project.pbxproj +++ b/src/PodcastsApp/PodcastsApp.xcodeproj/project.pbxproj @@ -7,9 +7,13 @@ objects = { /* Begin PBXBuildFile section */ + 1E8272EB2A151FA6005837D3 /* Stub.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1E8272EA2A151FA6005837D3 /* Stub.swift */; }; + 1E8272ED2A155CFB005837D3 /* Episode.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1E8272EC2A155CFB005837D3 /* Episode.swift */; }; + 1E8272EF2A1584CC005837D3 /* LibraryMenu.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1E8272EE2A1584CC005837D3 /* LibraryMenu.swift */; }; + 1E8272F12A1597C8005837D3 /* MenuItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1E8272F02A1597C8005837D3 /* MenuItem.swift */; }; + 1E8272F32A15A361005837D3 /* PodcastCover.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1E8272F22A15A361005837D3 /* PodcastCover.swift */; }; 1E92BCE42A13FD4E0026C641 /* PodcastListItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1E92BCE32A13FD4E0026C641 /* PodcastListItem.swift */; }; 1E92BCE62A1400660026C641 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 1E92BCE52A1400660026C641 /* Images.xcassets */; }; - 1E92BCE92A14015E0026C641 /* Images.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1E92BCE82A14015E0026C641 /* Images.swift */; }; 1E92BCEB2A14032D0026C641 /* Podcast.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1E92BCEA2A14032D0026C641 /* Podcast.swift */; }; 1E92BCEF2A14319D0026C641 /* PodcastListView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1E92BCEE2A14319D0026C641 /* PodcastListView.swift */; }; 1E92BCF12A1439000026C641 /* PodcastView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1E92BCF02A1439000026C641 /* PodcastView.swift */; }; @@ -44,9 +48,13 @@ /* End PBXContainerItemProxy section */ /* Begin PBXFileReference section */ + 1E8272EA2A151FA6005837D3 /* Stub.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Stub.swift; sourceTree = ""; }; + 1E8272EC2A155CFB005837D3 /* Episode.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Episode.swift; sourceTree = ""; }; + 1E8272EE2A1584CC005837D3 /* LibraryMenu.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LibraryMenu.swift; sourceTree = ""; }; + 1E8272F02A1597C8005837D3 /* MenuItem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MenuItem.swift; sourceTree = ""; }; + 1E8272F22A15A361005837D3 /* PodcastCover.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PodcastCover.swift; sourceTree = ""; }; 1E92BCE32A13FD4E0026C641 /* PodcastListItem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PodcastListItem.swift; sourceTree = ""; }; 1E92BCE52A1400660026C641 /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = ""; }; - 1E92BCE82A14015E0026C641 /* Images.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Images.swift; sourceTree = ""; }; 1E92BCEA2A14032D0026C641 /* Podcast.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Podcast.swift; sourceTree = ""; }; 1E92BCEE2A14319D0026C641 /* PodcastListView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PodcastListView.swift; sourceTree = ""; }; 1E92BCF02A1439000026C641 /* PodcastView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PodcastView.swift; sourceTree = ""; }; @@ -91,14 +99,6 @@ /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ - 1E92BCE72A1401490026C641 /* Utils */ = { - isa = PBXGroup; - children = ( - 1E92BCE82A14015E0026C641 /* Images.swift */, - ); - path = Utils; - sourceTree = ""; - }; 1EFF148A2A10E76A0018278E = { isa = PBXGroup; children = ( @@ -122,7 +122,6 @@ 1EFF14952A10E76A0018278E /* PodcastsApp */ = { isa = PBXGroup; children = ( - 1E92BCE72A1401490026C641 /* Utils */, 1EFF14C52A1116430018278E /* Model */, 1EFF14C02A10F3AC0018278E /* Views */, 1EFF14962A10E76A0018278E /* PodcastsAppApp.swift */, @@ -169,6 +168,8 @@ 1E92BCEE2A14319D0026C641 /* PodcastListView.swift */, 1E92BCF02A1439000026C641 /* PodcastView.swift */, 1E92BCF22A1440B20026C641 /* LibraryMenuItem.swift */, + 1E8272EE2A1584CC005837D3 /* LibraryMenu.swift */, + 1E8272F22A15A361005837D3 /* PodcastCover.swift */, ); path = Views; sourceTree = ""; @@ -177,6 +178,9 @@ isa = PBXGroup; children = ( 1E92BCEA2A14032D0026C641 /* Podcast.swift */, + 1E8272EA2A151FA6005837D3 /* Stub.swift */, + 1E8272EC2A155CFB005837D3 /* Episode.swift */, + 1E8272F02A1597C8005837D3 /* MenuItem.swift */, ); path = Model; sourceTree = ""; @@ -312,13 +316,17 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 1E92BCE92A14015E0026C641 /* Images.swift in Sources */, 1E92BCF32A1440B20026C641 /* LibraryMenuItem.swift in Sources */, 1EFF14992A10E76A0018278E /* ContentView.swift in Sources */, 1E92BCEF2A14319D0026C641 /* PodcastListView.swift in Sources */, + 1E8272F32A15A361005837D3 /* PodcastCover.swift in Sources */, 1EFF14C42A10FBDE0018278E /* LibraryView.swift in Sources */, 1EFF14972A10E76A0018278E /* PodcastsAppApp.swift in Sources */, 1EFF14C92A1139E80018278E /* NowPlayingBar.swift in Sources */, + 1E8272ED2A155CFB005837D3 /* Episode.swift in Sources */, + 1E8272F12A1597C8005837D3 /* MenuItem.swift in Sources */, + 1E8272EF2A1584CC005837D3 /* LibraryMenu.swift in Sources */, + 1E8272EB2A151FA6005837D3 /* Stub.swift in Sources */, 1E92BCF12A1439000026C641 /* PodcastView.swift in Sources */, 1EFF14C72A1116D90018278E /* PodcastEpisode.swift in Sources */, 1E92BCEB2A14032D0026C641 /* Podcast.swift in Sources */, diff --git a/src/PodcastsApp/PodcastsApp/Images.xcassets/301vues_cover.imageset/Contents.json b/src/PodcastsApp/PodcastsApp/Images.xcassets/301vues_cover.imageset/Contents.json new file mode 100644 index 0000000..3310c8a --- /dev/null +++ b/src/PodcastsApp/PodcastsApp/Images.xcassets/301vues_cover.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "ab6765630000ba8a34809821af4de219482403eb.jpg", + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/src/PodcastsApp/PodcastsApp/Images.xcassets/301vues_cover.imageset/ab6765630000ba8a34809821af4de219482403eb.jpg b/src/PodcastsApp/PodcastsApp/Images.xcassets/301vues_cover.imageset/ab6765630000ba8a34809821af4de219482403eb.jpg new file mode 100644 index 0000000..a47e333 Binary files /dev/null and b/src/PodcastsApp/PodcastsApp/Images.xcassets/301vues_cover.imageset/ab6765630000ba8a34809821af4de219482403eb.jpg differ diff --git a/src/PodcastsApp/PodcastsApp/Images.xcassets/abientotdeterevoir_cover.imageset/Contents.json b/src/PodcastsApp/PodcastsApp/Images.xcassets/abientotdeterevoir_cover.imageset/Contents.json new file mode 100644 index 0000000..83c7531 --- /dev/null +++ b/src/PodcastsApp/PodcastsApp/Images.xcassets/abientotdeterevoir_cover.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "ab6765630000ba8af4cbfed80035f4357fd96958.jpg", + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/src/PodcastsApp/PodcastsApp/Images.xcassets/abientotdeterevoir_cover.imageset/ab6765630000ba8af4cbfed80035f4357fd96958.jpg b/src/PodcastsApp/PodcastsApp/Images.xcassets/abientotdeterevoir_cover.imageset/ab6765630000ba8af4cbfed80035f4357fd96958.jpg new file mode 100644 index 0000000..ad84010 Binary files /dev/null and b/src/PodcastsApp/PodcastsApp/Images.xcassets/abientotdeterevoir_cover.imageset/ab6765630000ba8af4cbfed80035f4357fd96958.jpg differ diff --git a/src/PodcastsApp/PodcastsApp/Images.xcassets/popcorn_cover.imageset/Contents.json b/src/PodcastsApp/PodcastsApp/Images.xcassets/popcorn_cover.imageset/Contents.json new file mode 100644 index 0000000..3ec83cb --- /dev/null +++ b/src/PodcastsApp/PodcastsApp/Images.xcassets/popcorn_cover.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "ab67656300005f1fdac23d37e5fba6e0cbcda1e7.jpg", + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/src/PodcastsApp/PodcastsApp/Images.xcassets/popcorn_cover.imageset/ab67656300005f1fdac23d37e5fba6e0cbcda1e7.jpg b/src/PodcastsApp/PodcastsApp/Images.xcassets/popcorn_cover.imageset/ab67656300005f1fdac23d37e5fba6e0cbcda1e7.jpg new file mode 100644 index 0000000..7fe9f60 Binary files /dev/null and b/src/PodcastsApp/PodcastsApp/Images.xcassets/popcorn_cover.imageset/ab67656300005f1fdac23d37e5fba6e0cbcda1e7.jpg differ diff --git a/src/PodcastsApp/PodcastsApp/Images.xcassets/unbonmoment_cover.imageset/Contents.json b/src/PodcastsApp/PodcastsApp/Images.xcassets/unbonmoment_cover.imageset/Contents.json new file mode 100644 index 0000000..73ad17c --- /dev/null +++ b/src/PodcastsApp/PodcastsApp/Images.xcassets/unbonmoment_cover.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "ab6765630000ba8a4e312595ecca6e991a65faa4.jpg", + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/src/PodcastsApp/PodcastsApp/Images.xcassets/unbonmoment_cover.imageset/ab6765630000ba8a4e312595ecca6e991a65faa4.jpg b/src/PodcastsApp/PodcastsApp/Images.xcassets/unbonmoment_cover.imageset/ab6765630000ba8a4e312595ecca6e991a65faa4.jpg new file mode 100644 index 0000000..4be0336 Binary files /dev/null and b/src/PodcastsApp/PodcastsApp/Images.xcassets/unbonmoment_cover.imageset/ab6765630000ba8a4e312595ecca6e991a65faa4.jpg differ diff --git a/src/PodcastsApp/PodcastsApp/Model/Episode.swift b/src/PodcastsApp/PodcastsApp/Model/Episode.swift new file mode 100644 index 0000000..a906aa4 --- /dev/null +++ b/src/PodcastsApp/PodcastsApp/Model/Episode.swift @@ -0,0 +1,19 @@ +// +// Episode.swift +// PodcastsApp +// +// Created by BREUIL Yohann on 17/05/2023. +// + +import Foundation + +public struct Episode : Identifiable { + public var id: UUID = UUID() + + public var title: String + public var description: String + public var datePublication: Date = Date.now + public var duration: Int + public var isPlayed: Bool = false + public var isDownloaded: Bool = false +} diff --git a/src/PodcastsApp/PodcastsApp/Model/MenuItem.swift b/src/PodcastsApp/PodcastsApp/Model/MenuItem.swift new file mode 100644 index 0000000..8aa6c60 --- /dev/null +++ b/src/PodcastsApp/PodcastsApp/Model/MenuItem.swift @@ -0,0 +1,15 @@ +// +// MenuItem.swift +// PodcastsApp +// +// Created by BREUIL Yohann on 18/05/2023. +// + +import Foundation + +public struct MenuItem : Identifiable { + public var id: UUID = UUID() + + public var iconName: String + public var text: String +} diff --git a/src/PodcastsApp/PodcastsApp/Model/Podcast.swift b/src/PodcastsApp/PodcastsApp/Model/Podcast.swift index 9afa26f..b4d01ab 100644 --- a/src/PodcastsApp/PodcastsApp/Model/Podcast.swift +++ b/src/PodcastsApp/PodcastsApp/Model/Podcast.swift @@ -7,6 +7,16 @@ import Foundation -struct Podcast { +public struct Podcast : Identifiable { + public var id: UUID = UUID() + public var name: String + public var creator: String + public var coverImage: String + public var nbStars: Float + public var nbEvaluations: Int + public var topic: String + public var lastUpdateDate: Date + + public var episodes: [Episode] = [] } diff --git a/src/PodcastsApp/PodcastsApp/Model/Stub.swift b/src/PodcastsApp/PodcastsApp/Model/Stub.swift new file mode 100644 index 0000000..7fb5ec9 --- /dev/null +++ b/src/PodcastsApp/PodcastsApp/Model/Stub.swift @@ -0,0 +1,71 @@ +// +// Stub.swift +// PodcastsApp +// +// Created by BREUIL Yohann on 17/05/2023. +// + +import Foundation + +let libraryMenuItem: [MenuItem] = [ + MenuItem(iconName: "square.stack", + text: "Podcasts"), + MenuItem(iconName: "checklist.unchecked", + text: "Chaînes"), + MenuItem(iconName: "bookmark", + text: "Enregistrés"), + MenuItem(iconName: "arrow.down.circle", + text: "Téléchargés"), + MenuItem(iconName: "clock", + text: "Derniers épisodes"), +] + +let podcastList : [Podcast] = [ + Podcast( + name: "Underscore_", + creator: "Micode", + coverImage: "underscore_podcast", + nbStars: 4.7, + nbEvaluations: 963, + topic: "Technologies", + lastUpdateDate: Date.now, + episodes: [ + Episode(title: "Salut", description: "Ceci est un texte", duration: 34), + Episode(title: "Salut", description: "Ceci est un texte", duration: 34), + Episode(title: "Salut", description: "Ceci est un texte", duration: 34), + Episode(title: "Salut", description: "Ceci est un texte", duration: 34), + Episode(title: "Salut", description: "Ceci est un texte", duration: 34), + ]), + Podcast( + name: "Popcorn", + creator: "DomingoTV", + coverImage: "popcorn_cover", + nbStars: 4.9, + nbEvaluations: 709, + topic: "Actualité du divertissement", + lastUpdateDate: Date.now), + Podcast( + name: "Un bon moment avec Kyan KHOJANDI et NAVO", + creator: "Kyan Khojandi & navo", + coverImage: "unbonmoment_cover", + nbStars: 4.7, + nbEvaluations: 1100, + topic: "Comédie: les interviews", + lastUpdateDate: Date.now), + Podcast( + name: "À bientôt de te revoir", + creator: "Binge Audio", + coverImage: "abientotdeterevoir_cover", + nbStars: 4.8, + nbEvaluations: 2700, + topic: "Comédie: les interviews", + lastUpdateDate: Date.now), + Podcast( + name: "301 vues", + creator: "Cyprien", + coverImage: "301vues_cover", + nbStars: 4.6, + nbEvaluations: 1100, + topic: "Humour", + lastUpdateDate: Date.now), +] diff --git a/src/PodcastsApp/PodcastsApp/Utils/Images.swift b/src/PodcastsApp/PodcastsApp/Utils/Images.swift deleted file mode 100644 index 6f469cd..0000000 --- a/src/PodcastsApp/PodcastsApp/Utils/Images.swift +++ /dev/null @@ -1,12 +0,0 @@ -// -// Images.swift -// PodcastsApp -// -// Created by BREUIL Yohann on 16/05/2023. -// - -import Foundation - -//static class Images { -// -//} diff --git a/src/PodcastsApp/PodcastsApp/Views/LibraryMenu.swift b/src/PodcastsApp/PodcastsApp/Views/LibraryMenu.swift new file mode 100644 index 0000000..66dd729 --- /dev/null +++ b/src/PodcastsApp/PodcastsApp/Views/LibraryMenu.swift @@ -0,0 +1,29 @@ +// +// LibraryMenu.swift +// PodcastsApp +// +// Created by BREUIL Yohann on 17/05/2023. +// + +import SwiftUI + +struct LibraryMenu: View { + var body: some View { + LazyVStack(alignment: .leading) { + Divider() + ForEach (libraryMenuItem) { libraryItem in + NavigationLink(destination: PodcastListView()) { + LibraryMenuItem(imageName: libraryItem.iconName, + text: libraryItem.text) + } + Divider() + } + } + } +} + +struct LibraryMenu_Previews: PreviewProvider { + static var previews: some View { + LibraryMenu() + } +} diff --git a/src/PodcastsApp/PodcastsApp/Views/LibraryMenuItem.swift b/src/PodcastsApp/PodcastsApp/Views/LibraryMenuItem.swift index e05ec97..755f804 100644 --- a/src/PodcastsApp/PodcastsApp/Views/LibraryMenuItem.swift +++ b/src/PodcastsApp/PodcastsApp/Views/LibraryMenuItem.swift @@ -8,8 +8,8 @@ import SwiftUI struct LibraryMenuItem: View { - @State var imageName: String - @State var text: String + var imageName: String + var text: String var body: some View { HStack { @@ -17,7 +17,10 @@ struct LibraryMenuItem: View { .foregroundColor(.accentColor) Text(text) .bold() + Spacer() + Image(systemName: "chevron.forward") } + .padding(.horizontal) } } diff --git a/src/PodcastsApp/PodcastsApp/Views/LibraryView.swift b/src/PodcastsApp/PodcastsApp/Views/LibraryView.swift index 1dfd7d0..997c651 100644 --- a/src/PodcastsApp/PodcastsApp/Views/LibraryView.swift +++ b/src/PodcastsApp/PodcastsApp/Views/LibraryView.swift @@ -12,58 +12,25 @@ struct LibraryView: View { var body: some View { NavigationStack { - List { - NavigationLink(destination: PodcastListView()) { - LibraryMenuItem(imageName: "square.stack", text: "Podcasts") - } - NavigationLink(destination: PodcastListView()) { - LibraryMenuItem(imageName: "checklist.unchecked", text: "Chaînes") - } - NavigationLink(destination: PodcastListView()) { - LibraryMenuItem(imageName: "bookmark", text: "Enregistrés") - } - NavigationLink(destination: PodcastListView()) { - LibraryMenuItem(imageName: "arrow.down.circle", text: "Téléchargés") - } - NavigationLink(destination: PodcastListView()) { - LibraryMenuItem(imageName: "clock", text: "Derniers épisodes") - } + ScrollView { + LibraryMenu() - VStack { + VStack(alignment: .leading) { Text("Mis à jour récemment") - .font(.title2) + .padding() .bold() - LazyVGrid(columns: columns, spacing: 20) { - NavigationLink(destination: PodcastView()) { - PodcastListItem() - } - NavigationLink(destination: PodcastView()) { - PodcastListItem() - } - NavigationLink(destination: PodcastView()) { - PodcastListItem() - } - NavigationLink(destination: PodcastView()) { - PodcastListItem() - } - NavigationLink(destination: PodcastView()) { - PodcastListItem() - } - NavigationLink(destination: PodcastView()) { - PodcastListItem() - } - NavigationLink(destination: PodcastView()) { - PodcastListItem() - } - NavigationLink(destination: PodcastView()) { - PodcastListItem() + LazyVGrid(columns: columns, spacing: 75) { + ForEach (podcastList) { podcast in + NavigationLink(destination: PodcastView(podcast: podcast)) { + PodcastListItem(podcast: podcast) + } } } } .padding(.top) } - .navigationTitle("Bibliothèque") + .navigationTitle("Bibliothèques") } } } diff --git a/src/PodcastsApp/PodcastsApp/Views/PodcastCover.swift b/src/PodcastsApp/PodcastsApp/Views/PodcastCover.swift new file mode 100644 index 0000000..8fab270 --- /dev/null +++ b/src/PodcastsApp/PodcastsApp/Views/PodcastCover.swift @@ -0,0 +1,60 @@ +// +// PodcastCover.swift +// PodcastsApp +// +// Created by BREUIL Yohann on 18/05/2023. +// + +import SwiftUI + +struct PodcastCover: View { + var podcast: Podcast + + var body: some View { + ZStack { + Rectangle() + .fill(.cyan) + + VStack { + Image(podcast.coverImage) + .resizable() + .aspectRatio(contentMode: .fit) + .frame(width: 300, height: 300) + Text(podcast.name) + Text(podcast.creator) + + Button(action: {}) { + Image(systemName: "play.fill") + Text("Reprendre") + } + .bold() + .frame(width: 200, height: 20, alignment: .center) + .cornerRadius(20) + .padding() + .background( + RoundedRectangle( + cornerRadius: 20, + style: .continuous + ) + .fill(.yellow)) + .overlay { + RoundedRectangle( + cornerRadius: 20, + style: .continuous + ) + .stroke(.pink, lineWidth: 2) + } + } + + } + } +} + +struct PodcastCover_Previews: PreviewProvider { + static var previews: some View { + Group { + PodcastCover(podcast: podcastList[0]) + PodcastCover(podcast: podcastList[0]).preferredColorScheme(.dark) + } + } +} diff --git a/src/PodcastsApp/PodcastsApp/Views/PodcastEpisode.swift b/src/PodcastsApp/PodcastsApp/Views/PodcastEpisode.swift index aa5e192..3ff2027 100644 --- a/src/PodcastsApp/PodcastsApp/Views/PodcastEpisode.swift +++ b/src/PodcastsApp/PodcastsApp/Views/PodcastEpisode.swift @@ -8,38 +8,97 @@ import SwiftUI struct PodcastEpisode: View { + var episode: Episode + var body: some View { VStack(alignment: .leading) { - Text("Samedi") + Text("5 Mai") .font(.caption) + .bold() .textCase(.uppercase) - Text("Title of episode") - .font(.title2) - Text("Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do") + + // Title + if episode.isPlayed { + Text(episode.title) + .font(.title2) + .bold() + } else { + Text(episode.title) + .font(.title3) + } + + // Description + Text(episode.description) + .font(.body) + + // Actions HStack { Button(action: {}) { Image(systemName: "play.fill") } .frame(width: 33, height: 33) .foregroundColor(Color.purple) - .background(Color.gray) + .background(Color("#747476")) .clipShape(Circle()) - - Text("52 min") + + if episode.isPlayed { + ProgressView(value: 0.2) + .frame(width: 70) + Text("Il reste \(episode.duration)") + .foregroundColor(Color.accentColor) + .bold() + } else { + Text("\(episode.duration)") + .foregroundColor(Color.accentColor) + .bold() + } + Spacer() + if (episode.isDownloaded) { + Image(systemName: "arrow.down.circle.fill") + } Image(systemName: "ellipsis") } } .padding() + .frame(width: UIScreen.main.bounds.width, height: 200) } } struct PodcastEpisodeDetail_Previews: PreviewProvider { static var previews: some View { + let episode1: Episode = Episode( + title: "L'assistant vocal d'Underscore", + description: "Texte qui ne décrit pas grand chose mais c'est intéressant de marquer beaucoup de texte juste pour écrire. C'est long mais bon c'est la vie, la vie c'est l'inverse de la mort. Je peux encore écrire pendant longtemts mais là j'ai une flemme.", + datePublication: Date.now, + duration: 30, + isPlayed: true) + + let episode2: Episode = Episode( + title: "L'assistant vocal d'Underscore", + description: "Texte qui ne décrit pas grand chose mais c'est intéressant de marquer beaucoup de texte juste pour écrire. C'est long mais bon c'est la vie, la vie c'est l'inverse de la mort. Je peux encore écrire pendant longtemts mais là j'ai une flemme.", + datePublication: Date.now, + duration: 30, + isPlayed: false) + + let episode3: Episode = Episode( + title: "L'assistant vocal d'Underscore", + description: "Texte qui ne décrit pas grand chose mais c'est intéressant de marquer beaucoup de texte juste pour écrire. C'est long mais bon c'est la vie, la vie c'est l'inverse de la mort. Je peux encore écrire pendant longtemts mais là j'ai une flemme.", + datePublication: Date.now, + duration: 30, + isPlayed: true, + isDownloaded: true) + Group { - PodcastEpisode() - PodcastEpisode().preferredColorScheme(.dark) + PodcastEpisode(episode: episode1) + PodcastEpisode(episode: episode1).preferredColorScheme(.dark) + + PodcastEpisode(episode: episode2) + PodcastEpisode(episode: episode2).preferredColorScheme(.dark) + + PodcastEpisode(episode: episode3) + PodcastEpisode(episode: episode3).preferredColorScheme(.dark) } } diff --git a/src/PodcastsApp/PodcastsApp/Views/PodcastListItem.swift b/src/PodcastsApp/PodcastsApp/Views/PodcastListItem.swift index bdef4bf..c7f97ca 100644 --- a/src/PodcastsApp/PodcastsApp/Views/PodcastListItem.swift +++ b/src/PodcastsApp/PodcastsApp/Views/PodcastListItem.swift @@ -8,30 +8,39 @@ import SwiftUI struct PodcastListItem: View { + var podcast: Podcast + var body: some View { - VStack(alignment: .center) { - Image(uiImage: UIImage(named: "underscore_podcast")!) + VStack(alignment: .leading) { + Image(podcast.coverImage) .resizable() - .aspectRatio(contentMode: .fit) - .cornerRadius(5) + .aspectRatio(contentMode: .fill) + .cornerRadius(8) VStack(alignment: .leading) { - Text("Underscore_") - HStack { - Text("Mise à jour : ") - Text("Mardi") - } + Text(podcast.name) + .bold() + Text("Mise à jour : Il y a 2j") } + .aspectRatio(contentMode: .fit) } - .frame(width: 200, height: 200) - + .frame(width: 175, height: 175) } } struct PodcastListDetail_Previews: PreviewProvider { static var previews: some View { + let podcast: Podcast = Podcast( + name: "Underscore_", + creator: "Micode", + coverImage: "underscore_podcast", + nbStars: 4.7, + nbEvaluations: 963, + topic: "Technologies", + lastUpdateDate: Date.now) + Group { - PodcastListItem() - PodcastListItem().preferredColorScheme(.dark) + PodcastListItem(podcast: podcast) + PodcastListItem(podcast: podcast).preferredColorScheme(.dark) } } } diff --git a/src/PodcastsApp/PodcastsApp/Views/PodcastListView.swift b/src/PodcastsApp/PodcastsApp/Views/PodcastListView.swift index d577879..99c2b88 100644 --- a/src/PodcastsApp/PodcastsApp/Views/PodcastListView.swift +++ b/src/PodcastsApp/PodcastsApp/Views/PodcastListView.swift @@ -12,31 +12,12 @@ struct PodcastListView: View { var body: some View { NavigationStack { - List { - LazyVGrid(columns: columns, spacing: 20) { - NavigationLink(destination: PodcastView()) { - PodcastListItem() - } - NavigationLink(destination: PodcastView()) { - PodcastListItem() - } - NavigationLink(destination: PodcastView()) { - PodcastListItem() - } - NavigationLink(destination: PodcastView()) { - PodcastListItem() - } - NavigationLink(destination: PodcastView()) { - PodcastListItem() - } - NavigationLink(destination: PodcastView()) { - PodcastListItem() - } - NavigationLink(destination: PodcastView()) { - PodcastListItem() - } - NavigationLink(destination: PodcastView()) { - PodcastListItem() + ScrollView { + LazyVGrid(columns: columns, spacing: 70) { + ForEach(podcastList) { podcast in + NavigationLink(destination: PodcastView(podcast: podcast)) { + PodcastListItem(podcast: podcast) + } } } } diff --git a/src/PodcastsApp/PodcastsApp/Views/PodcastView.swift b/src/PodcastsApp/PodcastsApp/Views/PodcastView.swift index 953dc1c..b247a33 100644 --- a/src/PodcastsApp/PodcastsApp/Views/PodcastView.swift +++ b/src/PodcastsApp/PodcastsApp/Views/PodcastView.swift @@ -8,46 +8,45 @@ import SwiftUI struct PodcastView: View { + let columns = [GridItem(.flexible())] + + var podcast: Podcast + var body: some View { NavigationStack { - List { + ScrollView { VStack { - Image(uiImage: UIImage(named: "underscore_podcast")!) - .resizable() - .aspectRatio(contentMode: .fit) - .cornerRadius(5) - Text("Underscore") - Text("Micode") - Button(action: {}) { - HStack { - Image(systemName: "play.fill") - Text("Reprendre") - } - } - .clipShape(Rectangle()) - .background(.gray) - .blur(radius: 0.5) + PodcastCover(podcast: podcast) - List { - PodcastEpisode() - PodcastEpisode() - PodcastEpisode() - } - } - .toolbar { - HStack { - Button(action: {}) { - Image(systemName: "checkmark") + LazyVGrid(columns: columns, spacing: 10, pinnedViews: [.sectionHeaders]) { + Section { + HStack { + Text("Épisodes") + } } - .clipShape(Circle()) - Button(action: {}) { - Image(systemName: "ellipsis") + ForEach (podcast.episodes) { episode in + PodcastEpisode(episode: episode) } - .clipShape(Circle()) } } } + .toolbar { + HStack { + Button(action: {}) { + Image(systemName: "checkmark") + } + .clipShape(Circle()) + .buttonStyle(.bordered) + + Button(action: {}) { + Image(systemName: "ellipsis") + } + .clipShape(Circle()) + .buttonStyle(.bordered) + } + } + .listStyle(.grouped) } } } @@ -55,8 +54,8 @@ struct PodcastView: View { struct PodcastInfoDetail_Previews: PreviewProvider { static var previews: some View { Group { - PodcastView() - PodcastView().preferredColorScheme(.dark) + PodcastView(podcast: podcastList[0]) + PodcastView(podcast: podcastList[0]).preferredColorScheme(.dark) } }