import 'dart:collection'; import 'package:aitrainer_app/bloc/exercise_log/exercise_log_bloc.dart'; import 'package:aitrainer_app/library/custom_icon_icons.dart'; import 'package:aitrainer_app/widgets/app_bar.dart'; import 'package:aitrainer_app/widgets/bottom_nav.dart'; import 'package:aitrainer_app/widgets/dialog_premium.dart'; import 'package:aitrainer_app/widgets/splash.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:intl/intl.dart'; import 'package:aitrainer_app/localization/app_language.dart'; 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/repository/exercise_repository.dart'; import 'package:aitrainer_app/library/tree_view.dart'; import 'package:aitrainer_app/util/common.dart'; import 'package:aitrainer_app/util/trans.dart'; import 'package:flutter/material.dart'; import 'package:aitrainer_app/widgets/treeview_parent_widget.dart'; class ExerciseLogPage extends StatefulWidget { @override _ExerciseLogPage createState() => _ExerciseLogPage(); } class _ExerciseLogPage extends State with Trans, Common { @override Widget build(BuildContext context) { LinkedHashMap arguments = ModalRoute.of(context).settings.arguments; //final ExerciseRepository exerciseRepository = arguments['exerciseRepository']; final int customerId = arguments['customerId']; setContext(context); return BlocProvider( create: (context) => ExerciseLogBloc(exerciseRepository: ExerciseRepository())..add(ExerciseLogLoad()), child: BlocConsumer(listener: (context, state) { if (state is ExerciseLogLoading) { return LoadingDialog(); } else if (state is ExerciseLogError) { //LoadingDialog.hide(context); Scaffold.of(context).showSnackBar( SnackBar(backgroundColor: Colors.orange, content: Text(state.message, style: TextStyle(color: Colors.white)))); } }, builder: (context, state) { final exerciseBloc = BlocProvider.of(context); if (state is ExerciseLogReady) { //LoadingDialog.hide(context); return getExerciseLog(customerId, exerciseBloc); } else if (state is ExerciseLogLoading) { return LoadingDialog(); } else { //LoadingDialog.hide(context); return getExerciseLog(customerId, exerciseBloc); } })); } Widget getExerciseLog(int customerId, ExerciseLogBloc exerciseLogBloc) { return Scaffold( appBar: AppBarNav(depth: 1), body: Container( padding: EdgeInsets.all(20), decoration: BoxDecoration( image: DecorationImage( image: customerId == Cache().userLoggedIn.customerId ? AssetImage('asset/image/WT_black_background.png') : AssetImage('asset/image/WT_light_background.png'), fit: BoxFit.cover, alignment: Alignment.center, ), ), child: exerciseWidget(exerciseLogBloc, customerId), ), bottomNavigationBar: BottomNavigator(bottomNavIndex: 1), ); } Widget exerciseWidget(ExerciseLogBloc exerciseLogBloc, int customerId) { return TreeView( startExpanded: false, children: _getTreeChildren(exerciseLogBloc, customerId), ); } List _getTreeChildren(ExerciseLogBloc exerciseLogBloc, int customerId) { final ExerciseRepository exerciseRepository = exerciseLogBloc.exerciseRepository; if (customerId == Cache().userLoggedIn.customerId) { exerciseRepository.exerciseList = exerciseRepository.getExerciseList(); } else if (Cache().getTrainee() != null && customerId == Cache().getTrainee().customerId) { exerciseRepository.exerciseList = exerciseRepository.getExerciseListTrainee(); } exerciseRepository.sortByDate(); List listWidget = List(); Card explanation = Card( color: Colors.white60, child: Container( padding: EdgeInsets.only(left: 10, right: 5, top: 12, bottom: 8), child: Column( mainAxisAlignment: MainAxisAlignment.spaceAround, children: [ Row( children: [ Icon( Icons.info, color: Colors.orangeAccent, ), Text(" "), Text( t("My Exercise Logs"), style: TextStyle(fontSize: 20, fontWeight: FontWeight.bold), ), ], ), Divider( color: Colors.transparent, ), Text( t("In this list you will find all your executed exercises grouped by the date."), style: TextStyle(fontSize: 12, fontWeight: FontWeight.normal), ), ], ))); listWidget.add(explanation); List listExercises = List(); String origDate = ""; exerciseRepository.exerciseLogList.forEach((exercise) { String exerciseDate = DateFormat("yyyy-MM-dd", AppLanguage().appLocal.toString()).format(exercise.dateAdd); if (origDate != exerciseDate) { if (origDate.length == 0) { listExercises.add(exercise); origDate = exerciseDate; } else { listWidget.add(Container( margin: const EdgeInsets.only(left: 4.0), child: TreeViewChild( startExpanded: false, parent: TreeviewParentWidget(text: origDate), children: _getChildList(listExercises, exerciseRepository, exerciseLogBloc), ))); listExercises = List(); listExercises.add(exercise); origDate = exerciseDate; } } else { listExercises.add(exercise); origDate = exerciseDate; } }); if (listExercises.length > 0) { listWidget.add(Container( margin: const EdgeInsets.only(left: 4.0), child: TreeViewChild( startExpanded: true, parent: TreeviewParentWidget(text: origDate), children: _getChildList(listExercises, exerciseRepository, exerciseLogBloc), ))); } return listWidget; } List _getChildList(List listExercises, ExerciseRepository exerciseRepository, ExerciseLogBloc exerciseLogBloc) { List list = List(); bool isEnglish = AppLanguage().appLocal == Locale('en'); listExercises.forEach((exercise) { ExerciseType exerciseType = exerciseRepository.getExerciseTypeById(exercise.exerciseTypeId); String exerciseName = isEnglish ? exerciseType.name : exerciseType.nameTranslation; list.add( Card( margin: EdgeInsets.only(left: 10, top: 5), color: Colors.white54, child: Container( padding: const EdgeInsets.only(left: 15, top: 0, right: 5, bottom: 0), child: Row(mainAxisAlignment: MainAxisAlignment.start, children: [ Flexible( fit: FlexFit.tight, flex: 20, child: Text( exerciseName, style: TextStyle(fontSize: 12, color: Colors.black), ), ), Flexible( fit: FlexFit.tight, child: SizedBox( width: 5, )), Flexible( fit: FlexFit.tight, flex: 20, child: Text( exercise.summary == null ? "" : exercise.summary, style: TextStyle(fontSize: 12, color: Colors.blue[800]), )), Stack( children: [ IconButton( iconSize: 36, icon: Icon(CustomIcon.heart_1, color: Colors.blue[800]), onPressed: () { evaluation(); }, ), GestureDetector( child: Image.asset( 'asset/image/lock.png', height: 25, width: 25, ), onTap: () { evaluation(); }), ], ), IconButton( icon: Icon(Icons.delete, color: Colors.black12), onPressed: () { confirmationDialog(exerciseLogBloc, exercise); }, ), ]), )), ); }); return list; } void evaluation() { showDialog( context: context, builder: (BuildContext context) { return DialogPremium( unlocked: true, unlockRound: 1, unlockedText: t("Enjoy also this premium fetaure to show all old evaluation data of your successful exercises."), function: "My Exercise Logs", onTap: () => {Navigator.of(context).pop()}, onCancel: () => {Navigator.of(context).pop()}, ); }); } void confirmationDialog(ExerciseLogBloc bloc, Exercise exercise) { ExerciseType exerciseType = bloc.exerciseRepository.getExerciseTypeById(exercise.exerciseTypeId); String exerciseName = AppLanguage().appLocal == Locale("en") ? exerciseType.name : exerciseType.nameTranslation; String strDate = AppLanguage().appLocal == Locale("en") ? "on the " + DateFormat(DateFormat.YEAR_MONTH_DAY, AppLanguage().appLocal.toString()).format(exercise.dateAdd.toUtc()) : DateFormat(DateFormat.YEAR_MONTH_DAY, AppLanguage().appLocal.toString()).format(exercise.dateAdd.toUtc()) + "-n"; final String unitQuantity = exercise.unitQuantity == null ? "" : "x" + exercise.unitQuantity.toStringAsFixed(0); showCupertinoDialog( useRootNavigator: true, context: context, //barrierDismissible: false, builder: (_) => CupertinoAlertDialog( title: Text(t("Are you sure to delete this exercise?")), content: Column(children: [ Divider(), Text( t("Exercise") + ": " + exerciseName, style: (TextStyle(color: Colors.blue)), ), Text( exercise.quantity.toStringAsFixed(0) + unitQuantity + " ", //+ //exerciseType.unitQuantityUnit == null // ? "" // : exerciseType.unitQuantityUnit, style: (TextStyle(color: Colors.deepOrange)), ), Text( strDate, style: (TextStyle(color: Colors.deepOrange)), ), ]), actions: [ FlatButton( child: Text(t("No")), onPressed: () => Navigator.pop(context), ), FlatButton( child: Text(t("Yes")), onPressed: () => {bloc.add(ExerciseLogDelete(exercise: exercise)), Navigator.pop(context)}, ) ], )); } }