Browse Source

OPS: upgrade rnwatch

OPS: react-native-watch-connectivity-0.4.1

FIX

FIX

Update WatchConnectivity.ios.js

Update WatchConnectivity.ios.js

ADD: Add Onchain address view for Lightning

Update package.json

FIX: Fix communication bug

FIX: Fix communication bug

Update Info.plist

FIX: Update for watch

Update Interface.storyboard

TST

Update WatchConnectivity.android.js

Update WatchConnectivity.ios.js
btcpayserverui
Marcos Rodriguez 5 years ago
committed by Overtorment
parent
commit
25e68fc21a
  1. 12
      WatchConnectivity.android.js
  2. 101
      WatchConnectivity.ios.js
  3. 6
      class/abstract-hd-wallet.js
  4. 17
      class/app-storage.js
  5. 15
      ios/BlueWallet/Info.plist
  6. 4
      ios/BlueWalletWatch Extension/InterfaceController.swift
  7. 16
      ios/BlueWalletWatch Extension/Objects/WatchDataSource.swift
  8. 13
      ios/BlueWalletWatch Extension/ReceiveInterfaceController.swift
  9. 7
      ios/BlueWalletWatch Extension/SpecifyInterfaceController.swift
  10. 14
      ios/BlueWalletWatch Extension/WalletDetailsInterfaceController.swift
  11. 35
      ios/BlueWalletWatch/Base.lproj/Interface.storyboard
  12. 12
      ios/Podfile.lock
  13. 164
      package-lock.json
  14. 2
      package.json
  15. 2
      screen/wallets/transactions.js

12
WatchConnectivity.android.js

@ -0,0 +1,12 @@
export default class WatchConnectivity {
isAppInstalled = false;
static shared = new WatchConnectivity();
wallets;
fetchTransactionsFunction = () => {};
getIsWatchAppInstalled() {}
async handleLightningInvoiceCreateRequest(_walletIndex, _amount, _description) {}
async sendWalletsToWatch() {}
}

101
WatchConnectivity.js → WatchConnectivity.ios.js

