BlueWallet/ios/TodayExtension/TodayViewController.swift

131 lines
5.2 KiB
Swift
Raw Normal View History

//
// TodayViewController.swift
// TodayExtension
//
// Created by Marcos Rodriguez on 11/2/19.
// Copyright © 2019 Facebook. All rights reserved.
//
import UIKit
import NotificationCenter
class TodayViewController: UIViewController, NCWidgetProviding {
@IBOutlet weak var currencyLabel: UILabel!
@IBOutlet weak var lastUpdatedDate: UILabel!
@IBOutlet weak var priceLabel: UILabel!
@IBOutlet weak var lastPriceArrowImage: UIImageView!
@IBOutlet weak var lastPrice: UILabel!
@IBOutlet weak var lastPriceFromLabel: UILabel!
private var lastPriceNumber: NSNumber?
override func viewDidLoad() {
super.viewDidLoad()
setLastPriceOutletsHidden(isHidden: true)
if let lastStoredTodayStore = TodayData.getPriceRateAndLastUpdate() {
processRateAndLastUpdate(todayStore: lastStoredTodayStore)
} else {
setLastPriceOutletsHidden(isHidden: true)
}
}
func setLastPriceOutletsHidden(isHidden: Bool) {
lastPrice.isHidden = isHidden
lastPriceFromLabel.isHidden = isHidden
lastPriceArrowImage.isHidden = isHidden
}
func processRateAndLastUpdate(todayStore: TodayDataStore) {
guard let rateString = todayStore.formattedRate, let dateFormatted = todayStore.formattedDate else { return }
priceLabel.text = rateString
lastUpdatedDate.text = dateFormatted
}
func processStoredRateAndLastUpdate(todayStore: TodayDataStore) {
guard let lastPriceNumber = todayStore.formattedRate else { return }
lastPrice.text = lastPriceNumber
}
func processCachedStoredRateAndLastUpdate(new: TodayDataStore, cached: TodayDataStore) {
guard let newPriceDoubleValue = new.rateDoubleValue, let cachedPriceNumber = cached.formattedRate, let cachedPriceNumberDoubleValue = cached.rateDoubleValue else { return }
lastPrice.text = cachedPriceNumber
if newPriceDoubleValue > cachedPriceNumberDoubleValue {
self.lastPriceArrowImage.image = UIImage(systemName: "arrow.up")
self.setLastPriceOutletsHidden(isHidden: false)
} else {
self.lastPriceArrowImage.image = UIImage(systemName: "arrow.down")
self.setLastPriceOutletsHidden(isHidden: false)
}
}
func widgetPerformUpdate(completionHandler: (@escaping (NCUpdateResult) -> Void)) {
// Perform any setup necessary in order to update the view.
// If an error is encountered, use NCUpdateResult.Failed
// If there's no update required, use NCUpdateResult.NoData
// If there's an update, use NCUpdateResult.NewData
let userPreferredCurrency = API.getUserPreferredCurrency();
self.currencyLabel.text = userPreferredCurrency
API.fetchPrice(currency: userPreferredCurrency, completion: { (result, error) in
DispatchQueue.main.async { [unowned self] in
guard let result = result else {
completionHandler(.failed)
return
}
guard let bpi = result["bpi"] as? Dictionary<String, Any>, let preferredCurrency = bpi[userPreferredCurrency] as? Dictionary<String, Any>, let rateString = preferredCurrency["rate"] as? String,
let time = result["time"] as? Dictionary<String, Any>, let lastUpdatedString = time["updatedISO"] as? String
else {
return
}
let latestRateDataStore = TodayDataStore(rate: rateString, lastUpdate: lastUpdatedString)
if let lastStoredTodayStore = TodayData.getPriceRateAndLastUpdate(), lastStoredTodayStore.lastUpdate == latestRateDataStore.lastUpdate, rateString == lastStoredTodayStore.rate, API.getLastSelectedCurrency() == userPreferredCurrency {
if let cached = TodayData.getCachedPriceRateAndLastUpdate() {
self.processCachedStoredRateAndLastUpdate(new: lastStoredTodayStore, cached: cached)
} else {
self.setLastPriceOutletsHidden(isHidden: true)
}
completionHandler(.noData)
} else {
self.processRateAndLastUpdate(todayStore: latestRateDataStore)
let priceRiceAndLastUpdate = TodayData.getPriceRateAndLastUpdate()
if let rate = priceRiceAndLastUpdate?.rate, let lastUpdate = priceRiceAndLastUpdate?.lastUpdate {
TodayData.saveCachePriceRateAndLastUpdate(rate: rate, lastUpdate: lastUpdate);
}
if let latestRateDataStore = latestRateDataStore.rateDoubleValue, let lastStoredPriceNumber = priceRiceAndLastUpdate?.rateDoubleValue, API.getLastSelectedCurrency() == userPreferredCurrency {
if latestRateDataStore > lastStoredPriceNumber {
self.lastPriceArrowImage.image = UIImage(systemName: "arrow.up")
self.setLastPriceOutletsHidden(isHidden: false)
} else {
self.lastPriceArrowImage.image = UIImage(systemName: "arrow.down")
self.setLastPriceOutletsHidden(isHidden: false)
}
self.lastPrice.text = priceRiceAndLastUpdate?.formattedRate
} else {
self.setLastPriceOutletsHidden(isHidden: true)
}
TodayData.savePriceRateAndLastUpdate(rate: latestRateDataStore.rate, lastUpdate: latestRateDataStore.lastUpdate)
API.saveNewSelectedCurrency()
completionHandler(.newData)
}
}
})
}
}