Add Favourites feature

This commit is contained in:
2025-04-04 19:45:10 +02:00
parent 384ee97cb7
commit 9984f2c943
5 changed files with 125 additions and 26 deletions
+16 -18
View File
@@ -38,8 +38,9 @@ class WCManager: NSObject, WCSessionDelegate {
func session(_ session: WCSession, activationDidCompleteWith activationState: WCSessionActivationState, error: (any Error)?) {}
// session(...) gets called for every incoming message through the WatchConnectivity channel
// As Meterios currently only needs messages from watch to device and responses back to the watch, this function currently only implements device-related responses.
// As Meterios currently only needs messages from watchOS to iOS and responses back to the watch, this function currently only implements iOS-related responses.
func session(_ session: WCSession, didReceiveMessage message: [String : Any], replyHandler: @escaping ([String : Any]) -> Void) {
#if os(iOS)
// Check for the different possible message types
if message.contains(where: { $0.key == "request" && $0.value as! String == WCMeteriosMessageTypes.ConnectionInfo.rawValue }) {
// Request for ConnectionInfo
@@ -51,18 +52,17 @@ class WCManager: NSObject, WCSessionDelegate {
// Request for a list of available drinks
Task {
let drinks = try await BackendConnector().GetDrinks(baseAddr: meteHostAddr)
let availableDrinks = drinks.filter({ $0.active })
let favouriteDrinks = drinks.filter({ FavouritesManager.default.IsFavourite($0.id) && $0.active })
let availableDrinks = drinks.filter({ !FavouritesManager.default.IsFavourite($0.id) && $0.active })
// note that drinks which are not active/available are not sent to the watch - the screen is too small to waste pixels.
// Create a plist-compatible variant of the Drink object containing the required information
var drinkArray: Array<String> = []
for d in availableDrinks {
drinkArray.append(
try! JSONEncoder().encode(d).base64EncodedString()
)
}
let favouriteDrinkArray = favouriteDrinks.map { drink in try! JSONEncoder().encode(drink).base64EncodedString() }
let availableDrinkArray = availableDrinks.map { drink in try! JSONEncoder().encode(drink).base64EncodedString() }
replyHandler([
"drinks": drinkArray
"favouriteDrinks": favouriteDrinkArray,
"availableDrinks": availableDrinkArray
])
}
} else if message.contains(where: { $0.key == "request" && $0.value as! String == WCMeteriosMessageTypes.BookDrink.rawValue }) {
@@ -86,6 +86,7 @@ class WCManager: NSObject, WCSessionDelegate {
} else {
log("Error: received unknown request. \(message)")
}
#endif // os(iOS)
}
// requestConnectionInfo requests User ID and Host address from the paired device
@@ -100,22 +101,19 @@ class WCManager: NSObject, WCSessionDelegate {
}
// requestDrinksList requests the list of drinks available at the backend from the paired device
func requestDrinksList(replyHandler: @escaping (Array<Drink>) -> Void, errorHandler: @escaping ((any Error)?) -> Void) {
func requestDrinksList(replyHandler: @escaping (Array<Drink>, Array<Drink>) -> Void, errorHandler: @escaping ((any Error)?) -> Void) {
session.sendMessage([
"request": WCMeteriosMessageTypes.DrinkList.rawValue
], replyHandler: { reply in
let drinks = reply["drinks"] as! Array<String>
let favouriteDrinks = reply["favouriteDrinks"] as! Array<String>
let availableDrinks = reply["availableDrinks"] as! Array<String>
// Create Drink objects from response
var drinkArray: Array<Drink> = []
for d in drinks {
let jsonDecoded = Data(base64Encoded: d)
let drink = try! JSONDecoder().decode(Drink.self, from: jsonDecoded!)
drinkArray.append(drink)
}
let favouriteDrinksArray = favouriteDrinks.map { drink in try! JSONDecoder().decode(Drink.self, from: Data(base64Encoded: drink)!) }
let availableDrinksArray = availableDrinks.map { drink in try! JSONDecoder().decode(Drink.self, from: Data(base64Encoded: drink)!) }
// enjoy your drinks, replyHandler!
replyHandler(drinkArray)
replyHandler(favouriteDrinksArray, availableDrinksArray)
}, errorHandler: { error in
errorHandler(error)
})