Files
digital-pilates/hooks/useQuickActions.ts

77 lines
2.3 KiB
TypeScript

import { useWaterData } from '@/hooks/useWaterData';
import { getInitialQuickAction } from '@/services/quickActions';
import { Toast } from '@/utils/toast.utils';
import * as Haptics from 'expo-haptics';
import * as QuickActions from 'expo-quick-actions';
import { useCallback, useEffect, useRef } from 'react';
export const useQuickActions = () => {
const { addWaterRecord } = useWaterData();
const subscriptionRef = useRef<any>(null);
// 处理快捷动作
const handleQuickAction = useCallback(async (action: any) => {
console.log('处理快捷动作:', action);
// 触发震动反馈
if (process.env.EXPO_OS === 'ios') {
Haptics.impactAsync(Haptics.ImpactFeedbackStyle.Medium);
}
// 检查是否是饮水快捷动作
if (action.id?.startsWith('drink_water')) {
const amount = action.params?.amount || 250; // 默认250ml
try {
// 添加饮水记录
const success = await addWaterRecord(amount);
if (success) {
Toast.success(`已记录饮水 ${amount}ml`);
} else {
Toast.error('添加饮水记录失败,请稍后重试');
}
} catch (error) {
console.error('快捷饮水失败:', error);
Toast.error('添加饮水记录失败,请稍后重试');
}
}
}, [addWaterRecord]);
// 设置快捷动作监听器
useEffect(() => {
const setupListener = () => {
try {
// 先处理初始快捷动作(如果应用是通过快捷动作启动的)
const initialAction = getInitialQuickAction();
if (initialAction) {
console.log('检测到初始快捷动作:', initialAction);
handleQuickAction(initialAction);
}
// 设置监听器处理后续的快捷动作
subscriptionRef.current = QuickActions.addListener(async (action) => {
await handleQuickAction(action);
});
console.log('快捷动作监听器已设置');
} catch (error) {
console.error('设置快捷动作监听器失败:', error);
}
};
setupListener();
// 清理函数
return () => {
if (subscriptionRef.current) {
subscriptionRef.current.remove();
console.log('快捷动作监听器已清理');
}
};
}, [handleQuickAction]);
return {
handleQuickAction,
};
};