In my SwiftUI view below, I would like my alert to update with the countdown variable which controls whether or not the Proceed button is active & also shows up in the text of the alert itself.
The current implementation does not update the value of countdown - it always remains as 5.
struct RedemptionView: View {
@Environment(\.dismiss) var dismiss
@State private var showQRCodeScanner = false
@State private var showPasscodeView = false
@State private var billAmount: String = ""
@State private var isShowingRedemptionStepView = false
@State private var showAlert = false
@State fileprivate var countdown: Int = 5
var allowsDelitePointCollection: Bool
var voucherTitle: String
var discountId: Int
var body: some View {
VStack {
DismissButton()
VStack(spacing: 16) {
Text("Scan the QR code provided by the staff, or pass your phone to them to enter the staff code.")
.font(.subheadline)
.multilineTextAlignment(.center)
.padding(.horizontal)
.fixedSize(horizontal: false, vertical: true)
Button(action: {
if !billAmount.isEmpty {
showAlert = true
startCountdown()
} else {
showQRCodeScanner = true
}
}) {
Text("Scan QR Code")
.font(.headline)
.padding()
.frame(maxWidth: .infinity)
.background(Color.blue)
.foregroundColor(.white)
.cornerRadius(10)
}
.padding(.horizontal)
}
.padding(.bottom)
Spacer()
}
.onTapGesture {
hideKeyboard()
}
.padding(.top, 20)
.sheet(isPresented: $showQRCodeScanner) {
QRCodeScannerView(discountId: discountId, billAmount: billAmount, discountTitle: voucherTitle, isPresented: $isShowingRedemptionStepView)
}
.sheet(isPresented: $showPasscodeView) {
PasscodeView(billAmount: billAmount, discountId: discountId, discountTitle: voucherTitle, isPresented: $isShowingRedemptionStepView)
}
.onChange(of: isShowingRedemptionStepView) { oldValue, newValue in
if !newValue && oldValue {
dismiss()
}
}
.alert("Verify Bill Amount - \(priceToStrFormat(price: (Int(billAmount) ?? 0) * 100, useComma: false))", isPresented: $showAlert) {
Button("Proceed\(countdown > 0 ? " In \(countdown)s" : "")") {
if countdown == 0 {
showQRCodeScanner = true
}
}.disabled(countdown > 0)
Button("Cancel", role: .cancel) { }
} message: {
Text("Show Phone to Staff to verify bill amount. Proceed in \(countdown) seconds")
}
}
private func startCountdown() {
Timer.scheduledTimer(withTimeInterval: 1.0, repeats: true) { timer in
if countdown > 0 {
countdown -= 1
} else {
timer.invalidate()
}
}
}
}