101 lines
2.8 KiB
TypeScript
101 lines
2.8 KiB
TypeScript
import { NativeModules, NativeEventEmitter, EmitterSubscription } from 'react-native';
|
|
import { createWaterRecordAction } from '@/store/waterSlice';
|
|
import { store } from '@/store';
|
|
import { WaterRecordSource } from './waterRecords';
|
|
|
|
// Native Module 接口定义
|
|
interface WaterRecordManagerInterface {
|
|
addWaterRecord(amount: number): Promise<{
|
|
success: boolean;
|
|
amount: number;
|
|
newTotal: number;
|
|
}>;
|
|
}
|
|
|
|
// 获取原生模块
|
|
const WaterRecordManager: WaterRecordManagerInterface = NativeModules.WaterRecordManager;
|
|
|
|
// 创建事件发射器
|
|
const waterRecordEventEmitter = NativeModules.WaterRecordManager
|
|
? new NativeEventEmitter(NativeModules.WaterRecordManager)
|
|
: null;
|
|
|
|
// 事件监听器引用
|
|
let eventSubscription: EmitterSubscription | null = null;
|
|
|
|
// 事件数据接口
|
|
interface WaterRecordEventData {
|
|
amount: number;
|
|
recordedAt: string;
|
|
source: string;
|
|
}
|
|
|
|
// 初始化事件监听器
|
|
export function initializeWaterRecordBridge(): void {
|
|
if (!waterRecordEventEmitter) {
|
|
console.warn('WaterRecordManager 原生模块不可用,跳过事件监听器初始化');
|
|
return;
|
|
}
|
|
|
|
if (eventSubscription) {
|
|
// 如果已经初始化,先清理
|
|
eventSubscription.remove();
|
|
}
|
|
|
|
// 监听来自原生模块的事件
|
|
eventSubscription = waterRecordEventEmitter.addListener(
|
|
'WaterRecordAdded',
|
|
(eventData: WaterRecordEventData) => {
|
|
console.log('收到来自 Swift 的喝水记录事件:', eventData);
|
|
|
|
// 通过 Redux 创建喝水记录
|
|
store.dispatch(createWaterRecordAction({
|
|
amount: eventData.amount,
|
|
recordedAt: eventData.recordedAt,
|
|
source: WaterRecordSource.Auto, // 标记为自动添加
|
|
}));
|
|
}
|
|
);
|
|
|
|
console.log('WaterRecordBridge 初始化完成');
|
|
}
|
|
|
|
// 清理事件监听器
|
|
export function cleanupWaterRecordBridge(): void {
|
|
if (eventSubscription) {
|
|
eventSubscription.remove();
|
|
eventSubscription = null;
|
|
}
|
|
}
|
|
|
|
// 供原生代码调用的添加喝水记录方法
|
|
export async function addWaterRecordFromNative(amount: number): Promise<{
|
|
success: boolean;
|
|
amount: number;
|
|
newTotal: number;
|
|
}> {
|
|
try {
|
|
if (!WaterRecordManager) {
|
|
throw new Error('WaterRecordManager 原生模块不可用');
|
|
}
|
|
|
|
const result = await WaterRecordManager.addWaterRecord(amount);
|
|
console.log('通过 Bridge 添加喝水记录成功:', result);
|
|
return result;
|
|
} catch (error) {
|
|
console.error('通过 Bridge 添加喝水记录失败:', error);
|
|
throw error;
|
|
}
|
|
}
|
|
|
|
// 检查原生模块是否可用
|
|
export function isWaterRecordBridgeAvailable(): boolean {
|
|
return WaterRecordManager && typeof WaterRecordManager.addWaterRecord === 'function';
|
|
}
|
|
|
|
export default {
|
|
initializeWaterRecordBridge,
|
|
cleanupWaterRecordBridge,
|
|
addWaterRecordFromNative,
|
|
isWaterRecordBridgeAvailable,
|
|
}; |