From 86b6e0c76534e7dc3df328fccb0ab67261b1c2dc Mon Sep 17 00:00:00 2001 From: "emre.kartal" Date: Wed, 31 Jan 2024 16:11:27 +0100 Subject: [PATCH 1/4] Add View CurrentBet --- Sources/AllInApp/AllIn/Components/Menu.swift | 21 +++++++--- .../ViewModels/CurrentBetViewModel.swift | 28 +++++++++++++ .../AllInApp/AllIn/Views/CurrentBetView.swift | 42 +++++++++++++++++++ .../AllIn/Views/HistoricBetView.swift | 1 - Sources/AllInApp/AllIn/Views/MainView.swift | 2 + .../AllInApp.xcodeproj/project.pbxproj | 8 ++++ Sources/Api/Sources/Api/UserApiManager.swift | 30 +++++++++++++ Sources/Model/Sources/Model/Manager.swift | 6 +++ .../Model/Sources/Model/UserDataManager.swift | 1 + 9 files changed, 132 insertions(+), 7 deletions(-) create mode 100644 Sources/AllInApp/AllIn/ViewModels/CurrentBetViewModel.swift create mode 100644 Sources/AllInApp/AllIn/Views/CurrentBetView.swift diff --git a/Sources/AllInApp/AllIn/Components/Menu.swift b/Sources/AllInApp/AllIn/Components/Menu.swift index 3bfd971..9d184d8 100644 --- a/Sources/AllInApp/AllIn/Components/Menu.swift +++ b/Sources/AllInApp/AllIn/Components/Menu.swift @@ -86,17 +86,26 @@ struct Menu: View { .padding([.leading,.trailing], 13) } - NavigationLink(destination: MainView(page: "Bet").navigationBarBackButtonHidden(true)) - { - ParameterMenu(image: "moneyImage", title: "BET EN COURS", description: "Gérez vos bets et récompensez les gagnants.") - .padding([.leading,.trailing], 13) + VStack { + NavigationLink(destination: MainView(page: "Bet").navigationBarBackButtonHidden(true)) + { + ParameterMenu(image: "moneyImage", title: "BET EN COURS", description: "Gérez vos bets et récompensez les gagnants.") + .padding([.leading,.trailing], 13) + } + NavigationLink(destination: MainView(page: "Ranking").navigationBarBackButtonHidden(true)) + { + ParameterMenu(image: "rankingImage", title: "CLASSEMENT", description: "Consultez votre classement parmis vos amis.") + .padding([.leading,.trailing], 13) + } } - NavigationLink(destination: MainView(page: "Ranking").navigationBarBackButtonHidden(true)) + + NavigationLink(destination: MainView(page: "Current").navigationBarBackButtonHidden(true)) { - ParameterMenu(image: "rankingImage", title: "CLASSEMENT", description: "Consultez votre classement parmis vos amis.") + ParameterMenu(image: "eyesImage", title: "BETS EN COURS", description: "Consultez vos paris en cours.") .padding([.leading,.trailing], 13) } + HStack { Spacer() Button { diff --git a/Sources/AllInApp/AllIn/ViewModels/CurrentBetViewModel.swift b/Sources/AllInApp/AllIn/ViewModels/CurrentBetViewModel.swift new file mode 100644 index 0000000..70691eb --- /dev/null +++ b/Sources/AllInApp/AllIn/ViewModels/CurrentBetViewModel.swift @@ -0,0 +1,28 @@ +// +// CurrentBetViewModel.swift +// AllIn +// +// Created by Emre on 31/01/2024. +// + +import Foundation +import DependencyInjection +import Model + +class CurrentBetViewModel: ObservableObject { + + @Inject var manager: Manager + + @Published private(set) var bets: [Bet] = [] + + init() { + getItems() + } + + func getItems() { + manager.getCurrentBets(withIndex: 0, withCount: 20) { bets in + self.bets = bets + } + } + +} diff --git a/Sources/AllInApp/AllIn/Views/CurrentBetView.swift b/Sources/AllInApp/AllIn/Views/CurrentBetView.swift new file mode 100644 index 0000000..275e93b --- /dev/null +++ b/Sources/AllInApp/AllIn/Views/CurrentBetView.swift @@ -0,0 +1,42 @@ +// +// CurrentBetView.swift +// AllIn +// +// Created by Emre on 31/01/2024. +// + +import SwiftUI +import Model + +struct CurrentBetView: View { + + @StateObject private var viewModel = CurrentBetViewModel() + @Binding var showMenu: Bool + @State private var showingSheet = false + + var body: some View { + + VStack(alignment: .center, spacing: 0) { + + TopBar(showMenu: self.$showMenu) + ScrollView(showsIndicators: false) { + Text("En cours") + .textStyle(weight: .bold, color: AllInColors.grey500Color, size: 25) + .padding([.top],15) + VStack(spacing: 20){ + ForEach(viewModel.bets, id: \.id) { (bet: Bet) in + ReviewCard(amountBetted: 110, isAWin: false) + } + } + .padding([.trailing, .leading, .bottom],25) + } + .refreshable { + viewModel.getItems() + } + Spacer() + } + .edgesIgnoringSafeArea(.bottom) + .background(AllInColors.backgroundColor) + } +} + diff --git a/Sources/AllInApp/AllIn/Views/HistoricBetView.swift b/Sources/AllInApp/AllIn/Views/HistoricBetView.swift index beaebcb..2e4dea0 100644 --- a/Sources/AllInApp/AllIn/Views/HistoricBetView.swift +++ b/Sources/AllInApp/AllIn/Views/HistoricBetView.swift @@ -9,7 +9,6 @@ import SwiftUI struct HistoricBetView: View { - @StateObject private var viewModel = BetViewModel() @Binding var showMenu: Bool @State private var showingSheet = false diff --git a/Sources/AllInApp/AllIn/Views/MainView.swift b/Sources/AllInApp/AllIn/Views/MainView.swift index 9b7900a..5dae676 100644 --- a/Sources/AllInApp/AllIn/Views/MainView.swift +++ b/Sources/AllInApp/AllIn/Views/MainView.swift @@ -46,6 +46,8 @@ struct MainView: View { FriendsView(showMenu: self.$showMenu) case "CreationBet": CreationBetView(showMenu: self.$showMenu) + case "Current": + CurrentBetView(showMenu: self.$showMenu) default: BetView(showMenu: self.$showMenu) } diff --git a/Sources/AllInApp/AllInApp.xcodeproj/project.pbxproj b/Sources/AllInApp/AllInApp.xcodeproj/project.pbxproj index 9d640e0..da2b013 100644 --- a/Sources/AllInApp/AllInApp.xcodeproj/project.pbxproj +++ b/Sources/AllInApp/AllInApp.xcodeproj/project.pbxproj @@ -23,6 +23,8 @@ EC01937E2B25C52E005D81E6 /* TopBar.swift in Sources */ = {isa = PBXBuildFile; fileRef = EC01937D2B25C52E005D81E6 /* TopBar.swift */; }; EC01FCC32B56650400BB2390 /* DetailsViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = EC01FCC22B56650400BB2390 /* DetailsViewModel.swift */; }; EC01FCC52B56791B00BB2390 /* HistoricBetViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = EC01FCC42B56791B00BB2390 /* HistoricBetViewModel.swift */; }; + EC17A15E2B6A955E008A8679 /* CurrentBetView.swift in Sources */ = {isa = PBXBuildFile; fileRef = EC17A15D2B6A955E008A8679 /* CurrentBetView.swift */; }; + EC17A1602B6A9781008A8679 /* CurrentBetViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = EC17A15F2B6A9781008A8679 /* CurrentBetViewModel.swift */; }; EC3077072B24CB840060E34D /* SplashView.swift in Sources */ = {isa = PBXBuildFile; fileRef = EC3077062B24CB840060E34D /* SplashView.swift */; }; EC3077092B24CF7F0060E34D /* Colors.swift in Sources */ = {isa = PBXBuildFile; fileRef = EC3077082B24CF7F0060E34D /* Colors.swift */; }; EC30770B2B24D9160060E34D /* WelcomeView.swift in Sources */ = {isa = PBXBuildFile; fileRef = EC30770A2B24D9160060E34D /* WelcomeView.swift */; }; @@ -123,6 +125,8 @@ EC01937D2B25C52E005D81E6 /* TopBar.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TopBar.swift; sourceTree = ""; }; EC01FCC22B56650400BB2390 /* DetailsViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DetailsViewModel.swift; sourceTree = ""; }; EC01FCC42B56791B00BB2390 /* HistoricBetViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HistoricBetViewModel.swift; sourceTree = ""; }; + EC17A15D2B6A955E008A8679 /* CurrentBetView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CurrentBetView.swift; sourceTree = ""; }; + EC17A15F2B6A9781008A8679 /* CurrentBetViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CurrentBetViewModel.swift; sourceTree = ""; }; EC3077062B24CB840060E34D /* SplashView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SplashView.swift; sourceTree = ""; }; EC3077082B24CF7F0060E34D /* Colors.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Colors.swift; sourceTree = ""; }; EC30770A2B24D9160060E34D /* WelcomeView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WelcomeView.swift; sourceTree = ""; }; @@ -309,6 +313,7 @@ 1244EF5F2B4EC31E00374ABF /* HistoricBetView.swift */, 123590B32B51792000F7AEBD /* DetailsView.swift */, 123225D82B67B46100D30BB3 /* BetEndingValidationView.swift */, + EC17A15D2B6A955E008A8679 /* CurrentBetView.swift */, ); path = Views; sourceTree = ""; @@ -367,6 +372,7 @@ ECB26A1A2B40746C00FE06B3 /* FriendsViewModel.swift */, EC01FCC22B56650400BB2390 /* DetailsViewModel.swift */, EC01FCC42B56791B00BB2390 /* HistoricBetViewModel.swift */, + EC17A15F2B6A9781008A8679 /* CurrentBetViewModel.swift */, ); path = ViewModels; sourceTree = ""; @@ -526,11 +532,13 @@ ECB26A192B40744F00FE06B3 /* RankingViewModel.swift in Sources */, EC650A502B2793D5003AFCAD /* TextCapsule.swift in Sources */, EC650A482B25DCFF003AFCAD /* UsersPreview.swift in Sources */, + EC17A15E2B6A955E008A8679 /* CurrentBetView.swift in Sources */, EC650A462B25D686003AFCAD /* RankingRow.swift in Sources */, EC01937A2B25C12B005D81E6 /* BetCard.swift in Sources */, EC650A422B25C817003AFCAD /* Friend.swift in Sources */, EC7A882F2B28E6BE004F226A /* ConfidentialityButton.swift in Sources */, ECB7BC702B336E28002A6654 /* RegisterViewModel.swift in Sources */, + EC17A1602B6A9781008A8679 /* CurrentBetViewModel.swift in Sources */, EC650A4C2B25E9C7003AFCAD /* RankingView.swift in Sources */, EC7A882B2B28D1E0004F226A /* DropDownMenu.swift in Sources */, EC7A882D2B28D8A1004F226A /* CreationBetView.swift in Sources */, diff --git a/Sources/Api/Sources/Api/UserApiManager.swift b/Sources/Api/Sources/Api/UserApiManager.swift index 59a79cc..c10fe43 100644 --- a/Sources/Api/Sources/Api/UserApiManager.swift +++ b/Sources/Api/Sources/Api/UserApiManager.swift @@ -51,6 +51,36 @@ public struct UserApiManager: UserDataManager { fatalError("Not implemented yet") } + public func getCurrentBets(withIndex index: Int, withCount count: Int, completion: @escaping ([Bet]) -> Void) { + let url = URL(string: allInApi + "bets/current")! + + var request = URLRequest(url: url) + request.httpMethod = "GET" + request.setValue("application/json", forHTTPHeaderField: "Content-Type") + request.setValue("Bearer \(token)", forHTTPHeaderField: "Authorization") + + var bets: [Bet] = [] + + URLSession.shared.dataTask(with: request) { data, response, error in + if let data = data { + print ("ALLIN : get current bets") + do { + if let httpResponse = response as? HTTPURLResponse, let jsonArray = try JSONSerialization.jsonObject(with: data, options: []) as? [[String: Any]] { + for json in jsonArray { + if let bet = FactoryApiBet().toBet(from: json) { + bets.append(bet) + } + } + print(httpResponse.statusCode) + completion(bets) + } + } catch { + print("Error parsing JSON: \(error)") + } + } + }.resume() + } + public func addParticipation(withId id: String, withAnswer answer: String, andStake stake: Int, completion : @escaping (Int)-> ()) { let url = URL(string: allInApi + "participations/add")! var request = URLRequest(url: url) diff --git a/Sources/Model/Sources/Model/Manager.swift b/Sources/Model/Sources/Model/Manager.swift index b8cbc23..5f65694 100644 --- a/Sources/Model/Sources/Model/Manager.swift +++ b/Sources/Model/Sources/Model/Manager.swift @@ -40,6 +40,12 @@ public struct Manager { } } + public func getCurrentBets(withIndex index: Int, withCount count: Int, completion: @escaping ([Bet]) -> Void) { + userDataManager.getCurrentBets(withIndex: index, withCount: count) { bets in + completion(bets) + } + } + public func addParticipation(withId id: String, withAnswer answer: String, andStake stake: Int, completion : @escaping (Int)-> ()) { userDataManager.addParticipation(withId: id, withAnswer: answer, andStake: stake) { status in completion(status) diff --git a/Sources/Model/Sources/Model/UserDataManager.swift b/Sources/Model/Sources/Model/UserDataManager.swift index 2fdc461..ff132db 100644 --- a/Sources/Model/Sources/Model/UserDataManager.swift +++ b/Sources/Model/Sources/Model/UserDataManager.swift @@ -12,5 +12,6 @@ public protocol UserDataManager { func addBet(bet: Bet, completion : @escaping (Int)-> ()) func getFriends() -> [User] func getOldBets(withIndex index: Int, withCount count: Int, completion: @escaping ([Bet]) -> Void) + func getCurrentBets(withIndex index: Int, withCount count: Int, completion: @escaping ([Bet]) -> Void) func addParticipation(withId id: String, withAnswer answer: String, andStake stake: Int, completion : @escaping (Int)-> ()) } From 27afb5718e3667373c18e8820290a15f077985fa Mon Sep 17 00:00:00 2001 From: Emre KARTAL Date: Thu, 1 Feb 2024 11:37:33 +0100 Subject: [PATCH 2/4] =?UTF-8?q?Mise=20=C3=A0=20jour=20de=20'.drone.yml'?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .drone.yml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/.drone.yml b/.drone.yml index 3e49dfc..24693e6 100644 --- a/.drone.yml +++ b/.drone.yml @@ -12,3 +12,9 @@ steps: commands: - cd Sources/Model - swift build + + - name: build + image: swift:latest + commands: + - cd Sources/Model + - swift test From f2ddcf9f08516fd602515ed6b34584bc1385fe69 Mon Sep 17 00:00:00 2001 From: Emre KARTAL Date: Thu, 1 Feb 2024 11:37:53 +0100 Subject: [PATCH 3/4] =?UTF-8?q?Mise=20=C3=A0=20jour=20de=20'.drone.yml'?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .drone.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.drone.yml b/.drone.yml index 24693e6..ac18c2d 100644 --- a/.drone.yml +++ b/.drone.yml @@ -13,7 +13,7 @@ steps: - cd Sources/Model - swift build - - name: build + - name: test image: swift:latest commands: - cd Sources/Model From 4238358cb6c8b527036650c8f08bdcc5fb28cd7c Mon Sep 17 00:00:00 2001 From: "emre.kartal" Date: Fri, 2 Feb 2024 22:00:04 +0100 Subject: [PATCH 4/4] Correction of the visual and refresh the Allcoins of a user :hammer: --- Sources/AllInApp/AllIn/AppState.swift | 2 +- .../AllIn/Components/AllcoinsCounter.swift | 5 +- .../AllInApp/AllIn/Components/BetCard.swift | 12 +- .../AllIn/Components/BetLineLoading.swift | 26 ++- .../AllIn/Components/DropDownAnswerMenu.swift | 5 +- .../AllIn/Components/ParticiationCell.swift | 14 +- .../AllIn/Components/ParticipateButton.swift | 3 +- .../AllIn/Components/ParticipationModal.swift | 159 ++++++++++-------- .../AllIn/Components/RankingRow.swift | 4 +- .../AllIn/Components/RecapBetCard.swift | 46 ++--- .../AllIn/Components/ReviewCard.swift | 11 +- .../AllIn/Components/TextCapsule.swift | 5 +- .../AllIn/Extensions/Extensions.swift | 39 ----- .../AllInApp/AllIn/Views/DetailsView.swift | 67 ++++---- 14 files changed, 197 insertions(+), 201 deletions(-) diff --git a/Sources/AllInApp/AllIn/AppState.swift b/Sources/AllInApp/AllIn/AppState.swift index d2d6693..ca9d3f4 100644 --- a/Sources/AllInApp/AllIn/AppState.swift +++ b/Sources/AllInApp/AllIn/AppState.swift @@ -12,7 +12,7 @@ class AppStateContainer: ObservableObject { static let shared = AppStateContainer() let loggedState: LoggedState = LoggedState() var onlineStatus: OnlineStatus = OnlineStatus() - var user: User? + @Published var user: User? @AppStorage("authenticationRefresh") var authenticationRefresh: String? } diff --git a/Sources/AllInApp/AllIn/Components/AllcoinsCounter.swift b/Sources/AllInApp/AllIn/Components/AllcoinsCounter.swift index 8d2a444..8dd954a 100644 --- a/Sources/AllInApp/AllIn/Components/AllcoinsCounter.swift +++ b/Sources/AllInApp/AllIn/Components/AllcoinsCounter.swift @@ -8,14 +8,17 @@ import SwiftUI struct AllcoinsCounter: View { + var backgroundColor: Color = .white var foregroundColor: Color = AllInColors.primaryColor + @ObservedObject var appStateContainer = AppStateContainer.shared + var body: some View { HStack(alignment: .center) { Image("allcoinIcon") .resizable() .frame(width: 17, height: 17, alignment: .leading) - Text(String(AppStateContainer.shared.user?.nbCoins ?? 0)) + Text(String(appStateContainer.user?.nbCoins ?? 0)) .fontWeight(.black) .foregroundColor(foregroundColor) } diff --git a/Sources/AllInApp/AllIn/Components/BetCard.swift b/Sources/AllInApp/AllIn/Components/BetCard.swift index 4e4073d..fc439bc 100644 --- a/Sources/AllInApp/AllIn/Components/BetCard.swift +++ b/Sources/AllInApp/AllIn/Components/BetCard.swift @@ -15,7 +15,7 @@ struct BetCard: View { @State var showParticipate: Bool = false var body: some View { - VStack(spacing: 0){ + VStack(spacing: 0) { VStack(alignment: .leading,spacing: 2){ HStack{ Spacer() @@ -31,7 +31,9 @@ struct BetCard: View { .font(.system(size: 20)) .fontWeight(.bold) HStack{ - Text("Commence le").font(.system(size: 15)).foregroundColor(AllInColors.grey800Color) + Text("Commence le") + .font(.system(size: 15)) + .foregroundColor(AllInColors.grey800Color) TextCapsule(date: bet.endRegisterDate) Spacer() } @@ -44,13 +46,14 @@ struct BetCard: View { HStack{ Spacer() UsersPreview() - Text(String(bet.registered.count) + " joueurs en attente") + Text(bet.registered.count.description + " joueurs en attente") .font(.system(size: 15)) .foregroundColor(AllInColors.grey800Color) .fontWeight(.medium) Spacer() - }.padding(0) + } + .padding(0) ParticipateButton(isOpen: $showDetails, isParticapatedOpen: $showParticipate, bet: bet) .padding(.top, 5) } @@ -60,6 +63,7 @@ struct BetCard: View { .cornerRadius(20, corners: [.bottomLeft,.bottomRight]) .border(width: 1, edges: [.top], color: AllInColors.delimiterGrey) } + .onTapGesture { showDetails.toggle() } diff --git a/Sources/AllInApp/AllIn/Components/BetLineLoading.swift b/Sources/AllInApp/AllIn/Components/BetLineLoading.swift index 73c5d49..2855892 100644 --- a/Sources/AllInApp/AllIn/Components/BetLineLoading.swift +++ b/Sources/AllInApp/AllIn/Components/BetLineLoading.swift @@ -23,17 +23,14 @@ struct BetLineLoading: View { return totalParticipations > 0 ? CGFloat(numberOfYes) / CGFloat(totalParticipations) : 0.0 } - - var yesParticipations: [Participation] { - return participations.filter { $0.response.uppercased() == "YES" } + participations.filter { $0.response.uppercased() == "YES" } } var noParticipations: [Participation] { - return participations.filter { $0.response.uppercased() == "NO" } + participations.filter { $0.response.uppercased() == "NO" } } - var body: some View { GeometryReader { geometry in VStack(alignment: .leading,spacing: 0){ @@ -53,16 +50,15 @@ struct BetLineLoading: View { HStack{ Spacer() Rectangle() - .frame(width: min(CGFloat(1-self.value)*geometry.size.width, geometry.size.width), height: 17) + .frame(width: min(CGFloat(1-self.value) * geometry.size.width, geometry.size.width), height: 17) .foregroundStyle(AllInColors.PinkBetGradiant).cornerRadius(999) } HStack(spacing: 0){ Rectangle() - .frame(width: min(CGFloat(self.value)*geometry.size.width, geometry.size.width), height: 17) + .frame(width: min(CGFloat(self.value) * geometry.size.width, geometry.size.width), height: 17) .foregroundStyle(AllInColors.BlueBetGradiant) .cornerRadius(999) - .animation(.linear) Image("loadingHeartIcon") .resizable() .frame(width: 29, height: 32) @@ -86,13 +82,13 @@ struct BetLineLoading: View { .foregroundColor(AllInColors.pink100) Image("pinkAllCoinIcon") .resizable() - .frame(width:10, height: 14) + .frame(width: 12, height: 12) } HStack(spacing: 5){ Image("bluePersonIcon") .resizable() - .frame(width:14, height: 12) + .frame(width: 12, height: 12) Text(yesParticipations.count.description) .font(.system(size: 15)) .fontWeight(.bold) @@ -104,13 +100,13 @@ struct BetLineLoading: View { .foregroundColor(AllInColors.pink100) Image("pinkPersonIcon") .resizable() - .frame(width:10, height: 14) + .frame(width: 12, height: 12) } HStack(spacing: 5){ Image("blueBadgeIcon") .resizable() - .frame(width:10, height: 14) + .frame(width: 12, height: 12) Text(yesParticipations.max(by: { $0.stake < $1.stake })?.stake.description ?? "0") .font(.system(size: 15)) .fontWeight(.bold) @@ -122,13 +118,13 @@ struct BetLineLoading: View { .foregroundColor(AllInColors.pink100) Image("pinkBadgeIcon") .resizable() - .frame(width:10, height: 14) + .frame(width: 12, height: 12) } HStack(spacing: 5){ Image("blueTrophyIcon") .resizable() - .frame(width:14, height: 13) + .frame(width: 12, height: 12) Text("1.2") .font(.system(size: 15)) .fontWeight(.bold) @@ -140,7 +136,7 @@ struct BetLineLoading: View { .foregroundColor(AllInColors.pink100) Image("pinkTrophyIcon") .resizable() - .frame(width:10, height: 14) + .frame(width:12, height: 12) } } diff --git a/Sources/AllInApp/AllIn/Components/DropDownAnswerMenu.swift b/Sources/AllInApp/AllIn/Components/DropDownAnswerMenu.swift index f7b301e..7825627 100644 --- a/Sources/AllInApp/AllIn/Components/DropDownAnswerMenu.swift +++ b/Sources/AllInApp/AllIn/Components/DropDownAnswerMenu.swift @@ -62,11 +62,10 @@ struct DropDownAnswerMenu: View { .padding([.leading, .trailing], 15) } }) - .frame(width: .infinity) .background(AllInColors.componentBackgroundColor) - .cornerRadius(10) + .cornerRadius(8) .overlay( - RoundedRectangle(cornerRadius: 10, style: .continuous) + RoundedRectangle(cornerRadius: 8, style: .continuous) .stroke(AllInColors.veryLightPurpleColor, lineWidth: 0.4) ) } diff --git a/Sources/AllInApp/AllIn/Components/ParticiationCell.swift b/Sources/AllInApp/AllIn/Components/ParticiationCell.swift index 735f808..5f0ae70 100644 --- a/Sources/AllInApp/AllIn/Components/ParticiationCell.swift +++ b/Sources/AllInApp/AllIn/Components/ParticiationCell.swift @@ -12,17 +12,23 @@ struct ParticiationCell: View { @State var participation: Participation? var body: some View { HStack(alignment: .center, spacing: 0){ - Circle().frame(width: 30, height: 30).foregroundColor(AllInColors.grey700Color).padding(.trailing, 5) + Circle() + .frame(width: 30, height: 30) + .foregroundColor(AllInColors.grey700Color) + .padding(.trailing, 7) Text(participation?.user.username ?? "Unknown") .font(.system(size: 15)) - .foregroundStyle(AllInColors.grey100Color) + .foregroundStyle(AllInColors.primaryTextColor) .fontWeight(.semibold) Spacer() Text(participation?.stake.description ?? "NaN") .font(.system(size: 18)) .foregroundStyle(AllInColors.lightPurpleColor) - .fontWeight(.bold).padding(.trailing, 5) - Image("PurpleAllCoin").resizable().frame(width: 11, height: 12) + .fontWeight(.bold) + .padding(.trailing, 8) + Image("PurpleAllCoin") + .resizable() + .frame(width: 11, height: 12) } } } diff --git a/Sources/AllInApp/AllIn/Components/ParticipateButton.swift b/Sources/AllInApp/AllIn/Components/ParticipateButton.swift index 44c1511..e1638db 100644 --- a/Sources/AllInApp/AllIn/Components/ParticipateButton.swift +++ b/Sources/AllInApp/AllIn/Components/ParticipateButton.swift @@ -66,6 +66,7 @@ struct ParticipateButton: View { .overlay( RoundedRectangle(cornerRadius: 12).stroke(AllInColors.delimiterGrey, lineWidth: 1) ) - }.disabled(isDisabled) + } + .disabled(isDisabled) } } diff --git a/Sources/AllInApp/AllIn/Components/ParticipationModal.swift b/Sources/AllInApp/AllIn/Components/ParticipationModal.swift index 781d0d7..78b3ee4 100644 --- a/Sources/AllInApp/AllIn/Components/ParticipationModal.swift +++ b/Sources/AllInApp/AllIn/Components/ParticipationModal.swift @@ -13,6 +13,13 @@ struct ParticipationModal: View { @Binding private var mise: String private var description: String var participationAddedCallback: (() -> Void)? + var possibleGain: Int { + if let stake = Float(mise), let selectedOption = options.first(where: { $0.0 == self.selectedOption }) { + return Int(round(stake * selectedOption.2)) + } else { + return 0 + } + } init(answer: Binding, mise: Binding, description: String, participationAddedCallback: (() -> Void)? = nil) { self._selectedOption = answer @@ -27,93 +34,101 @@ struct ParticipationModal: View { ] var body: some View { - VStack(alignment: .leading){ - HStack{ - Spacer() - Rectangle() - .foregroundStyle(AllInColors.grey800Color) - .frame(maxWidth: 80, maxHeight: 5) - .cornerRadius(999) - Spacer() - - }.padding(10) - HStack{ - Text("Faites vos paris") - .font(.system(size: 18)) - .foregroundColor(AllInColors.primaryTextColor) - .fontWeight(.semibold) - Spacer() - AllcoinsCounter(backgroundColor: AllInColors.purpleAccentColor, foregroundColor: .white) - } - .padding(.leading, 15) + GeometryReader { geometry in VStack(alignment: .leading){ - Text(description) - .font(.system(size: 13)) - .foregroundColor(AllInColors.primaryTextColor) - .fontWeight(.light) - - DropDownAnswerMenu(selectedOption: $selectedOption, options: options) - - TextField("",text: $mise, prompt: Text("Mise") - .foregroundColor(AllInColors.lightGrey300Color) - .font(.system(size: 14)) - .fontWeight(.bold)) - .padding() - .keyboardType(.numberPad) - .background( - RoundedRectangle(cornerRadius: 9) - .fill(AllInColors.lightGrey200Color) - .frame(height: 40) - ) - .frame(width: .infinity, height: 40) - .foregroundColor(.black) - .overlay( - RoundedRectangle(cornerRadius: 10, style: .continuous) - .stroke(AllInColors.delimiterGrey, lineWidth: 1) - ) - .padding(.bottom, 5) - - } - .padding(15) - Spacer() - VStack{ HStack{ - Text("Gains possibles") - .font(.system(size: 13)) + Spacer() + Rectangle() + .foregroundStyle(AllInColors.lightGrey300Color) + .frame(maxWidth: 80, maxHeight: 5) + .cornerRadius(999) + Spacer() + + } + .padding(10) + HStack{ + Text("Faites vos paris") + .font(.system(size: 18)) .foregroundColor(AllInColors.primaryTextColor) - .fontWeight(.regular) + .fontWeight(.semibold) Spacer() - Text("231") + AllcoinsCounter(backgroundColor: AllInColors.lightPurpleColor, foregroundColor: .white) + } + .padding(.leading, 15) + VStack(alignment: .leading){ + Text(description) .font(.system(size: 13)) .foregroundColor(AllInColors.primaryTextColor) .fontWeight(.light) + + DropDownAnswerMenu(selectedOption: $selectedOption, options: options) + + TextField("", text: $mise, prompt: Text("Mise") + .foregroundColor(AllInColors.lightGrey300Color) + .font(.system(size: 16)) + .fontWeight(.bold)) + .padding() + .keyboardType(.numberPad) + .background( + RoundedRectangle(cornerRadius: 9) + .fill(AllInColors.lightGrey200Color) + .frame(height: 40) + ) + .frame(height: 40) + .foregroundColor(.black) + .overlay( + RoundedRectangle(cornerRadius: 8, style: .continuous) + .stroke(AllInColors.delimiterGrey, lineWidth: 1) + ) + .padding(.bottom, 5) + } - .padding(.top, 10).padding(.bottom, 0) - Button { - participationAddedCallback?() - } label: { - Text("Miser") - .font(.system(size: 23)) - .foregroundColor(AllInColors.whiteColor) - .fontWeight(.bold) - .frame(maxWidth: .infinity) - .padding(.vertical, 3) + .padding(15) + Spacer() + VStack{ + HStack{ + Text("Gains possibles") + .font(.system(size: 13)) + .foregroundColor(AllInColors.primaryTextColor) + .fontWeight(.medium) + Spacer() + Text(possibleGain.description) + .font(.system(size: 13)) + .foregroundColor(AllInColors.primaryTextColor) + .fontWeight(.bold) + Image("allcoinIcon") + .resizable() + .frame(width: 11, height: 12) + + } + .padding(.top, 10) + .padding(.bottom, 0) + Button { + participationAddedCallback?() + } label: { + Text("Miser") + .font(.system(size: 23)) + .foregroundColor(AllInColors.whiteColor) + .fontWeight(.bold) + .frame(maxWidth: .infinity) + .padding(.vertical, 3) + } + .buttonStyle(.borderedProminent) + .tint(AllInColors.lightPurpleColor) + .disabled(checkAndSetError()) + .padding(.bottom, 5) } - .buttonStyle(.borderedProminent) - .tint(AllInColors.purpleAccentColor) - .disabled(checkAndSetError()) - + .padding(.horizontal, 10) + .background(AllInColors.whiteColor) + .border(width: 1, edges: [.top], color: AllInColors.delimiterGrey) } - .padding(.horizontal, 10) - .background(AllInColors.whiteColor) - .border(width: 1, edges: [.top], color: AllInColors.delimiterGrey) + .background(AllInColors.underComponentBackgroundColor) } - .background(AllInColors.underComponentBackgroundColor) } func checkAndSetError() -> Bool { if let stake = Int(mise) { - if stake <= AppStateContainer.shared.user?.nbCoins ?? 0 { + if stake <= AppStateContainer.shared.user?.nbCoins ?? 0 && stake > 0 { return false } else { return true diff --git a/Sources/AllInApp/AllIn/Components/RankingRow.swift b/Sources/AllInApp/AllIn/Components/RankingRow.swift index dec46d5..688e76a 100644 --- a/Sources/AllInApp/AllIn/Components/RankingRow.swift +++ b/Sources/AllInApp/AllIn/Components/RankingRow.swift @@ -16,7 +16,7 @@ struct RankingRow: View { var body: some View { HStack(){ - Text(String(number)) + Text(number.description) .textStyle(weight: .bold, color: AllInColors.lightPurpleColor, size: 18) .padding(.leading, 15) @@ -34,7 +34,7 @@ struct RankingRow: View { Image("allcoinIcon") .resizable() .frame(width: 17, height: 17, alignment: .leading) - Text(String(allCoins)) + Text(allCoins.description) .textStyle(weight: .black, color: AllInColors.lightPurpleColor, size: 16) .padding(.trailing, 15) } diff --git a/Sources/AllInApp/AllIn/Components/RecapBetCard.swift b/Sources/AllInApp/AllIn/Components/RecapBetCard.swift index b788b52..7d48284 100644 --- a/Sources/AllInApp/AllIn/Components/RecapBetCard.swift +++ b/Sources/AllInApp/AllIn/Components/RecapBetCard.swift @@ -13,6 +13,7 @@ struct RecapBetCard: View { @State private var isPressed = false @State var showDetails: Bool = false @State var showPartipated: Bool = false + var body: some View { VStack(spacing: 0){ VStack(alignment: .leading,spacing: 2){ @@ -92,30 +93,29 @@ struct RecapBetCard: View { .padding([.top,.bottom],5) .background(AllInColors.primaryGradient) .cornerRadius(8, corners: .allCorners) - - - }.padding([.bottom],10) - - - }.frame(width: .infinity) - .padding([.top,.bottom],8) - .padding([.leading,.trailing],15) - .background(AllInColors.underComponentBackgroundColor) - .cornerRadius(20, corners: [.bottomLeft,.bottomRight]) - .padding(.bottom,0).border(width: 1, edges: [.top], color: AllInColors.delimiterGrey) - }.scaleEffect(longPressTap ? 0.97 : 1.0) - .animation(.easeInOut, value: longPressTap) - .onTapGesture { - showDetails.toggle() - }.fullScreenCover(isPresented: $showDetails) { - DetailsView(isModalPresented: $showDetails, isModalParticipated: $showPartipated,id: "1") + } + .padding([.bottom],10) } - .gesture( - LongPressGesture(minimumDuration: 0.5) - .updating($longPressTap) { value, state, _ in - state = value - } - ) + .frame(width: .infinity) + .padding([.top,.bottom],8) + .padding([.leading,.trailing],15) + .background(AllInColors.underComponentBackgroundColor) + .cornerRadius(20, corners: [.bottomLeft,.bottomRight]) + .padding(.bottom,0).border(width: 1, edges: [.top], color: AllInColors.delimiterGrey) + } + .scaleEffect(longPressTap ? 0.97 : 1.0) + .animation(.easeInOut, value: longPressTap) + .onTapGesture { + showDetails.toggle() + }.fullScreenCover(isPresented: $showDetails) { + DetailsView(isModalPresented: $showDetails, isModalParticipated: $showPartipated,id: "1") + } + .gesture( + LongPressGesture(minimumDuration: 0.5) + .updating($longPressTap) { value, state, _ in + state = value + } + ) } } diff --git a/Sources/AllInApp/AllIn/Components/ReviewCard.swift b/Sources/AllInApp/AllIn/Components/ReviewCard.swift index 1730ff8..f9f42a6 100644 --- a/Sources/AllInApp/AllIn/Components/ReviewCard.swift +++ b/Sources/AllInApp/AllIn/Components/ReviewCard.swift @@ -18,7 +18,9 @@ struct ReviewCard: View { VStack(alignment: .leading,spacing: 2){ HStack{ Spacer() - Text("proposé par Lucas").font(.system(size: 10)).foregroundColor(AllInColors.grey800Color) + Text("proposé par Lucas") + .font(.system(size: 10)) + .foregroundColor(AllInColors.grey800Color) } Text("Etudes").font(.system(size: 15)).foregroundColor(AllInColors.grey800Color) @@ -32,7 +34,8 @@ struct ReviewCard: View { } .frame(width: .infinity) .padding(.all,15) - .background(AllInColors.componentBackgroundColor).cornerRadius(20, corners: [.topLeft,.topRight]).padding(.bottom,0) + .background(AllInColors.componentBackgroundColor) + .cornerRadius(20, corners: [.topLeft,.topRight]).padding(.bottom,0) VStack(alignment: .center,spacing:0){ HStack(){ @@ -54,10 +57,6 @@ struct ReviewCard: View { .frame(width: .infinity) .padding(.all,10) - - - - } .frame(width: .infinity) .padding(.all,2) diff --git a/Sources/AllInApp/AllIn/Components/TextCapsule.swift b/Sources/AllInApp/AllIn/Components/TextCapsule.swift index 11ec010..3cc6cee 100644 --- a/Sources/AllInApp/AllIn/Components/TextCapsule.swift +++ b/Sources/AllInApp/AllIn/Components/TextCapsule.swift @@ -36,7 +36,7 @@ struct TextCapsule: View { RoundedRectangle(cornerRadius: 20) .stroke(AllInColors.delimiterGrey, lineWidth: 1) ) - + Text(formattedTime) .font(.system(size: 15)) .foregroundColor(AllInColors.lightPurpleColor) @@ -49,6 +49,9 @@ struct TextCapsule: View { RoundedRectangle(cornerRadius: 20) .stroke(AllInColors.delimiterGrey, lineWidth: 1) ) + + Spacer() + } } } diff --git a/Sources/AllInApp/AllIn/Extensions/Extensions.swift b/Sources/AllInApp/AllIn/Extensions/Extensions.swift index a79953c..74732e0 100644 --- a/Sources/AllInApp/AllIn/Extensions/Extensions.swift +++ b/Sources/AllInApp/AllIn/Extensions/Extensions.swift @@ -83,42 +83,3 @@ extension View { } } } - -struct SlideInFromBottomTransition: ViewModifier { - var yOffset: CGFloat - - func body(content: Content) -> some View { - content - .offset(y: yOffset) - .animation(.easeInOut(duration: 0.3)) - } -} - -extension AnyTransition { - static func slideInFromBottom(yOffset: CGFloat) -> AnyTransition { - AnyTransition.modifier( - active: SlideInFromBottomTransition(yOffset: yOffset), - identity: SlideInFromBottomTransition(yOffset: 0) - ) - } -} - -struct SlideOutToBottomTransition: ViewModifier { - var yOffset: CGFloat - - func body(content: Content) -> some View { - content - .offset(y: yOffset) - .opacity(yOffset == 0 ? 1 : 0) - .animation(.easeInOut(duration: 0.3)) - } -} - -extension AnyTransition { - static func slideOutToBottom(yOffset: CGFloat) -> AnyTransition { - AnyTransition.modifier( - active: SlideOutToBottomTransition(yOffset: yOffset), - identity: SlideOutToBottomTransition(yOffset: 0) - ) - } -} diff --git a/Sources/AllInApp/AllIn/Views/DetailsView.swift b/Sources/AllInApp/AllIn/Views/DetailsView.swift index a67ed2a..3cec22b 100644 --- a/Sources/AllInApp/AllIn/Views/DetailsView.swift +++ b/Sources/AllInApp/AllIn/Views/DetailsView.swift @@ -25,7 +25,6 @@ struct DetailsView: View { case .orderedSame: return true } - } else { return true } @@ -37,15 +36,15 @@ struct DetailsView: View { switch currentDate.compare(endRegisterDate) { case .orderedAscending: - return ("En cours...", AllInColors.purpleAccentColor) + return ("En cours...", AllInColors.darkPurpleColor) case .orderedDescending: - return ("En attente...",AllInColors.pink100) + return ("En attente...", AllInColors.pink100) case .orderedSame: - return ("Fin des inscriptions...",AllInColors.grey50Color) + return ("Fin des inscriptions...", AllInColors.grey50Color) } } else { - return ("Statut indisponible", AllInColors.whiteColor) + return ("Statut indisponible", AllInColors.pink100) } } @@ -62,6 +61,7 @@ struct DetailsView: View { VStack(alignment: .center) { HStack{ Text(StatusValues.0) + .italic() .font(.system(size: 25)) .fontWeight(.bold).padding(.bottom, 10) .foregroundStyle(Color.black) @@ -78,15 +78,18 @@ struct DetailsView: View { } .padding(.horizontal, 15) .background(StatusValues.1) - .transition(.slideInFromBottom(yOffset:0)) VStack(spacing: 0) { - VStack(alignment: .leading,spacing: 5){ - HStack{ + VStack(alignment: .leading, spacing: 5) { + HStack(spacing: 3) { Spacer() - Text("proposé par " + (viewModel.betDetail?.bet.author.username ?? "Unknown").capitalized) + Text("proposé par") .font(.system(size: 10)) .foregroundColor(AllInColors.grey800Color) + Text((viewModel.betDetail?.bet.author.username ?? "Unknown").capitalized) + .font(.system(size: 10)) + .fontWeight(.semibold) + .foregroundColor(AllInColors.primaryTextColor) } Text(viewModel.betDetail?.bet.theme ?? "Not loaded") @@ -96,27 +99,34 @@ struct DetailsView: View { .font(.system(size: 20)) .fontWeight(.bold) .padding(.bottom, 10) - HStack{ - Text("Commence le") - .frame(maxWidth: 100) - .font(.system(size: 15)) - .foregroundColor(AllInColors.grey800Color) + HStack { + HStack { + Spacer() + Text("Commence le") + .font(.system(size: 15)) + .foregroundColor(AllInColors.grey800Color) + } + .frame(width: 105) + .padding(.trailing, 10) TextCapsule(date: viewModel.betDetail?.bet.endRegisterDate ?? Date()) Spacer() }.padding(.bottom, 10) - HStack{ - Text("Fini le") - .frame(maxWidth: 100) - .font(.system(size: 15)) - .foregroundColor(AllInColors.grey800Color) + HStack { + HStack { + Spacer() + Text("Prend fin le") + .font(.system(size: 15)) + .foregroundColor(AllInColors.grey800Color) + } + .frame(width: 105) + .padding(.trailing, 10) TextCapsule(date: viewModel.betDetail?.bet.endBetDate ?? Date()) Spacer() - } } - .frame(width: .infinity) - .padding(.all,15).padding(.vertical, 10) + .padding(.all, 15) + .padding(.vertical, 10) .background(AllInColors.componentBackgroundColor) .cornerRadius(20, corners: [.topLeft,.topRight]).padding(.bottom,0) @@ -136,8 +146,8 @@ struct DetailsView: View { ParticiationCell(participation: participation).padding(.horizontal, 10) } } - .padding(.bottom, 28) - + .padding(.bottom, geometry.safeAreaInsets.bottom + 28) + Spacer() } .frame(maxWidth: /*@START_MENU_TOKEN@*/.infinity/*@END_MENU_TOKEN@*/, maxHeight: .infinity) @@ -146,15 +156,14 @@ struct DetailsView: View { .border(width: 1, edges: [.top], color: AllInColors.delimiterGrey) Spacer() - - } - .frame(maxWidth: .infinity, maxHeight: geometry.size.height*0.98) + .frame(maxWidth: .infinity, maxHeight: (geometry.size.height + geometry.safeAreaInsets.bottom) - 50) .background(AllInColors.componentBackgroundColor) - .cornerRadius(15) + .cornerRadius(15, corners: [.topLeft, .topRight]) ParticipateButton(isOpen: $isModalPresented, isParticapatedOpen: $isModalParticipated, bet: viewModel.betDetail?.bet) - .padding(10) + .padding(.bottom, geometry.safeAreaInsets.bottom + 5) + .padding(.horizontal, 10) } .sheet(isPresented: $isModalParticipated) { ParticipationModal(answer: $viewModel.answer, mise: $viewModel.mise, description: viewModel.betDetail?.bet.phrase ?? "Not loaded", participationAddedCallback: {