-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathChargeView.swift
More file actions
81 lines (70 loc) · 2.8 KB
/
Copy pathChargeView.swift
File metadata and controls
81 lines (70 loc) · 2.8 KB
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
import SwiftUI
import PaystackCore
@available(iOS 14.0, *)
struct ChargeView: View {
@StateObject
var viewModel: ChargeViewModel
@EnvironmentObject
var visibilityContainer: ViewVisibilityContainer
init(accessCode: String) {
self._viewModel = StateObject(
wrappedValue: ChargeViewModel(accessCode: accessCode))
}
var body: some View {
VStack {
if viewModel.centerView {
Spacer()
}
if viewModel.inTestMode {
TestModeInidcator()
}
switch viewModel.transactionState {
case .loading(let message):
LoadingView(message: message)
case .error(let error):
// TODO: Update once we have new designs for this error screen
ErrorView(message: error.message)
case .payment(let type):
paymentFlowView(for: type)
case .success(let amount, let merchant, let details):
ChargeSuccessView(amount: amount, merchant: merchant,
completionDetails: details)
case .channelSelection(let transactionInformation, let supportedChannels):
ChannelSelectionView(state: $viewModel.transactionState,
supportedChannels: supportedChannels,
information: transactionInformation)
}
Spacer()
Image.paystackSecured
.aspectRatio(contentMode: .fit)
.frame(width: 140)
}
.task(viewModel.verifyAccessCodeAndProceed)
.modalCancelButton(showConfirmation: viewModel.displayCloseButtonConfirmation,
onCancelled: chargeCancelled)
}
@ViewBuilder
func paymentFlowView(for type: ChargePaymentType) -> some View {
switch type {
case .card(let transactionInformation):
ChargeCardView(transactionDetails: transactionInformation,
chargeContainer: viewModel)
case .mobileMoney(let transactionInformation, let provider):
MobileMoneyFlowFactory.view(for: provider,
chargeContainer: viewModel,
transactionDetails: transactionInformation)
}
}
func chargeCancelled() {
switch viewModel.transactionState {
case .success:
guard let reference = viewModel.transactionDetails?.reference else {
Logger.error("Transaction details could not be found")
return
}
visibilityContainer.completeAndDismiss(with: .completed(.init(reference: reference)))
default:
visibilityContainer.cancelAndDismiss()
}
}
}