2021-10-22 23:08:09 +00:00
import ' package:diameter/components/dialogs.dart ' ;
2021-12-04 23:44:46 +00:00
import ' package:diameter/models/settings.dart ' ;
2021-10-25 23:11:58 +00:00
import ' package:diameter/utils/date_time_utils.dart ' ;
2021-10-22 23:08:09 +00:00
import ' package:flutter/material.dart ' ;
import ' package:diameter/models/bolus.dart ' ;
import ' package:diameter/models/bolus_profile.dart ' ;
import ' package:diameter/screens/bolus/bolus_detail.dart ' ;
class BolusListScreen extends StatefulWidget {
2021-11-07 20:13:28 +00:00
final BolusProfile bolusProfile ;
final List < Bolus > bolusRates ;
final Function ( ) reload ;
2021-10-22 23:08:09 +00:00
2021-11-07 20:13:28 +00:00
const BolusListScreen (
{ Key ? key , required this . bolusProfile , this . bolusRates = const [ ] , required this . reload } )
: super ( key: key ) ;
2021-10-22 23:08:09 +00:00
@ override
_BolusListScreenState createState ( ) = > _BolusListScreenState ( ) ;
}
class _BolusListScreenState extends State < BolusListScreen > {
2021-11-07 20:13:28 +00:00
void reload ( { String ? message } ) {
widget . reload ( ) ;
2021-10-22 23:08:09 +00:00
setState ( ( ) {
if ( message ! = null ) {
var snackBar = SnackBar (
content: Text ( message ) ,
duration: const Duration ( seconds: 2 ) ,
) ;
ScaffoldMessenger . of ( context )
. . removeCurrentSnackBar ( )
. . showSnackBar ( snackBar ) ;
}
} ) ;
}
void handleEditAction ( Bolus bolus ) {
Navigator . push (
context ,
MaterialPageRoute (
builder: ( context ) = > BolusDetailScreen (
2021-11-07 20:13:28 +00:00
bolusProfileId: widget . bolusProfile . id ,
id: bolus . id ,
2021-10-22 23:08:09 +00:00
) ,
) ,
2021-11-07 20:13:28 +00:00
) . then ( ( message ) = > reload ( message: message ) ) ;
2021-10-22 23:08:09 +00:00
}
void onDelete ( Bolus bolus ) {
2021-11-07 20:13:28 +00:00
Bolus . remove ( bolus . id ) ;
reload ( message: ' Bolus Rate deleted ' ) ;
2021-10-22 23:08:09 +00:00
}
void handleDeleteAction ( Bolus bolus ) async {
2021-12-04 23:44:46 +00:00
if ( Settings . get ( ) . showConfirmationDialogOnDelete ) {
2021-10-22 23:08:09 +00:00
Dialogs . showConfirmationDialog (
context: context ,
onConfirm: ( ) = > onDelete ( bolus ) ,
message: ' Are you sure you want to delete this Bolus Rate? ' ,
) ;
} else {
onDelete ( bolus ) ;
}
}
2021-11-07 20:13:28 +00:00
String ? validateTimePeriod ( int index ) {
List < Bolus > bolusRates = widget . bolusRates ;
2021-10-25 23:11:58 +00:00
Bolus bolus = bolusRates [ index ] ;
if ( index = = 0 & &
( bolus . startTime . toLocal ( ) . hour ! = 0 | | bolus . startTime . minute ! = 0 ) ) {
return ' First Bolus of the day needs to start at 00:00 ' ;
}
if ( index > 0 ) {
var lastEndTime = bolusRates [ index - 1 ] . endTime ;
if ( bolus . startTime . isAfter ( lastEndTime ) ) {
return ' There \' s a time gap between this and the previous rate ' ;
}
}
if ( index = = bolusRates . length - 1 & &
( bolus . endTime . toLocal ( ) . hour ! = 0 | | bolus . endTime . minute ! = 0 ) ) {
return ' Last Bolus of the day needs to end at 00:00 ' ;
}
// check for duplicates
if ( bolusRates
. where ( ( other ) = > bolus ! = other & & bolus . startTime = = other . startTime )
. isNotEmpty ) {
return ' There are multiple rates with this start time ' ;
}
if ( bolusRates
. where ( ( other ) = >
bolus . startTime . isBefore ( other . startTime ) & &
bolus . endTime . isAfter ( other . startTime ) )
. isNotEmpty ) {
return ' This rate \' s time period overlaps with another one ' ;
}
}
2021-10-22 23:08:09 +00:00
@ override
Widget build ( BuildContext context ) {
2021-11-26 23:01:12 +00:00
return widget . bolusRates . isNotEmpty ? SingleChildScrollView (
2021-10-22 23:08:09 +00:00
padding: const EdgeInsets . only ( top: 10.0 ) ,
child: Column (
children: [
2021-11-26 23:01:12 +00:00
ListView . builder (
2021-11-07 20:13:28 +00:00
shrinkWrap: true ,
itemCount: widget . bolusRates . length ,
itemBuilder: ( context , index ) {
final bolus = widget . bolusRates [ index ] ;
final error = validateTimePeriod ( index ) ;
return ListTile (
isThreeLine: true ,
tileColor: error ! = null ? Colors . red . shade100 : null ,
onTap: ( ) {
handleEditAction ( bolus ) ;
} ,
title: Text (
' ${ DateTimeUtils . displayTime ( bolus . startTime ) } - ${ DateTimeUtils . displayTime ( bolus . endTime ) } ' ) ,
subtitle: Column (
mainAxisSize: MainAxisSize . max ,
crossAxisAlignment: CrossAxisAlignment . start ,
children: [
Text (
2021-12-06 00:11:22 +00:00
' ${ bolus . units } U per ${ bolus . carbs } ${ Settings . nutritionMeasurementSuffix } carbs/ ${ Settings . glucoseMeasurement = = GlucoseMeasurement . mgPerDl ? bolus . mgPerDl : bolus . mmolPerL } ${ Settings . glucoseMeasurementSuffix } ' ) ,
2021-11-07 20:13:28 +00:00
error ! = null
? Text ( error ,
style: const TextStyle ( color: Colors . red ) )
: const Text ( ' ' )
] ) ,
trailing: Row (
mainAxisSize: MainAxisSize . min ,
children: [
IconButton (
icon: const Icon (
Icons . delete ,
color: Colors . blue ,
2021-10-22 23:08:09 +00:00
) ,
2021-11-07 20:13:28 +00:00
onPressed: ( ) = > handleDeleteAction ( bolus ) ,
) ,
] ,
) ,
2021-10-22 23:08:09 +00:00
) ;
} ,
2021-11-26 23:01:12 +00:00
) ,
2021-10-22 23:08:09 +00:00
] ,
) ,
2021-11-26 23:01:12 +00:00
) : const Center (
child: Text ( ' You have not created any Bolus Rates yet! ' ) ,
) ;
2021-10-22 23:08:09 +00:00
}
}