|
...
|
...
|
@@ -178,6 +178,13 @@ class ApiHrvReportDataSource implements HrvReportDataSource { |
|
|
|
if (_stressLevelFromApiId(item.hrvLevel) case final level?)
|
|
|
|
date: level,
|
|
|
|
};
|
|
|
|
final dailyStressScoresByDate = <DateTime, double>{
|
|
|
|
for (final item
|
|
|
|
in data.dailyDistributionList ?? const <DailyDistributionList>[])
|
|
|
|
if (_parseApiDate(item.date) case final date?)
|
|
|
|
if (item.comprehensiveStressScore case final score?)
|
|
|
|
date: score.toDouble(),
|
|
|
|
};
|
|
|
|
final distributionCounts = _distributionCounts(data.hrvDistributionList);
|
|
|
|
|
|
|
|
return YearlyHrvReport(
|
|
...
|
...
|
@@ -189,6 +196,7 @@ class ApiHrvReportDataSource implements HrvReportDataSource { |
|
|
|
trendsByDate,
|
|
|
|
levelsByDate,
|
|
|
|
preferDailyLevel: true,
|
|
|
|
dailyStressScoresByDate: dailyStressScoresByDate,
|
|
|
|
),
|
|
|
|
],
|
|
|
|
distributionCounts:
|
|
...
|
...
|
@@ -203,6 +211,7 @@ class ApiHrvReportDataSource implements HrvReportDataSource { |
|
|
|
Map<DateTime, HrvTrendList> trendsByDate,
|
|
|
|
Map<DateTime, HrvStressLevel> levelsByDate, {
|
|
|
|
bool preferDailyLevel = false,
|
|
|
|
Map<DateTime, double> dailyStressScoresByDate = const {},
|
|
|
|
}) {
|
|
|
|
final trend = trendsByDate[date];
|
|
|
|
final trendLevel = _stressLevelFromApiId(trend?.state);
|
|
...
|
...
|
@@ -215,6 +224,7 @@ class ApiHrvReportDataSource implements HrvReportDataSource { |
|
|
|
averageHeartRate: trend?.hrAverage?.round(),
|
|
|
|
lastRestingHrValue: trend?.lastRestingHrValue,
|
|
|
|
comprehensiveStressScore: trend?.comprehensiveStressScore?.toDouble(),
|
|
|
|
dailyComprehensiveStressScore: dailyStressScoresByDate[date],
|
|
|
|
trendLevel: trendLevel,
|
|
|
|
level: level,
|
|
|
|
);
|
|
...
|
...
|
@@ -418,6 +428,16 @@ class MockHrvReportDataSource implements HrvReportDataSource { |
|
|
|
if (year == 2025) return YearlyHrvReport.empty(year);
|
|
|
|
|
|
|
|
const monthlyValues = [58.0, 82.0, 64.0, 74.0, 31.0, 45.0, 31.0];
|
|
|
|
const monthlyStressScores = [42.0, 29.0, 48.0, 33.0, 72.0, 86.0, 55.0];
|
|
|
|
const monthlyTrendLevels = [
|
|
|
|
HrvStressLevel.normal,
|
|
|
|
HrvStressLevel.normal,
|
|
|
|
HrvStressLevel.normal,
|
|
|
|
HrvStressLevel.normal,
|
|
|
|
HrvStressLevel.attention,
|
|
|
|
HrvStressLevel.overload,
|
|
|
|
HrvStressLevel.normal,
|
|
|
|
];
|
|
|
|
final days = <HrvDayReport>[];
|
|
|
|
var dataIndex = 0;
|
|
|
|
final levels = <HrvStressLevel>[
|
|
...
|
...
|
@@ -437,10 +457,26 @@ class MockHrvReportDataSource implements HrvReportDataSource { |
|
|
|
averageHrv: hasData ? monthlyValues[month - 1] : null,
|
|
|
|
averageHeartRate: hasData ? 67 : null,
|
|
|
|
level: level,
|
|
|
|
comprehensiveStressScore:
|
|
|
|
day == 1 && month <= monthlyStressScores.length
|
|
|
|
? monthlyStressScores[month - 1]
|
|
|
|
: null,
|
|
|
|
dailyComprehensiveStressScore:
|
|
|
|
hasData ? _mockDailyStressScore(level!) : null,
|
|
|
|
trendLevel: day == 1 && month <= monthlyTrendLevels.length
|
|
|
|
? monthlyTrendLevels[month - 1]
|
|
|
|
: null,
|
|
|
|
),
|
|
|
|
);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return YearlyHrvReport(year: year, days: days, validDayCount: 133);
|
|
|
|
}
|
|
|
|
|
|
|
|
double _mockDailyStressScore(HrvStressLevel level) => switch (level) {
|
|
|
|
HrvStressLevel.excellent => 10,
|
|
|
|
HrvStressLevel.normal => 40,
|
|
|
|
HrvStressLevel.attention => 70,
|
|
|
|
HrvStressLevel.overload => 90,
|
|
|
|
};
|
|
|
|
} |
...
|
...
|
|