Add Participation functions

pull/16/head
Emre KARTAL 1 year ago
parent 6fb1146ab6
commit 0b4f5a0f53

@ -51,7 +51,8 @@ struct BetCard: View {
Spacer()
}.padding(0)
ParticipateButton(isOpen: $showDetails, isParticapatedOpen: $showParticipate, bet: bet).padding(.top, 5)
ParticipateButton(isOpen: $showDetails, isParticapatedOpen: $showParticipate, bet: bet)
.padding(.top, 5)
}
.frame(width: .infinity)
.padding(.all,8)

@ -10,12 +10,12 @@ import Model
struct BetLineLoading: View {
@State var participations: [Participation]
var participations: [Participation]
var value: CGFloat {
let totalParticipations = participations.count
let numberOfYes = participations.filter { $0.response == "OUI" }.count
let numberOfNo = participations.filter { $0.response == "NON" }.count
let numberOfYes = participations.filter { $0.response.uppercased() == "YES" }.count
let numberOfNo = participations.filter { $0.response.uppercased() == "NO" }.count
if(numberOfNo == 0 && numberOfYes == 0){
return 0.5
}
@ -26,11 +26,11 @@ struct BetLineLoading: View {
var yesParticipations: [Participation] {
return participations.filter { $0.response == "OUI" }
return participations.filter { $0.response.uppercased() == "YES" }
}
var noParticipations: [Participation] {
return participations.filter { $0.response == "NON" }
return participations.filter { $0.response.uppercased() == "NO" }
}

@ -6,8 +6,12 @@
//
import SwiftUI
import DependencyInjection
struct Menu: View {
@Inject var authService: IAuthService
var body: some View {
VStack(alignment: .leading, spacing: 10) {
@ -93,6 +97,17 @@ struct Menu: View {
.padding([.leading,.trailing], 13)
}
HStack {
Spacer()
Button {
authService.logout()
} label: {
Text("Deconnexion")
.foregroundColor(.white)
}
Spacer()
}
Spacer()
Image("gearIcon")
.resizable()

@ -9,25 +9,22 @@ import SwiftUI
import Model
struct ParticipateButton: View {
@Binding var isOpen : Bool
@Binding var isParticapatedOpen: Bool
@State var bet: Bet?
var bet: Bet?
var isDisabled: Bool {
let endRegisterDate: Date? = bet?.endRegisterDate
if endRegisterDate != nil{
guard let endRegisterDate = bet?.endRegisterDate else {
return true
}
let currentDate = Date()
switch currentDate.compare(endRegisterDate!) {
switch currentDate.compare(endRegisterDate) {
case .orderedAscending:
return false
case .orderedDescending:
return true
case .orderedSame:
return true
}
} else {
case .orderedDescending, .orderedSame:
return true
}
}
@ -43,7 +40,7 @@ struct ParticipateButton: View {
.frame(maxWidth: .infinity).padding(10)
.multilineTextAlignment(.center)
.overlay {
switch isDisabled{
switch isDisabled {
case true:
AllInColors.grey700Color.frame(width: 170)
.mask(
@ -69,8 +66,6 @@ struct ParticipateButton: View {
.overlay(
RoundedRectangle(cornerRadius: 12).stroke(AllInColors.delimiterGrey, lineWidth: 1)
)
}.disabled(isDisabled)
}
}

@ -8,29 +8,52 @@
import SwiftUI
struct ParticipationModal: View {
@State private var selectedOption = 0
@State private var mise: String = ""
@Binding private var selectedOption: Int
@Binding private var mise: String
private var description: String
var participationAddedCallback: (() -> Void)?
init(answer: Binding<Int>, mise: Binding<String>, description: String, participationAddedCallback: (() -> Void)? = nil) {
self._selectedOption = answer
self._mise = mise
self.description = description
self.participationAddedCallback = participationAddedCallback
}
let options: [(Int, String, Float)] = [
(0, "OUI", 1.2),
(1, "NON", 3.3),
]
var body: some View {
VStack(alignment: .leading){
HStack{
Spacer()
Rectangle().foregroundStyle(AllInColors.grey800Color).frame(maxWidth: 80, maxHeight: 5).cornerRadius(999)
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.blackTitleColor).fontWeight(.semibold)
Text("Faites vos paris")
.font(.system(size: 18))
.foregroundColor(AllInColors.blackTitleColor)
.fontWeight(.semibold)
Spacer()
AllcoinsCounter(backgroundColor: AllInColors.purpleAccentColor, foregroundColor: AllInColors.whiteColor)
}
.padding(.leading, 15)
VStack(alignment: .leading){
Text("Emre va réussir son TP de CI/CD mercredi?").font(.system(size: 13)).foregroundColor(AllInColors.grey100Color).fontWeight(.light)
Text(description)
.font(.system(size: 13))
.foregroundColor(AllInColors.grey100Color)
.fontWeight(.light)
DropDownAnswerMenu(selectedOption: $selectedOption, options: options)
TextField("",text: $mise, prompt: Text("Mise")
.foregroundColor(AllInColors.lightGrey300Color)
.font(.system(size: 14))
@ -55,19 +78,35 @@ struct ParticipationModal: View {
Spacer()
VStack{
HStack{
Text("Gains possibles").font(.system(size: 13)).foregroundColor(AllInColors.blackTitleColor).fontWeight(.regular)
Text("Gains possibles")
.font(.system(size: 13))
.foregroundColor(AllInColors.blackTitleColor)
.fontWeight(.regular)
Spacer()
Text("231").font(.system(size: 13)).foregroundColor(AllInColors.blackTitleColor).fontWeight(.light)
}.padding(.top, 10).padding(.bottom, 0)
Text("231")
.font(.system(size: 13))
.foregroundColor(AllInColors.blackTitleColor)
.fontWeight(.light)
}
.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)
Text("Miser")
.font(.system(size: 23))
.foregroundColor(AllInColors.whiteColor)
.fontWeight(.bold)
.frame(maxWidth: .infinity)
.padding(.vertical, 3)
}
.buttonStyle(.borderedProminent).tint(AllInColors.purpleAccentColor)
.buttonStyle(.borderedProminent)
.tint(AllInColors.purpleAccentColor)
}.padding(.horizontal, 10).background(AllInColors.whiteColor).border(width: 1, edges: [.top], color: AllInColors.delimiterGrey)
}.background(AllInColors.underComponentBackgroundColor)
}
.padding(.horizontal, 10)
.background(AllInColors.whiteColor)
.border(width: 1, edges: [.top], color: AllInColors.delimiterGrey)
}
.background(AllInColors.underComponentBackgroundColor)
}
}

@ -153,4 +153,9 @@ class AuthService: IAuthService {
DependencyInjection.shared.addSingleton(Manager.self, Manager(withBetDataManager: BetApiManager(withUserToken: token), withUserDataManager: UserApiManager(withUserToken: token)))
}
public func logout() {
AppStateContainer.shared.authenticationRefresh = nil
AppStateContainer.shared.loggedState.connectedUser = false
}
}

@ -11,4 +11,5 @@ protocol IAuthService {
func login(login: String, password: String, completion : @escaping (Int)-> ())
func register(username: String, email: String, password: String, completion : @escaping (Int)-> ())
func refreshAuthentication()
func logout()
}

@ -14,6 +14,8 @@ class DetailsViewModel: ObservableObject {
@Inject var manager: Manager
var id: String
@Published var answer = 0
@Published var mise: String = ""
@Published var betDetail: BetDetail?
@ -27,4 +29,16 @@ class DetailsViewModel: ObservableObject {
self.betDetail = bet
}
}
func addParticipate() {
if let stake = Int(mise) {
var rep: String = ""
if answer == 0 {
rep = "Yes"
} else {
rep = "No"
}
manager.addParticipation(withId: id, withAnswer: rep, andStake: stake)
}
}
}

@ -6,6 +6,9 @@ struct DetailsView: View {
@Binding var isModalPresented: Bool
@Binding var isModalParticipated: Bool
@State var progressValue: Float = 0.2
var id: String
@StateObject private var viewModel: DetailsViewModel
var isFinished: Bool {
viewModel.betDetail?.finalAnswer == nil ? false : true
}
@ -46,10 +49,7 @@ struct DetailsView: View {
}
}
var id: String
@StateObject private var viewModel: DetailsViewModel
init(isModalPresented: Binding<Bool>, isModalParticipated: Binding<Bool>,id: String) {
init(isModalPresented: Binding<Bool>, isModalParticipated: Binding<Bool>, id: String) {
self._isModalPresented = isModalPresented
self._isModalParticipated = isModalParticipated
self.id = id
@ -61,7 +61,11 @@ struct DetailsView: View {
ZStack(alignment: .bottom) {
VStack(alignment: .center) {
HStack{
Text(StatusValues.0).font(.system(size: 25)).fontWeight(.bold).padding(.bottom, 10).foregroundStyle(Color.black).opacity(0.4)
Text(StatusValues.0)
.font(.system(size: 25))
.fontWeight(.bold).padding(.bottom, 10)
.foregroundStyle(Color.black)
.opacity(0.4)
Spacer()
Image("closeIcon")
.resizable()
@ -75,6 +79,7 @@ struct DetailsView: View {
.padding(.horizontal, 15)
.background(StatusValues.1)
.transition(.slideInFromBottom(yOffset:0))
VStack(spacing: 0) {
VStack(alignment: .leading,spacing: 5){
HStack{
@ -114,11 +119,13 @@ struct DetailsView: View {
.padding(.all,15).padding(.vertical, 10)
.background(AllInColors.componentBackgroundColor)
.cornerRadius(20, corners: [.topLeft,.topRight]).padding(.bottom,0)
if isFinished {
ResultBanner()
}
VStack(alignment: .leading, spacing: 5) {
BetLineLoading(participations: viewModel.betDetail?.participations ?? []).padding(.vertical,15)
BetLineLoading(participations: viewModel.betDetail?.participations ?? [])
.padding(.vertical,15)
Text("Liste des participants")
.font(.system(size: 18))
.foregroundStyle(AllInColors.grey100Color)
@ -143,12 +150,15 @@ struct DetailsView: View {
.background(AllInColors.componentBackgroundColor)
.cornerRadius(15)
ParticipateButton(isOpen: $isModalPresented, isParticapatedOpen: $isModalParticipated,bet: viewModel.betDetail?.bet ).padding(10)
ParticipateButton(isOpen: $isModalPresented, isParticapatedOpen: $isModalParticipated, bet: viewModel.betDetail?.bet)
.padding(10)
}
.sheet(isPresented: $isModalParticipated) {
ParticipationModal().presentationDetents([.fraction(0.55)])
ParticipationModal(answer: $viewModel.answer, mise: $viewModel.mise, description: viewModel.betDetail?.bet.phrase ?? "Not loaded", participationAddedCallback: {
viewModel.addParticipate()
isModalParticipated.toggle()
})
.presentationDetents([.fraction(0.55)])
}
.edgesIgnoringSafeArea(.bottom)
}

@ -24,7 +24,7 @@ public class FactoryApiBet: FactoryBet {
"endRegistration": formatZonedDateTime(dateTime: bet.endRegisterDate),
"endBet": formatZonedDateTime(dateTime: bet.endBetDate),
"isPrivate": String(bet.isPublic),
"response": [],
"response": ["Yes","No"],
]
return json
@ -76,6 +76,28 @@ public class FactoryApiBet: FactoryBet {
return nil
}
return BetDetail(bet: bet, answers: [], participations: [])
var participations: [Participation] = []
if let participationsJson = json["participations"] as? [[String: Any]], !participationsJson.isEmpty {
for participationJson in participationsJson {
if let participation = self.toParticipate(from: participationJson) {
participations.append(participation)
}
}
}
return BetDetail(bet: bet, answers: [], participations: participations)
}
public func toParticipate(from json: [String: Any]) -> Participation? {
guard let id = json["id"] as? String,
let betId = json["betId"] as? String,
let username = json["username"] as? String,
let answer = json["answer"] as? String,
let stake = json["stake"] as? Int else {
return nil
}
return Participation(id: id, stake: stake, date: Date(), response: answer, user: User(username: username, email: "Email", nbCoins: 0, friends: []), betId: betId)
}
}

@ -49,4 +49,27 @@ public struct UserApiManager: UserDataManager {
public func getOldBets(withIndex index: Int, withCount count: Int, completion: @escaping ([Bet]) -> Void) {
fatalError("Not implemented yet")
}
public func addParticipation(withId id: String, withAnswer answer: String, andStake stake: Int) {
let url = URL(string: allInApi + "participations/add")!
var request = URLRequest(url: url)
request.httpMethod = "POST"
request.setValue("application/json", forHTTPHeaderField: "Content-Type")
request.setValue("Bearer \(token)", forHTTPHeaderField: "Authorization")
let json: [String: Any] = [
"betId": id,
"answer": answer,
"stake": stake
]
if let jsonData = try? JSONSerialization.data(withJSONObject: json, options: []){
URLSession.shared.uploadTask(with: request, from: jsonData) { data, response, error in
print ("ALLIN : Add Participation")
if let httpResponse = response as? HTTPURLResponse {
print(httpResponse.statusCode)
}
}.resume()
}
}
}

@ -37,4 +37,8 @@ public struct Manager {
completion(bets)
}
}
public func addParticipation(withId id: String, withAnswer answer: String, andStake stake: Int) {
userDataManager.addParticipation(withId: id, withAnswer: answer, andStake: stake)
}
}

@ -10,7 +10,7 @@ import Foundation
/// A class representing a user's participation in a bet.
public class Participation: ObservableObject, Identifiable {
public let id: UUID
public let id: String
/// The amount of stake in the bet.
public private(set) var stake: Int
@ -34,12 +34,12 @@ public class Participation: ObservableObject, Identifiable {
/// - response: The response or outcome of the participation.
/// - user: The user who participated in the bet.
/// - betId: The unique identifier of the bet.
public init(stake: Int, date: Date, response: String, user: User, betId: String) {
public init(id: String, stake: Int, date: Date, response: String, user: User, betId: String) {
self.id = id
self.stake = stake
self.date = date
self.response = response
self.user = user
self.betId = betId
self.id = UUID()
}
}

@ -12,4 +12,5 @@ public protocol UserDataManager {
func addBet(bet: Bet)
func getFriends() -> [User]
func getOldBets(withIndex index: Int, withCount count: Int, completion: @escaping ([Bet]) -> Void)
func addParticipation(withId id: String, withAnswer answer: String, andStake stake: Int)
}

@ -89,10 +89,10 @@ struct Stub {
self.betsDetail.append(betDetail)
}
self.betsDetail[0].addParticipation(newParticipation: Participation(stake: 120, date: Date(), response: "OUI", user: user1, betId: "1"))
self.betsDetail[0].addParticipation(newParticipation: Participation(stake: 20, date: Date(), response: "NON", user: user2, betId: "2"))
self.betsDetail[0].addParticipation(newParticipation: Participation(stake: 320, date: Date(), response: "OUI", user: user3, betId: "3"))
self.betsDetail[0].addParticipation(newParticipation: Participation(stake: 320, date: Date(), response: "OUI", user: user3, betId: "3"))
self.betsDetail[0].addParticipation(newParticipation: Participation(id: UUID().uuidString, stake: 120, date: Date(), response: "OUI", user: user1, betId: "1"))
self.betsDetail[0].addParticipation(newParticipation: Participation(id: UUID().uuidString, stake: 20, date: Date(), response: "NON", user: user2, betId: "2"))
self.betsDetail[0].addParticipation(newParticipation: Participation(id: UUID().uuidString, stake: 320, date: Date(), response: "OUI", user: user3, betId: "3"))
self.betsDetail[0].addParticipation(newParticipation: Participation(id: UUID().uuidString, stake: 320, date: Date(), response: "OUI", user: user3, betId: "3"))
}

Loading…
Cancel
Save