Cleanup code
This commit is contained in:
@@ -2,7 +2,60 @@
|
||||
// AsyncImageWithPlaceholder.swift
|
||||
// meterios
|
||||
//
|
||||
// Created by Maximilian on 23.04.25.
|
||||
// (c) 2025 Martin "maride" Dessauer
|
||||
//
|
||||
|
||||
import Foundation
|
||||
import SwiftUI
|
||||
|
||||
/// **AsyncImageWithPlaceholder** wraps AsyncImage, showing a Spinner while loading and a question mark in case of errors.
|
||||
struct AsyncImageWithPlaceholder : View {
|
||||
private var url: URL?
|
||||
private var width: CGFloat
|
||||
private var height: CGFloat
|
||||
|
||||
// Access the current color scheme (that is, e.g.: dark mode, light mode) environment value
|
||||
@Environment(\.colorScheme) var colorScheme
|
||||
|
||||
// baseShape and baseShapeView resemble the "background" (while loading, and in case of errors, and for the image itself)
|
||||
private var baseShape : some Shape = RoundedRectangle(cornerRadius: 8.0)
|
||||
var baseShapeView : some View {
|
||||
baseShape
|
||||
.foregroundStyle(colorScheme == .dark ? .black : .white)
|
||||
.frame(width: width, height: height)
|
||||
}
|
||||
|
||||
/// Creates a new instance of AsyncImageWithPlaceholder, loading the image pointed to by url, with exact measures of width by height
|
||||
init(url: URL? = nil, width: CGFloat, height: CGFloat) {
|
||||
self.url = url
|
||||
self.width = width
|
||||
self.height = height
|
||||
}
|
||||
|
||||
var body: some View {
|
||||
AsyncImage(url: self.url) { phase in
|
||||
if let image = phase.image {
|
||||
// Image loaded
|
||||
image
|
||||
.resizable()
|
||||
.aspectRatio(contentMode: .fit)
|
||||
.frame(width: self.width, height: self.height)
|
||||
.clipShape(baseShape)
|
||||
} else if phase.error != nil {
|
||||
// Error, display a dummy image (question mark)
|
||||
ZStack {
|
||||
baseShapeView
|
||||
Text("?")
|
||||
.fontWeight(.bold)
|
||||
.foregroundStyle(.gray)
|
||||
}
|
||||
} else {
|
||||
// Loading Placeholder
|
||||
ZStack {
|
||||
baseShapeView
|
||||
ProgressView()
|
||||
}
|
||||
}
|
||||
}.fixedSize()
|
||||
}
|
||||
}
|
||||
|
||||
+9
-36
@@ -9,7 +9,6 @@ import SwiftUI
|
||||
import WatchConnectivity
|
||||
|
||||
enum WCMeteriosMessageTypes: String {
|
||||
case ConnectionInfo
|
||||
case DrinkList
|
||||
case BookDrink
|
||||
}
|
||||
@@ -26,7 +25,6 @@ class WCManager: NSObject, WCSessionDelegate {
|
||||
if (WCSession.isSupported()) {
|
||||
session.delegate = self
|
||||
session.activate()
|
||||
log("Activated session")
|
||||
}
|
||||
}
|
||||
|
||||
@@ -42,13 +40,8 @@ class WCManager: NSObject, WCSessionDelegate {
|
||||
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
|
||||
replyHandler([
|
||||
"userID": meteUserID,
|
||||
"hostAddr": meteHostAddr
|
||||
])
|
||||
} else if message.contains(where: { $0.key == "request" && $0.value as! String == WCMeteriosMessageTypes.DrinkList.rawValue }) {
|
||||
switch message["request"] as! String {
|
||||
case WCMeteriosMessageTypes.DrinkList.rawValue:
|
||||
// Request for a list of available drinks
|
||||
Task {
|
||||
let drinks = try await BackendConnector().GetDrinks(baseAddr: meteHostAddr)
|
||||
@@ -65,7 +58,7 @@ class WCManager: NSObject, WCSessionDelegate {
|
||||
"availableDrinks": availableDrinkArray
|
||||
])
|
||||
}
|
||||
} else if message.contains(where: { $0.key == "request" && $0.value as! String == WCMeteriosMessageTypes.BookDrink.rawValue }) {
|
||||
case WCMeteriosMessageTypes.BookDrink.rawValue:
|
||||
// Book the given drink at the backend
|
||||
Task {
|
||||
do {
|
||||
@@ -83,23 +76,15 @@ class WCManager: NSObject, WCSessionDelegate {
|
||||
])
|
||||
}
|
||||
}
|
||||
} else {
|
||||
log("Error: received unknown request. \(message)")
|
||||
default:
|
||||
// Malformed message from watch
|
||||
replyHandler([
|
||||
"error": "request contains no request",
|
||||
])
|
||||
}
|
||||
#endif // os(iOS)
|
||||
}
|
||||
|
||||
// requestConnectionInfo requests User ID and Host address from the paired device
|
||||
func requestConnectionInfo(replyHandler: @escaping (Int, String) -> Void, errorHandler: @escaping ((any Error)?) -> Void) {
|
||||
session.sendMessage([
|
||||
"request": WCMeteriosMessageTypes.ConnectionInfo.rawValue
|
||||
], replyHandler: { reply in
|
||||
replyHandler(reply["userID"] as! Int, reply["hostAddr"] as! String)
|
||||
}, errorHandler: { error in
|
||||
errorHandler(error)
|
||||
})
|
||||
}
|
||||
|
||||
// requestDrinksList requests the list of drinks available at the backend from the paired device
|
||||
func requestDrinksList(replyHandler: @escaping (Array<Drink>, Array<Drink>) -> Void, errorHandler: @escaping ((any Error)?) -> Void) {
|
||||
session.sendMessage([
|
||||
@@ -125,21 +110,9 @@ class WCManager: NSObject, WCSessionDelegate {
|
||||
"request": WCMeteriosMessageTypes.BookDrink.rawValue,
|
||||
"drinkID": drinkID,
|
||||
], replyHandler: { reply in
|
||||
let salut = reply["salut"] as! String
|
||||
replyHandler(salut)
|
||||
replyHandler(reply["salut"] as! String)
|
||||
}, errorHandler: { error in
|
||||
errorHandler(error)
|
||||
})
|
||||
}
|
||||
|
||||
private func log(_ line: String) {
|
||||
#if os(iOS)
|
||||
let prefix = "[WCM@iOS]"
|
||||
#elseif os(watchOS)
|
||||
let prefix = "[WCM@wOS]"
|
||||
#else
|
||||
let prefix = "[WCM@?OS]"
|
||||
#endif // os(...)
|
||||
print("\(prefix) \(line)")
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user