Add watchOS support

This commit is contained in:
2025-04-04 18:23:12 +02:00
parent 96b0466deb
commit 384ee97cb7
20 changed files with 857 additions and 48 deletions
+52
View File
@@ -0,0 +1,52 @@
//
// Drink.swift
// meterios
//
// (c) 2025 Martin "maride" Dessauer
//
import SwiftUI
struct Drink: Identifiable, Encodable, Decodable {
public var id: Int
public var name: String
public var logoURL: String
private var price: String
private var bottle_size: String
public var caffeine: Int
public var active: Bool
// KeyMap is an enum covering the field names as used by SpaceMarket API
private enum KeyMap : String, CodingKey { case id, name, bottle_size, caffeine, price, active, logo_url }
// Init function to be used with JSONDecoder using SpaceMarket API's strange types
init(from decoder : Decoder) throws {
let container = try decoder.container(keyedBy: KeyMap.self)
self.id = try container.decode(Int.self, forKey: .id)
self.name = try container.decode(String.self, forKey: .name)
self.bottle_size = (try? container.decode(String.self, forKey: .bottle_size)) ?? ""
self.caffeine = (try? container.decode(Int.self, forKey: .caffeine)) ?? 0
self.price = (try? container.decode(String.self, forKey: .price)) ?? ""
self.active = (try? container.decode(Bool.self, forKey: .active)) ?? false
self.logoURL = (try? container.decode(String.self, forKey: .logo_url)) ?? ""
}
// Init function, as straight-forward as it gets
init(id: Int, name: String, logoURL: String = "", price: String = "", bottle_size: String = "", caffeine: Int = 0, active: Bool = true) {
self.id = id
self.name = name
self.logoURL = logoURL
self.price = price
self.bottle_size = bottle_size
self.caffeine = caffeine
self.active = active
}
func GetPrice() -> Float {
return Float(self.price) ?? 9999.99
}
func GetBottleSize() -> Float {
return Float(self.bottle_size) ?? 9999.99
}
}
+46
View File
@@ -0,0 +1,46 @@
//
// User.swift
// meterios
//
// (c) 2025 Martin "maride" Dessauer
//
import SwiftUI
import CryptoKit
struct User: Decodable, Identifiable, Hashable {
var id: UUID = UUID() // Careful: meterios-internal ID, not Mete/Backend user accoint ID!
var meteID: Int
var displayName: String
var displayImageURL: String
var balance: Float
private enum KeyMap : String, CodingKey { case id, name, email, balance }
// Init function to be used with JSONDecoder, converting from SpaceMarket API's strange types to proper types
init(from decoder : Decoder) throws {
let container = try decoder.container(keyedBy: KeyMap.self)
self.meteID = try container.decode(Int.self, forKey: .id)
self.displayName = try container.decode(String.self, forKey: .name)
self.displayImageURL = String(
format: "https://secure.gravatar.com/avatar/%@",
Insecure.MD5.hash(
// e-mails may be empty as they are not required during the registration process in Mete
// however, Gravatar requires them for the profile picture functionality.
// Default to the profile picture of md5("0"), which is simply the Gravatar logo on blue background
data: (try container.decode(String.self, forKey: .email).data(using: .utf8)) ?? "0".data(using: .utf8)!
).compactMap {
String(format: "%02x", $0)
}.joined()
)
self.balance = Float(try container.decode(String.self, forKey: .balance)) ?? -9999.99
}
// Init function, as straight-forward as it gets
init(meteID: Int, displayName: String, displayImageURL: String, balance: Float) {
self.meteID = meteID
self.displayName = displayName
self.displayImageURL = displayImageURL
self.balance = balance
}
}