summaryrefslogtreecommitdiff
path: root/TalerWallet1/Views/Banking/DepositIbanV.swift
blob: 6d588bf0123bade69170239be4e91fbb7d90fc86 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
/*
 * This file is part of GNU Taler, ©2022-23 Taler Systems S.A.
 * See LICENSE.md
 */
import SwiftUI
import taler_swift
import SymLog


struct DepositIbanV: View {
    private let symLog = SymLogV(0)
    let stack: CallStack
    let feeLabel: String?
    let feeIsNotZero: Bool?            // nil = no fees at all, false = no fee for this tx
    let amountAvailable: Amount?
//    @Binding var depositIBAN: String
//    @Binding var accountHolder: String
    @Binding var amountToTransfer: Amount

    @EnvironmentObject private var controller: Controller
    @EnvironmentObject private var model: WalletModel
    @Environment(\.colorScheme) private var colorScheme
    @Environment(\.colorSchemeContrast) private var colorSchemeContrast
    @AppStorage("minimalistic") var minimalistic: Bool = false
    @AppStorage("depositIBAN") var depositIBAN: String = EMPTYSTRING
    @AppStorage("accountHolder") var accountHolder: String = EMPTYSTRING

    @State private var myFeeLabel: String = EMPTYSTRING
    @State private var transactionStarted: Bool = false
    @State private var paytoUri: String? = nil
    @FocusState private var isFocused: Bool

    private func buttonTitle(_ amount: Amount, _ currencyInfo: CurrencyInfo) -> String {
        let amountWithCurrency = amount.string(currencyInfo, useSymbol: false)
        return String(localized: "Next", comment: "advance Deposit to Amount")
        return String(localized: "Deposit \(amountWithCurrency)", comment: "amount with currency")
    }

    private func subjectTitle(_ amount: Amount, _ currencyInfo: CurrencyInfo) -> String {
        let amountStr = amount.string(currencyInfo)
        return String(localized: "NavTitle_Deposit_AmountStr",
                   defaultValue: "Deposit", comment: "NavTitle: Deposit")
//                   defaultValue: "Deposit \(amountStr)", comment: "NavTitle: Deposit 'amountStr'")
    }

    var body: some View {
#if PRINT_CHANGES
        let _ = Self._printChanges()
        let _ = symLog.vlog(amountToTransfer.readableDescription)       // just to get the # to compare it with .onAppear & onDisappear
#endif
        let currency = amountToTransfer.currencyStr
        let currencyInfo = controller.info(for: currency, controller.currencyTicker)
        let destination = LazyView {
            DepositAmountV(stack: stack.push(),
                        paytoUri: paytoUri,
//                 exchangeBaseUrl: baseURL,
                 amountAvailable: amountAvailable,
//                     depositIBAN: $depositIBAN,
//                   accountHolder: $accountHolder,
                amountToTransfer: $amountToTransfer)
        }
        ScrollView { VStack (alignment: .leading, spacing: 6) {
            if let feeIsNotZero {       // don't show fee if nil
                let label = feeLabel ?? myFeeLabel
                if label.count > 0 {
                    Text(label)
                        .frame(maxWidth: .infinity, alignment: .trailing)
                        .foregroundColor(feeIsNotZero ? .red 
                                                      : WalletColors().secondary(colorScheme, colorSchemeContrast))
                        .talerFont(.body)
                }
            }
            if !minimalistic {
                Text("Account holder:")
                    .talerFont(.title3)
                    .accessibilityAddTraits(.isHeader)
                    .accessibilityRemoveTraits(.isStaticText)
                    .padding(.top)
            }
            TextField(minimalistic ? "Account holder" : EMPTYSTRING, text: $accountHolder)
                .focused($isFocused)
                .talerFont(.title2)
                .foregroundColor(WalletColors().fieldForeground)     // text color
                .background(WalletColors().fieldBackground)
                .textFieldStyle(.roundedBorder)
                .padding(minimalistic ? .bottom : .vertical)
                .onAppear {
                    if !UIAccessibility.isVoiceOverRunning {
                        symLog.log("dispatching kbd...")
                        DispatchQueue.main.asyncAfter(deadline: .now() + 0.7) {
                            isFocused = true        // make first responder - raise keybord
                            symLog.log("...kbd isFocused")
                        }
                    }
                }

            if !minimalistic {
                Text("IBAN:")
                    .talerFont(.title3)
                    .accessibilityAddTraits(.isHeader)
                    .accessibilityRemoveTraits(.isStaticText)
                    .padding(.top)
            }
            TextField(minimalistic ? "IBAN" : EMPTYSTRING, text: $depositIBAN)
                .talerFont(.title2)
                .foregroundColor(WalletColors().fieldForeground)     // text color
                .background(WalletColors().fieldBackground)
                .textFieldStyle(.roundedBorder)
                .padding(minimalistic ? .bottom : .vertical)

            let disabled = (accountHolder.count < 1) || paytoUri == nil    // TODO: check amountAvailable
            NavigationLink(destination: destination) {
                Text(buttonTitle(amountToTransfer, currencyInfo))
            }
            .buttonStyle(TalerButtonStyle(type: .prominent, disabled: disabled))
                .disabled(disabled)
                .accessibilityHint(disabled ? "enabled when account holder and IBAN are set" : EMPTYSTRING)
        }.padding(.horizontal) } // ScrollVStack
//        .scrollBounceBehavior(.basedOnSize)  needs iOS 16.4
        .navigationTitle(subjectTitle(amountToTransfer, currencyInfo))
        .background(WalletColors().backgroundColor.edgesIgnoringSafeArea(.all))
        .onAppear {
            DebugViewC.shared.setViewID(VIEW_DEPOSIT_ACCEPT, stack: stack.push())
//            print("❗️ P2PSubjectV onAppear")
        }
        .onDisappear {
//            print("❗️ P2PSubjectV onDisappear")
        }
        .task(id: depositIBAN) {
            if (try? await model.validateIbanM(depositIBAN)) == true {
                let payto = "payto://iban/\(depositIBAN)?receiver-name=\(accountHolder)"
                paytoUri = payto.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed)!
            } else {
                paytoUri = nil
            }
        }
    }
}
// MARK: -
#if DEBUG
#endif