92 lines
3.2 KiB
Swift
92 lines
3.2 KiB
Swift
//
|
|
// ContentView.swift
|
|
// meterios-watch
|
|
//
|
|
// (c) 2025 Martin "maride" Dessauer
|
|
//
|
|
|
|
import SwiftUI
|
|
|
|
struct ContentView: View {
|
|
private var wcMgr: WCManager
|
|
|
|
@State private var favouriteDrinks: Array<Drink> = []
|
|
@State private var availableDrinks: Array<Drink> = []
|
|
|
|
@State private var showUpdateError: Bool = false
|
|
@State private var updateError: String = ""
|
|
@State private var updateErrorCount: Int = 0
|
|
|
|
init(_ wcMgr: WCManager) {
|
|
self.wcMgr = wcMgr
|
|
}
|
|
|
|
// update performs a full update from the paired device, covering connection info (user ID and backend address) and list of drinks
|
|
func update() {
|
|
if updateErrorCount >= 3 {
|
|
showUpdateError = true
|
|
updateErrorCount = 0
|
|
return
|
|
}
|
|
|
|
// Update drinks list from paired device
|
|
wcMgr.requestDrinksList(
|
|
replyHandler: { favDrinks, availDrinks in
|
|
// Drinks received from backend
|
|
self.favouriteDrinks = favDrinks
|
|
self.availableDrinks = availDrinks
|
|
showUpdateError = false
|
|
}, errorHandler: { error in
|
|
// Error receiving drinks
|
|
print("Error receiving drinks: \(error)")
|
|
updateError = error?.localizedDescription ?? "Unknown error"
|
|
updateErrorCount += 1
|
|
update()
|
|
}
|
|
)
|
|
}
|
|
|
|
var body: some View {
|
|
ZStack {
|
|
if favouriteDrinks.count + availableDrinks.count > 0 {
|
|
NavigationView {
|
|
List() {
|
|
// Drinks
|
|
Section(String(localized: "FAVOURITES")) {
|
|
ForEach(favouriteDrinks) { drink in
|
|
NavigationLink(drink.name) {
|
|
DrinkDetailView(wcMgr: wcMgr, drink: drink)
|
|
}
|
|
}
|
|
}
|
|
Section(String(localized: "DRINKS")) {
|
|
ForEach(availableDrinks) { drink in
|
|
NavigationLink(drink.name) {
|
|
DrinkDetailView(wcMgr: wcMgr, drink: drink)
|
|
}
|
|
}
|
|
}
|
|
|
|
// Controls
|
|
Section {
|
|
Button(String(localized: "REFRESH")) {
|
|
favouriteDrinks = []
|
|
availableDrinks = []
|
|
update()
|
|
}
|
|
}
|
|
}
|
|
}
|
|
} else {
|
|
ProgressView()
|
|
}
|
|
}
|
|
.onAppear(perform: update)
|
|
// Alert to communicate an error in communication with the paired device
|
|
.alert(String(localized: "CONNECTION_ERROR"), isPresented: $showUpdateError) {
|
|
Text(updateError).tint(.red).font(.footnote)
|
|
Button(String(localized: "RETRY"), systemImage: "arrow.clockwise", action: update)
|
|
}
|
|
}
|
|
}
|