81 lines
2.4 KiB
Swift
81 lines
2.4 KiB
Swift
//
|
|
// TransactionView.swift
|
|
// meterios-watch
|
|
//
|
|
// (c) 2025 Martin "maride" Dessauer
|
|
//
|
|
|
|
import SwiftUI
|
|
|
|
struct TransactionView: View {
|
|
private var wcMgr: WCManager
|
|
private var drinkID: Int
|
|
|
|
@State var statusLine = "Booking..."
|
|
|
|
@Environment(\.dismiss) private var dismiss
|
|
|
|
// If the backend reacts too fast (we hate that, huh?), the user is confused because of the short life of this view
|
|
// closeTimer takes care of that confusion and gives the user the good old 56k modem feeling.
|
|
@State var closeTimer: Timer?
|
|
@State var closeTimerReady: Bool = false
|
|
@State var backendBookTimer: Timer?
|
|
@State var backendTimerReady: Bool = false
|
|
|
|
init(wcMgr: WCManager, drinkID: Int) {
|
|
self.wcMgr = wcMgr
|
|
self.drinkID = drinkID
|
|
}
|
|
|
|
// maybeDismiss dismisses this view after the backend call(s) finished AND the timer(s) ran out
|
|
func maybeDismiss() {
|
|
if closeTimerReady && backendTimerReady {
|
|
dismiss()
|
|
}
|
|
}
|
|
|
|
// Books the drinks handed over to this view
|
|
func book() {
|
|
// Try to book the drink(s)
|
|
wcMgr.bookDrink(drinkID: drinkID) { salut in
|
|
statusLine = salut
|
|
backendTimerReady = true
|
|
maybeDismiss()
|
|
} errorHandler: { error in
|
|
statusLine = error!.localizedDescription
|
|
print("Error booking drinks: \(error)")
|
|
}
|
|
}
|
|
|
|
var body: some View {
|
|
// Green checkmark or progress indicator
|
|
VStack {
|
|
if backendTimerReady {
|
|
Image(systemName: "checkmark.circle.fill")
|
|
.foregroundStyle(.green)
|
|
} else {
|
|
ProgressView()
|
|
}
|
|
|
|
// Status line, on success with salute
|
|
Text(statusLine)
|
|
.font(.title)
|
|
|
|
// Let watch vibrate on success
|
|
if #available(watchOS 10.0, *) {
|
|
Text("")
|
|
.opacity(0)
|
|
.sensoryFeedback(.success, trigger: backendTimerReady)
|
|
}
|
|
}.onAppear(perform: {
|
|
closeTimer = Timer.scheduledTimer(withTimeInterval: 1.5, repeats: false) { timer in
|
|
closeTimerReady = true
|
|
maybeDismiss()
|
|
}
|
|
backendBookTimer = Timer.scheduledTimer(withTimeInterval: 0.5, repeats: false) { timer in
|
|
book()
|
|
}
|
|
})
|
|
}
|
|
}
|