Files
eqn.ios/Sources/Earthquake Network/Controllers/InApp/PurchaseProVersionViewController.swift
T
2020-10-15 08:40:02 +02:00

171 lines
6.4 KiB
Swift

//
// PurchaseProVersionViewController.swift
// Earthquake Network
//
// Created by Busi Andrea on 29/07/2020.
// Copyright © 2020 Earthquake Network. All rights reserved.
//
import UIKit
import SafariServices
import StoreKit
class PurchaseProVersionViewController: UIViewController {
@IBOutlet private weak var discountTextLabel: UILabel!
@IBOutlet private weak var descriptionTextLabel: UILabel!
@IBOutlet private weak var openPrivacyButton: UIButton!
@IBOutlet private weak var openTermsButton: UIButton!
@IBOutlet private weak var priceLabel: UILabel!
@IBOutlet private weak var purchaseButton: UIButton!
// MARK: - Internal
private var products = [SKProduct]()
private var proProduct: SKProduct?
private var restoreTapped = false
/// Time remaining (in hours) for discounted price. If zero, no discount available
private var discountTimeRemaining: Int = 0
// MARK: - View Lifecycle
override func viewDidLoad() {
super.viewDidLoad()
NotificationCenter.default.addObserver(self, selector: #selector(handlePurchaseNotification(_:)),
name: .IAPHelperPurchaseNotification,
object: nil)
configureUI()
loadProducts()
checkDiscountPrice()
}
// MARK: - Private
private func configureUI() {
let restoreButton = UIBarButtonItem(title: NSLocalizedString("purchase_pro_restore", comment: ""),
style: .plain,
target: self,
action: #selector(restoreTapped(_:)))
navigationItem.rightBarButtonItem = restoreButton
purchaseButton.isEnabled = false
descriptionTextLabel.text = NSLocalizedString("purchase_pro_description", comment: "")
discountTextLabel.text = NSLocalizedString("purchase_pro_discount", comment: "")
discountTextLabel.isHidden = true
}
private func updateUI() {
// search for the Pro product
let isDiscountEnabled = discountTimeRemaining > 0
let identifier = isDiscountEnabled ? VersioneProProducts.Identifier.ProVersionDiscounted : VersioneProProducts.Identifier.ProVersionFullPrice
guard let proProduct = products.first(where: { $0.productIdentifier.lowercased() == identifier.lowercased() }) else {
return
}
self.proProduct = proProduct
priceFormatter.locale = proProduct.priceLocale
if isDiscountEnabled {
discountTextLabel.isHidden = false
let string = NSLocalizedString("purchase_pro_discount", comment: "")
discountTextLabel.text = String(format: string, discountTimeRemaining)
}
priceLabel.text = priceFormatter.string(from: proProduct.price)
purchaseButton.isEnabled = true
if UserDefaults.standard.bool(forKey: VersioneProProducts.Identifier.ProVersionFullPrice) ||
UserDefaults.standard.bool(forKey: VersioneProProducts.Identifier.ProVersionDiscounted) ||
UserDefaults.standard.bool(forKey: VersioneProProducts.Identifier.Subscription10kYearly) ||
UserDefaults.standard.bool(forKey: VersioneProProducts.Identifier.Subscription10kYearlyDiscounted) ||
UserDefaults.standard.bool(forKey: VersioneProProducts.Identifier.Subscription100kYearly) ||
UserDefaults.standard.bool(forKey: VersioneProProducts.Identifier.Subscription100kYearlyDiscounted) {
purchaseButton.isEnabled = false
priceLabel.text = "-"
}
}
private func loadProducts() {
VersioneProProducts.store.requestProducts { [weak self] success, products in
guard let self = self, let products = products, success == true else { return }
self.products = products
self.updateUI()
}
}
private func checkDiscountPrice() {
EQNPurchaseUtility.offerTimeRemaining { (timeRemaining) in
DispatchQueue.main.async {
self.discountTimeRemaining = timeRemaining
self.updateUI()
}
}
}
// MARK: - Actions
@objc func restoreTapped(_ sender: Any) {
restoreTapped = true
VersioneProProducts.store.restorePurchases()
}
@IBAction func purchaseTapped(_ sender: UIButton) {
guard let product = proProduct else { return }
VersioneProProducts.store.buyProduct(product)
}
@IBAction func openExternalLinkTapped(_ sender: UIButton) {
var linkUrl: URL?
if sender == openPrivacyButton {
linkUrl = URL(string: "\(EQNWebsiteAddress)/privacy/")
} else if sender == openTermsButton {
linkUrl = URL(string: "\(EQNWebsiteAddress)/terms-conditions/")
}
if let url = linkUrl {
let controller = SFSafariViewController(url: url)
present(controller, animated: true, completion: nil)
}
}
// MARK: - Notifications
@objc func handlePurchaseNotification(_ notification: Notification) {
guard let productId = notification.object as? String,
products.contains(where: { $0.productIdentifier == productId }) else {
print("[PurchasePro] Unable to find the product")
return
}
if restoreTapped {
restoreTapped = false
let alert = UIAlertController(title: NSLocalizedString("purchase_pro_restore_alert_title", comment: ""),
message: NSLocalizedString("purchase_pro_restore_alert_message", comment: ""),
preferredStyle: .alert)
alert.addAction(UIAlertAction(title: "OK", style: .default) { [weak self] _ in
self?.navigationController?.popViewController(animated: true)
})
present(alert, animated: true)
} else {
navigationController?.popViewController(animated: true)
}
}
// MARK: - Helper
private var priceFormatter: NumberFormatter = {
let formatter = NumberFormatter()
formatter.formatterBehavior = .behavior10_4
formatter.numberStyle = .currency
return formatter
}()
}