@ -1,42 +1,51 @@
import * as Watch from 'react-native-watch-connectivity'; import * as Watch from 'react-native-watch-connectivity';
import { InteractionManager, Platform } from 'react-native'; import { InteractionManager } from 'react-native';
const loc = require('./loc'); const loc = require('./loc');
export default class WatchConnectivity { export default class WatchConnectivity {
isAppInstalled = false; isAppInstalled = false;
BlueApp = require('./BlueApp'); static shared = new WatchConnectivity();
wallets;
fetchTransactionsFunction = () => {};
constructor() { constructor() {
if (Platform.OS === 'ios') { this.getIsWatchAppInstalled();
this.getIsWatchAppInstalled();
}
} }
getIsWatchAppInstalled() { getIsWatchAppInstalled() {
if (Platform.OS !== 'ios') return;
Watch.getIsWatchAppInstalled((err, isAppInstalled) => { Watch.getIsWatchAppInstalled((err, isAppInstalled) => {
if (!err) { if (!err) {
this.isAppInstalled = isAppInstalled; WatchConnectivity.shared.isAppInstalled = isAppInstalled;
this.sendWalletsToWatch(); Watch.subscribeToWatchState((err, watchState) => {
} if (!err) {
}); if (watchState === 'Activated') {
Watch.subscribeToMessages(async (err, message, reply) => { WatchConnectivity.shared.sendWalletsToWatch();
if (!err) { }
if (message.request === 'createInvoice') { }
const createInvoiceRequest = await this.handleLightningInvoiceCreateRequest( });
message.walletIndex, Watch.subscribeToMessages(async (err, message, reply) => {
message.amount, if (!err) {
message.description, if (message.request === 'createInvoice') {
); const createInvoiceRequest = await this.handleLightningInvoiceCreateRequest(
reply({ invoicePaymentRequest: createInvoiceRequest }); message.walletIndex,
} message.amount,
} else { message.description,
reply(err); );
reply({ invoicePaymentRequest: createInvoiceRequest });
} else if (message.message === 'sendApplicationContext') {
await WatchConnectivity.shared.sendWalletsToWatch(WatchConnectivity.shared.wallets);
} else if (message.message === 'fetchTransactions') {
await WatchConnectivity.shared.fetchTransactionsFunction();
}
} else {
reply(err);
}
});
} }
}); });
} }
async handleLightningInvoiceCreateRequest(walletIndex, amount, description) { async handleLightningInvoiceCreateRequest(walletIndex, amount, description) {
const wallet = this.BlueApp.getWallets()[walletIndex]; const wallet = WatchConnectivity.shared.wallets[walletIndex];
if (wallet.allowReceive() && amount > 0 && description.trim().length > 0) { if (wallet.allowReceive() && amount > 0 && description.trim().length > 0) {
try { try {
const invoiceRequest = await wallet.addInvoice(amount, description); const invoiceRequest = await wallet.addInvoice(amount, description);
@ -47,18 +56,31 @@ export default class WatchConnectivity {
} }
} }
async sendWalletsToWatch() { async sendWalletsToWatch(allWallets) {
if (Platform.OS !== 'ios') return; if (allWallets === undefined && WatchConnectivity.shared.wallets !== undefined) {
InteractionManager.runAfterInteractions(async () => { allWallets = WatchConnectivity.shared.wallets;
if (this.isAppInstalled) { }
const allWallets = this.BlueApp.getWallets(); if (allWallets && allWallets.length === 0) {
return;
}
return InteractionManager.runAfterInteractions(async () => {
console.warn(WatchConnectivity.shared.isAppInstalled);
if (WatchConnectivity.shared.isAppInstalled) {
let wallets = []; let wallets = [];
for (const wallet of allWallets) { for (const wallet of allWallets) {
let receiveAddress = ''; let receiveAddress = '';
if (wallet.allowReceive()) { if (wallet.allowReceive()) {
if (wallet.getAddressAsync) { if (wallet.getAddressAsync) {
await wallet.getAddressAsync(); try {
receiveAddress = wallet.getAddress(); await wallet.getAddressAsync();
receiveAddress = wallet.getAddress();
} catch (error) {
console.log(error);
receiveAddress = wallet.getAddress();
}
} else { } else {
receiveAddress = wallet.getAddress(); receiveAddress = wallet.getAddress();
} }
@ -70,7 +92,7 @@ export default class WatchConnectivity {
let memo = ''; let memo = '';
let amount = 0; let amount = 0;
if (transaction.hasOwnProperty('confirmations') && !transaction.confirmations > 0) { if (transaction.hasOwnProperty('confirmations') && !(transaction.confirmations > 0)) {
type = 'pendingConfirmation'; type = 'pendingConfirmation';
} else if (transaction.type === 'user_invoice' || transaction.type === 'payment_request') { } else if (transaction.type === 'user_invoice' || transaction.type === 'payment_request') {
const currentDate = new Date(); const currentDate = new Date();
@ -92,9 +114,7 @@ export default class WatchConnectivity {
type = 'received'; type = 'received';
} }
if (transaction.type === 'user_invoice' || transaction.type === 'payment_request') { if (transaction.type === 'user_invoice' || transaction.type === 'payment_request') {
if (isNaN(transaction.value)) { amount = isNaN(transaction.value) ? '0' : amount;
amount = '0';
}
const currentDate = new Date(); const currentDate = new Date();
const now = (currentDate.getTime() / 1000) | 0; const now = (currentDate.getTime() / 1000) | 0;
const invoiceExpiration = transaction.timestamp + transaction.expire_time; const invoiceExpiration = transaction.timestamp + transaction.expire_time;
@ -113,8 +133,8 @@ export default class WatchConnectivity {
} else { } else {
amount = loc.formatBalance(transaction.value, wallet.getPreferredBalanceUnit(), true).toString(); amount = loc.formatBalance(transaction.value, wallet.getPreferredBalanceUnit(), true).toString();
} }
if (this.BlueApp.tx_metadata[transaction.hash] && this.BlueApp.tx_metadata[transaction.hash]['memo']) { if (WatchConnectivity.shared.tx_metadata[transaction.hash] && WatchConnectivity.shared.tx_metadata[transaction.hash]['memo']) {
memo = this.BlueApp.tx_metadata[transaction.hash]['memo']; memo = WatchConnectivity.shared.tx_metadata[transaction.hash]['memo'];
} else if (transaction.memo) { } else if (transaction.memo) {
memo = transaction.memo; memo = transaction.memo;
} }
@ -130,14 +150,9 @@ export default class WatchConnectivity {
transactions: watchTransactions, transactions: watchTransactions,
}); });
} }
Watch.updateApplicationContext({ wallets, randomID: Math.floor(Math.random() * 11) });
Watch.updateApplicationContext({ wallets }); return { wallets };
} }
}); });
} }
} }
WatchConnectivity.init = function() {
if (WatchConnectivity.shared || Platform.OS !== 'ios') return;
WatchConnectivity.shared = new WatchConnectivity();
};

6
class/abstract-hd-wallet.js

@ -138,7 +138,7 @@ export class AbstractHDWallet extends LegacyWallet {
freeAddress = this._getExternalAddressByIndex(this.next_free_address_index + c); // we didnt check this one, maybe its free freeAddress = this._getExternalAddressByIndex(this.next_free_address_index + c); // we didnt check this one, maybe its free
this.next_free_address_index += c + 1; // now points to the one _after_ this.next_free_address_index += c + 1; // now points to the one _after_
} }
this._address = freeAddress;
return freeAddress; return freeAddress;
} }
@ -176,7 +176,7 @@ export class AbstractHDWallet extends LegacyWallet {
freeAddress = this._getExternalAddressByIndex(this.next_free_address_index + c); // we didnt check this one, maybe its free freeAddress = this._getExternalAddressByIndex(this.next_free_address_index + c); // we didnt check this one, maybe its free
this.next_free_address_index += c + 1; // now points to the one _after_ this.next_free_address_index += c + 1; // now points to the one _after_
} }
this._address = freeAddress;
return freeAddress; return freeAddress;
} }
@ -187,7 +187,7 @@ export class AbstractHDWallet extends LegacyWallet {
* @return {string} * @return {string}
*/ */
getAddress() { getAddress() {
return ''; return this._address;
} }
_getExternalWIFByIndex(index) { _getExternalWIFByIndex(index) {

17
class/app-storage.js

@ -244,8 +244,13 @@ export class AppStorage {
this.tx_metadata = data.tx_metadata; this.tx_metadata = data.tx_metadata;
} }
} }
WatchConnectivity.init(); WatchConnectivity.shared.wallets = this.wallets;
WatchConnectivity.shared && (await WatchConnectivity.shared.sendWalletsToWatch()); WatchConnectivity.shared.tx_metadata = this.tx_metadata;
WatchConnectivity.shared.fetchTransactionsFunction = async () => {
await this.fetchWalletTransactions();
await this.saveToDisk();
};
await WatchConnectivity.shared.sendWalletsToWatch(this.wallets);
return true; return true;
} else { } else {
return false; // failed loading data or loading/decryptin data return false; // failed loading data or loading/decryptin data
@ -265,6 +270,7 @@ export class AppStorage {
deleteWallet(wallet) { deleteWallet(wallet) {
let secret = wallet.getSecret(); let secret = wallet.getSecret();
let tempWallets = []; let tempWallets = [];
for (let value of this.wallets) { for (let value of this.wallets) {
if (value.getSecret() === secret) { if (value.getSecret() === secret) {
// the one we should delete // the one we should delete
@ -318,8 +324,9 @@ export class AppStorage {
} else { } else {
await this.setItem(AppStorage.FLAG_ENCRYPTED, ''); // drop the flag await this.setItem(AppStorage.FLAG_ENCRYPTED, ''); // drop the flag
} }
WatchConnectivity.init(); WatchConnectivity.shared.wallets = this.wallets;
WatchConnectivity.shared && WatchConnectivity.shared.sendWalletsToWatch(); WatchConnectivity.shared.tx_metadata = this.tx_metadata;
await WatchConnectivity.shared.sendWalletsToWatch();
return this.setItem('data', JSON.stringify(data)); return this.setItem('data', JSON.stringify(data));
} }
@ -455,4 +462,4 @@ export class AppStorage {
async sleep(ms) { async sleep(ms) {
return new Promise(resolve => setTimeout(resolve, ms)); return new Promise(resolve => setTimeout(resolve, ms));
} }
} }

15
ios/BlueWallet/Info.plist

@ -47,6 +47,21 @@
<true/> <true/>
<key>NSExceptionDomains</key> <key>NSExceptionDomains</key>
<dict> <dict>
<key>electrum3.bluewallet.io</key>
<dict>
<key>NSExceptionAllowsInsecureHTTPLoads</key>
<true/>
</dict>
<key>electrum2.bluewallet.io</key>
<dict>
<key>NSExceptionAllowsInsecureHTTPLoads</key>
<true/>
</dict>
<key>electrum1.bluewallet.io</key>
<dict>
<key>NSExceptionAllowsInsecureHTTPLoads</key>
<true/>
</dict>
<key>localhost</key> <key>localhost</key>
<dict> <dict>
<key>NSExceptionAllowsInsecureHTTPLoads</key> <key>NSExceptionAllowsInsecureHTTPLoads</key>

4
ios/BlueWalletWatch Extension/InterfaceController.swift

@ -19,7 +19,6 @@ class InterfaceController: WKInterfaceController {
override func willActivate() { override func willActivate() {
// This method is called when watch view controller is about to be visible to user // This method is called when watch view controller is about to be visible to user
super.willActivate() super.willActivate()
WCSession.default.sendMessage(["message" : "sendApplicationContext"], replyHandler: nil, errorHandler: nil)
if (WatchDataSource.shared.wallets.isEmpty) { if (WatchDataSource.shared.wallets.isEmpty) {
loadingIndicatorGroup.setHidden(true) loadingIndicatorGroup.setHidden(true)
@ -31,8 +30,6 @@ class InterfaceController: WKInterfaceController {
} }
@objc private func processWalletsTable() { @objc private func processWalletsTable() {
loadingIndicatorGroup.setHidden(false)
walletsTable.setHidden(true)
walletsTable.setNumberOfRows(WatchDataSource.shared.wallets.count, withRowType: WalletInformation.identifier) walletsTable.setNumberOfRows(WatchDataSource.shared.wallets.count, withRowType: WalletInformation.identifier)
for index in 0..<walletsTable.numberOfRows { for index in 0..<walletsTable.numberOfRows {
@ -45,7 +42,6 @@ class InterfaceController: WKInterfaceController {
controller.balance = wallet.balance controller.balance = wallet.balance
controller.type = WalletGradient(rawValue: wallet.type) ?? .SegwitHD controller.type = WalletGradient(rawValue: wallet.type) ?? .SegwitHD
} }
loadingIndicatorGroup.setHidden(true)
noWalletsAvailableLabel.setHidden(!WatchDataSource.shared.wallets.isEmpty) noWalletsAvailableLabel.setHidden(!WatchDataSource.shared.wallets.isEmpty)
walletsTable.setHidden(WatchDataSource.shared.wallets.isEmpty) walletsTable.setHidden(WatchDataSource.shared.wallets.isEmpty)
} }

16
ios/BlueWalletWatch Extension/Objects/WatchDataSource.swift

@ -32,10 +32,10 @@ class WatchDataSource: NSObject, WCSessionDelegate {
} }
func processWalletsData(walletsInfo: [String: Any]) { func processWalletsData(walletsInfo: [String: Any]) {
if let walletsToProcess = walletsInfo["wallets"] as? [[String: Any]] { if let walletsToProcess = walletsInfo["wallets"] as? [[String: Any]], !walletsToProcess.isEmpty {
wallets.removeAll(); wallets.removeAll();
for (index, entry) in walletsToProcess.enumerated() { for (index, entry) in walletsToProcess.enumerated() {
guard let label = entry["label"] as? String, let balance = entry["balance"] as? String, let type = entry["type"] as? String, let preferredBalanceUnit = entry["preferredBalanceUnit"] as? String, let receiveAddress = entry["receiveAddress"] as? String, let transactions = entry["transactions"] as? [[String: Any]] else { guard let label = entry["label"] as? String, let balance = entry["balance"] as? String, let type = entry["type"] as? String, let preferredBalanceUnit = entry["preferredBalanceUnit"] as? String, let transactions = entry["transactions"] as? [[String: Any]] else {
continue continue
} }
var transactionsProcessed = [Transaction]() var transactionsProcessed = [Transaction]()
@ -44,6 +44,7 @@ class WatchDataSource: NSObject, WCSessionDelegate {
let transaction = Transaction(time: time, memo: memo, type: type, amount: amount) let transaction = Transaction(time: time, memo: memo, type: type, amount: amount)
transactionsProcessed.append(transaction) transactionsProcessed.append(transaction)
} }
let receiveAddress = entry["receiveAddress"] as? String ?? ""
let wallet = Wallet(label: label, balance: balance, type: type, preferredBalanceUnit: preferredBalanceUnit, receiveAddress: receiveAddress, transactions: transactionsProcessed, identifier: index) let wallet = Wallet(label: label, balance: balance, type: type, preferredBalanceUnit: preferredBalanceUnit, receiveAddress: receiveAddress, transactions: transactionsProcessed, identifier: index)
wallets.append(wallet) wallets.append(wallet)
} }
@ -73,7 +74,7 @@ class WatchDataSource: NSObject, WCSessionDelegate {
}) { (error) in }) { (error) in
print(error) print(error)
responseHandler("") responseHandler("")
} }
} }
@ -85,18 +86,17 @@ class WatchDataSource: NSObject, WCSessionDelegate {
WatchDataSource.shared.processWalletsData(walletsInfo: applicationContext) WatchDataSource.shared.processWalletsData(walletsInfo: applicationContext)
} }
func session(_ session: WCSession, didReceiveUserInfo userInfo: [String : Any] = [:]) {
// WatchDataSource.shared.processWalletsData(walletsInfo: userInfo)
}
func session(_ session: WCSession, activationDidCompleteWith activationState: WCSessionActivationState, error: Error?) { func session(_ session: WCSession, activationDidCompleteWith activationState: WCSessionActivationState, error: Error?) {
if activationState == .activated { if activationState == .activated {
WCSession.default.sendMessage([:], replyHandler: nil, errorHandler: nil)
if let existingData = keychain.getData(Wallet.identifier), let walletData = try? NSKeyedUnarchiver.unarchiveTopLevelObjectWithData(existingData) as? [Wallet] { if let existingData = keychain.getData(Wallet.identifier), let walletData = try? NSKeyedUnarchiver.unarchiveTopLevelObjectWithData(existingData) as? [Wallet] {
guard let walletData = walletData, walletData != self.wallets else { return } guard let walletData = walletData, walletData != self.wallets else { return }
wallets = walletData wallets = walletData
WatchDataSource.postDataUpdatedNotification() WatchDataSource.postDataUpdatedNotification()
} }
WCSession.default.sendMessage(["message" : "sendApplicationContext"], replyHandler: { (replyData) in
}) { (error) in
print(error)
}
} }
} }

13
ios/BlueWalletWatch Extension/ReceiveInterfaceController.swift

@ -7,6 +7,7 @@
// //
import WatchKit import WatchKit
import WatchConnectivity
import Foundation import Foundation
import EFQRCode import EFQRCode
@ -16,19 +17,22 @@ class ReceiveInterfaceController: WKInterfaceController {
@IBOutlet weak var imageInterface: WKInterfaceImage! @IBOutlet weak var imageInterface: WKInterfaceImage!
private var wallet: Wallet? private var wallet: Wallet?
private var isRenderingQRCode: Bool? private var isRenderingQRCode: Bool?
private var receiveMethod: String = "receive"
@IBOutlet weak var loadingIndicator: WKInterfaceGroup! @IBOutlet weak var loadingIndicator: WKInterfaceGroup!
override func awake(withContext context: Any?) { override func awake(withContext context: Any?) {
super.awake(withContext: context) super.awake(withContext: context)
guard let identifier = context as? Int, WatchDataSource.shared.wallets.count > identifier else { guard let passedContext = context as? (Int, String), WatchDataSource.shared.wallets.count >= passedContext.0 else {
pop() pop()
return return
} }
let identifier = passedContext.0
let wallet = WatchDataSource.shared.wallets[identifier] let wallet = WatchDataSource.shared.wallets[identifier]
self.wallet = wallet self.wallet = wallet
receiveMethod = passedContext.1
NotificationCenter.default.addObserver(forName: SpecifyInterfaceController.NotificationName.createQRCode, object: nil, queue: nil) { [weak self] (notification) in NotificationCenter.default.addObserver(forName: SpecifyInterfaceController.NotificationName.createQRCode, object: nil, queue: nil) { [weak self] (notification) in
self?.isRenderingQRCode = true self?.isRenderingQRCode = true
if let wallet = self?.wallet, wallet.type == "lightningCustodianWallet", let object = notification.object as? SpecifyInterfaceController.SpecificQRCodeContent, let amount = object.amount { if let wallet = self?.wallet, wallet.type == "lightningCustodianWallet", self?.receiveMethod == "createInvoice", let object = notification.object as? SpecifyInterfaceController.SpecificQRCodeContent, let amount = object.amount {
self?.imageInterface.setHidden(true) self?.imageInterface.setHidden(true)
self?.loadingIndicator.setHidden(false) self?.loadingIndicator.setHidden(false)
WatchDataSource.requestLightningInvoice(walletIdentifier: identifier, amount: amount, description: object.description, responseHandler: { (invoice) in WatchDataSource.requestLightningInvoice(walletIdentifier: identifier, amount: amount, description: object.description, responseHandler: { (invoice) in
@ -43,6 +47,7 @@ class ReceiveInterfaceController: WKInterfaceController {
self?.imageInterface.setHidden(false) self?.imageInterface.setHidden(false)
self?.imageInterface.setImage(nil) self?.imageInterface.setImage(nil)
self?.imageInterface.setImage(image) self?.imageInterface.setImage(image)
WCSession.default.sendMessage(["message": "fetchTransactions"], replyHandler: nil, errorHandler: nil)
} else { } else {
self?.pop() self?.pop()
self?.presentAlert(withTitle: "Error", message: "Unable to create invoice. Please, make sure your iPhone is paired and nearby.", preferredStyle: .alert, actions: [WKAlertAction(title: "OK", style: .default, handler: { [weak self] in self?.presentAlert(withTitle: "Error", message: "Unable to create invoice. Please, make sure your iPhone is paired and nearby.", preferredStyle: .alert, actions: [WKAlertAction(title: "OK", style: .default, handler: { [weak self] in
@ -83,7 +88,7 @@ class ReceiveInterfaceController: WKInterfaceController {
} }
guard !wallet.receiveAddress.isEmpty, let cgImage = EFQRCode.generate( guard !wallet.receiveAddress.isEmpty, let cgImage = EFQRCode.generate(
content: wallet.receiveAddress) else { content: wallet.receiveAddress), receiveMethod != "createInvoice" else {
return return
} }
@ -93,7 +98,7 @@ class ReceiveInterfaceController: WKInterfaceController {
override func didAppear() { override func didAppear() {
super.didAppear() super.didAppear()
if wallet?.type == "lightningCustodianWallet" { if wallet?.type == "lightningCustodianWallet" && receiveMethod == "createInvoice" {
if isRenderingQRCode == nil { if isRenderingQRCode == nil {
presentController(withName: SpecifyInterfaceController.identifier, context: wallet?.identifier) presentController(withName: SpecifyInterfaceController.identifier, context: wallet?.identifier)
isRenderingQRCode = false isRenderingQRCode = false

7
ios/BlueWalletWatch Extension/SpecifyInterfaceController.swift

@ -14,6 +14,8 @@ class SpecifyInterfaceController: WKInterfaceController {
static let identifier = "SpecifyInterfaceController" static let identifier = "SpecifyInterfaceController"
@IBOutlet weak var descriptionButton: WKInterfaceButton! @IBOutlet weak var descriptionButton: WKInterfaceButton!
@IBOutlet weak var amountButton: WKInterfaceButton! @IBOutlet weak var amountButton: WKInterfaceButton!
@IBOutlet weak var createButton: WKInterfaceButton!
struct SpecificQRCodeContent { struct SpecificQRCodeContent {
var amount: Double? var amount: Double?
var description: String? var description: String?
@ -36,6 +38,7 @@ class SpecifyInterfaceController: WKInterfaceController {
} }
let wallet = WatchDataSource.shared.wallets[identifier] let wallet = WatchDataSource.shared.wallets[identifier]
self.wallet = wallet self.wallet = wallet
self.createButton.setAlpha(0.5)
self.specifiedQRContent.bitcoinUnit = wallet.type == "lightningCustodianWallet" ? .SATS : .BTC self.specifiedQRContent.bitcoinUnit = wallet.type == "lightningCustodianWallet" ? .SATS : .BTC
NotificationCenter.default.addObserver(forName: NumericKeypadInterfaceController.NotificationName.keypadDataChanged, object: nil, queue: nil) { [weak self] (notification) in NotificationCenter.default.addObserver(forName: NumericKeypadInterfaceController.NotificationName.keypadDataChanged, object: nil, queue: nil) { [weak self] (notification) in
guard let amountObject = notification.object as? [String], !amountObject.isEmpty else { return } guard let amountObject = notification.object as? [String], !amountObject.isEmpty else { return }
@ -53,6 +56,10 @@ class SpecifyInterfaceController: WKInterfaceController {
if let amountDouble = Double(title), let keyPadType = self?.specifiedQRContent.bitcoinUnit { if let amountDouble = Double(title), let keyPadType = self?.specifiedQRContent.bitcoinUnit {
self?.specifiedQRContent.amount = amountDouble self?.specifiedQRContent.amount = amountDouble
self?.amountButton.setTitle("\(title) \(keyPadType)") self?.amountButton.setTitle("\(title) \(keyPadType)")
let isShouldCreateButtonBeEnabled = amountDouble > 0 && !title.isEmpty
self?.createButton.setEnabled(isShouldCreateButtonBeEnabled)
self?.createButton.setAlpha(isShouldCreateButtonBeEnabled ? 1.0 : 0.5)
} }
} }
} }

14
ios/BlueWalletWatch Extension/WalletDetailsInterfaceController.swift

@ -16,11 +16,13 @@ class WalletDetailsInterfaceController: WKInterfaceController {
static let identifier = "WalletDetailsInterfaceController" static let identifier = "WalletDetailsInterfaceController"
@IBOutlet weak var walletBasicsGroup: WKInterfaceGroup! @IBOutlet weak var walletBasicsGroup: WKInterfaceGroup!
@IBOutlet weak var walletBalanceLabel: WKInterfaceLabel! @IBOutlet weak var walletBalanceLabel: WKInterfaceLabel!
@IBOutlet weak var createInvoiceButton: WKInterfaceButton!
@IBOutlet weak var walletNameLabel: WKInterfaceLabel! @IBOutlet weak var walletNameLabel: WKInterfaceLabel!
@IBOutlet weak var receiveButton: WKInterfaceButton! @IBOutlet weak var receiveButton: WKInterfaceButton!
@IBOutlet weak var noTransactionsLabel: WKInterfaceLabel! @IBOutlet weak var noTransactionsLabel: WKInterfaceLabel!
@IBOutlet weak var transactionsTable: WKInterfaceTable! @IBOutlet weak var transactionsTable: WKInterfaceTable!
override func awake(withContext context: Any?) { override func awake(withContext context: Any?) {
super.awake(withContext: context) super.awake(withContext: context)
guard let identifier = context as? Int else { guard let identifier = context as? Int else {
@ -32,7 +34,7 @@ class WalletDetailsInterfaceController: WKInterfaceController {
walletBalanceLabel.setText(wallet.balance) walletBalanceLabel.setText(wallet.balance)
walletNameLabel.setText(wallet.label) walletNameLabel.setText(wallet.label)
walletBasicsGroup.setBackgroundImageNamed(WalletGradient(rawValue: wallet.type)?.imageString) walletBasicsGroup.setBackgroundImageNamed(WalletGradient(rawValue: wallet.type)?.imageString)
createInvoiceButton.setHidden(wallet.type != "lightningCustodianWallet")
processWalletsTable() processWalletsTable()
} }
@ -40,12 +42,14 @@ class WalletDetailsInterfaceController: WKInterfaceController {
super.willActivate() super.willActivate()
transactionsTable.setHidden(wallet?.transactions.isEmpty ?? true) transactionsTable.setHidden(wallet?.transactions.isEmpty ?? true)
noTransactionsLabel.setHidden(!(wallet?.transactions.isEmpty ?? false)) noTransactionsLabel.setHidden(!(wallet?.transactions.isEmpty ?? false))
receiveButton.setHidden(wallet?.receiveAddress.isEmpty ?? true)
} }
@IBAction func receiveMenuItemTapped() { @IBAction func receiveMenuItemTapped() {
presentController(withName: ReceiveInterfaceController.identifier, context: wallet) presentController(withName: ReceiveInterfaceController.identifier, context: (wallet, "receive"))
} }
@objc private func processWalletsTable() { @objc private func processWalletsTable() {
transactionsTable.setNumberOfRows(wallet?.transactions.count ?? 0, withRowType: TransactionTableRow.identifier) transactionsTable.setNumberOfRows(wallet?.transactions.count ?? 0, withRowType: TransactionTableRow.identifier)
@ -61,8 +65,12 @@ class WalletDetailsInterfaceController: WKInterfaceController {
noTransactionsLabel.setHidden(!(wallet?.transactions.isEmpty ?? false)) noTransactionsLabel.setHidden(!(wallet?.transactions.isEmpty ?? false))
} }
@IBAction func createInvoiceTapped() {
pushController(withName: ReceiveInterfaceController.identifier, context: (wallet?.identifier, "createInvoice"))
}
override func contextForSegue(withIdentifier segueIdentifier: String) -> Any? { override func contextForSegue(withIdentifier segueIdentifier: String) -> Any? {
return wallet?.identifier return (wallet?.identifier, "receive")
} }
} }

35
ios/BlueWalletWatch/Base.lproj/Interface.storyboard

@ -1,18 +1,16 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder.WatchKit.Storyboard" version="3.0" toolsVersion="14490.70" targetRuntime="watchKit" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" colorMatched="YES" initialViewController="AgC-eL-Hgc"> <document type="com.apple.InterfaceBuilder.WatchKit.Storyboard" version="3.0" toolsVersion="15505" targetRuntime="watchKit" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" colorMatched="YES" initialViewController="AgC-eL-Hgc">
<device id="watch44" orientation="portrait"> <device id="watch44"/>
<adaptation id="fullscreen"/>
</device>
<dependencies> <dependencies>
<deployment identifier="watchOS"/> <deployment identifier="watchOS"/>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="14490.49"/> <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="15510"/>
<plugIn identifier="com.apple.InterfaceBuilder.IBWatchKitPlugin" version="14490.21"/> <plugIn identifier="com.apple.InterfaceBuilder.IBWatchKitPlugin" version="15501"/>
</dependencies> </dependencies>
<scenes> <scenes>
<!--BlueWallet--> <!--BlueWallet-->
<scene sceneID="aou-V4-d1y"> <scene sceneID="aou-V4-d1y">
<objects> <objects>
<controller title="BlueWallet" fullBounds="YES" id="AgC-eL-Hgc" customClass="InterfaceController" customModule="BlueWalletWatch" customModuleProvider="target"> <controller title="BlueWallet" id="AgC-eL-Hgc" customClass="InterfaceController" customModule="BlueWalletWatch" customModuleProvider="target">
<items> <items>
<table alignment="left" id="jUH-JS-ccp"> <table alignment="left" id="jUH-JS-ccp">
<items> <items>
@ -74,7 +72,7 @@
</group> </group>
</items> </items>
</group> </group>
<button width="1" alignment="left" title="Receive" id="bPO-h8-ccD"> <button width="1" alignment="left" hidden="YES" title="Receive" id="bPO-h8-ccD">
<color key="titleColor" red="0.18431372549019609" green="0.37254901960784315" blue="0.70196078431372544" alpha="1" colorSpace="calibratedRGB"/> <color key="titleColor" red="0.18431372549019609" green="0.37254901960784315" blue="0.70196078431372544" alpha="1" colorSpace="calibratedRGB"/>
<color key="backgroundColor" red="0.80000000000000004" green="0.8666666666666667" blue="0.97647058823529409" alpha="1" colorSpace="calibratedRGB"/> <color key="backgroundColor" red="0.80000000000000004" green="0.8666666666666667" blue="0.97647058823529409" alpha="1" colorSpace="calibratedRGB"/>
<fontDescription key="font" type="system" weight="medium" pointSize="16"/> <fontDescription key="font" type="system" weight="medium" pointSize="16"/>
@ -82,6 +80,14 @@
<segue destination="egq-Yw-qK5" kind="push" identifier="ReceiveInterfaceController" id="zEG-Xi-Smb"/> <segue destination="egq-Yw-qK5" kind="push" identifier="ReceiveInterfaceController" id="zEG-Xi-Smb"/>
</connections> </connections>
</button> </button>
<button width="1" alignment="left" hidden="YES" title="Create Invoice" id="7bc-tt-Pab" userLabel="Create Invoice">
<color key="titleColor" red="0.1843137255" green="0.37254901959999998" blue="0.70196078429999997" alpha="1" colorSpace="calibratedRGB"/>
<color key="backgroundColor" red="0.80000000000000004" green="0.86666666670000003" blue="0.97647058819999999" alpha="1" colorSpace="calibratedRGB"/>
<fontDescription key="font" type="system" weight="medium" pointSize="16"/>
<connections>
<action selector="createInvoiceTapped" destination="XWa-4i-Abg" id="0YZ-PF-kAC"/>
</connections>
</button>
<label alignment="center" verticalAlignment="bottom" text="No Transactions" textAlignment="left" id="pi4-Bk-Jiq"/> <label alignment="center" verticalAlignment="bottom" text="No Transactions" textAlignment="left" id="pi4-Bk-Jiq"/>
<table alignment="left" id="nyQ-lX-DX0"> <table alignment="left" id="nyQ-lX-DX0">
<items> <items>
@ -125,6 +131,7 @@
</table> </table>
</items> </items>
<connections> <connections>
<outlet property="createInvoiceButton" destination="7bc-tt-Pab" id="CcN-EV-pnQ"/>
<outlet property="noTransactionsLabel" destination="pi4-Bk-Jiq" id="zft-Hw-KuZ"/> <outlet property="noTransactionsLabel" destination="pi4-Bk-Jiq" id="zft-Hw-KuZ"/>
<outlet property="receiveButton" destination="bPO-h8-ccD" id="xBq-42-9qP"/> <outlet property="receiveButton" destination="bPO-h8-ccD" id="xBq-42-9qP"/>
<outlet property="transactionsTable" destination="nyQ-lX-DX0" id="N1x-px-s08"/> <outlet property="transactionsTable" destination="nyQ-lX-DX0" id="N1x-px-s08"/>
@ -163,9 +170,9 @@
<!--ReceiveInterfaceController--> <!--ReceiveInterfaceController-->
<scene sceneID="tQ7-Qr-5i4"> <scene sceneID="tQ7-Qr-5i4">
<objects> <objects>
<controller identifier="ReceiveInterfaceController" fullBounds="YES" fullScreen="YES" id="egq-Yw-qK5" customClass="ReceiveInterfaceController" customModule="BlueWalletWatch_Extension"> <controller identifier="ReceiveInterfaceController" fullBounds="YES" id="egq-Yw-qK5" customClass="ReceiveInterfaceController" customModule="BlueWalletWatch_Extension">
<items> <items>
<imageView height="1" alignment="left" id="Dnb-sM-wdN"/> <imageView height="0.90000000000000002" alignment="left" id="Dnb-sM-wdN"/>
<group width="1" alignment="center" verticalAlignment="center" hidden="YES" layout="vertical" id="0If-FP-smM"> <group width="1" alignment="center" verticalAlignment="center" hidden="YES" layout="vertical" id="0If-FP-smM">
<items> <items>
<imageView width="60" height="60" alignment="center" image="loadingIndicator" contentMode="scaleAspectFit" id="nQb-s6-ySB"/> <imageView width="60" height="60" alignment="center" image="loadingIndicator" contentMode="scaleAspectFit" id="nQb-s6-ySB"/>
@ -209,7 +216,7 @@
<separator alignment="left" alpha="0.0" id="i7u-PI-g7Q"> <separator alignment="left" alpha="0.0" id="i7u-PI-g7Q">
<color key="color" red="0.63137254899999995" green="0.63137254899999995" blue="0.63137254899999995" alpha="0.84999999999999998" colorSpace="calibratedRGB"/> <color key="color" red="0.63137254899999995" green="0.63137254899999995" blue="0.63137254899999995" alpha="0.84999999999999998" colorSpace="calibratedRGB"/>
</separator> </separator>
<button width="1" alignment="left" verticalAlignment="bottom" title="Create" id="6eh-lx-UEe"> <button width="1" alignment="left" verticalAlignment="bottom" title="Create" enabled="NO" id="6eh-lx-UEe">
<color key="titleColor" red="0.1843137255" green="0.37254901959999998" blue="0.70196078429999997" alpha="1" colorSpace="calibratedRGB"/> <color key="titleColor" red="0.1843137255" green="0.37254901959999998" blue="0.70196078429999997" alpha="1" colorSpace="calibratedRGB"/>
<color key="backgroundColor" red="0.80000000000000004" green="0.86666666670000003" blue="0.97647058819999999" alpha="1" colorSpace="calibratedRGB"/> <color key="backgroundColor" red="0.80000000000000004" green="0.86666666670000003" blue="0.97647058819999999" alpha="1" colorSpace="calibratedRGB"/>
<fontDescription key="font" type="system" weight="medium" pointSize="16"/> <fontDescription key="font" type="system" weight="medium" pointSize="16"/>
@ -220,6 +227,7 @@
</items> </items>
<connections> <connections>
<outlet property="amountButton" destination="0Hm-hv-Yi3" id="9DN-zh-BGB"/> <outlet property="amountButton" destination="0Hm-hv-Yi3" id="9DN-zh-BGB"/>
<outlet property="createButton" destination="6eh-lx-UEe" id="1T3-m4-oVN"/>
<outlet property="descriptionButton" destination="fcI-6Z-moQ" id="a7M-ZD-Zsi"/> <outlet property="descriptionButton" destination="fcI-6Z-moQ" id="a7M-ZD-Zsi"/>
</connections> </connections>
</controller> </controller>
@ -335,5 +343,10 @@
<point key="canvasLocation" x="220" y="1029"/> <point key="canvasLocation" x="220" y="1029"/>
</scene> </scene>
</scenes> </scenes>
<resources>
<image name="loadingIndicator" width="108" height="108"/>
<image name="pendingConfirmation" width="12" height="12"/>
<image name="walletHD" width="249" height="100.5"/>
</resources>
<color key="tintColor" red="0.40784313725490196" green="0.73333333333333328" blue="0.88235294117647056" alpha="1" colorSpace="calibratedRGB"/> <color key="tintColor" red="0.40784313725490196" green="0.73333333333333328" blue="0.88235294117647056" alpha="1" colorSpace="calibratedRGB"/>
</document> </document>

12
ios/Podfile.lock

@ -102,8 +102,6 @@ PODS:
- React - React
- react-native-slider (2.0.0-rc.1): - react-native-slider (2.0.0-rc.1):
- React - React
- react-native-watch-connectivity (0.3.2):
- React
- react-native-webview (6.9.0): - react-native-webview (6.9.0):
- React - React
- React-RCTActionSheet (0.60.5): - React-RCTActionSheet (0.60.5):
@ -156,6 +154,8 @@ PODS:
- React - React
- RNVectorIcons (6.6.0): - RNVectorIcons (6.6.0):
- React - React
- RNWatch (0.4.1):
- React
- Sentry (4.4.1): - Sentry (4.4.1):
- Sentry/Core (= 4.4.1) - Sentry/Core (= 4.4.1)
- Sentry/Core (4.4.1) - Sentry/Core (4.4.1)
@ -190,7 +190,6 @@ DEPENDENCIES:
- react-native-image-picker (from `../node_modules/react-native-image-picker`) - react-native-image-picker (from `../node_modules/react-native-image-picker`)
- react-native-randombytes (from `../node_modules/react-native-randombytes`) - react-native-randombytes (from `../node_modules/react-native-randombytes`)
- "react-native-slider (from `../node_modules/@react-native-community/slider`)" - "react-native-slider (from `../node_modules/@react-native-community/slider`)"
- react-native-watch-connectivity (from `../node_modules/react-native-watch-connectivity`)
- react-native-webview (from `../node_modules/react-native-webview`) - react-native-webview (from `../node_modules/react-native-webview`)
- React-RCTActionSheet (from `../node_modules/react-native/Libraries/ActionSheetIOS`) - React-RCTActionSheet (from `../node_modules/react-native/Libraries/ActionSheetIOS`)
- React-RCTAnimation (from `../node_modules/react-native/Libraries/NativeAnimation`) - React-RCTAnimation (from `../node_modules/react-native/Libraries/NativeAnimation`)
@ -215,6 +214,7 @@ DEPENDENCIES:
- RNShare (from `../node_modules/react-native-share`) - RNShare (from `../node_modules/react-native-share`)
- RNSVG (from `../node_modules/react-native-svg`) - RNSVG (from `../node_modules/react-native-svg`)
- RNVectorIcons (from `../node_modules/react-native-vector-icons`) - RNVectorIcons (from `../node_modules/react-native-vector-icons`)
- RNWatch (from `../node_modules/react-native-watch-connectivity`)
- TcpSockets (from `../node_modules/react-native-tcp`) - TcpSockets (from `../node_modules/react-native-tcp`)
- ToolTipMenu (from `../node_modules/react-native-tooltip`) - ToolTipMenu (from `../node_modules/react-native-tooltip`)
- yoga (from `../node_modules/react-native/ReactCommon/yoga`) - yoga (from `../node_modules/react-native/ReactCommon/yoga`)
@ -274,8 +274,6 @@ EXTERNAL SOURCES:
:path: "../node_modules/react-native-randombytes" :path: "../node_modules/react-native-randombytes"
react-native-slider: react-native-slider:
:path: "../node_modules/@react-native-community/slider" :path: "../node_modules/@react-native-community/slider"
react-native-watch-connectivity:
:path: "../node_modules/react-native-watch-connectivity"
react-native-webview: react-native-webview:
:path: "../node_modules/react-native-webview" :path: "../node_modules/react-native-webview"
React-RCTActionSheet: React-RCTActionSheet:
@ -324,6 +322,8 @@ EXTERNAL SOURCES:
:path: "../node_modules/react-native-svg" :path: "../node_modules/react-native-svg"
RNVectorIcons: RNVectorIcons:
:path: "../node_modules/react-native-vector-icons" :path: "../node_modules/react-native-vector-icons"
RNWatch:
:path: "../node_modules/react-native-watch-connectivity"
TcpSockets: TcpSockets:
:path: "../node_modules/react-native-tcp" :path: "../node_modules/react-native-tcp"
ToolTipMenu: ToolTipMenu:
@ -359,7 +359,6 @@ SPEC CHECKSUMS:
react-native-image-picker: 3637d63fef7e32a230141ab4660d3ceb773c824f react-native-image-picker: 3637d63fef7e32a230141ab4660d3ceb773c824f
react-native-randombytes: 991545e6eaaf700b4ee384c291ef3d572e0b2ca8 react-native-randombytes: 991545e6eaaf700b4ee384c291ef3d572e0b2ca8
react-native-slider: 6d83f7b8076a84e965a43fbdcfcf9dac19cea42e react-native-slider: 6d83f7b8076a84e965a43fbdcfcf9dac19cea42e
react-native-watch-connectivity: 5333c7054ff667130fd93f504a3d6bb35e87cabd
react-native-webview: f72ac4078e115dfa741cc588acb1cca25566457d react-native-webview: f72ac4078e115dfa741cc588acb1cca25566457d
React-RCTActionSheet: b0f1ea83f4bf75fb966eae9bfc47b78c8d3efd90 React-RCTActionSheet: b0f1ea83f4bf75fb966eae9bfc47b78c8d3efd90
React-RCTAnimation: 359ba1b5690b1e87cc173558a78e82d35919333e React-RCTAnimation: 359ba1b5690b1e87cc173558a78e82d35919333e
@ -384,6 +383,7 @@ SPEC CHECKSUMS:
RNShare: 8b171d4b43c1d886917fdd303bf7a4b87167b05c RNShare: 8b171d4b43c1d886917fdd303bf7a4b87167b05c
RNSVG: 0eb087cfb5d7937be93c45b163b26352a647e681 RNSVG: 0eb087cfb5d7937be93c45b163b26352a647e681
RNVectorIcons: 0bb4def82230be1333ddaeee9fcba45f0b288ed4 RNVectorIcons: 0bb4def82230be1333ddaeee9fcba45f0b288ed4
RNWatch: a14e378448e187cc12f307f61d41fe8a65400e86
Sentry: 5d312a04e369154aeac616214f4dfc3cbcc8b296 Sentry: 5d312a04e369154aeac616214f4dfc3cbcc8b296
swift_qrcodejs: 4d024fc98b0778b804ec6a5c810880fd092aec9d swift_qrcodejs: 4d024fc98b0778b804ec6a5c810880fd092aec9d
TcpSockets: 8d839b9b14f6f344d98e4642ded13ab3112b462d TcpSockets: 8d839b9b14f6f344d98e4642ded13ab3112b462d

164
package-lock.json

@ -5762,25 +5762,25 @@
"dependencies": { "dependencies": {
"abbrev": { "abbrev": {
"version": "1.1.1", "version": "1.1.1",
"resolved": false, "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz",
"integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==",
"optional": true "optional": true
}, },
"ansi-regex": { "ansi-regex": {
"version": "2.1.1", "version": "2.1.1",
"resolved": false, "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
"integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
"optional": true "optional": true
}, },
"aproba": { "aproba": {
"version": "1.2.0", "version": "1.2.0",
"resolved": false, "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz",
"integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==",
"optional": true "optional": true
}, },
"are-we-there-yet": { "are-we-there-yet": {
"version": "1.1.5", "version": "1.1.5",
"resolved": false, "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz",
"integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==",
"optional": true, "optional": true,
"requires": { "requires": {
@ -5790,13 +5790,13 @@
}, },
"balanced-match": { "balanced-match": {
"version": "1.0.0", "version": "1.0.0",
"resolved": false, "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
"integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=",
"optional": true "optional": true
}, },
"brace-expansion": { "brace-expansion": {
"version": "1.1.11", "version": "1.1.11",
"resolved": false, "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
"integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
"optional": true, "optional": true,
"requires": { "requires": {
@ -5806,37 +5806,37 @@
}, },
"chownr": { "chownr": {
"version": "1.1.1", "version": "1.1.1",
"resolved": false, "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.1.tgz",
"integrity": "sha512-j38EvO5+LHX84jlo6h4UzmOwi0UgW61WRyPtJz4qaadK5eY3BTS5TY/S1Stc3Uk2lIM6TPevAlULiEJwie860g==", "integrity": "sha512-j38EvO5+LHX84jlo6h4UzmOwi0UgW61WRyPtJz4qaadK5eY3BTS5TY/S1Stc3Uk2lIM6TPevAlULiEJwie860g==",
"optional": true "optional": true
}, },
"code-point-at": { "code-point-at": {
"version": "1.1.0", "version": "1.1.0",
"resolved": false, "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz",
"integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=",
"optional": true "optional": true
}, },
"concat-map": { "concat-map": {
"version": "0.0.1", "version": "0.0.1",
"resolved": false, "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
"integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
"optional": true "optional": true
}, },
"console-control-strings": { "console-control-strings": {
"version": "1.1.0", "version": "1.1.0",
"resolved": false, "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz",
"integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=",
"optional": true "optional": true
}, },
"core-util-is": { "core-util-is": {
"version": "1.0.2", "version": "1.0.2",
"resolved": false, "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
"integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=",
"optional": true "optional": true
}, },
"debug": { "debug": {
"version": "4.1.1", "version": "4.1.1",
"resolved": false, "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
"integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
"optional": true, "optional": true,
"requires": { "requires": {
@ -5845,25 +5845,25 @@
}, },
"deep-extend": { "deep-extend": {
"version": "0.6.0", "version": "0.6.0",
"resolved": false, "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz",
"integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==",
"optional": true "optional": true
}, },
"delegates": { "delegates": {
"version": "1.0.0", "version": "1.0.0",
"resolved": false, "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz",
"integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=",
"optional": true "optional": true
}, },
"detect-libc": { "detect-libc": {
"version": "1.0.3", "version": "1.0.3",
"resolved": false, "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz",
"integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=", "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=",
"optional": true "optional": true
}, },
"fs-minipass": { "fs-minipass": {
"version": "1.2.5", "version": "1.2.5",
"resolved": false, "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.5.tgz",
"integrity": "sha512-JhBl0skXjUPCFH7x6x61gQxrKyXsxB5gcgePLZCwfyCGGsTISMoIeObbrvVeP6Xmyaudw4TT43qV2Gz+iyd2oQ==", "integrity": "sha512-JhBl0skXjUPCFH7x6x61gQxrKyXsxB5gcgePLZCwfyCGGsTISMoIeObbrvVeP6Xmyaudw4TT43qV2Gz+iyd2oQ==",
"optional": true, "optional": true,
"requires": { "requires": {
@ -5872,13 +5872,13 @@
}, },
"fs.realpath": { "fs.realpath": {
"version": "1.0.0", "version": "1.0.0",
"resolved": false, "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
"integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
"optional": true "optional": true
}, },
"gauge": { "gauge": {
"version": "2.7.4", "version": "2.7.4",
"resolved": false, "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz",
"integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=",
"optional": true, "optional": true,
"requires": { "requires": {
@ -5894,7 +5894,7 @@
}, },
"glob": { "glob": {
"version": "7.1.3", "version": "7.1.3",
"resolved": false, "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz",
"integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==",
"optional": true, "optional": true,
"requires": { "requires": {
@ -5908,13 +5908,13 @@
}, },
"has-unicode": { "has-unicode": {
"version": "2.0.1", "version": "2.0.1",
"resolved": false, "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz",
"integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=",
"optional": true "optional": true
}, },
"iconv-lite": { "iconv-lite": {
"version": "0.4.24", "version": "0.4.24",
"resolved": false, "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
"integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
"optional": true, "optional": true,
"requires": { "requires": {
@ -5923,7 +5923,7 @@
}, },
"ignore-walk": { "ignore-walk": {
"version": "3.0.1", "version": "3.0.1",
"resolved": false, "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.1.tgz",
"integrity": "sha512-DTVlMx3IYPe0/JJcYP7Gxg7ttZZu3IInhuEhbchuqneY9wWe5Ojy2mXLBaQFUQmo0AW2r3qG7m1mg86js+gnlQ==", "integrity": "sha512-DTVlMx3IYPe0/JJcYP7Gxg7ttZZu3IInhuEhbchuqneY9wWe5Ojy2mXLBaQFUQmo0AW2r3qG7m1mg86js+gnlQ==",
"optional": true, "optional": true,
"requires": { "requires": {
@ -5932,7 +5932,7 @@
}, },
"inflight": { "inflight": {
"version": "1.0.6", "version": "1.0.6",
"resolved": false, "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
"integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
"optional": true, "optional": true,
"requires": { "requires": {
@ -5942,19 +5942,19 @@
}, },
"inherits": { "inherits": {
"version": "2.0.3", "version": "2.0.3",
"resolved": false, "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
"integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=",
"optional": true "optional": true
}, },
"ini": { "ini": {
"version": "1.3.5", "version": "1.3.5",
"resolved": false, "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz",
"integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==",
"optional": true "optional": true
}, },
"is-fullwidth-code-point": { "is-fullwidth-code-point": {
"version": "1.0.0", "version": "1.0.0",
"resolved": false, "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz",
"integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=",
"optional": true, "optional": true,
"requires": { "requires": {
@ -5963,13 +5963,13 @@
}, },
"isarray": { "isarray": {
"version": "1.0.0", "version": "1.0.0",
"resolved": false, "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
"integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
"optional": true "optional": true
}, },
"minimatch": { "minimatch": {
"version": "3.0.4", "version": "3.0.4",
"resolved": false, "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
"integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
"optional": true, "optional": true,
"requires": { "requires": {
@ -5978,13 +5978,13 @@
}, },
"minimist": { "minimist": {
"version": "0.0.8", "version": "0.0.8",
"resolved": false, "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz",
"integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=",
"optional": true "optional": true
}, },
"minipass": { "minipass": {
"version": "2.3.5", "version": "2.3.5",
"resolved": false, "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.3.5.tgz",
"integrity": "sha512-Gi1W4k059gyRbyVUZQ4mEqLm0YIUiGYfvxhF6SIlk3ui1WVxMTGfGdQ2SInh3PDrRTVvPKgULkpJtT4RH10+VA==", "integrity": "sha512-Gi1W4k059gyRbyVUZQ4mEqLm0YIUiGYfvxhF6SIlk3ui1WVxMTGfGdQ2SInh3PDrRTVvPKgULkpJtT4RH10+VA==",
"optional": true, "optional": true,
"requires": { "requires": {
@ -5994,7 +5994,7 @@
}, },
"minizlib": { "minizlib": {
"version": "1.2.1", "version": "1.2.1",
"resolved": false, "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.2.1.tgz",
"integrity": "sha512-7+4oTUOWKg7AuL3vloEWekXY2/D20cevzsrNT2kGWm+39J9hGTCBv8VI5Pm5lXZ/o3/mdR4f8rflAPhnQb8mPA==", "integrity": "sha512-7+4oTUOWKg7AuL3vloEWekXY2/D20cevzsrNT2kGWm+39J9hGTCBv8VI5Pm5lXZ/o3/mdR4f8rflAPhnQb8mPA==",
"optional": true, "optional": true,
"requires": { "requires": {
@ -6003,7 +6003,7 @@
}, },
"mkdirp": { "mkdirp": {
"version": "0.5.1", "version": "0.5.1",
"resolved": false, "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz",
"integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=",
"optional": true, "optional": true,
"requires": { "requires": {
@ -6012,13 +6012,13 @@
}, },
"ms": { "ms": {
"version": "2.1.1", "version": "2.1.1",
"resolved": false, "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz",
"integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==",
"optional": true "optional": true
}, },
"needle": { "needle": {
"version": "2.3.0", "version": "2.3.0",
"resolved": false, "resolved": "https://registry.npmjs.org/needle/-/needle-2.3.0.tgz",
"integrity": "sha512-QBZu7aAFR0522EyaXZM0FZ9GLpq6lvQ3uq8gteiDUp7wKdy0lSd2hPlgFwVuW1CBkfEs9PfDQsQzZghLs/psdg==", "integrity": "sha512-QBZu7aAFR0522EyaXZM0FZ9GLpq6lvQ3uq8gteiDUp7wKdy0lSd2hPlgFwVuW1CBkfEs9PfDQsQzZghLs/psdg==",
"optional": true, "optional": true,
"requires": { "requires": {
@ -6029,7 +6029,7 @@
}, },
"node-pre-gyp": { "node-pre-gyp": {
"version": "0.12.0", "version": "0.12.0",
"resolved": false, "resolved": "https://registry.npmjs.org/node-pre-gyp/-/node-pre-gyp-0.12.0.tgz",
"integrity": "sha512-4KghwV8vH5k+g2ylT+sLTjy5wmUOb9vPhnM8NHvRf9dHmnW/CndrFXy2aRPaPST6dugXSdHXfeaHQm77PIz/1A==", "integrity": "sha512-4KghwV8vH5k+g2ylT+sLTjy5wmUOb9vPhnM8NHvRf9dHmnW/CndrFXy2aRPaPST6dugXSdHXfeaHQm77PIz/1A==",
"optional": true, "optional": true,
"requires": { "requires": {
@ -6047,7 +6047,7 @@
}, },
"nopt": { "nopt": {
"version": "4.0.1", "version": "4.0.1",
"resolved": false, "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.1.tgz",
"integrity": "sha1-0NRoWv1UFRk8jHUFYC0NF81kR00=", "integrity": "sha1-0NRoWv1UFRk8jHUFYC0NF81kR00=",
"optional": true, "optional": true,
"requires": { "requires": {
@ -6057,13 +6057,13 @@
}, },
"npm-bundled": { "npm-bundled": {
"version": "1.0.6", "version": "1.0.6",
"resolved": false, "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.0.6.tgz",
"integrity": "sha512-8/JCaftHwbd//k6y2rEWp6k1wxVfpFzB6t1p825+cUb7Ym2XQfhwIC5KwhrvzZRJu+LtDE585zVaS32+CGtf0g==", "integrity": "sha512-8/JCaftHwbd//k6y2rEWp6k1wxVfpFzB6t1p825+cUb7Ym2XQfhwIC5KwhrvzZRJu+LtDE585zVaS32+CGtf0g==",
"optional": true "optional": true
}, },
"npm-packlist": { "npm-packlist": {
"version": "1.4.1", "version": "1.4.1",
"resolved": false, "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-1.4.1.tgz",
"integrity": "sha512-+TcdO7HJJ8peiiYhvPxsEDhF3PJFGUGRcFsGve3vxvxdcpO2Z4Z7rkosRM0kWj6LfbK/P0gu3dzk5RU1ffvFcw==", "integrity": "sha512-+TcdO7HJJ8peiiYhvPxsEDhF3PJFGUGRcFsGve3vxvxdcpO2Z4Z7rkosRM0kWj6LfbK/P0gu3dzk5RU1ffvFcw==",
"optional": true, "optional": true,
"requires": { "requires": {
@ -6073,7 +6073,7 @@
}, },
"npmlog": { "npmlog": {
"version": "4.1.2", "version": "4.1.2",
"resolved": false, "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz",
"integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==",
"optional": true, "optional": true,
"requires": { "requires": {
@ -6085,19 +6085,19 @@
}, },
"number-is-nan": { "number-is-nan": {
"version": "1.0.1", "version": "1.0.1",
"resolved": false, "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz",
"integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=",
"optional": true "optional": true
}, },
"object-assign": { "object-assign": {
"version": "4.1.1", "version": "4.1.1",
"resolved": false, "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
"integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=",
"optional": true "optional": true
}, },
"once": { "once": {
"version": "1.4.0", "version": "1.4.0",
"resolved": false, "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
"integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
"optional": true, "optional": true,
"requires": { "requires": {
@ -6106,19 +6106,19 @@
}, },
"os-homedir": { "os-homedir": {
"version": "1.0.2", "version": "1.0.2",
"resolved": false, "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz",
"integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=",
"optional": true "optional": true
}, },
"os-tmpdir": { "os-tmpdir": {
"version": "1.0.2", "version": "1.0.2",
"resolved": false, "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz",
"integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=",
"optional": true "optional": true
}, },
"osenv": { "osenv": {
"version": "0.1.5", "version": "0.1.5",
"resolved": false, "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz",
"integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==",
"optional": true, "optional": true,
"requires": { "requires": {
@ -6128,19 +6128,19 @@
}, },
"path-is-absolute": { "path-is-absolute": {
"version": "1.0.1", "version": "1.0.1",
"resolved": false, "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
"integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
"optional": true "optional": true
}, },
"process-nextick-args": { "process-nextick-args": {
"version": "2.0.0", "version": "2.0.0",
"resolved": false, "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz",
"integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==",
"optional": true "optional": true
}, },
"rc": { "rc": {
"version": "1.2.8", "version": "1.2.8",
"resolved": false, "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz",
"integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==",
"optional": true, "optional": true,
"requires": { "requires": {
@ -6152,7 +6152,7 @@
"dependencies": { "dependencies": {
"minimist": { "minimist": {
"version": "1.2.0", "version": "1.2.0",
"resolved": false, "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
"integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=",
"optional": true "optional": true
} }
@ -6160,7 +6160,7 @@
}, },
"readable-stream": { "readable-stream": {
"version": "2.3.6", "version": "2.3.6",
"resolved": false, "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz",
"integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==",
"optional": true, "optional": true,
"requires": { "requires": {
@ -6175,7 +6175,7 @@
}, },
"rimraf": { "rimraf": {
"version": "2.6.3", "version": "2.6.3",
"resolved": false, "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz",
"integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==",
"optional": true, "optional": true,
"requires": { "requires": {
@ -6184,43 +6184,43 @@
}, },
"safe-buffer": { "safe-buffer": {
"version": "5.1.2", "version": "5.1.2",
"resolved": false, "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
"integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
"optional": true "optional": true
}, },
"safer-buffer": { "safer-buffer": {
"version": "2.1.2", "version": "2.1.2",
"resolved": false, "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
"integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
"optional": true "optional": true
}, },
"sax": { "sax": {
"version": "1.2.4", "version": "1.2.4",
"resolved": false, "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz",
"integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==",
"optional": true "optional": true
}, },
"semver": { "semver": {
"version": "5.7.0", "version": "5.7.0",
"resolved": false, "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz",
"integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==", "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==",
"optional": true "optional": true
}, },
"set-blocking": { "set-blocking": {
"version": "2.0.0", "version": "2.0.0",
"resolved": false, "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz",
"integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=",
"optional": true "optional": true
}, },
"signal-exit": { "signal-exit": {
"version": "3.0.2", "version": "3.0.2",
"resolved": false, "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz",
"integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=",
"optional": true "optional": true
}, },
"string-width": { "string-width": {
"version": "1.0.2", "version": "1.0.2",
"resolved": false, "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz",
"integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=",
"optional": true, "optional": true,
"requires": { "requires": {
@ -6231,7 +6231,7 @@
}, },
"string_decoder": { "string_decoder": {
"version": "1.1.1", "version": "1.1.1",
"resolved": false, "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
"integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
"optional": true, "optional": true,
"requires": { "requires": {
@ -6240,7 +6240,7 @@
}, },
"strip-ansi": { "strip-ansi": {
"version": "3.0.1", "version": "3.0.1",
"resolved": false, "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
"integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
"optional": true, "optional": true,
"requires": { "requires": {
@ -6249,13 +6249,13 @@
}, },
"strip-json-comments": { "strip-json-comments": {
"version": "2.0.1", "version": "2.0.1",
"resolved": false, "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz",
"integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=",
"optional": true "optional": true
}, },
"tar": { "tar": {
"version": "4.4.8", "version": "4.4.8",
"resolved": false, "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.8.tgz",
"integrity": "sha512-LzHF64s5chPQQS0IYBn9IN5h3i98c12bo4NCO7e0sGM2llXQ3p2FGC5sdENN4cTW48O915Sh+x+EXx7XW96xYQ==", "integrity": "sha512-LzHF64s5chPQQS0IYBn9IN5h3i98c12bo4NCO7e0sGM2llXQ3p2FGC5sdENN4cTW48O915Sh+x+EXx7XW96xYQ==",
"optional": true, "optional": true,
"requires": { "requires": {
@ -6270,13 +6270,13 @@
}, },
"util-deprecate": { "util-deprecate": {
"version": "1.0.2", "version": "1.0.2",
"resolved": false, "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
"integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=",
"optional": true "optional": true
}, },
"wide-align": { "wide-align": {
"version": "1.1.3", "version": "1.1.3",
"resolved": false, "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz",
"integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==",
"optional": true, "optional": true,
"requires": { "requires": {
@ -6285,13 +6285,13 @@
}, },
"wrappy": { "wrappy": {
"version": "1.0.2", "version": "1.0.2",
"resolved": false, "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
"integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
"optional": true "optional": true
}, },
"yallist": { "yallist": {
"version": "3.0.3", "version": "3.0.3",
"resolved": false, "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.0.3.tgz",
"integrity": "sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A==", "integrity": "sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A==",
"optional": true "optional": true
} }
@ -6579,9 +6579,9 @@
"integrity": "sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE=" "integrity": "sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE="
}, },
"handlebars": { "handlebars": {
"version": "4.4.2", "version": "4.5.1",
"resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.4.2.tgz", "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.5.1.tgz",
"integrity": "sha512-cIv17+GhL8pHHnRJzGu2wwcthL5sb8uDKBHvZ2Dtu5s1YNt0ljbzKbamnc+gr69y7bzwQiBdr5+hOpRd5pnOdg==", "integrity": "sha512-C29UoFzHe9yM61lOsIlCE5/mQVGrnIOrOq7maQl76L7tYPCgC1og0Ajt6uWnX4ZTxBPnjw+CUvawphwCfJgUnA==",
"dev": true, "dev": true,
"requires": { "requires": {
"neo-async": "^2.6.0", "neo-async": "^2.6.0",
@ -6591,9 +6591,9 @@
}, },
"dependencies": { "dependencies": {
"commander": { "commander": {
"version": "2.20.1", "version": "2.20.3",
"resolved": "https://registry.npmjs.org/commander/-/commander-2.20.1.tgz", "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
"integrity": "sha512-cCuLsMhJeWQ/ZpsFTbE765kvVfoeSddc4nU3up4fV+fDBcfUXnbITJ+JzhkdjzOqhURjZgujxaioam4RM9yGUg==", "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==",
"dev": true, "dev": true,
"optional": true "optional": true
}, },
@ -6604,13 +6604,13 @@
"dev": true "dev": true
}, },
"uglify-js": { "uglify-js": {
"version": "3.6.0", "version": "3.6.8",
"resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.6.0.tgz", "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.6.8.tgz",
"integrity": "sha512-W+jrUHJr3DXKhrsS7NUVxn3zqMOFn0hL/Ei6v0anCIMoKC93TjcflTagwIHLW7SfMFfiQuktQyFVCFHGUE0+yg==", "integrity": "sha512-XhHJ3S3ZyMwP8kY1Gkugqx3CJh2C3O0y8NPiSxtm1tyD/pktLAkFZsFGpuNfTZddKDQ/bbDBLAd2YyA1pbi8HQ==",
"dev": true, "dev": true,
"optional": true, "optional": true,
"requires": { "requires": {
"commander": "~2.20.0", "commander": "~2.20.3",
"source-map": "~0.6.1" "source-map": "~0.6.1"
} }
} }
@ -12382,7 +12382,7 @@
} }
}, },
"react-native-secure-key-store": { "react-native-secure-key-store": {
"version": "git+https://github.com/marcosrdz/react-native-secure-key-store.git#eda78b4dd9696c8ff56569e077ccb630a2e65ac1", "version": "git+https://github.com/marcosrdz/react-native-secure-key-store.git#8b04878825050e80b0ac8a3571525b7791c1cc70",
"from": "git+https://github.com/marcosrdz/react-native-secure-key-store.git" "from": "git+https://github.com/marcosrdz/react-native-secure-key-store.git"
}, },
"react-native-share": { "react-native-share": {
@ -12421,7 +12421,7 @@
} }
}, },
"react-native-tcp": { "react-native-tcp": {
"version": "git+https://github.com/aprock/react-native-tcp.git#c29cf0f29c14eab41182a37af54ef7b2409620b2", "version": "git+https://github.com/aprock/react-native-tcp.git#6a3b1bc702bf1d40287274ac32698335a8fba61a",
"from": "git+https://github.com/aprock/react-native-tcp.git", "from": "git+https://github.com/aprock/react-native-tcp.git",
"requires": { "requires": {
"base64-js": "0.0.8", "base64-js": "0.0.8",
@ -12535,9 +12535,9 @@
} }
}, },
"react-native-watch-connectivity": { "react-native-watch-connectivity": {
"version": "0.3.2", "version": "0.4.1",
"resolved": "https://registry.npmjs.org/react-native-watch-connectivity/-/react-native-watch-connectivity-0.3.2.tgz", "resolved": "https://registry.npmjs.org/react-native-watch-connectivity/-/react-native-watch-connectivity-0.4.1.tgz",
"integrity": "sha512-NA8XHZ31i7wE1MvuOiZqk93EOl/YgvXW0g0TU7/O701QPMkUhzRWlLJxOa9opcgYLLZ6VlvvhdxJ7ZMntreJKQ==" "integrity": "sha512-fMx3hRXinxAoC64YUL+UkXuwlgYeYp3ECKMucxFgRtouzfCC3RGD+wewY7vxgOrcjkKXusIbCdbU4gS2Lojhqw=="
}, },
"react-native-webview": { "react-native-webview": {
"version": "6.9.0", "version": "6.9.0",
@ -13076,7 +13076,7 @@
} }
}, },
"rn-nodeify": { "rn-nodeify": {
"version": "github:tradle/rn-nodeify#580705c3ee0227298d0d12dba413f7aa3bb24ebb", "version": "github:tradle/rn-nodeify#300ca4460c3e4ffa01c45b3a122ce182dc1a0c5a",
"from": "github:tradle/rn-nodeify", "from": "github:tradle/rn-nodeify",
"dev": true, "dev": true,
"requires": { "requires": {

2
package.json

@ -116,7 +116,7 @@
"react-native-tcp": "git+https://github.com/aprock/react-native-tcp.git", "react-native-tcp": "git+https://github.com/aprock/react-native-tcp.git",
"react-native-tooltip": "git+https://github.com/marcosrdz/react-native-tooltip.git", "react-native-tooltip": "git+https://github.com/marcosrdz/react-native-tooltip.git",
"react-native-vector-icons": "6.6.0", "react-native-vector-icons": "6.6.0",
"react-native-watch-connectivity": "0.3.2", "react-native-watch-connectivity": "0.4.1",
"react-native-webview": "6.9.0", "react-native-webview": "6.9.0",
"react-navigation": "3.11.0", "react-navigation": "3.11.0",
"react-navigation-hooks": "1.1.0", "react-navigation-hooks": "1.1.0",

2
screen/wallets/transactions.js

@ -164,13 +164,13 @@ export default class WalletTransactions extends Component {
let start = +new Date(); let start = +new Date();
const oldTxLen = wallet.getTransactions().length; const oldTxLen = wallet.getTransactions().length;
await wallet.fetchTransactions(); await wallet.fetchTransactions();
if (oldTxLen !== wallet.getTransactions().length) smthChanged = true;
if (wallet.fetchPendingTransactions) { if (wallet.fetchPendingTransactions) {
await wallet.fetchPendingTransactions(); await wallet.fetchPendingTransactions();
} }
if (wallet.fetchUserInvoices) { if (wallet.fetchUserInvoices) {
await wallet.fetchUserInvoices(); await wallet.fetchUserInvoices();
} }
if (oldTxLen !== wallet.getTransactions().length) smthChanged = true;
let end = +new Date(); let end = +new Date();
console.log(wallet.getLabel(), 'fetch tx took', (end - start) / 1000, 'sec'); console.log(wallet.getLabel(), 'fetch tx took', (end - start) / 1000, 'sec');
} catch (err) { } catch (err) {

Loading…
Cancel
Save