import 'dart:collection'; import 'package:aitrainer_app/bloc/exercise_form_bloc.dart'; import 'package:aitrainer_app/localization/app_language.dart'; import 'package:aitrainer_app/localization/app_localization.dart'; import 'package:aitrainer_app/model/cache.dart'; import 'package:aitrainer_app/model/exercise_type.dart'; import 'package:aitrainer_app/repository/exercise_repository.dart'; import 'package:flutter/services.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'; class ExerciseNewPage extends StatefulWidget{ _ExerciseNewPageState createState() => _ExerciseNewPageState(); } class _ExerciseNewPageState extends State { @override Widget build(BuildContext context) { final ExerciseType exerciseType = ModalRoute.of(context).settings.arguments; return BlocProvider( create: (context) => ExerciseFormBloc(exerciseRepository: ExerciseRepository()), child: Builder(builder: (context) { // ignore: close_sinks final exerciseBloc = BlocProvider.of(context); exerciseBloc.exerciseRepository.setExerciseType(exerciseType); String exerciseName = AppLanguage().appLocal == Locale("en") ? exerciseBloc.exerciseRepository.exerciseType.name : exerciseBloc.exerciseRepository.exerciseType.nameTranslation; return Form( autovalidate: true, child: Scaffold( resizeToAvoidBottomInset: true, appBar: AppBar( backgroundColor: Colors.transparent, title: Row( mainAxisAlignment: MainAxisAlignment.end, children: [ Image.asset( 'asset/image/WT_long_logo.png', fit: BoxFit.cover, height: 65.0, ), ], ), leading: IconButton( icon: Icon(Icons.arrow_back, color: Colors.white), onPressed: () => Navigator.of(context).pop(), ), ), body: Container( width: MediaQuery.of(context).size.width, height: MediaQuery.of(context).size.height, decoration: BoxDecoration( image: DecorationImage( image: AssetImage('asset/image/WT_light_background.png'), fit: BoxFit.fill, alignment: Alignment.center, ), ), child: Container( padding: const EdgeInsets.only (top: 25, left:25, right: 25), child: SingleChildScrollView( scrollDirection: Axis.vertical, child: Column( mainAxisAlignment: MainAxisAlignment.spaceAround, children: [ Divider(color: Colors.transparent,), Divider(color: Colors.transparent,), Text(AppLocalizations.of(context).translate('Save Exercise'), style: TextStyle(fontSize: 14, color: Colors.blueAccent)), Text(exerciseName, style: TextStyle(fontWeight: FontWeight.bold, fontSize: 18, color: Colors.deepOrange), overflow: TextOverflow.fade, maxLines: 1, softWrap: true, ), Divider(color: Colors.transparent,), FlatButton( child: Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Icon(Icons.description), Text(AppLocalizations.of(context).translate("Description"), style: TextStyle( color: Colors.blueAccent, fontWeight: FontWeight.normal, fontSize: 14 )), Icon(Icons.arrow_forward_ios), ]), textColor: Colors.blueAccent, color: Colors.transparent, onPressed: () => { Navigator.of(context).pushNamed('exerciseTypeDescription', arguments: exerciseBloc.exerciseRepository), }, ), Divider(color: Colors.transparent,), columnQuantityUnit(exerciseBloc), Divider(color: Colors.transparent,), Divider(color: Colors.transparent,), Divider(color: Colors.transparent,), columnQuantity(exerciseBloc), Divider(), RaisedButton( textColor: Colors.white, color: Colors.deepOrange, focusColor: Colors.white, onPressed: () => { confirmationDialog( exerciseBloc ), }, child: Text(AppLocalizations.of(context).translate("Save"), style: TextStyle(fontSize: 16),) ), Divider(color: Colors.transparent,), Divider(color: Colors.transparent,), Divider(color: Colors.transparent,), ]), ) ) ), ), ); }) ); } Column columnQuantityUnit( ExerciseFormBloc bloc ) { Column column = Column(); if ( bloc.exerciseRepository.exerciseType != null && bloc.exerciseRepository.exerciseType.unitQuantity == "1") { column = Column( children: [ TextFieldBlocBuilder( textFieldBloc: bloc.unitQuantityField, textAlign: TextAlign.center, style: TextStyle(fontSize: 30, color: Colors.lightBlue, fontWeight: FontWeight.bold), inputFormatters: [ WhitelistingTextInputFormatter (RegExp(r"[\d.]")) ], onChanged: (input) => { print ("UnitQuantity value $input"), bloc.exerciseRepository.setUnitQuantity( double.parse(input)) }, decoration: InputDecoration( fillColor: Colors.white, filled: false, hintStyle: TextStyle(fontSize: 16, color: Colors.black54, fontWeight: FontWeight.w100), hintText: AppLocalizations.of(context).translate("The number of the exercise done with"), labelStyle: TextStyle(fontSize: 16, color: Colors.lightBlue), labelText: AppLocalizations.of(context).translate( bloc.exerciseRepository.exerciseType.unitQuantityUnit), ), ), new InkWell( child: new Text(AppLocalizations.of(context).translate( bloc.exerciseRepository.exerciseType.unitQuantityUnit), style: TextStyle(fontSize: 16)), ), ]); }; return column; } Column columnQuantity( ExerciseFormBloc bloc ) { Column column = Column( children: [ TextFieldBlocBuilder( textFieldBloc: bloc.quantityField, textAlign: TextAlign.center, style: TextStyle(fontSize: 50, color: Colors.deepOrange, fontWeight: FontWeight.bold), inputFormatters: [ WhitelistingTextInputFormatter (RegExp(r"[\d.]")) ], onChanged: (input) => { print ("Quantity value $input"), bloc.exerciseRepository.setQuantity(double.parse(input)), bloc.exerciseRepository.setUnit(bloc.exerciseRepository.exerciseType.unit) }, decoration: InputDecoration( fillColor: Colors.white, filled: false, hintStyle: TextStyle(fontSize: 16, color: Colors.black54, fontWeight: FontWeight.w100), hintText: AppLocalizations.of(context).translate("The number of the exercise"), labelStyle: TextStyle(fontSize: 16, color: Colors.deepOrange), labelText: AppLocalizations.of(context).translate( bloc.exerciseRepository.exerciseType.unit), ), ), ]); return column; } String validateNumberInput( input ) { String error = AppLocalizations.of(context).translate("Please type the right quantity 0-10000"); dynamic rc = ( input != null && input.length > 0); if ( ! rc ) { return null; } Pattern pattern = r'^\d+(?:\.\d+)?$'; RegExp regex = new RegExp(pattern); if (!regex.hasMatch(input)) { return error; } rc = double.tryParse(input); if ( rc == null ) { return error; } if ( ! ( double.parse(input) < 10000 && double.parse(input) > 0) ) { return error; } return null; } void confirmationDialog( ExerciseFormBloc bloc ) { LinkedHashMap args = LinkedHashMap(); print("exercise validated " + bloc.exerciseRepository.exercise.quantity.toString()); 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(); } showCupertinoDialog( useRootNavigator: true, context: context, //barrierDismissible: false, builder:(_) => CupertinoAlertDialog( title: Text(AppLocalizations.of(context).translate("Do you save this exercise with these parameters?")), content: Column( children: [ Divider(), Text(AppLocalizations.of(context).translate("Exercise") + ": " + bloc.exerciseRepository.exerciseType.name, style: (TextStyle(color: Colors.blue)),), Text(quantity + " " + AppLocalizations.of(context).translate(bloc.exerciseRepository.exerciseType.unit), style: (TextStyle(color: Colors.deepOrange)),), Text(bloc.exerciseRepository.exerciseType.unitQuantity == "1" ? AppLocalizations.of(context).translate("with") + " " + unitQuantity + " " + AppLocalizations.of(context).translate(bloc.exerciseRepository.exerciseType.unitQuantityUnit) : "", style: (TextStyle(color: Colors.deepOrange)), ), ]), actions: [ FlatButton( child: Text(AppLocalizations.of(context).translate("No")), onPressed: () => Navigator.pop(context), ), FlatButton( child: Text(AppLocalizations.of(context).translate("Yes")), onPressed: () => { bloc.exerciseRepository.setCustomer(Cache().userLoggedIn), bloc.exerciseRepository.addExercise(), Navigator.pop(context), Navigator.pop(context), if ( bloc.exerciseRepository.exerciseType.is1RM ) { args['exerciseRepository'] = bloc.exerciseRepository, args['percent'] = 0.75, args['readonly'] = false, Navigator.of(context).pushNamed('exerciseControlPage', arguments: args ) } }, ) ], ) ); } }