First draft for new subscription

clubs
Laurent 1 year ago
parent c2fd9f1c8d
commit 1b0694a708
  1. 20
      PadelClub/Data/Tournament.swift
  2. 16
      PadelClub/Views/Calling/CallView.swift
  3. 16
      PadelClub/Views/Calling/Components/MenuWarningView.swift
  4. 16
      PadelClub/Views/Calling/SendToAllView.swift
  5. 16
      PadelClub/Views/Match/MatchDetailView.swift
  6. 4
      PadelClub/Views/Tournament/Subscription/Guard.swift
  7. 4
      PadelClub/Views/Tournament/Subscription/StoreItem.swift
  8. 10
      PadelClub/Views/Tournament/TournamentView.swift

@ -391,7 +391,7 @@ final class Tournament : ModelObject, Storable {
// MARK: - // MARK: -
/// Warning: if the enum has more than 10 cases, the payment algo is broken /// Warning: if the enum has more than 10 cases, the payment algo is broken
enum TournamentPayment: Int, CaseIterable { enum TournamentPayment: Int, Codable, CaseIterable {
case free, unit, subscriptionUnit, unlimited case free, unit, subscriptionUnit, unlimited
var isSubscription: Bool { var isSubscription: Bool {
@ -2022,16 +2022,32 @@ defer {
case cantPayTournament case cantPayTournament
} }
func payIfNecessary() throws { private let userCanPayCall: ServiceCall = ServiceCall(path: "can-pay-tournament/", method: .post, requiresToken: true)
struct ClubPayload: Codable {
var club: String
}
struct PaymentReturn: Codable {
var payment: TournamentPayment?
}
func payIfNecessary() async throws {
if self.payment != nil { return } if self.payment != nil { return }
if let payment = Guard.main.paymentForNewTournament() { if let payment = Guard.main.paymentForNewTournament() {
self.payment = payment self.payment = payment
try DataStore.shared.tournaments.addOrUpdate(instance: self) try DataStore.shared.tournaments.addOrUpdate(instance: self)
return return
} }
let services = try StoreCenter.main.service()
if let clubId = self.club()?.id {
let pr: PaymentReturn = try await services.runCall(userCanPayCall, payload: ClubPayload(club: clubId))
self.payment = pr.payment
}
throw PaymentError.cantPayTournament throw PaymentError.cantPayTournament
} }
} }
fileprivate extension Bool { fileprivate extension Bool {

@ -234,12 +234,16 @@ struct CallView: View {
} }
} }
fileprivate func _payTournamentAndExecute(_ handler: () -> ()) { fileprivate func _payTournamentAndExecute(_ handler: @escaping () -> ()) {
do { Task {
try self.tournament.payIfNecessary() do {
handler() try await tournament.payIfNecessary()
} catch { handler()
self.showSubscriptionView = true } catch {
DispatchQueue.main.async {
self.showSubscriptionView = true
}
}
} }
} }

@ -150,12 +150,16 @@ struct MenuWarningView: View {
} }
} }
fileprivate func _payTournamentAndExecute(_ handler: () -> ()) { fileprivate func _payTournamentAndExecute(_ handler: @escaping () -> ()) {
do { Task {
try tournament.payIfNecessary() do {
handler() try await tournament.payIfNecessary()
} catch { handler()
self.showSubscriptionView = true } catch {
DispatchQueue.main.async {
self.showSubscriptionView = true
}
}
} }
} }

@ -244,12 +244,16 @@ struct SendToAllView: View {
} }
} }
fileprivate func _payTournamentAndExecute(_ handler: () -> ()) { fileprivate func _payTournamentAndExecute(_ handler: @escaping () -> ()) {
do { Task {
try tournament.payIfNecessary() do {
handler() try await tournament.payIfNecessary()
} catch { handler()
self.showSubscriptionView = true } catch {
DispatchQueue.main.async {
self.showSubscriptionView = true
}
}
} }
} }

