-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathWatchConnectivityManager.swift
More file actions
116 lines (99 loc) · 3.79 KB
/
WatchConnectivityManager.swift
File metadata and controls
116 lines (99 loc) · 3.79 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
//
// WatchConnectivityManager.swift
// zaCalc2
//
// Created by sholl on 9/30/25.
//
import Foundation
import Combine
import WatchConnectivity
class WatchConnectivityManager: NSObject, ObservableObject {
static let shared = WatchConnectivityManager()
private override init() {
super.init()
if WCSession.isSupported() {
let session = WCSession.default
session.delegate = self
session.activate()
}
}
func sendCalculatorData(_ data: CalculatorData) {
guard WCSession.default.isReachable else {
// Try transferUserInfo for background delivery
transferCalculatorData(data)
return
}
let message = createDataDictionary(from: data)
WCSession.default.sendMessage(message, replyHandler: { _ in
// Message sent successfully
}) { _ in
// Fallback to transferUserInfo
self.transferCalculatorData(data)
}
}
private func transferCalculatorData(_ data: CalculatorData) {
guard WCSession.default.activationState == .activated else { return }
let userInfo = createDataDictionary(from: data)
WCSession.default.transferUserInfo(userInfo)
}
private func createDataDictionary(from data: CalculatorData) -> [String: Any] {
var dict: [String: Any] = [
"quantity": data.quantity,
"diameter": data.diameter,
"thickness": data.thickness,
"hydration": data.hydration,
"prefermentAmount": data.prefermentAmount,
"prefermentHydration": data.prefermentHydration,
"salt": data.salt,
"oil": data.oil,
"sugar": data.sugar,
"waste": data.waste,
"useCentimeters": data.useCentimeters,
"useOunces": data.useOunces,
"useCelsius": data.useCelsius,
"yeastType": data.yeastType.rawValue,
"pizzaStyle": data.pizzaStyle.rawValue,
"bakersYeastPercentage": data.bakersYeastPercentage,
"bakersYeastType": data.bakersYeastType.rawValue,
"bakersYeastAmountInput": data.bakersYeastAmountInput,
"toppingsSize": data.toppingsSize,
// Calculated results
"totalDoughWeight": data.totalDoughWeight,
"ballWeight": data.ballWeight,
"totalFlour": data.totalFlour,
"prefermentFlour": data.prefermentFlour,
"totalPreferment": data.totalPreferment,
"water": data.water,
"saltAmount": data.saltAmount,
"oilAmount": data.oilAmount,
"sugarAmount": data.sugarAmount,
"bakersYeastAmount": data.bakersYeastAmount
]
// Include custom pizza styles if selected
if let selectedId = data.selectedCustomStyleId,
let selectedStyle = data.customPizzaStyles.first(where: { $0.id == selectedId }) {
// Encode the custom style
if let styleData = try? JSONEncoder().encode(selectedStyle),
let styleDict = try? JSONSerialization.jsonObject(with: styleData) as? [String: Any] {
dict["selectedCustomStyle"] = styleDict
}
}
return dict
}
}
extension WatchConnectivityManager: WCSessionDelegate {
func session(_ session: WCSession, activationDidCompleteWith activationState: WCSessionActivationState, error: Error?) {
// Session activation completed
}
#if os(iOS)
func sessionDidBecomeInactive(_ session: WCSession) {
// Session became inactive
}
func sessionDidDeactivate(_ session: WCSession) {
session.activate()
}
#endif
func session(_ session: WCSession, didReceiveMessage message: [String : Any]) {
// Handle messages from watch if needed
}
}