Add Favourites feature
This commit is contained in:
+16
-18
@@ -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)
|
||||
})
|
||||
|
||||
Reference in New Issue
Block a user