// // ContentView.swift // meterios-watch // // (c) 2025 Martin "maride" Dessauer // import SwiftUI struct ContentView: View { private var wcMgr: WCManager @State private var favouriteDrinks: Array = [] @State private var availableDrinks: Array = [] @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) } } }