Skip to content

Commit

Permalink
Split fermentation and ingredients models
Browse files Browse the repository at this point in the history
  • Loading branch information
duddu committed Oct 22, 2023
1 parent 6687a66 commit 089a21f
Show file tree
Hide file tree
Showing 10 changed files with 148 additions and 124 deletions.
2 changes: 1 addition & 1 deletion VERSION
Original file line number Diff line number Diff line change
@@ -1 +1 @@
1.9.5
1.9.6
36 changes: 0 additions & 36 deletions lib/models/calculator_model.dart

This file was deleted.

19 changes: 19 additions & 0 deletions lib/models/fermentation_model.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
import 'package:flutter/material.dart';
import 'package:sourdoc/methods/temperature_unit_helpers.dart';
import 'package:sourdoc/methods/get_fermentation_values.dart';

class FermentationModel extends ChangeNotifier {
double _inoculation = 0;
double _bulkRise = 0;

double get inoculation => _inoculation;
double get bulkRise => _bulkRise;

void updateFermentationValues(
{required double temperature, required TemperatureUnit temperatureUnit}) {
_inoculation = getInoculationValue(temperature, temperatureUnit);
_bulkRise = getBulkRiseValue(temperature, temperatureUnit);

notifyListeners();
}
}
27 changes: 27 additions & 0 deletions lib/models/ingredients_model.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
import 'package:flutter/material.dart';
import 'package:sourdoc/methods/get_ingredients_values.dart';

class IngredientsModel extends ChangeNotifier {
double _flour = 0;
double _water = 0;
double _levain = 0;
double _salt = 0;

double get flour => _flour;
double get water => _water;
double get levain => _levain;
double get salt => _salt;

void updateIngredientsValues(
{required double totalWeight,
required double hydration,
required double saltLevel,
required double inoculation}) {
_flour = getFlourValue(totalWeight, hydration, saltLevel, inoculation);
_water = getNonFlourIngredientValue(_flour, hydration);
_levain = getNonFlourIngredientValue(_flour, inoculation);
_salt = getNonFlourIngredientValue(_flour, saltLevel);

notifyListeners();
}
}
81 changes: 44 additions & 37 deletions lib/widgets/home_page.dart
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,8 @@ import 'package:sourdoc/constants/routes.dart';
import 'package:sourdoc/constants/style.dart' as style;
import 'package:sourdoc/methods/temperature_unit_helpers.dart';
import 'package:sourdoc/methods/persist_initial_values.dart';
import 'package:sourdoc/models/calculator_model.dart';
import 'package:sourdoc/models/fermentation_model.dart';
import 'package:sourdoc/models/ingredients_model.dart';
import 'package:sourdoc/models/temperature_unit_model.dart';
import 'package:sourdoc/widgets/app_bar_with_actions.dart';
import 'package:sourdoc/widgets/centered_container.dart';
Expand Down Expand Up @@ -46,9 +47,10 @@ class HomePage extends StatelessWidget {
onPressed: () {
Navigator.pushNamed(context, helpPagePath);
})))),
body: ChangeNotifierProvider(
create: (context) => CalculatorModel(),
child: const HomePageListView()),
body: MultiProvider(providers: [
ChangeNotifierProvider(create: (context) => FermentationModel()),
ChangeNotifierProvider(create: (context) => IngredientsModel())
], child: const HomePageListView()),
);
}
}
Expand Down Expand Up @@ -100,12 +102,12 @@ class CalculatorForm extends StatefulWidget {
}

