import 'package:aitrainer_app/model/cache.dart'; import 'package:aitrainer_app/model/exercise.dart'; import 'package:aitrainer_app/model/exercise_type.dart'; import 'package:aitrainer_app/model/training_plan.dart'; import 'package:aitrainer_app/model/training_result.dart'; import 'package:aitrainer_app/repository/exercise_repository.dart'; import 'package:aitrainer_app/repository/training_plan_repository.dart'; import 'package:aitrainer_app/util/app_language.dart'; import 'package:aitrainer_app/util/enums.dart'; import 'package:aitrainer_app/util/track.dart'; import 'package:bloc/bloc.dart'; import 'package:equatable/equatable.dart'; import 'package:flutter/material.dart'; import 'package:syncfusion_flutter_calendar/calendar.dart'; part 'training_log_event.dart'; part 'training_log_state.dart'; class TrainingLogBloc extends Bloc { final ExerciseRepository exerciseRepository = ExerciseRepository(); TrainingLogBloc() : super(TrainingLogInitial()) { on(_onLoad); on(_onDelete); on(_onResult); on(_onSearch); } final List _results = []; get results => this._results; bool search = false; int exerciseTypeIdSearched = 0; @override Future close() { return super.close(); } void _onLoad(TrainingLogLoad event, Emitter emit) async { emit(TrainingLogLoading()); await Cache().setActivityDonePrefs(ActivityDone.isExerciseLogSeen); _results.clear(); _results.addAll(getTrainingResults()); Track().track(TrackingEvent.exercise_log_open); emit(TrainingLogReady()); } void _onDelete(TrainingLogDelete event, Emitter emit) async { emit(TrainingLogLoading()); exerciseRepository.exerciseList!.remove(event.exercise); await exerciseRepository.deleteExercise(event.exercise); if (Cache().getExercises() != null) { Cache().getExercises()!.remove(event.exercise); } _results.clear(); _results.addAll(getTrainingResults()); Track().track(TrackingEvent.exercise_log_delete); emit(TrainingLogReady()); } void _onSearch(TrainingLogSearch event, Emitter emit) async { emit(TrainingLogLoading()); exerciseTypeIdSearched = event.exerciseTypeId; search = true; _results.clear(); _results.addAll(getTrainingResults()); emit(TrainingLogReady()); } void _onResult(TrainingResultEvent event, Emitter emit) async { emit(TrainingLogLoading()); Track().track(TrackingEvent.exercise_log_result); emit(TrainingLogReady()); } List getTrainingResults() { exerciseRepository.getExerciseList(); exerciseRepository.sortByDate(); final TrainingPlanRepository trainingPlanRepository = TrainingPlanRepository(); final List trainings = []; if (exerciseRepository.exerciseLogList == null) { return trainings; } bool isEnglish = AppLanguage().appLocal == Locale('en'); int trainingPlanOrigId = 0; exerciseRepository.exerciseLogList!.sort((a, b) { return a.dateAdd!.compareTo(b.dateAdd!) > 0 ? 1 : -1; }); exerciseRepository.exerciseLogList!.forEach((exercise) { final trainingPlanId = exercise.trainingPlanDetailsId; final DateTime startTraining = DateTime( exercise.dateAdd!.year, exercise.dateAdd!.month, exercise.dateAdd!.day, exercise.dateAdd!.hour, exercise.dateAdd!.minute - 5, 0); final DateTime start = DateTime( exercise.dateAdd!.year, exercise.dateAdd!.month, exercise.dateAdd!.day, exercise.dateAdd!.hour, exercise.dateAdd!.minute, 0); final DateTime end = exercise.trainingPlanDetailsId == null ? DateTime(exercise.dateAdd!.year, exercise.dateAdd!.month, exercise.dateAdd!.day, exercise.dateAdd!.hour, exercise.dateAdd!.minute + 2, 0) : DateTime(exercise.dateAdd!.year, exercise.dateAdd!.month, exercise.dateAdd!.day, exercise.dateAdd!.hour, exercise.dateAdd!.minute + 10, 0); if (trainingPlanId != null && trainingPlanId != trainingPlanOrigId) { trainingPlanOrigId = trainingPlanId; TrainingPlan? plan = trainingPlanRepository.getTrainingPlanById(trainingPlanId); final String? trainingName = plan != null ? isEnglish ? plan.name : plan.nameTranslations[AppLanguage().appLocal.toString()] : "Training"; trainings.add(TrainingResult( exercise: null, eventName: trainingName != null ? trainingName : "", from: startTraining, to: DateTime(exercise.dateAdd!.year, exercise.dateAdd!.month, exercise.dateAdd!.day, exercise.dateAdd!.hour + 2, exercise.dateAdd!.minute, 0), background: Colors.orange[800]!, isAllDay: false, isTest: false, isExercise: false, summary: null, )); } final ExerciseType? exerciseType = exerciseRepository.getExerciseTypeById(exercise.exerciseTypeId!); final String exerciseName = isEnglish ? exerciseType!.name : exerciseType!.nameTranslation; Color color = exercise.trainingPlanDetailsId == null ? Colors.blue : Colors.orange; if (exerciseTypeIdSearched == exercise.exerciseTypeId) { color = Color(0xffb4f500); } trainings.add(TrainingResult( exercise: exercise, eventName: exerciseName, from: start, to: end, background: color, isAllDay: false, isTest: exercise.trainingPlanDetailsId == null ? true : false, isExercise: true, summary: exercise.summary, )); }); trainings.sort((a, b) { return a.from.compareTo(b.from) > 0 ? -1 : 1; }); return trainings; } } class TrainingDataSource extends CalendarDataSource { TrainingDataSource(List source) { appointments = source; } @override DateTime getStartTime(int index) { return appointments![index].from; } @override DateTime getEndTime(int index) { return appointments![index].to; } @override String getSubject(int index) { return appointments![index].eventName; } @override Color getColor(int index) { //print("Color ${appointments![index].eventName} - ${appointments![index].background}"); return appointments![index].background; } @override bool isAllDay(int index) { return appointments![index].isAllDay; } }