feat: 添加最大心率功能,更新用户资料编辑页面以显示最大心率数据,优化相关组件和服务
This commit is contained in:
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user