feat: 添加最大心率功能,更新用户资料编辑页面以显示最大心率数据,优化相关组件和服务

This commit is contained in:
2025-09-05 21:58:46 +08:00
parent aee291bb69
commit 3c416545db
6 changed files with 100 additions and 71 deletions

View File

@@ -183,12 +183,6 @@ async function fetchStepCount(date: Date): Promise<number> {
});
}
// 获取指定日期每小时步数数据 (已弃用,使用 fetchHourlyStepSamples 替代)
// 保留此函数以防后向兼容需求
async function fetchHourlyStepCount(date: Date): Promise<HourlyStepData[]> {
// 直接调用更准确的样本数据获取函数
return fetchHourlyStepSamples(date);
}
// 使用样本数据获取每小时步数
async function fetchHourlyStepSamples(date: Date): Promise<HourlyStepData[]> {
@@ -483,7 +477,7 @@ async function fetchActivitySummary(options: HealthDataOptions): Promise<HealthA
return new Promise((resolve) => {
AppleHealthKit.getActivitySummary(
options,
(err: Object, results: HealthActivitySummary[]) => {
(err: string, results: HealthActivitySummary[]) => {
if (err) {
logError('ActivitySummary', err);
return resolve(null);
@@ -537,6 +531,44 @@ async function fetchHeartRate(options: HealthDataOptions): Promise<number | null
});
}
// 获取指定时间范围内的最大心率
export async function fetchMaximumHeartRate(options: HealthDataOptions): Promise<number | null> {
return new Promise((resolve) => {
AppleHealthKit.getHeartRateSamples(options, (err, res) => {
if (err) {
logError('最大心率', err);
return resolve(null);
}
if (!res || !Array.isArray(res) || res.length === 0) {
logWarning('最大心率', '为空或格式错误');
return resolve(null);
}
// 从所有心率样本中找出最大值
let maxHeartRate = 0;
let validSamplesCount = 0;
res.forEach((sample: any) => {
if (sample && sample.value !== undefined) {
const heartRate = validateHeartRate(sample.value);
if (heartRate !== null) {
maxHeartRate = Math.max(maxHeartRate, heartRate);
validSamplesCount++;
}
}
});
if (validSamplesCount > 0 && maxHeartRate > 0) {
logSuccess('最大心率', { maxHeartRate, validSamplesCount });
resolve(maxHeartRate);
} else {
logWarning('最大心率', '没有找到有效的样本数据');
resolve(null);
}
});
});
}
// 默认健康数据
function getDefaultHealthData(): TodayHealthData {
return {
@@ -721,7 +753,7 @@ export async function saveWaterIntakeToHealthKit(amount: number, recordedAt?: st
endDate: recordedAt ? new Date(recordedAt).toISOString() : new Date().toISOString(),
};
AppleHealthKit.saveWater(waterOptions, (error: Object, result) => {
AppleHealthKit.saveWater(waterOptions, (error: string, result) => {
if (error) {
console.error('添加饮水记录到 HealthKit 失败:', error);
resolve(false);
@@ -742,7 +774,7 @@ export async function saveWaterIntakeToHealthKit(amount: number, recordedAt?: st
// 获取 HealthKit 中的饮水记录
export async function getWaterIntakeFromHealthKit(options: HealthDataOptions): Promise<any[]> {
return new Promise((resolve) => {
AppleHealthKit.getWaterSamples(options, (error: Object, results: any[]) => {
AppleHealthKit.getWaterSamples(options, (error: string, results: any[]) => {
if (error) {
console.error('获取 HealthKit 饮水记录失败:', error);
resolve([]);
@@ -850,3 +882,4 @@ export async function fetchActivityRingsForDate(date: Date): Promise<ActivityRin
return null;
}
}