import 'dart:collection'; import 'package:aitrainer_app/bloc/exercise_new/exercise_new_bloc.dart'; import 'package:aitrainer_app/bloc/menu/menu_bloc.dart'; import 'package:aitrainer_app/bloc/test_set_execute/test_set_execute_bloc.dart'; import 'package:aitrainer_app/library/custom_icon_icons.dart'; import 'package:aitrainer_app/model/cache.dart'; import 'package:aitrainer_app/model/exercise_ability.dart'; import 'package:aitrainer_app/model/exercise_type.dart'; import 'package:aitrainer_app/repository/customer_repository.dart'; import 'package:aitrainer_app/repository/exercise_repository.dart'; import 'package:aitrainer_app/service/logging.dart'; import 'package:aitrainer_app/util/trans.dart'; import 'package:aitrainer_app/widgets/app_bar.dart'; import 'package:aitrainer_app/widgets/bmi_widget.dart'; import 'package:aitrainer_app/widgets/bmr_widget.dart'; import 'package:aitrainer_app/widgets/bottom_bar_multiple_exercises.dart'; import 'package:aitrainer_app/widgets/exercise_save.dart'; import 'package:aitrainer_app/widgets/size_widget.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter_form_bloc/flutter_form_bloc.dart'; import 'package:google_fonts/google_fonts.dart'; import 'package:modal_progress_hud/modal_progress_hud.dart'; class ExerciseNewPage extends StatefulWidget { _ExerciseNewPageState createState() => _ExerciseNewPageState(); } class _ExerciseNewPageState extends State with Trans, Logging { @override Widget build(BuildContext context) { final ExerciseType exerciseType = ModalRoute.of(context).settings.arguments; // ignore: close_sinks final menuBloc = BlocProvider.of(context); setContext(context); return BlocProvider( create: (context) => ExerciseNewBloc( exerciseRepository: ExerciseRepository(), menuBloc: menuBloc, customerRepository: CustomerRepository(), exerciseType: exerciseType) ..add(ExerciseNewLoad()), child: BlocConsumer( listener: (context, state) { if (state is ExerciseNewError) { Scaffold.of(context).showSnackBar( SnackBar(backgroundColor: Colors.orange, content: Text(state.message, style: TextStyle(color: Colors.white)))); } else if (state is ExerciseNewSaved) { final LinkedHashMap args = LinkedHashMap(); // ignore: close_sinks final TestSetExecuteBloc executeBloc = BlocProvider.of(context); print("Execute paralell $exerciseType paralell: ${executeBloc.paralellTest}"); if (executeBloc != null && executeBloc.existsActivePlan() == true) { Navigator.of(context).pushNamed("testSetExecute"); } else { // ignore: close_sinks final bloc = BlocProvider.of(context); if (bloc.exerciseRepository.exerciseType.unitQuantityUnit == null) { args['exerciseRepository'] = bloc.exerciseRepository; Navigator.of(context).pushNamed('evaluationPage', arguments: args); } else if (menuBloc.ability.equalsTo(ExerciseAbility.oneRepMax)) { args['exerciseRepository'] = bloc.exerciseRepository; args['percent'] = 0.75; args['readonly'] = false; Navigator.of(context).pushNamed('exerciseControlPage', arguments: args); } } } }, builder: (context, state) { final exerciseBloc = BlocProvider.of(context); return ModalProgressHUD( child: getExerciseSaveWidget(exerciseBloc, exerciseType, menuBloc), inAsyncCall: state is ExerciseNewLoading, opacity: 0.5, color: Colors.black54, progressIndicator: CircularProgressIndicator(), ); }, )); } Widget getExerciseSaveWidget(ExerciseNewBloc exerciseBloc, ExerciseType exerciseType, MenuBloc menuBloc) { if (exerciseBloc.exerciseRepository.exerciseType.name == "BMR") { return BMR(exerciseBloc: exerciseBloc); } if (exerciseBloc.exerciseRepository.exerciseType.name == "BMI") { return BMI(exerciseBloc: exerciseBloc); } if (exerciseBloc.exerciseRepository.exerciseType.name == "Sizes") { return SizeWidget(exerciseBloc: exerciseBloc); } return Scaffold( appBar: AppBarNav(depth: 1), body: Container( padding: EdgeInsets.only(top: 10, left: 20, right: 20), decoration: BoxDecoration( image: DecorationImage( image: AssetImage('asset/image/WT_black_background.jpg'), fit: BoxFit.cover, alignment: Alignment.center, ), ), child: ExerciseSave( exerciseName: exerciseBloc.exerciseRepository.exerciseType.nameTranslation, exerciseDescription: exerciseBloc.exerciseRepository.exerciseType.descriptionTranslation, exerciseTask: t("Please take a relative bigger weight and repeat 12-20 times"), unit: exerciseBloc.exerciseRepository.exerciseType.unit, unitQuantityUnit: exerciseBloc.exerciseRepository.exerciseType.unitQuantityUnit, hasUnitQuantity: exerciseBloc.exerciseRepository.exerciseType.unitQuantityUnit != null, onQuantityChanged: (value) { exerciseBloc.add(ExerciseNewQuantityChange(quantity: double.parse(value))); }, onUnitQuantityChanged: (value) => exerciseBloc.add(ExerciseNewQuantityUnitChange(quantity: double.parse(value))), //onSubmit: () => confirmationDialog(exerciseBloc, menuBloc), exerciseTypeId: exerciseType.exerciseTypeId, )), floatingActionButton: FloatingActionButton.extended( onPressed: () => save(exerciseBloc, menuBloc), backgroundColor: Colors.orange[800], icon: Icon(CustomIcon.save), label: Text( t("Save"), style: GoogleFonts.inter(fontWeight: FontWeight.bold, fontSize: 16), ), ), bottomNavigationBar: BottomBarMultipleExercises( isSet: false, exerciseTypeId: exerciseType.exerciseTypeId, ), ); } void save(ExerciseNewBloc bloc, MenuBloc menuBloc) { // ignore: close_sinks final TestSetExecuteBloc executeBloc = BlocProvider.of(context); if (executeBloc != null && executeBloc.existsActivePlan() == true) { confirmationOverride(bloc); } else { confirmationSave(bloc, menuBloc); } } void confirmationSave(ExerciseNewBloc bloc, MenuBloc menuBloc) { if (bloc.exerciseRepository.exercise.quantity == null) { return; } String quantity = bloc.exerciseRepository.exercise.quantity % 1 == 0 ? bloc.exerciseRepository.exercise.quantity.round().toString() : bloc.exerciseRepository.exercise.quantity.toString(); String unitQuantity = ""; if (bloc.exerciseRepository.exercise.unitQuantity != null) { unitQuantity = bloc.exerciseRepository.exercise.unitQuantity % 1 == 0 ? bloc.exerciseRepository.exercise.unitQuantity.round().toString() : bloc.exerciseRepository.exercise.unitQuantity.toString(); } // ignore: close_sinks final TestSetExecuteBloc executeBloc = BlocProvider.of(context); showCupertinoDialog( useRootNavigator: true, context: context, builder: (_) => CupertinoAlertDialog( title: Text(t("Do you save this exercise with these parameters?")), content: Column(children: [ Divider(), Text( t("Exercise") + ": " + bloc.exerciseRepository.exerciseType.name, style: (TextStyle(color: Colors.blue)), ), Text( quantity + " " + t(bloc.exerciseRepository.exerciseType.unit), style: (TextStyle(color: Colors.deepOrange)), ), Text( bloc.exerciseRepository.exerciseType.unitQuantity == "1" ? t("with") + " " + unitQuantity + " " + t(bloc.exerciseRepository.exerciseType.unitQuantityUnit) : "", style: (TextStyle(color: Colors.deepOrange)), ), ]), actions: [ FlatButton( child: Text(t("No")), onPressed: () => Navigator.pop(context), ), FlatButton( child: Text(t("Yes")), onPressed: () { saveAll(bloc); if (executeBloc.existsActivePlan() == true) { executeBloc.add(TestSetExecuteExerciseFinished( exerciseTypeId: bloc.exerciseRepository.exerciseType.exerciseTypeId, quantity: bloc.exerciseRepository.exercise.quantity, unitQuantity: bloc.exerciseRepository.exercise.unitQuantity)); } Navigator.pop(context); }, ) ], )); } void saveAll(ExerciseNewBloc bloc) { bloc.exerciseRepository.setCustomer(Cache().userLoggedIn); bloc.add(ExerciseNewSubmit()); } void confirmationOverride(ExerciseNewBloc bloc) { // ignore: close_sinks final TestSetExecuteBloc executeBloc = BlocProvider.of(context); showCupertinoDialog( useRootNavigator: true, context: context, builder: (_) => CupertinoAlertDialog( title: Text(t("You have an active Test Set!"), style: GoogleFonts.archivoBlack(fontSize: 20, color: Colors.red[800])), content: Column(children: [ Divider(), Text(t("Do you want to override it?"), style: GoogleFonts.archivoBlack(fontSize: 16, color: Colors.blue[800])), ]), actions: [ FlatButton( child: Text(t("No"), style: GoogleFonts.archivoBlack(fontSize: 16, color: Colors.blue[800])), onPressed: () => Navigator.pop(context), ), FlatButton( child: Text(t("Yes"), style: GoogleFonts.archivoBlack(fontSize: 16, color: Colors.red[800])), onPressed: () { Navigator.pop(context); executeBloc.add(TestSetExecuteDeleteAllActive()); saveAll(bloc); }, ) ], )); } }