334 lines
13 KiB
Dart
334 lines
13 KiB
Dart
import 'package:aitrainer_app/bloc/exercise_form_bloc.dart';
|
|
import 'package:aitrainer_app/localization/app_localization.dart';
|
|
import 'package:aitrainer_app/model/auth.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<ExerciseNewPage> {
|
|
|
|
@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<ExerciseFormBloc>(context);
|
|
|
|
exerciseBloc.exerciseRepository.setExerciseType(exerciseType);
|
|
String exerciseName = exerciseBloc.exerciseRepository.exerciseType.name;
|
|
|
|
return Form(
|
|
autovalidate: true,
|
|
child: Scaffold(
|
|
resizeToAvoidBottomInset: true,
|
|
appBar: AppBar(
|
|
backgroundColor: Colors.transparent,
|
|
title: Row(
|
|
mainAxisAlignment: MainAxisAlignment.end,
|
|
children: <Widget>[
|
|
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: <Widget>[
|
|
Divider(color: Colors.transparent,),
|
|
Divider(color: Colors.transparent,),
|
|
Divider(color: Colors.transparent,),
|
|
|
|
Text(AppLocalizations.of(context).translate(exerciseName) + " " +
|
|
AppLocalizations.of(context).translate('Save Exercise'),
|
|
style: TextStyle(fontWeight: FontWeight.bold, fontSize: 18, color: Colors.deepOrange)),
|
|
Divider(color: Colors.transparent,),
|
|
Divider(color: Colors.transparent,),
|
|
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: [
|
|
FilteringTextInputFormatter(RegExp(r"[\d.]"), allow: true)
|
|
],
|
|
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),
|
|
),
|
|
),
|
|
/*TextFormField(
|
|
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),
|
|
),
|
|
autovalidate: true,
|
|
textAlign: TextAlign.center,
|
|
initialValue: "",
|
|
style: TextStyle(fontSize: 30,
|
|
color: Colors.lightBlue,
|
|
fontWeight: FontWeight.bold),
|
|
validator: (input) {
|
|
return validateNumberInput(input);
|
|
},
|
|
inputFormatters: [
|
|
FilteringTextInputFormatter(RegExp(r"[\d.]"))
|
|
//WhitelistingTextInputFormatter(RegExp(r"[\d.]"))
|
|
],
|
|
onChanged: (input) => {
|
|
print ("UnitQuantity value $input"),
|
|
bloc.exerciseRepository.setUnitQuantity(
|
|
double.parse(input))
|
|
},
|
|
|
|
), */
|
|
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: [
|
|
FilteringTextInputFormatter(RegExp(r"[\d.]"), allow: true)
|
|
],
|
|
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),
|
|
),
|
|
),
|
|
/* TextFormField(
|
|
decoration: InputDecoration(
|
|
fillColor: Colors.white,
|
|
filled: false,
|
|
hintText: AppLocalizations.of(context).translate("The number of the exercise"),
|
|
hintStyle: TextStyle(fontSize: 16, color: Colors.black54, fontWeight: FontWeight.w100),
|
|
labelStyle: TextStyle(fontSize: 16, color: Colors.deepOrange),
|
|
labelText: AppLocalizations.of(context).translate(
|
|
bloc.exerciseRepository.exerciseType.unit),
|
|
),
|
|
autovalidate: true,
|
|
textAlign: TextAlign.center,
|
|
initialValue: "",
|
|
style: TextStyle(fontSize: 50,
|
|
color: Colors.deepOrange,
|
|
fontWeight: FontWeight.bold),
|
|
validator: (input) {
|
|
return validateNumberInput(input);
|
|
},
|
|
inputFormatters: [
|
|
WhitelistingTextInputFormatter(RegExp(r"[\d.]"))
|
|
],
|
|
onChanged: (input) =>
|
|
{
|
|
print ("Quantity value $input"),
|
|
bloc.exerciseRepository.setQuantity(double.parse(input)),
|
|
bloc.exerciseRepository.setUnit(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 ) {
|
|
|
|
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 = 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") + ": " +
|
|
AppLocalizations.of(context).translate(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(Auth().userLoggedIn),
|
|
bloc.exerciseRepository.addExercise(),
|
|
|
|
Navigator.pop(context),
|
|
Navigator.pop(context),
|
|
},
|
|
)
|
|
],
|
|
)
|
|
);
|
|
}
|
|
}
|