feat: 移除目标管理演示页面并优化相关组件

- 删除目标管理演示页面的代码,简化项目结构
- 更新底部导航,移除目标管理演示页面的路由
- 调整相关组件的样式和逻辑,确保界面一致性
- 优化颜色常量的使用,提升视觉效果
This commit is contained in:
2025-08-22 21:24:31 +08:00
parent 9e719a9eda
commit c12329bc96
16 changed files with 1130 additions and 759 deletions

View File

@@ -11,6 +11,8 @@ const PERMISSIONS: HealthKitPermissions = {
AppleHealthKit.Constants.Permissions.SleepAnalysis,
AppleHealthKit.Constants.Permissions.HeartRateVariability,
AppleHealthKit.Constants.Permissions.ActivitySummary,
AppleHealthKit.Constants.Permissions.OxygenSaturation,
AppleHealthKit.Constants.Permissions.HeartRate,
],
write: [
// 支持体重写入
@@ -32,6 +34,9 @@ export type TodayHealthData = {
exerciseMinutesGoal: number;
standHours: number;
standHoursGoal: number;
// 新增血氧饱和度和心率数据
oxygenSaturation: number | null;
heartRate: number | null;
};
export async function ensureHealthPermissions(): Promise<boolean> {
@@ -74,8 +79,8 @@ export async function fetchHealthDataForDate(date: Date): Promise<TodayHealthDat
console.log('查询选项:', options);
// 并行获取所有健康数据包括ActivitySummary
const [steps, calories, basalMetabolism, sleepDuration, hrv, activitySummary] = await Promise.all([
// 并行获取所有健康数据包括ActivitySummary、血氧饱和度和心率
const [steps, calories, basalMetabolism, sleepDuration, hrv, activitySummary, oxygenSaturation, heartRate] = await Promise.all([
// 获取步数
new Promise<number>((resolve) => {
AppleHealthKit.getStepCount({
@@ -198,10 +203,68 @@ export async function fetchHealthDataForDate(date: Date): Promise<TodayHealthDat
resolve(results[0]);
},
);
}),
// 获取血氧饱和度数据
new Promise<number | null>((resolve) => {
AppleHealthKit.getOxygenSaturationSamples(options, (err, res) => {
if (err) {
console.error('获取血氧饱和度失败:', err);
return resolve(null);
}
if (!res || !Array.isArray(res) || res.length === 0) {
console.warn('血氧饱和度数据为空或格式错误');
return resolve(null);
}
console.log('血氧饱和度数据:', res);
// 获取最新的血氧饱和度值
const latestOxygen = res[res.length - 1];
if (latestOxygen && latestOxygen.value !== undefined && latestOxygen.value !== null) {
// 血氧饱和度通常在0-100之间验证数据有效性
const value = Number(latestOxygen.value);
if (value >= 0 && value <= 100) {
resolve(Number(value.toFixed(1)));
} else {
console.warn('血氧饱和度数据异常:', value);
resolve(null);
}
} else {
resolve(null);
}
});
}),
// 获取心率数据
new Promise<number | null>((resolve) => {
AppleHealthKit.getHeartRateSamples(options, (err, res) => {
if (err) {
console.error('获取心率失败:', err);
return resolve(null);
}
if (!res || !Array.isArray(res) || res.length === 0) {
console.warn('心率数据为空或格式错误');
return resolve(null);
}
console.log('心率数据:', res);
// 获取最新的心率值
const latestHeartRate = res[res.length - 1];
if (latestHeartRate && latestHeartRate.value !== undefined && latestHeartRate.value !== null) {
// 心率通常在30-200之间验证数据有效性
const value = Number(latestHeartRate.value);
if (value >= 30 && value <= 200) {
resolve(Math.round(value));
} else {
console.warn('心率数据异常:', value);
resolve(null);
}
} else {
resolve(null);
}
});
})
]);
console.log('指定日期健康数据获取完成:', { steps, calories, basalMetabolism, sleepDuration, hrv, activitySummary });
console.log('指定日期健康数据获取完成:', { steps, calories, basalMetabolism, sleepDuration, hrv, activitySummary, oxygenSaturation, heartRate });
return {
steps,
@@ -215,7 +278,10 @@ export async function fetchHealthDataForDate(date: Date): Promise<TodayHealthDat
exerciseMinutes: activitySummary?.appleExerciseTime || 0,
exerciseMinutesGoal: activitySummary?.appleExerciseTimeGoal || 30,
standHours: activitySummary?.appleStandHours || 0,
standHoursGoal: activitySummary?.appleStandHoursGoal || 12
standHoursGoal: activitySummary?.appleStandHoursGoal || 12,
// 血氧饱和度和心率数据
oxygenSaturation,
heartRate
};
}