diff --git a/SynchronyFinancial/SynchronyFinancial WatchKit App/Base.lproj/Interface.storyboard b/SynchronyFinancial/SynchronyFinancial WatchKit App/Base.lproj/Interface.storyboard index 4b0c66c..c076878 100644 --- a/SynchronyFinancial/SynchronyFinancial WatchKit App/Base.lproj/Interface.storyboard +++ b/SynchronyFinancial/SynchronyFinancial WatchKit App/Base.lproj/Interface.storyboard @@ -323,27 +323,59 @@ - - - + + + + - + + + + + + + + + + + + + + + + diff --git a/SynchronyFinancial/SynchronyFinancial WatchKit Extension/AccountDetailsInterfaceController.swift b/SynchronyFinancial/SynchronyFinancial WatchKit Extension/AccountDetailsInterfaceController.swift index f7e28bd..fe30f0b 100644 --- a/SynchronyFinancial/SynchronyFinancial WatchKit Extension/AccountDetailsInterfaceController.swift +++ b/SynchronyFinancial/SynchronyFinancial WatchKit Extension/AccountDetailsInterfaceController.swift @@ -12,7 +12,7 @@ import Foundation class AccountDetailsInterfaceController: WKInterfaceController { var selectedAccount: Account? var dictForAcct: [String: Account] = [:] - var transactionDict: [String: [Transaction]] = [:] + var transactionDict: [String: Any] = [:] @IBOutlet var loadingLabel: WKInterfaceLabel! @IBOutlet var activityIndicator: WKInterfaceImage! @@ -41,6 +41,9 @@ class AccountDetailsInterfaceController: WKInterfaceController { return } + if let acct = self.selectedAccount { + self.transactionDict.updateValue(acct, forKey: "acct") + } self.transactionDict.updateValue(transactions, forKey: "transactions") self.pushController(withName: "Transactions", context: self.transactionDict) self.configureInterfaceObjects(false) diff --git a/SynchronyFinancial/SynchronyFinancial WatchKit Extension/CancellationInterfaceController.swift b/SynchronyFinancial/SynchronyFinancial WatchKit Extension/CancellationInterfaceController.swift new file mode 100644 index 0000000..f904d37 --- /dev/null +++ b/SynchronyFinancial/SynchronyFinancial WatchKit Extension/CancellationInterfaceController.swift @@ -0,0 +1,34 @@ +// +// CancellationInterfaceController.swift +// SynchronyFinancial WatchKit Extension +// +// Created by Alan Maynard on 4/8/19. +// Copyright © 2019 Alan Maynard. All rights reserved. +// + +import WatchKit +import Foundation + +class CancellationInterfaceController: WKInterfaceController { + @IBOutlet var confirmationLabel: WKInterfaceLabel! + + override func awake(withContext context: Any?) { + super.awake(withContext: context) + + guard let data = context as? [String: String], let confirmation = data["cancellation_confirm"] else { + NSLog("Error receiving context for payment cancellation") + return + } + + setTitle("Done") + confirmationLabel.setText(confirmation) + } + + override func willActivate() { + super.willActivate() + } + + override func didDeactivate() { + super.didDeactivate() + } +} diff --git a/SynchronyFinancial/SynchronyFinancial WatchKit Extension/TransactionDetailsInterfaceController.swift b/SynchronyFinancial/SynchronyFinancial WatchKit Extension/TransactionDetailsInterfaceController.swift index 492d71b..62698e0 100644 --- a/SynchronyFinancial/SynchronyFinancial WatchKit Extension/TransactionDetailsInterfaceController.swift +++ b/SynchronyFinancial/SynchronyFinancial WatchKit Extension/TransactionDetailsInterfaceController.swift @@ -10,10 +10,17 @@ import WatchKit import Foundation class TransactionDetailsInterfaceController: WKInterfaceController { + @IBOutlet var activityIndicator: WKInterfaceImage! + @IBOutlet var activityIndicatorLabel: WKInterfaceLabel! + @IBOutlet weak var contentGroup: WKInterfaceGroup! @IBOutlet var transactionName: WKInterfaceLabel! @IBOutlet var dateLabel: WKInterfaceLabel! @IBOutlet var amountLabel: WKInterfaceLabel! @IBOutlet var cancelButton: WKInterfaceButton! + + var transaction: Transaction? + var account: Account? + override func awake(withContext context: Any?) { super.awake(withContext: context) @@ -21,18 +28,45 @@ class TransactionDetailsInterfaceController: WKInterfaceController { let transaction = data["transaction"] as? Transaction, let merchant = data["merchant"] as? String, let date = data["date"] as? Date, - let amount = data["amount"] as? Double else { + let amount = data["amount"] as? Double, + let acct = data["acct"] as? Account else { NSLog("Error receiving context in TransactionDetails.") return } - setTitle("Dismiss") + self.transaction = transaction + account = acct transactionName.setText(merchant) dateLabel.setText("Date: \(DateFormatter.localizedString(from: date, dateStyle: .short, timeStyle: .none))") amountLabel.setText(String(format: "Amount: $%.2f", amount)) cancelButton.setHidden(!transaction.isModifiable) } + @IBAction func cancelButtonTapped() { + guard let t = transaction, let acct = account else { + NSLog("Error: no values for transaction or account.") + return + } + + activityIndicator.configureForActivityIndicator() + activityIndicatorLabel.setHidden(false) + contentGroup.setHidden(true) + + FetchData.cancelPayment(accountAlias: acct.accountAlias, confirmationNum: t.confirmationNum, paymentId: t.paymentId) { conf, error in + guard error == nil else { + self.presentAlert(withTitle: "Error", message: "We were unable to process your cancellation at this time. Please try again later.", preferredStyle: .alert, actions: [WKAlertAction(title: "Dismiss", style: .default, handler:{})]) + return + } + + self.activityIndicatorLabel.setHidden(true) + self.activityIndicator.stopAnimating() + self.contentGroup.setHidden(false) + let context: [String: String] = ["cancellation_confirm": conf] + self.presentController(withName: "Cancellation", context: context) + self.popToRootController() + } + } + override func willActivate() { // This method is called when watch view controller is about to be visible to user super.willActivate() diff --git a/SynchronyFinancial/SynchronyFinancial WatchKit Extension/TransactionsInterfaceController.swift b/SynchronyFinancial/SynchronyFinancial WatchKit Extension/TransactionsInterfaceController.swift index 8a6241b..6b77d9d 100644 --- a/SynchronyFinancial/SynchronyFinancial WatchKit Extension/TransactionsInterfaceController.swift +++ b/SynchronyFinancial/SynchronyFinancial WatchKit Extension/TransactionsInterfaceController.swift @@ -12,15 +12,19 @@ import Foundation class TransactionsInterfaceController: WKInterfaceController { @IBOutlet weak var transactionsTable: WKInterfaceTable! var transactions: [Transaction] = [] + var account: Account? override func awake(withContext context: Any?) { super.awake(withContext: context) - guard let data = context as? [String: [Transaction]], let trans = data["transactions"] else { - NSLog("Error receiving context containing transactions in TransactionsInterfaceController") - return + guard let data = context as? [String: Any], + let trans = data["transactions"] as? [Transaction], + let acct = data["acct"] as? Account else { + NSLog("Error receiving context containing transactions in TransactionsInterfaceController") + return } + account = acct transactions = trans configureRows() } @@ -36,13 +40,14 @@ class TransactionsInterfaceController: WKInterfaceController { } override func table(_ table: WKInterfaceTable, didSelectRowAt rowIndex: Int) { + guard let acct = account else { return } let transaction = transactions[rowIndex] let context: [String: Any] = ["transaction": transaction, "merchant": transaction.merchantID, "date": transaction.date, - "amount": transaction.amount] - - presentController(withName: "TransactionDetails", context: context) + "amount": transaction.amount, + "acct": acct] + pushController(withName: "TransactionDetails", context: context) } private func configureRows() { diff --git a/SynchronyFinancial/SynchronyFinancial.xcodeproj/project.pbxproj b/SynchronyFinancial/SynchronyFinancial.xcodeproj/project.pbxproj index eecc94f..76e8ade 100644 --- a/SynchronyFinancial/SynchronyFinancial.xcodeproj/project.pbxproj +++ b/SynchronyFinancial/SynchronyFinancial.xcodeproj/project.pbxproj @@ -34,6 +34,7 @@ 678C3885223098C400FEAAF6 /* Account.swift in Sources */ = {isa = PBXBuildFile; fileRef = 48F2430B2214CBF700B9C894 /* Account.swift */; }; 678C388622309F7D00FEAAF6 /* AccountCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 48DA0057221D12E70081A500 /* AccountCell.swift */; }; 678C62BA224ECDFD0007AD53 /* PaymentResultInterfaceController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 678C62B9224ECDFD0007AD53 /* PaymentResultInterfaceController.swift */; }; + 679A9069225C1B0E00247F39 /* CancellationInterfaceController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 679A9068225C1B0E00247F39 /* CancellationInterfaceController.swift */; }; 67BAC269219E254700713FEF /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 67BAC268219E254700713FEF /* AppDelegate.swift */; }; 67BAC26E219E254700713FEF /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 67BAC26C219E254700713FEF /* Main.storyboard */; }; 67BAC270219E254800713FEF /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 67BAC26F219E254800713FEF /* Assets.xcassets */; }; @@ -114,6 +115,7 @@ 676392B52242A3F800740A8C /* TransactionCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TransactionCell.swift; sourceTree = ""; }; 678C38832230950100FEAAF6 /* AccountDetailsInterfaceController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AccountDetailsInterfaceController.swift; sourceTree = ""; }; 678C62B9224ECDFD0007AD53 /* PaymentResultInterfaceController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PaymentResultInterfaceController.swift; sourceTree = ""; }; + 679A9068225C1B0E00247F39 /* CancellationInterfaceController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CancellationInterfaceController.swift; sourceTree = ""; }; 67BAC265219E254700713FEF /* SynchronyFinancial.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = SynchronyFinancial.app; sourceTree = BUILT_PRODUCTS_DIR; }; 67BAC268219E254700713FEF /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 67BAC26D219E254700713FEF /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; @@ -215,6 +217,7 @@ 67BAC28A219E254900713FEF /* SynchronyFinancial WatchKit Extension */ = { isa = PBXGroup; children = ( + 679A9068225C1B0E00247F39 /* CancellationInterfaceController.swift */, 678C62B9224ECDFD0007AD53 /* PaymentResultInterfaceController.swift */, 67293CF022542F15009E0E7A /* TransactionDetailsInterfaceController.swift */, 674BD1522239A39D0076AFD6 /* PayBillInterfaceController.swift */, @@ -508,6 +511,7 @@ 67E17B87223812C2008871FE /* Defaults.swift in Sources */, 67293CF122542F15009E0E7A /* TransactionDetailsInterfaceController.swift in Sources */, 1123372E223ABD6400B70925 /* FetchData.swift in Sources */, + 679A9069225C1B0E00247F39 /* CancellationInterfaceController.swift in Sources */, 112969422257B8920082AAC5 /* PaymentOptionsInterfaceController.swift in Sources */, 48F243072214C98600B9C894 /* AccountTableInterfaceController.swift in Sources */, 676392B62242A3F800740A8C /* TransactionCell.swift in Sources */,