Skip to content

Commit

Permalink
feat(fitbit): refactor _findLatestDataEntry function in fitbit_handle…
Browse files Browse the repository at this point in the history
…r.dart
  • Loading branch information
ibrahimozkn committed Jan 24, 2025
1 parent 6a9258c commit 2374eef
Showing 1 changed file with 72 additions and 27 deletions.
99 changes: 72 additions & 27 deletions app/lib/util/fitbit_handler.dart
Original file line number Diff line number Diff line change
Expand Up @@ -314,52 +314,97 @@ class FitbitHandler {
return mapped;
}

static Future<DateTime?> _findLatestDataEntry(
/*static Future<DateTime?> _findLatestDataEntry(
StudySubject subject,
String taskId,
String questionId,
FitbitQuestionType type,
) async {
if (subject.progress.isEmpty) return null;

final latestProgress = subject.progress.lastWhere(
(entry) =>
entry.taskId == taskId && entry.resultType == 'QuestionnaireState',
);
if (subject.progress.isEmpty) {
return null;
}
if (latestProgress.taskId != taskId) return null;
final answers = subject.progress
.where((entry) =>
entry.taskId == taskId && entry.resultType == 'QuestionnaireState')
.map((entry) =>
(entry.result as Result<QuestionnaireState>).result.answers.values)
.expand((answerList) => answerList)
.where((answer) => answer.question == questionId)
.map((answer) => answer.response as List<dynamic>)
.toList();
final questionnaireState =
latestProgress.result as Result<QuestionnaireState>;
if (answers.isEmpty) return null;
final answers = questionnaireState.result.answers.values.where(
(answer) => answer.question == questionId,
);
final fitbitData = answers
.map((raw) => raw.cast<String>())
.map((stringList) => stringList.map(parseLine).toList())
.map((parsedList) => parsedList.map(FitbitData.fromJson).toList())
.toList()
.expand((element) => element)
.toList();
if (answers.isEmpty) return null;
if (fitbitData.isEmpty) return null;
final raw = answers.first.response as List<dynamic>;
final stringList = raw.cast<String>();
final parsedList = stringList.map(parseLine).toList();
final fitbitData = parsedList.map(FitbitData.fromJson).toList();
final filtered = fitbitData
.where(
(data) => data.type.toLowerCase() == type.toReadable().toLowerCase(),
)
final fitbitDataTypedList = fitbitData
.where((data) =>
data.type.toLowerCase() == type.toReadable().toLowerCase())
.toList();
if (filtered.isEmpty) return null;
if (fitbitDataTypedList.isEmpty) return null;
switch (type) {
case FitbitQuestionType.steps:
return filtered.last.dateTime;
return fitbitDataTypedList.last.dateTime;
case FitbitQuestionType.heartrate:
return filtered.last.dateTime;
return fitbitDataTypedList.last.dateTime;
case FitbitQuestionType.sleep:
return (filtered.last as FitbitSleepData).entryDateTime;
return (fitbitDataTypedList.last as FitbitSleepData).entryDateTime;
}
}*/

return null;
//refactored
static Future<DateTime?> _findLatestDataEntry(
StudySubject subject,
String taskId,
String questionId,
FitbitQuestionType type,
) async {
if (subject.progress.isEmpty) return null;

DateTime? latestDate;
final typeLower = type.toReadable().toLowerCase();

for (final entry in subject.progress) {
if (entry.taskId != taskId || entry.resultType != 'QuestionnaireState') {
continue;
}

final questionnaireState =
(entry.result as Result<QuestionnaireState>).result;

for (final answer in questionnaireState.answers.values) {
if (answer.question != questionId) continue;

for (final raw in (answer.response as List<dynamic>).cast<String>()) {
final data = FitbitData.fromJson(parseLine(raw));

if (data.type.toLowerCase() != typeLower) continue;

final DateTime? date = switch (type) {
FitbitQuestionType.sleep => (data as FitbitSleepData).entryDateTime,
_ => data.dateTime,
};

if (date != null &&
(latestDate == null || date.isAfter(latestDate))) {
latestDate = date;
}
}
}
}

return latestDate;
}

static Future<List<FitbitData>> syncFitbitData(
Expand Down

0 comments on commit 2374eef

Please sign in to comment.