2019-05-02 16:33:03 -04:00
//
// R e c e i v e I n t e r f a c e C o n t r o l l e r . s w i f t
// B l u e W a l l e t W a t c h E x t e n s i o n
//
// C r e a t e d b y M a r c o s R o d r i g u e z o n 3 / 1 2 / 1 9 .
// C o p y r i g h t © 2 0 1 9 F a c e b o o k . A l l r i g h t s r e s e r v e d .
//
import WatchKit
2019-11-11 01:26:39 -05:00
import WatchConnectivity
2019-05-02 16:33:03 -04:00
import Foundation
import EFQRCode
class ReceiveInterfaceController : WKInterfaceController {
static let identifier = " ReceiveInterfaceController "
@IBOutlet weak var imageInterface : WKInterfaceImage !
private var wallet : Wallet ?
private var isRenderingQRCode : Bool ?
2019-11-11 01:26:39 -05:00
private var receiveMethod : String = " receive "
2019-05-02 16:33:03 -04:00
@IBOutlet weak var loadingIndicator : WKInterfaceGroup !
override func awake ( withContext context : Any ? ) {
super . awake ( withContext : context )
2019-11-11 01:26:39 -05:00
guard let passedContext = context as ? ( Int , String ) , WatchDataSource . shared . wallets . count >= passedContext . 0 else {
2019-05-02 16:33:03 -04:00
pop ( )
return
}
2019-11-11 01:26:39 -05:00
let identifier = passedContext . 0
2019-05-02 16:33:03 -04:00
let wallet = WatchDataSource . shared . wallets [ identifier ]
self . wallet = wallet
2019-11-11 01:26:39 -05:00
receiveMethod = passedContext . 1
2019-05-02 16:33:03 -04:00
NotificationCenter . default . addObserver ( forName : SpecifyInterfaceController . NotificationName . createQRCode , object : nil , queue : nil ) { [ weak self ] ( notification ) in
self ? . isRenderingQRCode = true
2019-11-11 01:26:39 -05:00
if let wallet = self ? . wallet , wallet . type = = " lightningCustodianWallet " , self ? . receiveMethod = = " createInvoice " , let object = notification . object as ? SpecifyInterfaceController . SpecificQRCodeContent , let amount = object . amount {
2019-05-02 16:33:03 -04:00
self ? . imageInterface . setHidden ( true )
self ? . loadingIndicator . setHidden ( false )
WatchDataSource . requestLightningInvoice ( walletIdentifier : identifier , amount : amount , description : object . description , responseHandler : { ( invoice ) in
DispatchQueue . main . async {
if ( ! invoice . isEmpty ) {
guard let cgImage = EFQRCode . generate (
2019-08-12 23:14:29 -04:00
content : " lightning: \( invoice ) " , inputCorrectionLevel : . h , pointShape : . circle ) else {
2019-05-02 16:33:03 -04:00
return
}
let image = UIImage ( cgImage : cgImage )
self ? . loadingIndicator . setHidden ( true )
self ? . imageInterface . setHidden ( false )
self ? . imageInterface . setImage ( nil )
self ? . imageInterface . setImage ( image )
2019-11-11 01:26:39 -05:00
WCSession . default . sendMessage ( [ " message " : " fetchTransactions " ] , replyHandler : nil , errorHandler : nil )
2019-05-02 16:33:03 -04:00
} else {
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 ? . dismiss ( )
} ) ] )
}
}
} )
} else {
guard let notificationObject = notification . object as ? SpecifyInterfaceController . SpecificQRCodeContent , let walletContext = self ? . wallet , ! walletContext . receiveAddress . isEmpty , let receiveAddress = self ? . wallet ? . receiveAddress else { return }
var address = " bitcoin: \( receiveAddress ) "
var hasAmount = false
if let amount = notificationObject . amount {
address . append ( " ?amount= \( amount ) & " )
hasAmount = true
}
if let description = notificationObject . description {
if ( ! hasAmount ) {
address . append ( " ? " )
}
address . append ( " label= \( description ) " )
}
DispatchQueue . main . async {
guard let cgImage = EFQRCode . generate (
content : address ) else {
return
}
let image = UIImage ( cgImage : cgImage )
self ? . imageInterface . setImage ( nil )
self ? . imageInterface . setImage ( image )
self ? . imageInterface . setHidden ( false )
self ? . loadingIndicator . setHidden ( true )
self ? . isRenderingQRCode = false
}
}
}
guard ! wallet . receiveAddress . isEmpty , let cgImage = EFQRCode . generate (
2019-11-11 01:26:39 -05:00
content : wallet . receiveAddress ) , receiveMethod != " createInvoice " else {
2019-05-02 16:33:03 -04:00
return
}
let image = UIImage ( cgImage : cgImage )
imageInterface . setImage ( image )
}
override func didAppear ( ) {
super . didAppear ( )
2019-11-11 01:26:39 -05:00
if wallet ? . type = = " lightningCustodianWallet " && receiveMethod = = " createInvoice " {
2019-05-02 16:33:03 -04:00
if isRenderingQRCode = = nil {
presentController ( withName : SpecifyInterfaceController . identifier , context : wallet ? . identifier )
isRenderingQRCode = false
} else if isRenderingQRCode = = false {
pop ( )
}
}
}
override func didDeactivate ( ) {
super . didDeactivate ( )
NotificationCenter . default . removeObserver ( self , name : SpecifyInterfaceController . NotificationName . createQRCode , object : nil )
}
@IBAction func specifyMenuItemTapped ( ) {
presentController ( withName : SpecifyInterfaceController . identifier , context : wallet ? . identifier )
}
}