💄 - add master and detail of podcasts

main
DJYohann 2 years ago
parent 5ad0c6e7d4
commit 02518bcb31

@ -7,6 +7,13 @@
objects = {
/* Begin PBXBuildFile section */
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 */; };
1E92BCF32A1440B20026C641 /* LibraryMenuItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1E92BCF22A1440B20026C641 /* LibraryMenuItem.swift */; };
1EFF14972A10E76A0018278E /* PodcastsAppApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1EFF14962A10E76A0018278E /* PodcastsAppApp.swift */; };
1EFF14992A10E76A0018278E /* ContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1EFF14982A10E76A0018278E /* ContentView.swift */; };
1EFF149B2A10E76C0018278E /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 1EFF149A2A10E76C0018278E /* Assets.xcassets */; };
@ -14,7 +21,9 @@
1EFF14A82A10E76D0018278E /* PodcastsAppTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1EFF14A72A10E76D0018278E /* PodcastsAppTests.swift */; };
1EFF14B22A10E76D0018278E /* PodcastsAppUITests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1EFF14B12A10E76D0018278E /* PodcastsAppUITests.swift */; };
1EFF14B42A10E76D0018278E /* PodcastsAppUITestsLaunchTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1EFF14B32A10E76D0018278E /* PodcastsAppUITestsLaunchTests.swift */; };
1EFF14C42A10FBDE0018278E /* PodcastsListView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1EFF14C32A10FBDE0018278E /* PodcastsListView.swift */; };
1EFF14C42A10FBDE0018278E /* LibraryView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1EFF14C32A10FBDE0018278E /* LibraryView.swift */; };
1EFF14C72A1116D90018278E /* PodcastEpisode.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1EFF14C62A1116D90018278E /* PodcastEpisode.swift */; };
1EFF14C92A1139E80018278E /* NowPlayingBar.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1EFF14C82A1139E80018278E /* NowPlayingBar.swift */; };
/* End PBXBuildFile section */
/* Begin PBXContainerItemProxy section */
@ -35,6 +44,13 @@
/* End PBXContainerItemProxy section */
/* Begin PBXFileReference section */
1E92BCE32A13FD4E0026C641 /* PodcastListItem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PodcastListItem.swift; sourceTree = "<group>"; };
1E92BCE52A1400660026C641 /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = "<group>"; };
1E92BCE82A14015E0026C641 /* Images.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Images.swift; sourceTree = "<group>"; };
1E92BCEA2A14032D0026C641 /* Podcast.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Podcast.swift; sourceTree = "<group>"; };
1E92BCEE2A14319D0026C641 /* PodcastListView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PodcastListView.swift; sourceTree = "<group>"; };
1E92BCF02A1439000026C641 /* PodcastView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PodcastView.swift; sourceTree = "<group>"; };
1E92BCF22A1440B20026C641 /* LibraryMenuItem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LibraryMenuItem.swift; sourceTree = "<group>"; };
1EFF14932A10E76A0018278E /* PodcastsApp.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = PodcastsApp.app; sourceTree = BUILT_PRODUCTS_DIR; };
1EFF14962A10E76A0018278E /* PodcastsAppApp.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PodcastsAppApp.swift; sourceTree = "<group>"; };
1EFF14982A10E76A0018278E /* ContentView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContentView.swift; sourceTree = "<group>"; };
@ -45,7 +61,9 @@
1EFF14AD2A10E76D0018278E /* PodcastsAppUITests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = PodcastsAppUITests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
1EFF14B12A10E76D0018278E /* PodcastsAppUITests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PodcastsAppUITests.swift; sourceTree = "<group>"; };
1EFF14B32A10E76D0018278E /* PodcastsAppUITestsLaunchTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PodcastsAppUITestsLaunchTests.swift; sourceTree = "<group>"; };
1EFF14C32A10FBDE0018278E /* PodcastsListView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PodcastsListView.swift; sourceTree = "<group>"; };
1EFF14C32A10FBDE0018278E /* LibraryView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LibraryView.swift; sourceTree = "<group>"; };
1EFF14C62A1116D90018278E /* PodcastEpisode.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PodcastEpisode.swift; sourceTree = "<group>"; };
1EFF14C82A1139E80018278E /* NowPlayingBar.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NowPlayingBar.swift; sourceTree = "<group>"; };
/* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */
@ -73,6 +91,14 @@
/* End PBXFrameworksBuildPhase section */
/* Begin PBXGroup section */
1E92BCE72A1401490026C641 /* Utils */ = {
isa = PBXGroup;
children = (
1E92BCE82A14015E0026C641 /* Images.swift */,
);
path = Utils;
sourceTree = "<group>";
};
1EFF148A2A10E76A0018278E = {
isa = PBXGroup;
children = (
@ -96,10 +122,13 @@
1EFF14952A10E76A0018278E /* PodcastsApp */ = {
isa = PBXGroup;
children = (
1E92BCE72A1401490026C641 /* Utils */,
1EFF14C52A1116430018278E /* Model */,
1EFF14C02A10F3AC0018278E /* Views */,
1EFF14962A10E76A0018278E /* PodcastsAppApp.swift */,
1EFF14982A10E76A0018278E /* ContentView.swift */,
1EFF149A2A10E76C0018278E /* Assets.xcassets */,
1E92BCE52A1400660026C641 /* Images.xcassets */,
1EFF149C2A10E76C0018278E /* Preview Content */,
);
path = PodcastsApp;
@ -133,11 +162,25 @@
1EFF14C02A10F3AC0018278E /* Views */ = {
isa = PBXGroup;
children = (
1EFF14C32A10FBDE0018278E /* PodcastsListView.swift */,
1EFF14C32A10FBDE0018278E /* LibraryView.swift */,
1EFF14C62A1116D90018278E /* PodcastEpisode.swift */,
1EFF14C82A1139E80018278E /* NowPlayingBar.swift */,
1E92BCE32A13FD4E0026C641 /* PodcastListItem.swift */,
1E92BCEE2A14319D0026C641 /* PodcastListView.swift */,
1E92BCF02A1439000026C641 /* PodcastView.swift */,
1E92BCF22A1440B20026C641 /* LibraryMenuItem.swift */,
);
path = Views;
sourceTree = "<group>";
};
1EFF14C52A1116430018278E /* Model */ = {
isa = PBXGroup;
children = (
1E92BCEA2A14032D0026C641 /* Podcast.swift */,
);
path = Model;
sourceTree = "<group>";
};
/* End PBXGroup section */
/* Begin PBXNativeTarget section */
@ -242,6 +285,7 @@
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = (
1E92BCE62A1400660026C641 /* Images.xcassets in Resources */,
1EFF149E2A10E76C0018278E /* Preview Assets.xcassets in Resources */,
1EFF149B2A10E76C0018278E /* Assets.xcassets in Resources */,
);
@ -268,9 +312,17 @@
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
1E92BCE92A14015E0026C641 /* Images.swift in Sources */,
1E92BCF32A1440B20026C641 /* LibraryMenuItem.swift in Sources */,
1EFF14992A10E76A0018278E /* ContentView.swift in Sources */,
1EFF14C42A10FBDE0018278E /* PodcastsListView.swift in Sources */,
1E92BCEF2A14319D0026C641 /* PodcastListView.swift in Sources */,
1EFF14C42A10FBDE0018278E /* LibraryView.swift in Sources */,
1EFF14972A10E76A0018278E /* PodcastsAppApp.swift in Sources */,
1EFF14C92A1139E80018278E /* NowPlayingBar.swift in Sources */,
1E92BCF12A1439000026C641 /* PodcastView.swift in Sources */,
1EFF14C72A1116D90018278E /* PodcastEpisode.swift in Sources */,
1E92BCEB2A14032D0026C641 /* Podcast.swift in Sources */,
1E92BCE42A13FD4E0026C641 /* PodcastListItem.swift in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@ -426,6 +478,7 @@
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
ASSETCATALOG_COMPILER_INCLUDE_ALL_APPICON_ASSETS = NO;
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 1;
DEVELOPMENT_ASSET_PATHS = "\"PodcastsApp/Preview Content\"";
@ -454,6 +507,7 @@
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
ASSETCATALOG_COMPILER_INCLUDE_ALL_APPICON_ASSETS = NO;
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 1;
DEVELOPMENT_ASSET_PATHS = "\"PodcastsApp/Preview Content\"";

@ -1,6 +1,23 @@
{
"colors" : [
{
"color" : {
"platform" : "universal",
"reference" : "systemPurpleColor"
},
"idiom" : "universal"
},
{
"appearances" : [
{
"appearance" : "luminosity",
"value" : "dark"
}
],
"color" : {
"platform" : "universal",
"reference" : "systemPurpleColor"
},
"idiom" : "universal"
}
],

Binary file not shown.

After

Width:  |  Height:  |  Size: 144 KiB

@ -1,6 +1,7 @@
{
"images" : [
{
"filename" : "1024.png",
"idiom" : "universal",
"platform" : "ios",
"size" : "1024x1024"

@ -8,30 +8,62 @@
import SwiftUI
struct ContentView: View {
@State private var selection: Tab = .library
enum Tab {
case listen
case explore
case library
case search
}
var body: some View {
TabView {
PodcastsListView()
TabView(selection: $selection) {
LibraryView()
.tabItem({
Label("Écouter", systemImage: "play.circle.fill")
})
PodcastsListView()
.tag(Tab.listen)
LibraryView()
.tabItem({
Label("Explorer", systemImage: "square.grid.2x2.fill")
})
PodcastsListView()
.tag(Tab.explore)
LibraryView()
.tabItem({
Label("Bibliothèque", systemImage: "square.stack.fill")
})
PodcastsListView()
.tag(Tab.library)
LibraryView()
.tabItem({
Label("Rechercher", systemImage: "magnifyingglass")
})
.tag(Tab.search)
}
.onAppear {
let appearance = UITabBarAppearance()
appearance.backgroundEffect = UIBlurEffect(style: .systemUltraThinMaterial)
appearance.backgroundColor = UIColor(Color.black.opacity(0.2))
// Use this appearance when scrolling behind the TabView:
UITabBar.appearance().standardAppearance = appearance
// Use this appearance when scrolled all the way up:
UITabBar.appearance().scrollEdgeAppearance = appearance
}
.overlay(VStack {
Spacer()
NowPlayingBar()
.frame(height: 162)
})
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
Group {
ContentView()
ContentView().preferredColorScheme(.dark)
}
}
}

@ -0,0 +1,6 @@
{
"info" : {
"author" : "xcode",
"version" : 1
}
}

@ -0,0 +1,21 @@
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "underscore.jpeg",
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 MiB

@ -0,0 +1,12 @@
//
// Podcast.swift
// PodcastsApp
//
// Created by BREUIL Yohann on 16/05/2023.
//
import Foundation
struct Podcast {
}

@ -0,0 +1,12 @@
//
// Images.swift
// PodcastsApp
//
// Created by BREUIL Yohann on 16/05/2023.
//
import Foundation
//static class Images {
//
//}

@ -0,0 +1,35 @@
//
// LibraryMenuItem.swift
// PodcastsApp
//
// Created by BREUIL Yohann on 17/05/2023.
//
import SwiftUI
struct LibraryMenuItem: View {
@State var imageName: String
@State var text: String
var body: some View {
HStack {
Image(systemName: imageName)
.foregroundColor(.accentColor)
Text(text)
.bold()
}
}
}
struct LibraryMenuItem_Previews: PreviewProvider {
static var previews: some View {
Group {
LibraryMenuItem(imageName: "square.stack", text: "Podcasts")
LibraryMenuItem(imageName: "checklist.unchecked", text: "Chaînes")
LibraryMenuItem(imageName: "square.stack", text: "Podcasts").preferredColorScheme(.dark)
LibraryMenuItem(imageName: "checklist.unchecked", text: "Chaînes").preferredColorScheme(.dark)
}
}
}

@ -0,0 +1,79 @@
//
// PodcastsListView.swift
// PodcastsApp
//
// Created by BREUIL Yohann on 14/05/2023.
//
import SwiftUI
struct LibraryView: View {
let columns = [GridItem(.flexible()), GridItem(.flexible())]
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")
}
VStack {
Text("Mis à jour récemment")
.font(.title2)
.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()
}
}
}
.padding(.top)
}
.navigationTitle("Bibliothèque")
}
}
}
struct PodcastsListView_Previews: PreviewProvider {
static var previews: some View {
Group {
LibraryView()
LibraryView().preferredColorScheme(.dark)
}
}
}

@ -0,0 +1,51 @@
//
// NowPlayingBar.swift
// PodcastsApp
//
// Created by BREUIL Yohann on 14/05/2023.
//
import SwiftUI
struct NowPlayingBar : View {
var body: some View {
ZStack {
Rectangle()
.foregroundColor(Color.black.opacity(0.2))
.frame(width: UIScreen.main.bounds.size.width, height: 65)
HStack {
Button(action: {}) {
HStack {
Image("Cover")
.resizable()
.frame(width: 45, height: 45)
.shadow(radius: 6, x: 0, y: 3)
.padding(.leading)
Text("Shake It Off").padding(.leading, 10)
Spacer()
}
}
.buttonStyle(PlainButtonStyle())
Button(action: {}) {
Image(systemName: "play.fill").font(.title3)
}
.buttonStyle(PlainButtonStyle()).padding(.horizontal)
Button(action: {}) {
Image(systemName: "forward.fill").font(.title3)
}
.buttonStyle(PlainButtonStyle())
.padding(.trailing, 30)
}
}
}
}
struct NowPlayingBar_Previews: PreviewProvider {
static var previews: some View {
NowPlayingBar()
}
}

@ -0,0 +1,46 @@
//
// PodcastEpisodeDetail.swift
// PodcastsApp
//
// Created by BREUIL Yohann on 14/05/2023.
//
import SwiftUI
struct PodcastEpisode: View {
var body: some View {
VStack(alignment: .leading) {
Text("Samedi")
.font(.caption)
.textCase(.uppercase)
Text("Title of episode")
.font(.title2)
Text("Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do")
HStack {
Button(action: {}) {
Image(systemName: "play.fill")
}
.frame(width: 33, height: 33)
.foregroundColor(Color.purple)
.background(Color.gray)
.clipShape(Circle())
Text("52 min")
Spacer()
Image(systemName: "ellipsis")
}
}
.padding()
}
}
struct PodcastEpisodeDetail_Previews: PreviewProvider {
static var previews: some View {
Group {
PodcastEpisode()
PodcastEpisode().preferredColorScheme(.dark)
}
}
}

@ -0,0 +1,37 @@
//
// PodcastListDetail.swift
// PodcastsApp
//
// Created by BREUIL Yohann on 16/05/2023.
//
import SwiftUI
struct PodcastListItem: View {
var body: some View {
VStack(alignment: .center) {
Image(uiImage: UIImage(named: "underscore_podcast")!)
.resizable()
.aspectRatio(contentMode: .fit)
.cornerRadius(5)
VStack(alignment: .leading) {
Text("Underscore_")
HStack {
Text("Mise à jour : ")
Text("Mardi")
}
}
}
.frame(width: 200, height: 200)
}
}
struct PodcastListDetail_Previews: PreviewProvider {
static var previews: some View {
Group {
PodcastListItem()
PodcastListItem().preferredColorScheme(.dark)
}
}
}

@ -0,0 +1,62 @@
//
// PodcastsList.swift
// PodcastsApp
//
// Created by BREUIL Yohann on 16/05/2023.
//
import SwiftUI
struct PodcastListView: View {
let columns = [GridItem(.flexible()), GridItem(.flexible())]
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()
}
}
}
.navigationTitle("Podcasts")
.toolbar {
Button(action: {}) {
Image(systemName: "ellipsis")
}
.clipShape(Circle())
}
}
}
}
struct PodcastsList_Previews: PreviewProvider {
static var previews: some View {
Group {
PodcastListView()
PodcastListView().preferredColorScheme(.dark)
}
}
}

@ -0,0 +1,63 @@
//
// PodcastInfoDetail.swift
// PodcastsApp
//
// Created by BREUIL Yohann on 17/05/2023.
//
import SwiftUI
struct PodcastView: View {
var body: some View {
NavigationStack {
List {
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)
List {
PodcastEpisode()
PodcastEpisode()
PodcastEpisode()
}
}
.toolbar {
HStack {
Button(action: {}) {
Image(systemName: "checkmark")
}
.clipShape(Circle())
Button(action: {}) {
Image(systemName: "ellipsis")
}
.clipShape(Circle())
}
}
}
}
}
}
struct PodcastInfoDetail_Previews: PreviewProvider {
static var previews: some View {
Group {
PodcastView()
PodcastView().preferredColorScheme(.dark)
}
}
}

@ -1,20 +0,0 @@
//
// PodcastsListView.swift
// PodcastsApp
//
// Created by BREUIL Yohann on 14/05/2023.
//
import SwiftUI
struct PodcastsListView: View {
var body: some View {
Text("Coming soon")
}
}
struct PodcastsListView_Previews: PreviewProvider {
static var previews: some View {
PodcastsListView()
}
}
Loading…
Cancel
Save