💄 - add stub and reformat views

main
DJYohann 2 years ago
parent 02518bcb31
commit 53ea3c88b7

@ -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 = "<group>"; };
1E8272EC2A155CFB005837D3 /* Episode.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Episode.swift; sourceTree = "<group>"; };
1E8272EE2A1584CC005837D3 /* LibraryMenu.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LibraryMenu.swift; sourceTree = "<group>"; };
1E8272F02A1597C8005837D3 /* MenuItem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MenuItem.swift; sourceTree = "<group>"; };
1E8272F22A15A361005837D3 /* PodcastCover.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PodcastCover.swift; sourceTree = "<group>"; };
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>"; };
@ -91,14 +99,6 @@
/* End PBXFrameworksBuildPhase section */
/* Begin PBXGroup section */
1E92BCE72A1401490026C641 /* Utils */ = {
isa = PBXGroup;
children = (
1E92BCE82A14015E0026C641 /* Images.swift */,
);
path = Utils;
sourceTree = "<group>";
};
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 = "<group>";
@ -177,6 +178,9 @@
isa = PBXGroup;
children = (
1E92BCEA2A14032D0026C641 /* Podcast.swift */,
1E8272EA2A151FA6005837D3 /* Stub.swift */,
1E8272EC2A155CFB005837D3 /* Episode.swift */,
1E8272F02A1597C8005837D3 /* MenuItem.swift */,
);
path = Model;
sourceTree = "<group>";
@ -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 */,

@ -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
}
}

@ -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
}
}

@ -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
}
}

@ -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
}
}

@ -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
}

@ -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
}

@ -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] = []
}

@ -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),
]

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

@ -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()
}
}

@ -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)
}
}

@ -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")
}
}
}

@ -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)
}
}
}

@ -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)
}
}

@ -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)
}
}
}

@ -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)
}
}
}
}

@ -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)
}
}

Loading…
Cancel
Save