diameter/lib/screens/basal/basal_detail.dart

182 lines
6.2 KiB
Dart
Raw Normal View History

2021-10-22 23:08:09 +00:00
import 'package:diameter/components/detail.dart';
import 'package:diameter/components/dialogs.dart';
import 'package:diameter/config.dart';
import 'package:diameter/navigation.dart';
import 'package:diameter/utils/date_time_utils.dart';
import 'package:flutter/material.dart';
import 'package:diameter/components/forms.dart';
import 'package:diameter/models/basal.dart';
import 'package:diameter/models/basal_profile.dart';
class BasalDetailScreen extends StatefulWidget {
static const String routeName = '/basal';
final BasalProfile basalProfile;
final Basal? basal;
const BasalDetailScreen({Key? key, required this.basalProfile, this.basal})
: super(key: key);
@override
_BasalDetailScreenState createState() => _BasalDetailScreenState();
}
class _BasalDetailScreenState extends State<BasalDetailScreen> {
final GlobalKey<FormState> _basalForm = GlobalKey<FormState>();
TimeOfDay _startTime = const TimeOfDay(hour: 0, minute: 0);
TimeOfDay _endTime = const TimeOfDay(hour: 0, minute: 0);
final _startTimeController = TextEditingController(text: '');
final _endTimeController = TextEditingController(text: '');
final _unitsController = TextEditingController(text: '');
@override
void initState() {
super.initState();
if (widget.basal != null) {
_startTime = TimeOfDay.fromDateTime(widget.basal!.startTime);
_endTime = TimeOfDay.fromDateTime(widget.basal!.endTime);
_unitsController.text = widget.basal!.units.toString();
}
updateStartTime();
updateEndTime();
}
void updateStartTime() {
_startTimeController.text = DateTimeUtils.displayTimeOfDay(_startTime);
}
void updateEndTime() {
_endTimeController.text = DateTimeUtils.displayTimeOfDay(_endTime);
}
void handleSaveAction() async {
// TODO: add confirmation dialog in case time period is already covered
if (_basalForm.currentState!.validate()) {
bool isNew = widget.basal == null;
isNew
? await Basal.save(
startTime: DateTimeUtils.convertTimeOfDayToDateTime(_startTime),
endTime: DateTimeUtils.convertTimeOfDayToDateTime(_endTime),
units: double.parse(_unitsController.text),
basalProfile: widget.basalProfile.objectId!,
)
: await Basal.update(
widget.basal!.objectId!,
startTime: DateTimeUtils.convertTimeOfDayToDateTime(_startTime),
endTime: DateTimeUtils.convertTimeOfDayToDateTime(_endTime),
units: double.parse(_unitsController.text),
);
Navigator.pop(context, '${isNew ? 'New' : ''} Basal Rate saved');
}
}
void handleCancelAction() {
bool isNew = widget.basal == null;
if (showConfirmationDialogOnCancel &&
((isNew &&
(_startTime.hour != 0 ||
_endTime.hour != 0 ||
_startTime.minute != 0 ||
_endTime.minute != 0 ||
double.tryParse(_unitsController.text) != null)) ||
(!isNew &&
(TimeOfDay.fromDateTime(widget.basal!.startTime) !=
_startTime ||
TimeOfDay.fromDateTime(widget.basal!.endTime) != _endTime ||
(double.tryParse(_unitsController.text) ?? 0) !=
widget.basal!.units)))) {
Dialogs.showCancelConfirmationDialog(
context: context,
isNew: isNew,
onSave: handleSaveAction,
);
} else {
Navigator.pop(context);
}
}
@override
Widget build(BuildContext context) {
bool isNew = widget.basal == null;
return Scaffold(
appBar: AppBar(
title: Text(
'${isNew ? 'New' : 'Edit'} Basal Rate for ${widget.basalProfile.name}'),
),
drawer: const Navigation(currentLocation: BasalDetailScreen.routeName),
body: Column(
children: [
StyledForm(
formState: _basalForm,
fields: [
Row(
children: [
Expanded(
// TODO fix handling of time zones!
child: Padding(
padding: const EdgeInsets.only(right: 5),
child: StyledTimeOfDayFormField(
label: 'Start Time',
controller: _startTimeController,
time: _startTime,
onChanged: (newStartTime) {
if (newStartTime != null) {
setState(() {
_startTime = newStartTime;
});
updateStartTime();
}
},
),
2021-10-22 23:08:09 +00:00
),
),
Expanded(
child: Padding(
padding: const EdgeInsets.only(left: 5),
child: StyledTimeOfDayFormField(
label: 'End Time',
controller: _endTimeController,
time: _endTime,
onChanged: (newEndTime) {
if (newEndTime != null) {
setState(() {
_endTime = newEndTime;
});
updateEndTime();
}
},
),
2021-10-22 23:08:09 +00:00
),
),
],
),
TextFormField(
controller: _unitsController,
keyboardType:
const TextInputType.numberWithOptions(decimal: true),
decoration: const InputDecoration(
labelText: 'Units',
suffixText: 'U',
),
validator: (value) {
if (value!.trim().isEmpty) {
return 'Empty amount of units';
}
return null;
},
),
],
),
],
),
bottomNavigationBar: DetailBottomRow(
onCancel: handleCancelAction,
onSave: handleSaveAction,
),
);
}
}