setStreakInvalid method
- String userEmail
Sets the user's streak to inactive if they failed to meet the exercise requirement (less than 5 minutes) yesterday.
Implementation
Future<void> setStreakInvalid(String userEmail) async {
final yesterday = DateTime.now().subtract(const Duration(days: 1));
final todayStart = DateTime.now().subtract(Duration(
hours: DateTime.now().hour,
minutes: DateTime.now().minute,
seconds: DateTime.now().second,
milliseconds: DateTime.now().millisecond,
microseconds: DateTime.now().microsecond,
));
if (await getDoneExercisesInSeconds(userEmail, day: yesterday) < 300) {
final userRef = await _getUserDocRef(userEmail);
final streaks = await userRef
.collection('streaks')
.where('isActive', isEqualTo: true)
.limit(1)
.get();
if (streaks.docs.isNotEmpty) {
final docRef = streaks.docs.first;
final startedAt = (docRef['startedAt'] as Timestamp).toDate();
final exercises = await userRef
.collection('exerciseLogs')
.orderBy('startTime', descending: true)
.get();
DateTime failedAtTime = todayStart;
if (exercises.docs.isNotEmpty) {
final exerciseDoc = exercises.docs.first;
final exerciseTime = (exerciseDoc['startTime'] as Timestamp).toDate();
failedAtTime = DateTime(exerciseTime.year, exerciseTime.month,
exerciseTime.day, 23, 59, 59);
}
if (startedAt.isBefore(todayStart)) {
await docRef.reference.update({
'isActive': false,
'failedAt': Timestamp.fromDate(failedAtTime),
});
}
}
}
}