ADD: Update complication currency based on user preference

This commit is contained in:
marcosrdz 2021-02-11 22:34:51 -05:00
parent c413a6a133
commit 983e6b4dd1
10 changed files with 85 additions and 37 deletions

View file

@ -7,7 +7,9 @@ import { BlueStorageContext } from './blue_modules/storage-context';
import Notifications from './blue_modules/notifications';
function WatchConnectivity() {
const { walletsInitialized, wallets, fetchWalletTransactions, saveToDisk, txMetadata } = useContext(BlueStorageContext);
const { walletsInitialized, wallets, fetchWalletTransactions, saveToDisk, txMetadata, preferredFiatCurrency } = useContext(
BlueStorageContext,
);
const isReachable = useReachability();
const isInstalled = useInstalled(); // true | false
@ -19,6 +21,21 @@ function WatchConnectivity() {
// eslint-disable-next-line react-hooks/exhaustive-deps
}, [walletsInitialized, wallets, isReachable, isInstalled]);
useEffect(() => {
if (walletsInitialized) {
try {
updateApplicationContext({
preferredFiatCurrency: JSON.parse(preferredFiatCurrency).endPointKey,
randomID: Math.floor(Math.random() * 11),
});
} catch (e) {
console.log('WatchConnectivity useEffect preferredFiatCurrency error');
console.log(e);
}
}
// eslint-disable-next-line react-hooks/exhaustive-deps
}, [preferredFiatCurrency, walletsInitialized]);
const handleMessages = (message, reply) => {
if (message.request === 'createInvoice') {
handleLightningInvoiceCreateRequest(message.walletIndex, message.amount, message.description)

View file

@ -30,6 +30,7 @@ async function setPrefferedCurrency(item) {
async function getPreferredCurrency() {
const preferredCurrency = await JSON.parse(await AsyncStorage.getItem(AppStorage.PREFERRED_CURRENCY));
await DefaultPreference.setName('group.io.bluewallet.bluewallet');
await DefaultPreference.set('preferredCurrency', preferredCurrency.endPointKey);
await DefaultPreference.set('preferredCurrencyLocale', preferredCurrency.locale.replace('-', '_'));
return preferredCurrency;

View file

@ -1,10 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>com.apple.security.application-groups</key>
<array>
<string>group.io.bluewallet.bluewallet</string>
</array>
</dict>
<dict/>
</plist>

View file

@ -41,13 +41,17 @@ class ComplicationController: NSObject, CLKComplicationDataSource {
let valueLabel: String
let currencySymbol: String
if let price = marketData?.formattedRateForComplication, let marketDatadata = marketData?.date, let userCurrencySymbol = fiatUnit(currency: WidgetAPI.getUserPreferredCurrency())?.symbol {
if let price = marketData?.formattedRateForComplication, let marketDatadata = marketData?.date {
date = marketDatadata
valueLabel = price
currencySymbol = userCurrencySymbol
if let preferredFiatCurrency = UserDefaults.standard.string(forKey: "preferredFiatCurrency"), let preferredFiatUnit = fiatUnit(currency: preferredFiatCurrency) {
currencySymbol = preferredFiatUnit.symbol
} else {
currencySymbol = fiatUnit(currency: "USD")!.symbol
}
} else {
valueLabel = "--"
currencySymbol = "USD"
currencySymbol = fiatUnit(currency: "USD")!.symbol
date = Date()
}

View file

@ -14,17 +14,32 @@ class ExtensionDelegate: NSObject, WKExtensionDelegate {
func applicationDidFinishLaunching() {
// Perform any final initialization of your application.
scheduleNextReload()
WidgetAPI.fetchPrice(currency: WidgetAPI.getUserPreferredCurrency()) { [weak self] (data, error) in
ExtensionDelegate.preferredFiatCurrencyChanged()
}
static func preferredFiatCurrencyChanged() {
let fiatUnitUserDefaults: FiatUnit
if let preferredFiatCurrency = UserDefaults.standard.string(forKey: "preferredFiatCurrency"), let preferredFiatUnit = fiatUnit(currency: preferredFiatCurrency) {
fiatUnitUserDefaults = preferredFiatUnit
} else {
fiatUnitUserDefaults = fiatUnit(currency: "USD")!
}
WidgetAPI.fetchPrice(currency: fiatUnitUserDefaults.endPointKey) { (data, error) in
if let data = data, let encodedData = try? PropertyListEncoder().encode(data) {
UserDefaults.standard.set(encodedData, forKey: MarketData.string)
self?.reloadActiveComplications()
UserDefaults.standard.synchronize()
let server = CLKComplicationServer.sharedInstance()
for complication in server.activeComplications ?? [] {
server.reloadTimeline(for: complication)
}
}
}
}
func nextReloadTime(after date: Date) -> Date {
let calendar = Calendar(identifier: .gregorian)
return calendar.date(byAdding: .minute, value: 1, to: date)!
return calendar.date(byAdding: .minute, value: 10, to: date)!
}
func scheduleNextReload() {
@ -60,14 +75,20 @@ class ExtensionDelegate: NSObject, WKExtensionDelegate {
func handle(_ backgroundTasks: Set<WKRefreshBackgroundTask>) {
for task in backgroundTasks {
switch task {
case let backgroundTask as WKApplicationRefreshBackgroundTask:
case let backgroundTask as WKApplicationRefreshBackgroundTask:
NSLog("ExtensionDelegate: handling WKApplicationRefreshBackgroundTask")
scheduleNextReload()
WidgetAPI.fetchPrice(currency: WidgetAPI.getUserPreferredCurrency()) { [weak self] (data, error) in
let fiatUnitUserDefaults: FiatUnit
if let preferredFiatCurrency = UserDefaults.standard.string(forKey: "preferredFiatCurrency"), let preferredFiatUnit = fiatUnit(currency: preferredFiatCurrency) {
fiatUnitUserDefaults = preferredFiatUnit
} else {
fiatUnitUserDefaults = fiatUnit(currency: "USD")!
}
WidgetAPI.fetchPrice(currency: fiatUnitUserDefaults.endPointKey) { [weak self] (data, error) in
if let data = data, let encodedData = try? PropertyListEncoder().encode(data) {
UserDefaults.standard.set(encodedData, forKey: MarketData.string)
UserDefaults.standard.synchronize()
self?.reloadActiveComplications()
backgroundTask.setTaskCompletedWithSnapshot(false)
}
@ -79,4 +100,6 @@ class ExtensionDelegate: NSObject, WKExtensionDelegate {
}
}
}

View file

@ -96,11 +96,23 @@ class WatchDataSource: NSObject, WCSessionDelegate {
}
func session(_ session: WCSession, didReceiveApplicationContext applicationContext: [String : Any]) {
WatchDataSource.shared.processWalletsData(walletsInfo: applicationContext)
if let preferredFiatCurrency = applicationContext["preferredFiatCurrency"] as? String, let preferredFiatCurrencyUnit = fiatUnit(currency: preferredFiatCurrency) {
UserDefaults.standard.set(preferredFiatCurrencyUnit.endPointKey, forKey: "preferredFiatCurrency")
UserDefaults.standard.synchronize()
ExtensionDelegate.preferredFiatCurrencyChanged()
} else {
WatchDataSource.shared.processWalletsData(walletsInfo: applicationContext)
}
}
func session(_ session: WCSession, didReceiveApplicationContext applicationContext: [String : Any], replyHandler: @escaping ([String : Any]) -> Void) {
WatchDataSource.shared.processWalletsData(walletsInfo: applicationContext)
if let preferredFiatCurrency = applicationContext["preferredFiatCurrency"] as? String, let preferredFiatCurrencyUnit = fiatUnit(currency: preferredFiatCurrency) {
UserDefaults.standard.set(preferredFiatCurrencyUnit.endPointKey, forKey: "preferredFiatCurrency")
UserDefaults.standard.synchronize()
ExtensionDelegate.preferredFiatCurrencyChanged()
} else {
WatchDataSource.shared.processWalletsData(walletsInfo: applicationContext)
}
}
func session(_ session: WCSession, activationDidCompleteWith activationState: WCSessionActivationState, error: Error?) {

View file

@ -1,10 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>com.apple.security.application-groups</key>
<array>
<string>group.io.bluewallet.bluewallet</string>
</array>
</dict>
<dict/>
</plist>

View file

@ -61,3 +61,14 @@ enum MarketDataTimeline: String {
case Previous = "previous"
case Current = "current"
}
enum UserDefaultsGroupKey: String {
case GroupName = "group.io.bluewallet.bluewallet"
case PreferredCurrency = "preferredCurrency"
case ElectrumSettingsHost = "electrum_host"
case ElectrumSettingsTCPPort = "electrum_tcp_port"
case ElectrumSettingsSSLPort = "electrum_ssl_port"
case AllWalletsBalance = "WidgetCommunicationAllWalletsSatoshiBalance"
case AllWalletsLatestTransactionTime = "WidgetCommunicationAllWalletsLatestTransactionTime"
case LatestTransactionIsUnconfirmed = "\"WidgetCommunicationLatestTransactionIsUnconfirmed\""
}

View file

@ -8,17 +8,6 @@
import Foundation
enum UserDefaultsGroupKey: String {
case GroupName = "group.io.bluewallet.bluewallet"
case PreferredCurrency = "preferredCurrency"
case ElectrumSettingsHost = "electrum_host"
case ElectrumSettingsTCPPort = "electrum_tcp_port"
case ElectrumSettingsSSLPort = "electrum_ssl_port"
case AllWalletsBalance = "WidgetCommunicationAllWalletsSatoshiBalance"
case AllWalletsLatestTransactionTime = "WidgetCommunicationAllWalletsLatestTransactionTime"
case LatestTransactionIsUnconfirmed = "\"WidgetCommunicationLatestTransactionIsUnconfirmed\""
}
struct UserDefaultsElectrumSettings {
let host: String?
let port: Int32?

View file

@ -42,7 +42,8 @@ class WidgetAPI {
}
static func getUserPreferredCurrency() -> String {
guard let userDefaults = UserDefaults(suiteName: "group.io.bluewallet.bluewallet"),
guard let userDefaults = UserDefaults(suiteName: UserDefaultsGroupKey.GroupName.rawValue),
let preferredCurrency = userDefaults.string(forKey: "preferredCurrency")
else {
return "USD"
@ -58,7 +59,7 @@ class WidgetAPI {
}
static func getUserPreferredCurrencyLocale() -> String {
guard let userDefaults = UserDefaults(suiteName: "group.io.bluewallet.bluewallet"),
guard let userDefaults = UserDefaults(suiteName: UserDefaultsGroupKey.GroupName.rawValue),
let preferredCurrency = userDefaults.string(forKey: "preferredCurrencyLocale")
else {
return "en_US"