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:
richarjiang
2025-08-21 09:51:25 +08:00
parent 19b92547e1
commit 78620f18ee
21 changed files with 2494 additions and 108 deletions

View File

@@ -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> {