feat: 更新依赖项并优化组件结构
- 在 package.json 和 package-lock.json 中新增 @sentry/react-native、react-native-device-info 和 react-native-purchases 依赖 - 更新统计页面,替换 CircularRing 组件为 FitnessRingsCard,增强健身数据展示 - 在布局文件中引入 ToastProvider,优化用户通知体验 - 新增 SuccessToast 组件,提供全局成功提示功能 - 更新健康数据获取逻辑,支持健身圆环数据的提取 - 优化多个组件的样式和交互,提升用户体验
This commit is contained in:
@@ -1,5 +1,5 @@
|
||||
import dayjs from 'dayjs';
|
||||
import type { HealthKitPermissions } from 'react-native-health';
|
||||
import type { HealthActivitySummary, HealthKitPermissions } from 'react-native-health';
|
||||
import AppleHealthKit from 'react-native-health';
|
||||
|
||||
const PERMISSIONS: HealthKitPermissions = {
|
||||
@@ -9,6 +9,7 @@ const PERMISSIONS: HealthKitPermissions = {
|
||||
AppleHealthKit.Constants.Permissions.ActiveEnergyBurned,
|
||||
AppleHealthKit.Constants.Permissions.SleepAnalysis,
|
||||
AppleHealthKit.Constants.Permissions.HeartRateVariability,
|
||||
AppleHealthKit.Constants.Permissions.ActivitySummary,
|
||||
],
|
||||
write: [
|
||||
// 支持体重写入
|
||||
@@ -22,6 +23,13 @@ export type TodayHealthData = {
|
||||
activeEnergyBurned: number; // kilocalories
|
||||
sleepDuration: number; // 睡眠时长(分钟)
|
||||
hrv: number | null; // 心率变异性 (ms)
|
||||
// 健身圆环数据
|
||||
activeCalories: number;
|
||||
activeCaloriesGoal: number;
|
||||
exerciseMinutes: number;
|
||||
exerciseMinutesGoal: number;
|
||||
standHours: number;
|
||||
standHoursGoal: number;
|
||||
};
|
||||
|
||||
export async function ensureHealthPermissions(): Promise<boolean> {
|
||||
@@ -57,13 +65,20 @@ export async function fetchHealthDataForDate(date: Date): Promise<TodayHealthDat
|
||||
endDate: end.toISOString()
|
||||
} as any;
|
||||
|
||||
const activitySummaryOptions = {
|
||||
startDate: start.toISOString(),
|
||||
endDate: end.toISOString()
|
||||
};
|
||||
|
||||
console.log('查询选项:', options);
|
||||
|
||||
// 并行获取所有健康数据
|
||||
const [steps, calories, sleepDuration, hrv] = await Promise.all([
|
||||
// 并行获取所有健康数据,包括ActivitySummary
|
||||
const [steps, calories, sleepDuration, hrv, activitySummary] = await Promise.all([
|
||||
// 获取步数
|
||||
new Promise<number>((resolve) => {
|
||||
AppleHealthKit.getStepCount(options, (err, res) => {
|
||||
AppleHealthKit.getStepCount({
|
||||
date: dayjs(date).toISOString()
|
||||
}, (err, res) => {
|
||||
if (err) {
|
||||
console.error('获取步数失败:', err);
|
||||
return resolve(0);
|
||||
@@ -144,11 +159,43 @@ export async function fetchHealthDataForDate(date: Date): Promise<TodayHealthDat
|
||||
resolve(null);
|
||||
}
|
||||
});
|
||||
}),
|
||||
|
||||
// 获取ActivitySummary数据(健身圆环数据)
|
||||
new Promise<HealthActivitySummary | null>((resolve) => {
|
||||
AppleHealthKit.getActivitySummary(
|
||||
activitySummaryOptions,
|
||||
(err: Object, results: HealthActivitySummary[]) => {
|
||||
if (err) {
|
||||
console.error('获取ActivitySummary失败:', err);
|
||||
return resolve(null);
|
||||
}
|
||||
if (!results || results.length === 0) {
|
||||
console.warn('ActivitySummary数据为空');
|
||||
return resolve(null);
|
||||
}
|
||||
console.log('ActivitySummary数据:', results[0]);
|
||||
resolve(results[0]);
|
||||
},
|
||||
);
|
||||
})
|
||||
]);
|
||||
|
||||
console.log('指定日期健康数据获取完成:', { steps, calories, sleepDuration, hrv });
|
||||
return { steps, activeEnergyBurned: calories, sleepDuration, hrv };
|
||||
console.log('指定日期健康数据获取完成:', { steps, calories, sleepDuration, hrv, activitySummary });
|
||||
|
||||
return {
|
||||
steps,
|
||||
activeEnergyBurned: calories,
|
||||
sleepDuration,
|
||||
hrv,
|
||||
// 健身圆环数据
|
||||
activeCalories: activitySummary?.activeEnergyBurned || 0,
|
||||
activeCaloriesGoal: activitySummary?.activeEnergyBurnedGoal || 350,
|
||||
exerciseMinutes: activitySummary?.appleExerciseTime || 0,
|
||||
exerciseMinutesGoal: activitySummary?.appleExerciseTimeGoal || 30,
|
||||
standHours: activitySummary?.appleStandHours || 0,
|
||||
standHoursGoal: activitySummary?.appleStandHoursGoal || 12
|
||||
};
|
||||
}
|
||||
|
||||
export async function fetchTodayHealthData(): Promise<TodayHealthData> {
|
||||
|
||||
Reference in New Issue
Block a user