Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
486b8cff2e | ||
|
|
d40bcaeca0 |
|
Before Width: | Height: | Size: 4.5 KiB After Width: | Height: | Size: 11 KiB |
|
Before Width: | Height: | Size: 4.5 KiB After Width: | Height: | Size: 11 KiB |
|
Before Width: | Height: | Size: 4.9 KiB After Width: | Height: | Size: 12 KiB |
|
Before Width: | Height: | Size: 3.5 KiB After Width: | Height: | Size: 7.9 KiB |
|
Before Width: | Height: | Size: 3.9 KiB After Width: | Height: | Size: 9.1 KiB |
|
Before Width: | Height: | Size: 4.0 KiB After Width: | Height: | Size: 9.6 KiB |
|
Before Width: | Height: | Size: 2.5 KiB After Width: | Height: | Size: 5.3 KiB |
|
Before Width: | Height: | Size: 2.5 KiB After Width: | Height: | Size: 9.0 KiB |
|
Before Width: | Height: | Size: 2.2 KiB After Width: | Height: | Size: 4.2 KiB |
|
Before Width: | Height: | Size: 2.3 KiB After Width: | Height: | Size: 5.0 KiB |
|
Before Width: | Height: | Size: 2.9 KiB After Width: | Height: | Size: 6.3 KiB |
|
Before Width: | Height: | Size: 8.8 KiB After Width: | Height: | Size: 25 KiB |
|
Before Width: | Height: | Size: 10 KiB After Width: | Height: | Size: 30 KiB |
|
Before Width: | Height: | Size: 12 KiB After Width: | Height: | Size: 35 KiB |
|
Before Width: | Height: | Size: 14 KiB After Width: | Height: | Size: 42 KiB |
|
Before Width: | Height: | Size: 15 KiB After Width: | Height: | Size: 46 KiB |
@@ -90,14 +90,20 @@ final class WatchSyncManager: NSObject, WCSessionDelegate {
|
|||||||
}
|
}
|
||||||
|
|
||||||
nonisolated func session(_ session: WCSession, didReceiveUserInfo userInfo: [String : Any] = [:]) {
|
nonisolated func session(_ session: WCSession, didReceiveUserInfo userInfo: [String : Any] = [:]) {
|
||||||
handleIncomingRefreshRequest(userInfo)
|
handleIncomingMessage(userInfo)
|
||||||
}
|
}
|
||||||
|
|
||||||
nonisolated func session(_ session: WCSession, didReceiveMessage message: [String : Any]) {
|
nonisolated func session(_ session: WCSession, didReceiveMessage message: [String : Any]) {
|
||||||
handleIncomingRefreshRequest(message)
|
handleIncomingMessage(message)
|
||||||
|
}
|
||||||
|
|
||||||
|
private nonisolated func handleIncomingMessage(_ payload: [String: Any]) {
|
||||||
|
if payload["fuelboard.snapshotRequest"] as? String != nil {
|
||||||
|
Task { @MainActor in
|
||||||
|
self.pushSnapshot()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private nonisolated func handleIncomingRefreshRequest(_ payload: [String: Any]) {
|
|
||||||
guard let raw = payload[FuelStore.watchRefreshRequestKey] as? String,
|
guard let raw = payload[FuelStore.watchRefreshRequestKey] as? String,
|
||||||
let timestamp = TimeInterval(raw) else { return }
|
let timestamp = TimeInterval(raw) else { return }
|
||||||
let date = Date(timeIntervalSince1970: timestamp)
|
let date = Date(timeIntervalSince1970: timestamp)
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 4.5 KiB After Width: | Height: | Size: 11 KiB |
|
Before Width: | Height: | Size: 4.5 KiB After Width: | Height: | Size: 11 KiB |
|
Before Width: | Height: | Size: 4.9 KiB After Width: | Height: | Size: 12 KiB |
|
Before Width: | Height: | Size: 3.5 KiB After Width: | Height: | Size: 7.9 KiB |
|
Before Width: | Height: | Size: 3.9 KiB After Width: | Height: | Size: 9.1 KiB |
|
Before Width: | Height: | Size: 4.0 KiB After Width: | Height: | Size: 9.6 KiB |
|
Before Width: | Height: | Size: 2.5 KiB After Width: | Height: | Size: 5.3 KiB |
|
Before Width: | Height: | Size: 2.5 KiB After Width: | Height: | Size: 9.0 KiB |
|
Before Width: | Height: | Size: 4.5 KiB After Width: | Height: | Size: 11 KiB |
|
Before Width: | Height: | Size: 3.9 KiB After Width: | Height: | Size: 9.1 KiB |
|
Before Width: | Height: | Size: 2.2 KiB After Width: | Height: | Size: 4.2 KiB |
|
Before Width: | Height: | Size: 2.3 KiB After Width: | Height: | Size: 5.0 KiB |
|
Before Width: | Height: | Size: 2.9 KiB After Width: | Height: | Size: 6.3 KiB |
|
Before Width: | Height: | Size: 8.8 KiB After Width: | Height: | Size: 25 KiB |
|
Before Width: | Height: | Size: 10 KiB After Width: | Height: | Size: 30 KiB |
|
Before Width: | Height: | Size: 12 KiB After Width: | Height: | Size: 35 KiB |
|
Before Width: | Height: | Size: 14 KiB After Width: | Height: | Size: 42 KiB |
|
Before Width: | Height: | Size: 15 KiB After Width: | Height: | Size: 46 KiB |
@@ -26,19 +26,13 @@ private enum WatchFuelType: String, CaseIterable, Identifiable, Codable {
|
|||||||
|
|
||||||
var color: Color {
|
var color: Color {
|
||||||
switch self {
|
switch self {
|
||||||
case .e10: return .green
|
case .e10: return Color(red: 48/255.0, green: 209/255.0, blue: 88/255.0) // #30D158
|
||||||
case .e5: return .yellow
|
case .e5: return Color(red: 255/255.0, green: 214/255.0, blue: 10/255.0) // #FFD60A
|
||||||
case .diesel: return .blue
|
case .diesel: return Color(red: 100/255.0, green: 210/255.0, blue: 255/255.0) // #64D2FF
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
var symbol: String {
|
var symbol: String { "fuelpump.fill" }
|
||||||
switch self {
|
|
||||||
case .e10: return "fuelpump.fill"
|
|
||||||
case .e5: return "fuelpump.circle.fill"
|
|
||||||
case .diesel: return "drop.fill"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
var sortRank: Int {
|
var sortRank: Int {
|
||||||
switch self {
|
switch self {
|
||||||
@@ -297,7 +291,10 @@ struct ContentView: View {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
.tabViewStyle(.verticalPage)
|
.tabViewStyle(.verticalPage)
|
||||||
.onAppear(perform: reloadFromCache)
|
.onAppear {
|
||||||
|
reloadFromCache()
|
||||||
|
WatchSyncManager.shared.requestSnapshot()
|
||||||
|
}
|
||||||
.onReceive(NotificationCenter.default.publisher(for: .fuelBoardWatchDataDidUpdate)) { _ in
|
.onReceive(NotificationCenter.default.publisher(for: .fuelBoardWatchDataDidUpdate)) { _ in
|
||||||
reloadFromCache()
|
reloadFromCache()
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -9,6 +9,7 @@ final class WatchSyncManager: NSObject, WCSessionDelegate {
|
|||||||
static let shared = WatchSyncManager()
|
static let shared = WatchSyncManager()
|
||||||
|
|
||||||
private let suiteName = "group.com.apt.fuelboard"
|
private let suiteName = "group.com.apt.fuelboard"
|
||||||
|
private let snapshotRequestKey = "fuelboard.snapshotRequest"
|
||||||
|
|
||||||
private override init() {
|
private override init() {
|
||||||
super.init()
|
super.init()
|
||||||
@@ -36,6 +37,18 @@ final class WatchSyncManager: NSObject, WCSessionDelegate {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func requestSnapshot() {
|
||||||
|
guard WCSession.isSupported() else { return }
|
||||||
|
let payload = [snapshotRequestKey: String(Date().timeIntervalSince1970)]
|
||||||
|
let session = WCSession.default
|
||||||
|
|
||||||
|
if session.isReachable {
|
||||||
|
session.sendMessage(payload, replyHandler: nil, errorHandler: nil)
|
||||||
|
} else {
|
||||||
|
session.transferUserInfo(payload)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private func sharedDefaults() -> UserDefaults? {
|
private func sharedDefaults() -> UserDefaults? {
|
||||||
UserDefaults(suiteName: suiteName)
|
UserDefaults(suiteName: suiteName)
|
||||||
}
|
}
|
||||||
@@ -74,6 +87,10 @@ final class WatchSyncManager: NSObject, WCSessionDelegate {
|
|||||||
func session(_ session: WCSession, activationDidCompleteWith activationState: WCSessionActivationState, error: (any Error)?) {
|
func session(_ session: WCSession, activationDidCompleteWith activationState: WCSessionActivationState, error: (any Error)?) {
|
||||||
if let error {
|
if let error {
|
||||||
print("WATCH-SYNC activation failed: \(error.localizedDescription)")
|
print("WATCH-SYNC activation failed: \(error.localizedDescription)")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if activationState == .activated {
|
||||||
|
requestSnapshot()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 4.5 KiB After Width: | Height: | Size: 11 KiB |
|
Before Width: | Height: | Size: 4.5 KiB After Width: | Height: | Size: 11 KiB |
|
Before Width: | Height: | Size: 4.9 KiB After Width: | Height: | Size: 12 KiB |
|
Before Width: | Height: | Size: 3.5 KiB After Width: | Height: | Size: 7.9 KiB |
|
Before Width: | Height: | Size: 3.9 KiB After Width: | Height: | Size: 9.1 KiB |
|
Before Width: | Height: | Size: 4.0 KiB After Width: | Height: | Size: 9.6 KiB |
|
Before Width: | Height: | Size: 2.5 KiB After Width: | Height: | Size: 5.3 KiB |
|
Before Width: | Height: | Size: 2.5 KiB After Width: | Height: | Size: 9.0 KiB |
|
Before Width: | Height: | Size: 2.2 KiB After Width: | Height: | Size: 4.2 KiB |
|
Before Width: | Height: | Size: 2.3 KiB After Width: | Height: | Size: 5.0 KiB |
|
Before Width: | Height: | Size: 2.9 KiB After Width: | Height: | Size: 6.3 KiB |
|
Before Width: | Height: | Size: 8.8 KiB After Width: | Height: | Size: 25 KiB |
|
Before Width: | Height: | Size: 10 KiB After Width: | Height: | Size: 30 KiB |
|
Before Width: | Height: | Size: 12 KiB After Width: | Height: | Size: 35 KiB |
|
Before Width: | Height: | Size: 14 KiB After Width: | Height: | Size: 42 KiB |
|
Before Width: | Height: | Size: 15 KiB After Width: | Height: | Size: 46 KiB |