taler-ios

iOS apps for GNU Taler (wallet)
Log | Files | Refs | README | LICENSE

ManualWithdrawDone.swift (4284B)


      1 /*
      2  * This file is part of GNU Taler, ©2022-25 Taler Systems S.A.
      3  * See LICENSE.md
      4  */
      5 /**
      6  * @author Marc Stibane
      7  */
      8 import SwiftUI
      9 import taler_swift
     10 import SymLog
     11 
     12 struct ManualWithdrawDone: View {
     13     private let symLog = SymLogV(0)
     14     let stack: CallStack
     15 //    let scope: ScopeInfo                                                        // TODO: use data from tx itself
     16 
     17     let url: URL?
     18     let baseURL: String
     19     let amountToTransfer: Amount
     20 //    let restrictAge: Int?
     21 
     22     @EnvironmentObject private var controller: Controller
     23     @EnvironmentObject private var model: WalletModel
     24 
     25     @State private var acceptManualWithdrawalResult: AcceptManualWithdrawalResult?
     26     @State private var transactionId: String?
     27     @State private var talerTX: TalerTransaction = TalerTransaction(dummyCurrency: DEMOCURRENCY)
     28 
     29     let navTitle = String(localized: "Wire Transfer")
     30 
     31     @MainActor
     32     private func viewDidLoad() async {
     33         if transactionId == nil {
     34             if let result = try? await model.acceptManualWithdrawal(amountToTransfer,
     35                                                            baseUrl: baseURL,
     36                                                        restrictAge: 0)
     37             {
     38                 if let url {
     39                     controller.removeURL(url)
     40                 }
     41                 transactionId = result.transactionId
     42             }
     43         }
     44     }
     45 
     46     var body: some View {
     47 #if PRINT_CHANGES
     48         let _ = Self._printChanges()
     49         let _ = symLog.vlog()       // just to get the # to compare it with .onAppear & onDisappear
     50 #endif
     51         Group {
     52             if let transactionId {
     53                 TransactionSummaryV(stack: stack.push(),
     54 //                                    scope: scope,                               // TODO: use data from tx itself
     55                             transactionId: transactionId,
     56                                   talerTX: $talerTX,
     57                                  navTitle: navTitle,
     58                                   hasDone: true,
     59                               abortAction: nil,
     60                              deleteAction: nil,
     61                                failAction: nil,
     62                             suspendAction: nil,
     63                              resumeAction: nil)
     64                 .navigationBarBackButtonHidden(true)
     65                 .interactiveDismissDisabled()           // can only use "Done" button to dismiss
     66 //                .navigationTitle(navTitle)
     67                 .safeAreaInset(edge: .bottom) {
     68                     Button("Done") { dismissTop(stack.push()) }
     69                         .buttonStyle(TalerButtonStyle(type: .prominent))
     70                         .padding(.horizontal)
     71                 }
     72             } else {
     73                 LoadingView(stack: stack.push(), scopeInfo: nil, message: baseURL.trimURL)
     74                     .task { await viewDidLoad() }
     75             }
     76         }
     77         .onAppear() {
     78             symLog.log("onAppear")
     79             DebugViewC.shared.setViewID(VIEW_WITHDRAW_ACCEPT, stack: stack.push())
     80         }
     81     }
     82 }
     83 
     84 // MARK: -
     85 #if DEBUG
     86 fileprivate struct ManualWithdrawDone_Previews: PreviewProvider {
     87     @MainActor
     88     struct BindingViewContainer : View {
     89         @State private var amountToTransfer = Amount(currency: LONGCURRENCY, cent: 510)
     90         @State private var previewD: CurrencyInfo = CurrencyInfo.zero(DEMOCURRENCY)
     91 
     92     var body: some View {
     93         let scopeInfo = ScopeInfo(type: .exchange, currency: LONGCURRENCY)
     94         let exchange = Exchange(exchangeBaseUrl: DEMOEXCHANGE,
     95                                       masterPub: "masterPub",
     96                                       scopeInfo: scopeInfo,
     97                                       paytoUris: [],
     98                                       tosStatus: .pending,
     99                             exchangeEntryStatus: .preset,
    100                            exchangeUpdateStatus: .initial,
    101                           ageRestrictionOptions: [])
    102         ManualWithdrawDone(stack: CallStack("Preview"),
    103                              url: URL("taler://withdraw"),
    104 //                           scope: scopeInfo,
    105                          baseURL: DEMOEXCHANGE,
    106                 amountToTransfer: amountToTransfer)
    107     }
    108 }
    109 
    110     static var previews: some View {
    111         BindingViewContainer()
    112     }
    113 }
    114 #endif