diff Simoleon/UI/SubscribeButton.swift @ 156:84137052813d

Refactor code
author Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
date Sat, 28 Aug 2021 11:15:25 +0100
parents Simoleon/Helpers/SubscribeButton.swift@3133bf6f6deb
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Simoleon/UI/SubscribeButton.swift	Sat Aug 28 11:15:25 2021 +0100
@@ -0,0 +1,104 @@
+//
+//  SubscribeButton.swift
+//  Simoleon
+//
+//  Created by Dennis Concepción Martín on 22/07/2021.
+//
+
+import SwiftUI
+import Purchases
+
+struct SubscribeButton: View {
+    @Binding var showingSubscriptionPaywall: Bool
+    @State private var price = ""
+    @State private var alertTitle = ""
+    @State private var alertMessage = ""
+    @State private var showingAlert = false
+    @State private var showingPrice = false
+    
+    var body: some View {
+        Button(action: purchaseMonthlySubscription) {
+            RoundedRectangle(cornerRadius: 15)
+                .frame(height: 60)
+                .overlay(
+                    VStack {
+                        if showingPrice {
+                            Text("Subscribe for \(price) / month")
+                                .foregroundColor(.white)
+                                .fontWeight(.semibold)
+                        } else {
+                            ProgressView()
+                        }
+                    }
+                )
+        }
+        .onAppear(perform: fetchMonthlySubscription)
+        .alert(isPresented: $showingAlert) {
+            Alert(title: Text(alertTitle), message: Text(alertMessage), dismissButton: .default(Text("Ok")))
+        }
+    }
+    
+    private func fetchMonthlySubscription() {
+        Purchases.shared.offerings { (offerings, error) in
+            if let product = offerings?.current?.monthly?.product {
+                price = formatCurrency(product.priceLocale, product.price)
+                showingPrice = true
+            }
+            
+            if let error = error as NSError? {
+                alertTitle = error.localizedDescription
+                alertMessage = error.localizedFailureReason ?? ""
+                price = "-"
+                showingPrice = true
+                showingAlert = true
+            }
+        }
+    }
+    
+    private func purchaseMonthlySubscription() {
+        showingPrice = false
+        
+        Purchases.shared.offerings { (offerings, error) in
+            if let package = offerings?.current?.monthly {
+                
+                Purchases.shared.purchasePackage(package) { (transaction, purchaserInfo, error, userCancelled) in
+                    if purchaserInfo?.entitlements["all"]?.isActive == true {
+                        showingPrice = true
+                        showingSubscriptionPaywall = false
+                    }
+                    
+                    if let error = error as NSError? {
+                        alertTitle = error.localizedDescription
+                        alertMessage = error.localizedFailureReason ?? ""
+                        showingPrice = true
+                        showingAlert = true
+                    }
+                }
+                
+                if let error = error as NSError? {
+                    alertTitle = error.localizedDescription
+                    alertMessage = error.localizedFailureReason ?? ""
+                    showingPrice = true
+                    showingAlert = true
+                }
+            }
+        }
+    }
+    
+    private func formatCurrency(_ locale: Locale, _ amount: NSDecimalNumber) -> String {
+        let formatter = NumberFormatter()
+        formatter.locale = locale
+        formatter.numberStyle = .currency
+        
+        // It won't fail. Check unit test
+        let formattedAmount = formatter.string(from: amount as NSNumber)!
+        
+        return formattedAmount
+    }
+}
+
+struct SubscribeButton_Previews: PreviewProvider {
+    static var previews: some View {
+        SubscribeButton(showingSubscriptionPaywall: .constant(true))
+    }
+}