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:flutter/services.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 { final GlobalKey _basalForm = GlobalKey(); 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( child: StyledTimeOfDayFormField( label: 'Start Time', controller: _startTimeController, time: _startTime, onChanged: (newStartTime) { if (newStartTime != null) { setState(() { _startTime = newStartTime; }); updateStartTime(); } }, ), ), Expanded( child: StyledTimeOfDayFormField( label: 'End Time', controller: _endTimeController, time: _endTime, onChanged: (newEndTime) { if (newEndTime != null) { setState(() { _endTime = newEndTime; }); updateEndTime(); } }, ), ), ], ), 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, ), ); } }