class _CalculatorFormState extends State<CalculatorForm> {
final temperatureController = TextEditingController();
final totalWeightController = TextEditingController();
final hydrationController = TextEditingController();
final saltController = TextEditingController();
final _temperatureController = TextEditingController();
final _totalWeightController = TextEditingController();
final _hydrationController = TextEditingController();
final _saltController = TextEditingController();

final unitChoiceList = temperatureUnitSet
final _unitChoiceList = temperatureUnitSet
.map((element) => UnitSingleChoiceDescriptor(
value: element.name,
label: element.symbol,
Expand All @@ -120,49 +122,54 @@ class _CalculatorFormState extends State<CalculatorForm> {
}

void _updateFermentationValues(TemperatureUnit temperatureUnit) {
Provider.of<CalculatorModel>(context, listen: false)
Provider.of<FermentationModel>(context, listen: false)
.updateFermentationValues(
_parseValue(temperatureController), temperatureUnit);
temperature: _parseValue(_temperatureController),
temperatureUnit: temperatureUnit);
}

void _updateIngredientsValues() {
Provider.of<CalculatorModel>(context, listen: false)
.updateIngredientsValues(_parseValue(totalWeightController),
_parseValue(hydrationController), _parseValue(saltController));
Provider.of<IngredientsModel>(context, listen: false)
.updateIngredientsValues(
totalWeight: _parseValue(_totalWeightController),
hydration: _parseValue(_hydrationController),
saltLevel: _parseValue(_saltController),
inoculation: Provider.of<FermentationModel>(context, listen: false)
.inoculation);
}

void _onTemperatureUnitSelectionChanged(TemperatureUnit selection) {
Provider.of<TemperatureUnitModel>(context, listen: false)
.updateTemperatureUnit(selection);
storeInitialValue(temperatureUnitKey, getTemperatureUnitSymbol(selection));
if (temperatureController.text.isNotEmpty) {
temperatureController.text = convertTemperatureToUnit(
_parseValue(temperatureController), selection)
if (_temperatureController.text.isNotEmpty) {
_temperatureController.text = convertTemperatureToUnit(
_parseValue(_temperatureController), selection)
.toStringAsFixed(1)
.replaceFirst('.0', '');
storeInitialValue(temperatureKey, temperatureController.text);
storeInitialValue(temperatureKey, _temperatureController.text);
}
}

void _onTemperatureChanged(TemperatureUnit temperatureUnit) {
_updateFermentationValues(temperatureUnit);
_updateIngredientsValues();
storeInitialValue(temperatureKey, temperatureController.text);
storeInitialValue(temperatureKey, _temperatureController.text);
}

void _onTotalWeightChanged() {
_updateIngredientsValues();
storeInitialValue(totalWeightKey, totalWeightController.text);
storeInitialValue(totalWeightKey, _totalWeightController.text);
}

void _onHydrationChanged() {
_updateIngredientsValues();
storeInitialValue(hydrationKey, hydrationController.text);
storeInitialValue(hydrationKey, _hydrationController.text);
}

void _onSaltChanged() {
_updateIngredientsValues();
storeInitialValue(saltLevelKey, saltController.text);
storeInitialValue(saltLevelKey, _saltController.text);
}

Future<TemperatureUnit> _getInitialTemperatureSymbol() async {
Expand All @@ -174,13 +181,13 @@ class _CalculatorFormState extends State<CalculatorForm> {
Future<void> _loadInitialValues() async {
final TemperatureUnit initialTemperatureUnit =
await _getInitialTemperatureSymbol();
temperatureController.text = await getInitialOrDefaultValue(
_temperatureController.text = await getInitialOrDefaultValue(
temperatureKey, form.getDefaultTemperature(initialTemperatureUnit));
totalWeightController.text =
_totalWeightController.text =
await getInitialOrDefaultValue(totalWeightKey, form.defaultTotalWeight);
hydrationController.text =
_hydrationController.text =
await getInitialOrDefaultValue(hydrationKey, form.defaultHydration);
saltController.text =
_saltController.text =
await getInitialOrDefaultValue(saltLevelKey, form.defaultSaltLevel);
_updateFermentationValues(initialTemperatureUnit);
_updateIngredientsValues();
Expand All @@ -194,10 +201,10 @@ class _CalculatorFormState extends State<CalculatorForm> {

@override
void dispose() {
temperatureController.dispose();
totalWeightController.dispose();
hydrationController.dispose();
saltController.dispose();
_temperatureController.dispose();
_totalWeightController.dispose();
_hydrationController.dispose();
_saltController.dispose();
super.dispose();
}

Expand All @@ -215,7 +222,7 @@ class _CalculatorFormState extends State<CalculatorForm> {
.merge(TextStyle(color: Colors.grey.shade800))),
UnitChoice<TemperatureUnit>(
a11yLabel: locale.a11yTemperatureUnitChoiceLabel,
unitList: unitChoiceList,
unitList: _unitChoiceList,
getInitialUnitValue: _getInitialTemperatureSymbol,
onSelectionChanged: _onTemperatureUnitSelectionChanged),
],
Expand All @@ -225,7 +232,7 @@ class _CalculatorFormState extends State<CalculatorForm> {
Consumer<TemperatureUnitModel>(builder: (context, model, child) {
return TextFieldWithAffixes(
paddingTop: 10,
controller: temperatureController,
controller: _temperatureController,
prefixText: locale.inputPrefixTemperature,
suffixText: model.temperatureUnitSymbol,
tooltip: locale.inputTooltipTemperature,
Expand All @@ -240,7 +247,7 @@ class _CalculatorFormState extends State<CalculatorForm> {
Row(
children: <TextFieldWithAffixes>[
TextFieldWithAffixes(
controller: totalWeightController,
controller: _totalWeightController,
prefixText: locale.inputPrefixWeight,
suffixText: locale.unitGrams,
tooltip: locale.inputTooltipWeight,
Expand All @@ -252,7 +259,7 @@ class _CalculatorFormState extends State<CalculatorForm> {
Row(
children: <TextFieldWithAffixes>[
TextFieldWithAffixes(
controller: hydrationController,
controller: _hydrationController,
prefixText: locale.inputPrefixHydration,
suffixText: locale.unitPercent,
tooltip: locale.inputTooltipHydration,
Expand All @@ -263,7 +270,7 @@ class _CalculatorFormState extends State<CalculatorForm> {
Row(
children: <TextFieldWithAffixes>[
TextFieldWithAffixes(
controller: saltController,
controller: _saltController,
prefixText: locale.inputPrefixSalt,
suffixText: locale.unitPercent,
tooltip: locale.inputTooltipSalt,
Expand All @@ -281,7 +288,7 @@ class IngredientsValues extends StatelessWidget {

@override
Widget build(BuildContext context) {
return Consumer<CalculatorModel>(builder: (context, model, child) {
return Consumer<IngredientsModel>(builder: (context, model, child) {
return Column(children: <Row>[
const Row(children: <Header>[
Header(
Expand Down Expand Up @@ -323,7 +330,7 @@ class FermentationValues extends StatelessWidget {

@override
Widget build(BuildContext context) {
return Consumer<CalculatorModel>(builder: (context, model, child) {
return Consumer<FermentationModel>(builder: (context, model, child) {
return Column(children: <Row>[
const Row(children: <Header>[Header(text: locale.headerFermentation)]),
Row(children: <VariableWithLabel>[
Expand Down
48 changes: 0 additions & 48 deletions test/models/calculator_model_test.dart

This file was deleted.

26 changes: 26 additions & 0 deletions test/models/fermentation_model_test.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
import 'package:flutter_test/flutter_test.dart';
import 'package:sourdoc/methods/temperature_unit_helpers.dart';
import 'package:sourdoc/models/fermentation_model.dart';

void main() {
group('FermentationModel', () {
test('should have fermentation values', () {
final model = FermentationModel();
expect(model.inoculation, 0);
expect(model.bulkRise, 0);
});

test('should update fermentation values', () {
final model = FermentationModel();
var i = 0;
model.addListener(() {
expect(model.inoculation, greaterThan(0));
expect(model.bulkRise, greaterThan(0));
i++;
});
model.updateFermentationValues(
temperature: 20, temperatureUnit: TemperatureUnit.celsius);
expect(i, 1);
});
});
}
Loading

0 comments on commit 089a21f

Please sign in to comment.