@ -498,14 +498,18 @@ struct MatchDetailView: View {
} }
} }
fileprivate func _payTournamentAndExecute(_ handler: () -> ()) { fileprivate func _payTournamentAndExecute(_ handler: @escaping () -> ()) {
guard let tournament = match.currentTournament() else { fatalError("missing tournament") } guard let tournament = match.currentTournament() else { fatalError("missing tournament") }
do { Task {
try tournament.payIfNecessary() do {
handler() try await tournament.payIfNecessary()
} catch { handler()
self.showSubscriptionView = true } catch {
DispatchQueue.main.async {
self.showSubscriptionView = true
}
}
} }
} }

@ -141,7 +141,7 @@ import LeStorage
var currentPlan: StoreItem? { var currentPlan: StoreItem? {
#if DEBUG #if DEBUG
return .monthlyUnlimited return nil
#else #else
if let currentBestPlan = self.currentBestPlan, let plan = StoreItem(rawValue: currentBestPlan.productID) { if let currentBestPlan = self.currentBestPlan, let plan = StoreItem(rawValue: currentBestPlan.productID) {
return plan return plan
@ -195,7 +195,7 @@ import LeStorage
func paymentForNewTournament() -> Tournament.TournamentPayment? { func paymentForNewTournament() -> Tournament.TournamentPayment? {
switch self.currentPlan { switch self.currentPlan {
case .monthlyUnlimited: case .monthlyUnlimited, .monthlyUnlimited:
return Tournament.TournamentPayment.unlimited return Tournament.TournamentPayment.unlimited
case .fivePerMonth: case .fivePerMonth:
if let purchaseDate = self.currentBestPlan?.originalPurchaseDate { if let purchaseDate = self.currentBestPlan?.originalPurchaseDate {

@ -8,6 +8,7 @@
import Foundation import Foundation
enum StoreItem: String, Identifiable, CaseIterable { enum StoreItem: String, Identifiable, CaseIterable {
case monthlyClub = "app.padelclub.tournament.subscription.monthly.club"
case monthlyUnlimited = "app.padelclub.tournament.subscription.unlimited" case monthlyUnlimited = "app.padelclub.tournament.subscription.unlimited"
case fivePerMonth = "app.padelclub.tournament.subscription.five.per.month" case fivePerMonth = "app.padelclub.tournament.subscription.five.per.month"
case unit = "app.padelclub.tournament.unit" case unit = "app.padelclub.tournament.unit"
@ -22,6 +23,7 @@ enum StoreItem: String, Identifiable, CaseIterable {
var systemImage: String { var systemImage: String {
switch self { switch self {
case .monthlyClub: return "trophy.circle.fill"
case .monthlyUnlimited: return "infinity.circle.fill" case .monthlyUnlimited: return "infinity.circle.fill"
case .fivePerMonth: return "star.circle.fill" case .fivePerMonth: return "star.circle.fill"
case .unit: return "tennisball.circle.fill" case .unit: return "tennisball.circle.fill"
@ -30,7 +32,7 @@ enum StoreItem: String, Identifiable, CaseIterable {
var isConsumable: Bool { var isConsumable: Bool {
switch self { switch self {
case .monthlyUnlimited, .fivePerMonth: return false case .monthlyUnlimited, .fivePerMonth, .monthlyClub: return false
case .unit: return true case .unit: return true
} }
} }

@ -156,10 +156,12 @@ struct TournamentView: View {
#if DEBUG #if DEBUG
Button { Button {
do { Task {
try self.tournament.payIfNecessary() do {
} catch { try await self.tournament.payIfNecessary()
Logger.error(error) } catch {
Logger.error(error)
}
} }
} label: { } label: {
Label("Payer le tournoi", systemImage: "dollarsign.circle.fill") Label("Payer le tournoi", systemImage: "dollarsign.circle.fill")

Loading…
Cancel
Save