workouttest_app/lib/bloc/exercise_control_form_bloc.dart
2020-09-19 08:09:43 +02:00

134 lines
3.8 KiB
Dart

import 'package:aitrainer_app/repository/exercise_repository.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter_form_bloc/flutter_form_bloc.dart';
class ExerciseControlFormBloc extends FormBloc<String, String> {
final ExerciseRepository exerciseRepository;
int step = 1;
final double percentToCalculate;
final bool readonly;
String times;
final initialRMField = TextFieldBloc(
);
final quantity1Field = TextFieldBloc(
);
final unitQuantity1Field = TextFieldBloc(
);
final quantity2Field = TextFieldBloc(
);
final unitQuantity2Field = TextFieldBloc(
);
final quantity3Field = TextFieldBloc(
);
final unitQuantity3Field = TextFieldBloc(
);
ExerciseControlFormBloc({this.exerciseRepository, this.percentToCalculate, this.readonly}) {
addFieldBlocs(fieldBlocs: [
initialRMField,
quantity1Field,
unitQuantity1Field,
quantity2Field,
unitQuantity2Field,
quantity3Field,
unitQuantity3Field,
]);
initialRMField.updateInitialValue(calculate1RM(percent75: false).toStringAsFixed(0));
unitQuantity1Field.updateInitialValue(calculate1RM(percent75: true).toStringAsFixed(0));
unitQuantity2Field.updateInitialValue(calculate1RM(percent75: true).toStringAsFixed(0));
unitQuantity3Field.updateInitialValue(calculate1RM(percent75: true).toStringAsFixed(0));
quantity1Field.onValueChanges(onData: (previous, current) async* {
exerciseRepository.setQuantity(current.valueToDouble);
exerciseRepository.setUnitQuantity(unitQuantity1Field.valueToDouble);
});
quantity2Field.onValueChanges(onData: (previous, current) async* {
exerciseRepository.setQuantity(current.valueToDouble);
exerciseRepository.setUnitQuantity(unitQuantity2Field.valueToDouble);
});
quantity3Field.onValueChanges(onData: (previous, current) async* {
exerciseRepository.setQuantity(current.valueToDouble);
exerciseRepository.setUnitQuantity(unitQuantity3Field.valueToDouble);
});
times = percentToCalculate == 0.5 ? "30-35" : "12";
}
@override
void onLoading() {
step = 1;
super.onLoading();
}
@override
void onSubmitting() async {
print("on Submitting Custom form");
try {
emitLoading(progress: 30);
if ( step == 1) {
//unitQuantity2Field.updateInitialValue(calculate1RM(percent75: true).toStringAsFixed(0));
//unitQuantity3Field.updateInitialValue(calculate1RM(percent75: true).toStringAsFixed(0));
step = 2;
} else if ( step == 2) {
//unitQuantity3Field.updateInitialValue(calculate1RM(percent75: true).toStringAsFixed(0));
step = 3;
} else if ( step == 3 ) {
//updatedRMField.updateInitialValue(calculate1RM(percent75: false).toStringAsFixed(0));
}
if ( ! readonly ) {
await exerciseRepository.addExercise();
}
emitSuccess(canSubmitAgain: true);
} on Exception catch (ex) {
emitFailure(failureResponse: ex.toString());
}
}
double calculate1RM({bool percent75}) {
if (exerciseRepository.exercise == null) {
exerciseRepository.getLastExercise();
}
double weight = exerciseRepository.exercise.unitQuantity;
double repeat = exerciseRepository.exercise.quantity;
if ( weight == 0 || repeat == 0) {
return 0;
}
double rmWendler = weight * repeat * 0.0333 + weight;
double rmOconner = weight * (1 + repeat / 40);
double average = (rmWendler + rmOconner) / 2;
return percent75 ? average * this.percentToCalculate : average;
}
//@override
Future<void> close() {
initialRMField.close();
quantity1Field.close();
unitQuantity1Field.close();
quantity2Field.close();
unitQuantity2Field.close();
quantity3Field.close();
unitQuantity3Field.close();
return super.close();
}
}