import 'package:diameter/components/dialogs.dart'; import 'package:diameter/models/log_bolus.dart'; import 'package:diameter/models/log_entry.dart'; import 'package:diameter/models/log_meal.dart'; import 'package:diameter/models/settings.dart'; import 'package:diameter/navigation.dart'; import 'package:diameter/screens/log/log_entry/log_entry.dart'; import 'package:diameter/utils/date_time_utils.dart'; import 'package:flutter/material.dart'; class LogScreen extends StatefulWidget { static const String routeName = '/log'; const LogScreen({Key? key}) : super(key: key); @override _LogScreenState createState() => _LogScreenState(); } class _LogScreenState extends State { late Map> _logEntryDailyMap; @override void initState() { super.initState(); reload(); } void reload({String? message}) { setState(() { _logEntryDailyMap = LogEntry.getDailyEntryMap(); }); setState(() { if (message != null) { var snackBar = SnackBar( content: Text(message), duration: const Duration(seconds: 2), ); ScaffoldMessenger.of(context) ..removeCurrentSnackBar() ..showSnackBar(snackBar); } }); } void onDelete(LogEntry logEntry) { LogEntry.remove(logEntry.id); reload(message: 'Log Entry deleted'); } void handleDeleteAction(LogEntry logEntry) async { if (Settings.get().showConfirmationDialogOnDelete) { Dialogs.showConfirmationDialog( context: context, onConfirm: () => onDelete(logEntry), message: 'Are you sure you want to delete this Log Entry?', ); } else { onDelete(logEntry); } } @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: const Text('Log Entries'), actions: [ IconButton(onPressed: reload, icon: const Icon(Icons.refresh)), ], ), drawer: const Navigation(currentLocation: LogScreen.routeName), body: Column( children: [ Expanded( child: _logEntryDailyMap.isNotEmpty ? ListView.builder( padding: const EdgeInsets.all(10.0), shrinkWrap: true, itemCount: _logEntryDailyMap.length, itemBuilder: (context, dateIndex) { List dateList = _logEntryDailyMap.keys.toList(); final date = dateList[dateIndex]; final entryList = _logEntryDailyMap[date]; final tiles = []; for (LogEntry logEntry in entryList!) { double bolus = LogBolus.getTotalBolusForEntry(logEntry.id); double carbs = LogMeal.getTotalCarbsForEntry(logEntry.id); tiles.add(ListTile( onTap: () { Navigator.push( context, MaterialPageRoute( builder: (context) => LogEntryScreen(id: logEntry.id), ), ).then((message) => reload(message: message)); }, title: Row( mainAxisAlignment: MainAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start, children: [ Expanded( child: Text( DateTimeUtils.displayTime(logEntry.time), ), ), Expanded( child: Column( children: logEntry.mgPerDl != null && (Settings.glucoseMeasurement == GlucoseMeasurement.mgPerDl || Settings.glucoseDisplayMode == GlucoseDisplayMode.both || Settings.glucoseDisplayMode == GlucoseDisplayMode .bothForList) ? [ Text(logEntry.mgPerDl.toString()), const Text( 'mg/dl', textScaleFactor: 0.75, ), ] : [], ), ), Expanded( child: Column( children: logEntry.mmolPerL != null && (Settings.glucoseMeasurement == GlucoseMeasurement.mmolPerL || Settings.glucoseDisplayMode == GlucoseDisplayMode.both || Settings.glucoseDisplayMode == GlucoseDisplayMode .bothForList) ? [ Text(logEntry.mmolPerL.toString()), const Text( 'mmol/l', textScaleFactor: 0.75, ), ] : [], ), ), Expanded( child: Column( children: (bolus > 0) ? [ Text(bolus.toStringAsPrecision(3)), const Text('U', textScaleFactor: 0.75), ] : [], ), ), Expanded( child: Column( children: (carbs > 0) ? [ Text(carbs.toStringAsPrecision(3)), Text( Settings.nutritionMeasurementSuffix, textScaleFactor: 0.75), ] : [], ), ), ], ), trailing: Row( mainAxisSize: MainAxisSize.min, children: [ IconButton( onPressed: () => handleDeleteAction(logEntry), icon: const Icon(Icons.delete, color: Colors.blue), ) ], ), )); } return ListBody( children: [Text(DateTimeUtils.displayDate(date))] + tiles, ); }, ) : const Center( child: Text('You have not created any Log Entries yet!'), ), ), ], ), floatingActionButton: FloatingActionButton( onPressed: () { Navigator.push( context, MaterialPageRoute( builder: (context) => const LogEntryScreen(), ), ).then((message) => reload(message: message)); }, child: const Icon(Icons.add), ), ); } }