From 2552f0fa11f0d8a7a5320f1cf293bff2ac02355d Mon Sep 17 00:00:00 2001 From: dankito Date: Fri, 17 Jul 2020 21:06:41 +0200 Subject: [PATCH] Implemented TransferMoneyDialog --- .../BankingiOSApp.xcodeproj/project.pbxproj | 8 + .../Base.lproj/Localizable.strings | 21 +++ .../BankingiOSApp/ContentView.swift | 13 +- .../de.lproj/Localizable.strings | 21 +++ .../ui/views/TransferMoneyDialog.swift | 156 ++++++++++++++++++ 5 files changed, 216 insertions(+), 3 deletions(-) create mode 100644 ui/BankingiOSApp/BankingiOSApp/ui/views/TransferMoneyDialog.swift diff --git a/ui/BankingiOSApp/BankingiOSApp.xcodeproj/project.pbxproj b/ui/BankingiOSApp/BankingiOSApp.xcodeproj/project.pbxproj index 593fcf89..ba381c6b 100644 --- a/ui/BankingiOSApp/BankingiOSApp.xcodeproj/project.pbxproj +++ b/ui/BankingiOSApp/BankingiOSApp.xcodeproj/project.pbxproj @@ -30,6 +30,8 @@ 36BCF88724C0A310005BEC29 /* PreviewData.swift in Sources */ = {isa = PBXBuildFile; fileRef = 36BCF88624C0A310005BEC29 /* PreviewData.swift */; }; 36BCF88924C0A7D7005BEC29 /* Message.swift in Sources */ = {isa = PBXBuildFile; fileRef = 36BCF88824C0A7D7005BEC29 /* Message.swift */; }; 36BCF88B24C0BD2D005BEC29 /* AccountTransactionsDialog.swift in Sources */ = {isa = PBXBuildFile; fileRef = 36BCF88A24C0BD2D005BEC29 /* AccountTransactionsDialog.swift */; }; + 36BCF88D24C1C1EA005BEC29 /* TransferMoneyDialog.swift in Sources */ = {isa = PBXBuildFile; fileRef = 36BCF88C24C1C1EA005BEC29 /* TransferMoneyDialog.swift */; }; + 36BCF88F24C1DFF7005BEC29 /* SheetPresenter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 36BCF88E24C1DFF7005BEC29 /* SheetPresenter.swift */; }; 36E7BA1424B3D05C00757859 /* ViewExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 36E7BA1324B3D05C00757859 /* ViewExtensions.swift */; }; 36FC929C24B39A05002B12E9 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 36FC929B24B39A05002B12E9 /* AppDelegate.swift */; }; 36FC929E24B39A05002B12E9 /* SceneDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 36FC929D24B39A05002B12E9 /* SceneDelegate.swift */; }; @@ -103,6 +105,8 @@ 36BCF88624C0A310005BEC29 /* PreviewData.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PreviewData.swift; sourceTree = ""; }; 36BCF88824C0A7D7005BEC29 /* Message.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Message.swift; sourceTree = ""; }; 36BCF88A24C0BD2D005BEC29 /* AccountTransactionsDialog.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AccountTransactionsDialog.swift; sourceTree = ""; }; + 36BCF88C24C1C1EA005BEC29 /* TransferMoneyDialog.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TransferMoneyDialog.swift; sourceTree = ""; }; + 36BCF88E24C1DFF7005BEC29 /* SheetPresenter.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SheetPresenter.swift; sourceTree = ""; }; 36E7BA1324B3D05C00757859 /* ViewExtensions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewExtensions.swift; sourceTree = ""; }; 36E7BA1824B9E70C00757859 /* xcode-frameworks */ = {isa = PBXFileReference; lastKnownFileType = folder; name = "xcode-frameworks"; path = "../../tools/BankFinder/build/xcode-frameworks"; sourceTree = ""; }; 36FC929824B39A05002B12E9 /* BankingiOSApp.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = BankingiOSApp.app; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -269,6 +273,7 @@ 36BCF86224BA5097005BEC29 /* SwiftUiRouter.swift */, 36BCF86D24BA691B005BEC29 /* DependencyInjector.swift */, 36BCF88824C0A7D7005BEC29 /* Message.swift */, + 36BCF88E24C1DFF7005BEC29 /* SheetPresenter.swift */, ); path = ui; sourceTree = ""; @@ -281,6 +286,7 @@ 36BCF88224C098BB005BEC29 /* BankListItem.swift */, 36BCF88424C098C8005BEC29 /* BankAccountListItem.swift */, 36BCF88A24C0BD2D005BEC29 /* AccountTransactionsDialog.swift */, + 36BCF88C24C1C1EA005BEC29 /* TransferMoneyDialog.swift */, ); path = views; sourceTree = ""; @@ -447,11 +453,13 @@ 36FC92D724B3A3BA002B12E9 /* NSUrlWebClient.swift in Sources */, 36BCF88324C098BB005BEC29 /* BankListItem.swift in Sources */, 36BCF87F24BFAA7F005BEC29 /* TestEntity.swift in Sources */, + 36BCF88D24C1C1EA005BEC29 /* TransferMoneyDialog.swift in Sources */, 36E7BA1424B3D05C00757859 /* ViewExtensions.swift in Sources */, 36BCF88924C0A7D7005BEC29 /* Message.swift in Sources */, 36BCF86C24BA5E72005BEC29 /* DispatchQueueAsyncRunner.swift in Sources */, 36BCF88124BFAB4A005BEC29 /* DependendTestEntity.swift in Sources */, 36BCF86324BA5097005BEC29 /* SwiftUiRouter.swift in Sources */, + 36BCF88F24C1DFF7005BEC29 /* SheetPresenter.swift in Sources */, 36FC929C24B39A05002B12E9 /* AppDelegate.swift in Sources */, 36BCF88B24C0BD2D005BEC29 /* AccountTransactionsDialog.swift in Sources */, 36BCF87B24BFA87E005BEC29 /* Extensions.swift in Sources */, diff --git a/ui/BankingiOSApp/BankingiOSApp/Base.lproj/Localizable.strings b/ui/BankingiOSApp/BankingiOSApp/Base.lproj/Localizable.strings index 6b24c28c..3cdcf417 100644 --- a/ui/BankingiOSApp/BankingiOSApp/Base.lproj/Localizable.strings +++ b/ui/BankingiOSApp/BankingiOSApp/Base.lproj/Localizable.strings @@ -1,12 +1,33 @@ +"OK" = "OK"; + "Add" = "Add"; +"Account" = "Account"; "Accounts" = "Accounts"; "Add account" = "Add account"; + +/* AddAccountDialog */ + "Bank code" = "Bank code"; "Customer ID" = "Online banking login name"; "Password" = "Online banking password"; "Could not add account" = "Could not add account"; "Error message from your bank %@" = "Error message from your bank:\n\n%@"; + + +"Show transfer money dialog" = "Transfer money"; + +/* TransferMoneyDialog */ +"Transfer Money Dialog Title" = "Überweisung"; +"Remittee Name" = "Name"; +"Remittee IBAN" = "IBAN"; +"Amount" = "Amount"; +"Usage" = "Usage"; +"Instant Payment" = "Instant Payment"; +"Transfer Money" = "Transfer"; + +"Successfully transferred %@ %@ to %@." = "Successfully transferred %@ %@ to %@."; +"Could not transfer %@ %@ to %@. Error: %@." = "Could not transfer %@ %@ to %@.\n\nError message from your bank:\n\n%@"; diff --git a/ui/BankingiOSApp/BankingiOSApp/ContentView.swift b/ui/BankingiOSApp/BankingiOSApp/ContentView.swift index cd409753..609af1b8 100644 --- a/ui/BankingiOSApp/BankingiOSApp/ContentView.swift +++ b/ui/BankingiOSApp/BankingiOSApp/ContentView.swift @@ -1,10 +1,11 @@ import SwiftUI struct ContentView: View { + @State private var selection = 0 var body: some View { - TabView(selection: $selection){ + TabView(selection: $selection) { AccountsTab() .tabItem { VStack { @@ -13,8 +14,14 @@ struct ContentView: View { } } .tag(0) - Text("Second View") - .font(.title) + + NavigationView { + VStack { + NavigationLink(destination: TransferMoneyDialog()) { + Text("Show transfer money dialog") + } + } + } .tabItem { VStack { Image("second") diff --git a/ui/BankingiOSApp/BankingiOSApp/de.lproj/Localizable.strings b/ui/BankingiOSApp/BankingiOSApp/de.lproj/Localizable.strings index e7d70051..01d6416c 100644 --- a/ui/BankingiOSApp/BankingiOSApp/de.lproj/Localizable.strings +++ b/ui/BankingiOSApp/BankingiOSApp/de.lproj/Localizable.strings @@ -1,12 +1,33 @@ +"OK" = "OK"; + "Add" = "Hinzufügen"; +"Account" = "Konto"; "Accounts" = "Konten"; "Add account" = "Konto hinzufügen"; + +/* AddAccountDialog */ + "Bank code" = "Bankleitzahl"; "Customer ID" = "Onlinebanking Login Name"; "Password" = "Online banking password"; "Could not add account" = "Konto konnte nicht hinzugefügt werden."; "Error message from your bank %@" = "Fehlermeldung Ihrer Bank:\n\n%@"; + + +"Show transfer money dialog" = "Überweisung"; + +/* TransferMoneyDialog */ +"Transfer Money Dialog Title" = "Überweisung"; +"Remittee Name" = "Name"; +"Remittee IBAN" = "IBAN"; +"Amount" = "Betrag"; +"Usage" = "Verwendungszweck"; +"Instant Payment" = "Echtzeitüberweisung"; +"Transfer Money" = "Überweisen"; + +"Successfully transferred %@ %@ to %@." = "%@ %@ wurden erfolgreich an %@ überwiesen."; +"Could not transfer %@ %@ to %@. Error: %@." = "Konnte nicht %@ %@ an %@ überweisen.\n\nFehlermeldung Ihrer Bank:\n\n%@"; diff --git a/ui/BankingiOSApp/BankingiOSApp/ui/views/TransferMoneyDialog.swift b/ui/BankingiOSApp/BankingiOSApp/ui/views/TransferMoneyDialog.swift new file mode 100644 index 00000000..ce1d6c36 --- /dev/null +++ b/ui/BankingiOSApp/BankingiOSApp/ui/views/TransferMoneyDialog.swift @@ -0,0 +1,156 @@ +import SwiftUI +import BankingUiSwift +import Combine + + +struct TransferMoneyDialog: View { + + @Environment(\.presentationMode) var presentation + + + private var showAccounts = false + + private var accountsSupportingTransferringMoney: [BUCBankAccount] = [] + + @State private var selectedAccountIndex = 0 + private var account: BUCBankAccount? = nil + + @State private var remitteeName: String = "" + @State private var isValidRemitteeNameEntered = false + + @State private var remitteeIban: String = "" + @State private var isValidRemitteeIbanEntered = false + + @State private var remitteeBic: String = "" // TODO + @State private var isValidRemitteeBicEntered = true // TODO + + @State private var amount = "" + @State private var isValidAmountEntered = false + + @State private var usage: String = "" + @State private var isValidUsageEntered = true + + @State private var instantPayment = false + + + private var supportsInstantPayment: Bool { + return self.account?.supportsInstantPaymentMoneyTransfer ?? false + } + + + @State private var transferMoneyResponseMessage: Message? = nil + + + @Inject private var presenter: BankingPresenterSwift + + + init() { + self.accountsSupportingTransferringMoney = self.presenter.bankAccounts.filter({ $0.supportsTransferringMoney }) + + self.account = self.accountsSupportingTransferringMoney.first + + self.showAccounts = self.accountsSupportingTransferringMoney.count > 1 + } + + + var body: some View { + Form { + if (showAccounts) { + Section { + Picker("Account", selection: $selectedAccountIndex) { + ForEach(0 ..< self.accountsSupportingTransferringMoney.count) { accountIndex in + Text(self.accountsSupportingTransferringMoney[accountIndex].displayName) + } + } + } + } + + Section { + TextField("Remittee Name", text: $remitteeName) + .onReceive(Just(remitteeName)) { newValue in + self.isValidRemitteeNameEntered = self.remitteeName.isEmpty == false + } + + TextField("Remittee IBAN", text: $remitteeIban) + .onReceive(Just(remitteeIban)) { newValue in + self.isValidRemitteeIbanEntered = self.remitteeIban.isEmpty == false + } + + TextField("Amount", text: $amount) + .keyboardType(.decimalPad) + .onReceive(Just(amount)) { newValue in + let filtered = newValue.filter { "0123456789,".contains($0) } + if filtered != newValue { + self.amount = filtered + } + + self.isValidAmountEntered = self.amount.isEmpty == false + } + + TextField("Usage", text: $usage) + .onReceive(Just($usage)) { newValue in + self.isValidUsageEntered = true + } + } + + if supportsInstantPayment { + Section { + Toggle("Instant Payment", isOn: $instantPayment) + } + } + + Section { + HStack { + Spacer() + Button(action: { self.transferMoney() }, + label: { Text("Transfer Money") }) + .disabled(!self.isRequiredDataEntered()) + Spacer() + } + } + } + .alert(item: $transferMoneyResponseMessage) { message in + if let secondaryButton = message.secondaryButton { + return Alert(title: message.title, message: message.message, primaryButton: message.primaryButton, secondaryButton: secondaryButton) + } + else { + return Alert(title: message.title, message: message.message, dismissButton: message.primaryButton) + } + } + .navigationBarTitle("Transfer Money Dialog Title", displayMode: .inline) + } + + + func isRequiredDataEntered() -> Bool { + return account != nil + && isValidRemitteeNameEntered + && isValidRemitteeIbanEntered + //&& isValidRemitteeBicEntered + && isValidAmountEntered + && isValidUsageEntered + } + + func transferMoney() { + let data = BUCTransferMoneyData(creditorName: remitteeName, creditorIban: remitteeIban, creditorBic: remitteeBic, amount: CommonBigDecimal(decimal: amount.replacingOccurrences(of: ",", with: ".")), usage: usage, instantPayment: instantPayment) + + presenter.transferMoneyAsync(bankAccount: account!, data: data) { response in + self.handleTransferMoneyResponse(data, response) + } + } + + func handleTransferMoneyResponse(_ data: BUCTransferMoneyData, _ response: BUCBankingClientResponse) { + if (response.isSuccessful) { + self.transferMoneyResponseMessage = Message(message: Text("Successfully transferred \(data.amount) \("€") to \(data.creditorName)")) + presentation.wrappedValue.dismiss() + } + else { + self.transferMoneyResponseMessage = Message(message: Text("Could not transfer \(data.amount) \("€") to \(data.creditorName). Error: \(response.errorToShowToUser ?? response.error?.message ?? "").")) + } + } +} + +struct TransferMoneyDialog_Previews: PreviewProvider { + static var previews: some View { + TransferMoneyDialog() + } +}