diff GeoQuiz/Controllers/StoreController.swift @ 26:425078c01194

refactor code
author Dennis C. M. <dennis@denniscm.com>
date Wed, 09 Nov 2022 10:30:01 +0100
parents GeoQuiz/Logic/StoreKitController.swift@b145c408f791
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/GeoQuiz/Controllers/StoreController.swift	Wed Nov 09 10:30:01 2022 +0100
@@ -0,0 +1,98 @@
+//
+//  StoreController.swift
+//  GeoQuiz
+//
+//  Created by Dennis Concepción Martín on 9/10/22.
+//
+
+import Foundation
+import RevenueCat
+
+class StoreController: ObservableObject {
+    @Published var errorAlertTitle = ""
+    @Published var errorAlertMessage = ""
+    
+    @Published var showingErrorAlert = false
+    @Published var showingSuccessAlert = false
+    @Published var showingActivityAlert = false
+    
+    @Published var offerings: Offerings? = nil
+    @Published var customerInfo: CustomerInfo? {
+        didSet {
+            premiumIsActive = customerInfo?.entitlements["Premium"]?.isActive == true
+        }
+    }
+    
+    @Published var premiumIsActive = false
+    
+    init() {
+        #if DEBUG
+        premiumIsActive = true
+        #else
+        Purchases.shared.getCustomerInfo { (customerInfo, error) in
+            self.customerInfo = customerInfo
+        }
+        #endif
+    }
+    
+    func buy(_ package: Package) {
+        showingActivityAlert = true
+        
+        Purchases.shared.purchase(package: package) { (transaction, customerInfo, error, userCancelled) in
+            if customerInfo?.entitlements["Premium"]?.isActive == true {
+                self.showingSuccessAlert = true
+            }
+            
+            if let error = error as? RevenueCat.ErrorCode {
+                switch error {
+                case .purchaseCancelledError:
+                    self.errorAlertTitle = "Purchase cancelled"
+                    self.errorAlertMessage = ""
+                    self.showingErrorAlert = true
+                default:
+                    self.errorAlertTitle = "The purchase failed"
+                    self.errorAlertMessage = "If the problem persists, contact me at dmartin@dennistech.io"
+                    self.showingErrorAlert = true
+                }
+            }
+            
+            self.customerInfo = customerInfo
+            self.showingActivityAlert = false
+        }
+    }
+    
+    func restorePurchase() {
+        showingActivityAlert = true
+        
+        Purchases.shared.restorePurchases { customerInfo, error in
+            if customerInfo?.entitlements["Premium"]?.isActive == true {
+                self.showingSuccessAlert = true
+            } else {
+                self.errorAlertTitle = "Opps!"
+                self.errorAlertMessage = "You don't have GeoQuiz Premium unlocked."
+                self.showingErrorAlert = true
+            }
+            
+            if let _ = error {
+                self.errorAlertTitle = "The purchase couldn't be restored"
+                self.errorAlertMessage = "If the problem persists, contact me at dmartin@dennistech.io"
+                self.showingErrorAlert = true
+            }
+            
+            self.customerInfo = customerInfo
+            self.showingActivityAlert = false
+        }
+    }
+    
+    func fetchOfferings() {
+        Purchases.shared.getOfferings { (offerings, error) in
+            if let _ = error {
+                self.errorAlertTitle = "The product couldn't be fetched"
+                self.errorAlertMessage = "If the problem persists, contact me at dmartin@dennistech.io"
+                self.showingErrorAlert = true
+            }
+            
+            self.offerings = offerings
+        }
+    }
+}