81 lines
2.5 KiB
Swift
81 lines
2.5 KiB
Swift
//
|
||
// WaterRecordManager.swift
|
||
// digitalpilates
|
||
//
|
||
// Native module for managing water records through React Native bridge
|
||
//
|
||
|
||
import Foundation
|
||
import React
|
||
import WidgetKit
|
||
|
||
@objc(WaterRecordManager)
|
||
class WaterRecordManager: NSObject, RCTBridgeModule {
|
||
|
||
static func moduleName() -> String! {
|
||
return "WaterRecordManager"
|
||
}
|
||
|
||
static func requiresMainQueueSetup() -> Bool {
|
||
return false
|
||
}
|
||
|
||
@objc
|
||
func addWaterRecord(_ amount: Int, resolver: @escaping RCTPromiseResolveBlock, rejecter: @escaping RCTPromiseRejectBlock) {
|
||
|
||
// 更新 App Group UserDefaults(用于 Widget 显示)
|
||
guard let sharedDefaults = UserDefaults(suiteName: "group.com.anonymous.digitalpilates") else {
|
||
rejecter("USERDEFAULTS_ERROR", "Failed to access App Group UserDefaults", nil)
|
||
return
|
||
}
|
||
|
||
let currentIntake = sharedDefaults.object(forKey: "widget_current_water_intake") as? Int ?? 0
|
||
let newIntake = currentIntake + amount
|
||
sharedDefaults.set(newIntake, forKey: "widget_current_water_intake")
|
||
|
||
// 创建 ISO8601 格式的日期字符串
|
||
let formatter = ISO8601DateFormatter()
|
||
let isoString = formatter.string(from: Date())
|
||
sharedDefaults.set(isoString, forKey: "widget_last_sync_time")
|
||
sharedDefaults.synchronize()
|
||
|
||
print("Water record added via bridge: +\(amount)ml, New total: \(newIntake)ml")
|
||
|
||
// 通过 React Native bridge 调用 TypeScript 代码来创建记录
|
||
DispatchQueue.main.async { [weak self] in
|
||
guard let bridge = self?.bridge else {
|
||
rejecter("BRIDGE_ERROR", "React Native bridge is not available", nil)
|
||
return
|
||
}
|
||
|
||
// 调用 TypeScript 中的 Redux action 来创建喝水记录
|
||
let eventData = [
|
||
"amount": amount,
|
||
"recordedAt": isoString,
|
||
"source": "auto" // 标记为来自 Widget/自动添加
|
||
]
|
||
|
||
// 发送事件给 TypeScript 代码
|
||
self?.sendEvent(withName: "WaterRecordAdded", body: eventData)
|
||
|
||
// 刷新 Widget
|
||
if #available(iOS 14.0, *) {
|
||
WidgetCenter.shared.reloadTimelines(ofKind: "WaterWidget")
|
||
}
|
||
|
||
resolver(["success": true, "amount": amount, "newTotal": newIntake])
|
||
}
|
||
}
|
||
|
||
// MARK: - Event Emitter
|
||
|
||
override func supportedEvents() -> [String]! {
|
||
return ["WaterRecordAdded"]
|
||
}
|
||
|
||
private func sendEvent(withName name: String, body: Any) {
|
||
if let bridge = self.bridge {
|
||
bridge.eventDispatcher().sendAppEvent(withName: name, body: body)
|
||
}
|
||
}
|
||
} |