Mercurial > public > simoleon
annotate Simoleon/UI/SubscribeButton.swift @ 162:f5de15e06c77
Refactor code
author | Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com> |
---|---|
date | Tue, 31 Aug 2021 13:04:28 +0100 |
parents | 84137052813d |
children |
rev | line source |
---|---|
28
4f862c618b44
Implemented RevenueCat
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
1 // |
4f862c618b44
Implemented RevenueCat
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
2 // SubscribeButton.swift |
4f862c618b44
Implemented RevenueCat
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
3 // Simoleon |
4f862c618b44
Implemented RevenueCat
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
4 // |
4f862c618b44
Implemented RevenueCat
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
5 // Created by Dennis Concepción Martín on 22/07/2021. |
4f862c618b44
Implemented RevenueCat
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
6 // |
4f862c618b44
Implemented RevenueCat
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
7 |
4f862c618b44
Implemented RevenueCat
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
8 import SwiftUI |
4f862c618b44
Implemented RevenueCat
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
9 import Purchases |
4f862c618b44
Implemented RevenueCat
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
10 |
4f862c618b44
Implemented RevenueCat
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
11 struct SubscribeButton: View { |
4f862c618b44
Implemented RevenueCat
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
12 @Binding var showingSubscriptionPaywall: Bool |
30
f76d0e26c178
Add localisation
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
28
diff
changeset
|
13 @State private var price = "" |
28
4f862c618b44
Implemented RevenueCat
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
14 @State private var alertTitle = "" |
4f862c618b44
Implemented RevenueCat
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
15 @State private var alertMessage = "" |
4f862c618b44
Implemented RevenueCat
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
16 @State private var showingAlert = false |
30
f76d0e26c178
Add localisation
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
28
diff
changeset
|
17 @State private var showingPrice = false |
28
4f862c618b44
Implemented RevenueCat
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
18 |
4f862c618b44
Implemented RevenueCat
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
19 var body: some View { |
4f862c618b44
Implemented RevenueCat
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
20 Button(action: purchaseMonthlySubscription) { |
4f862c618b44
Implemented RevenueCat
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
21 RoundedRectangle(cornerRadius: 15) |
4f862c618b44
Implemented RevenueCat
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
22 .frame(height: 60) |
4f862c618b44
Implemented RevenueCat
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
23 .overlay( |
4f862c618b44
Implemented RevenueCat
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
24 VStack { |
4f862c618b44
Implemented RevenueCat
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
25 if showingPrice { |
62
c7b6249ab745
uncomment localized texts
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
47
diff
changeset
|
26 Text("Subscribe for \(price) / month") |
28
4f862c618b44
Implemented RevenueCat
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
27 .foregroundColor(.white) |
4f862c618b44
Implemented RevenueCat
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
28 .fontWeight(.semibold) |
4f862c618b44
Implemented RevenueCat
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
29 } else { |
4f862c618b44
Implemented RevenueCat
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
30 ProgressView() |
4f862c618b44
Implemented RevenueCat
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
31 } |
4f862c618b44
Implemented RevenueCat
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
32 } |
4f862c618b44
Implemented RevenueCat
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
33 ) |
4f862c618b44
Implemented RevenueCat
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
34 } |
4f862c618b44
Implemented RevenueCat
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
35 .onAppear(perform: fetchMonthlySubscription) |
4f862c618b44
Implemented RevenueCat
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
36 .alert(isPresented: $showingAlert) { |
4f862c618b44
Implemented RevenueCat
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
37 Alert(title: Text(alertTitle), message: Text(alertMessage), dismissButton: .default(Text("Ok"))) |
4f862c618b44
Implemented RevenueCat
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
38 } |
4f862c618b44
Implemented RevenueCat
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
39 } |
4f862c618b44
Implemented RevenueCat
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
40 |
4f862c618b44
Implemented RevenueCat
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
41 private func fetchMonthlySubscription() { |
4f862c618b44
Implemented RevenueCat
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
42 Purchases.shared.offerings { (offerings, error) in |
4f862c618b44
Implemented RevenueCat
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
43 if let product = offerings?.current?.monthly?.product { |
47
75c1a05176f6
Refactor code
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
42
diff
changeset
|
44 price = formatCurrency(product.priceLocale, product.price) |
28
4f862c618b44
Implemented RevenueCat
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
45 showingPrice = true |
4f862c618b44
Implemented RevenueCat
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
46 } |
4f862c618b44
Implemented RevenueCat
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
47 |
4f862c618b44
Implemented RevenueCat
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
48 if let error = error as NSError? { |
4f862c618b44
Implemented RevenueCat
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
49 alertTitle = error.localizedDescription |
30
f76d0e26c178
Add localisation
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
28
diff
changeset
|
50 alertMessage = error.localizedFailureReason ?? "" |
f76d0e26c178
Add localisation
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
28
diff
changeset
|
51 price = "-" |
28
4f862c618b44
Implemented RevenueCat
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
52 showingPrice = true |
4f862c618b44
Implemented RevenueCat
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
53 showingAlert = true |
4f862c618b44
Implemented RevenueCat
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
54 } |
4f862c618b44
Implemented RevenueCat
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
55 } |
4f862c618b44
Implemented RevenueCat
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
56 } |
4f862c618b44
Implemented RevenueCat
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
57 |
4f862c618b44
Implemented RevenueCat
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
58 private func purchaseMonthlySubscription() { |
4f862c618b44
Implemented RevenueCat
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
59 showingPrice = false |
4f862c618b44
Implemented RevenueCat
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
60 |
4f862c618b44
Implemented RevenueCat
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
61 Purchases.shared.offerings { (offerings, error) in |
4f862c618b44
Implemented RevenueCat
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
62 if let package = offerings?.current?.monthly { |
4f862c618b44
Implemented RevenueCat
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
63 |
4f862c618b44
Implemented RevenueCat
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
64 Purchases.shared.purchasePackage(package) { (transaction, purchaserInfo, error, userCancelled) in |
4f862c618b44
Implemented RevenueCat
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
65 if purchaserInfo?.entitlements["all"]?.isActive == true { |
4f862c618b44
Implemented RevenueCat
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
66 showingPrice = true |
4f862c618b44
Implemented RevenueCat
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
67 showingSubscriptionPaywall = false |
4f862c618b44
Implemented RevenueCat
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
68 } |
4f862c618b44
Implemented RevenueCat
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
69 |
4f862c618b44
Implemented RevenueCat
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
70 if let error = error as NSError? { |
4f862c618b44
Implemented RevenueCat
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
71 alertTitle = error.localizedDescription |
30
f76d0e26c178
Add localisation
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
28
diff
changeset
|
72 alertMessage = error.localizedFailureReason ?? "" |
28
4f862c618b44
Implemented RevenueCat
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
73 showingPrice = true |
4f862c618b44
Implemented RevenueCat
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
74 showingAlert = true |
4f862c618b44
Implemented RevenueCat
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
75 } |
4f862c618b44
Implemented RevenueCat
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
76 } |
4f862c618b44
Implemented RevenueCat
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
77 |
4f862c618b44
Implemented RevenueCat
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
78 if let error = error as NSError? { |
4f862c618b44
Implemented RevenueCat
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
79 alertTitle = error.localizedDescription |
30
f76d0e26c178
Add localisation
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
28
diff
changeset
|
80 alertMessage = error.localizedFailureReason ?? "" |
28
4f862c618b44
Implemented RevenueCat
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
81 showingPrice = true |
4f862c618b44
Implemented RevenueCat
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
82 showingAlert = true |
4f862c618b44
Implemented RevenueCat
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
83 } |
4f862c618b44
Implemented RevenueCat
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
84 } |
4f862c618b44
Implemented RevenueCat
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
85 } |
4f862c618b44
Implemented RevenueCat
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
86 } |
4f862c618b44
Implemented RevenueCat
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
87 |
4f862c618b44
Implemented RevenueCat
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
88 private func formatCurrency(_ locale: Locale, _ amount: NSDecimalNumber) -> String { |
4f862c618b44
Implemented RevenueCat
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
89 let formatter = NumberFormatter() |
4f862c618b44
Implemented RevenueCat
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
90 formatter.locale = locale |
4f862c618b44
Implemented RevenueCat
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
91 formatter.numberStyle = .currency |
4f862c618b44
Implemented RevenueCat
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
92 |
82
3133bf6f6deb
Implemented Unit Testing
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
62
diff
changeset
|
93 // It won't fail. Check unit test |
3133bf6f6deb
Implemented Unit Testing
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
62
diff
changeset
|
94 let formattedAmount = formatter.string(from: amount as NSNumber)! |
3133bf6f6deb
Implemented Unit Testing
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
62
diff
changeset
|
95 |
3133bf6f6deb
Implemented Unit Testing
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
62
diff
changeset
|
96 return formattedAmount |
28
4f862c618b44
Implemented RevenueCat
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
97 } |
4f862c618b44
Implemented RevenueCat
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
98 } |
4f862c618b44
Implemented RevenueCat
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
99 |
4f862c618b44
Implemented RevenueCat
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
100 struct SubscribeButton_Previews: PreviewProvider { |
4f862c618b44
Implemented RevenueCat
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
101 static var previews: some View { |
4f862c618b44
Implemented RevenueCat
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
102 SubscribeButton(showingSubscriptionPaywall: .constant(true)) |
4f862c618b44
Implemented RevenueCat
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
103 } |
4f862c618b44
Implemented RevenueCat
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
104 } |