From 9ba32016b867e06e5f9fc6a42de0a164280ad285 Mon Sep 17 00:00:00 2001 From: Freek van de Ven Date: Wed, 10 Jul 2024 15:16:58 +0200 Subject: [PATCH] fix: change DateTime to TimeOfDay for timeselection widgets --- .../src/config/availability_translations.dart | 8 +-- .../template_availability_day_overview.dart | 24 ++------- .../lib/src/ui/screens/template_day_edit.dart | 26 ++++++++-- .../widgets/availabillity_time_selection.dart | 8 +-- .../ui/widgets/generic_time_selection.dart | 8 +-- .../lib/src/ui/widgets/input_fields.dart | 18 ++----- .../lib/src/ui/widgets/pause_selection.dart | 49 ++++++++++++++----- .../ui/widgets/template_time_selection.dart | 8 +-- 8 files changed, 84 insertions(+), 65 deletions(-) diff --git a/packages/flutter_availability/lib/src/config/availability_translations.dart b/packages/flutter_availability/lib/src/config/availability_translations.dart index 5a03993..879f2c7 100644 --- a/packages/flutter_availability/lib/src/config/availability_translations.dart +++ b/packages/flutter_availability/lib/src/config/availability_translations.dart @@ -225,12 +225,12 @@ class AvailabilityTranslations { /// Get the time formatted as a string /// /// The default implementation is `HH:mm` - final String Function(BuildContext, DateTime) timeFormatter; + final String Function(BuildContext, TimeOfDay) timeFormatter; } -String _defaultTimeFormatter(BuildContext context, DateTime date) => - "${date.hour.toString().padLeft(2, '0')}:" - "${date.minute.toString().padLeft(2, '0')}"; +String _defaultTimeFormatter(BuildContext context, TimeOfDay time) => + "${time.hour.toString().padLeft(2, '0')}:" + "${time.minute.toString().padLeft(2, '0')}"; String _defaultDayMonthFormatter(BuildContext context, DateTime date) => "${_getDayName(date.weekday)} ${date.day} ${_getMonthName(date.month)}"; diff --git a/packages/flutter_availability/lib/src/ui/screens/template_availability_day_overview.dart b/packages/flutter_availability/lib/src/ui/screens/template_availability_day_overview.dart index fe311d5..eb318c0 100644 --- a/packages/flutter_availability/lib/src/ui/screens/template_availability_day_overview.dart +++ b/packages/flutter_availability/lib/src/ui/screens/template_availability_day_overview.dart @@ -108,30 +108,14 @@ class _AvailabilityModificationViewState var timeSelection = AvailabilityTimeSelection( dateRange: widget.dateRange, - startTime: _startTime != null - ? DateTime( - widget.dateRange.start.year, - widget.dateRange.start.month, - widget.dateRange.start.day, - _startTime!.hour, - _startTime!.minute, - ) - : null, - endTime: _endTime != null - ? DateTime( - widget.dateRange.start.year, - widget.dateRange.start.month, - widget.dateRange.start.day, - _endTime!.hour, - _endTime!.minute, - ) - : null, + startTime: _startTime, + endTime: _endTime, key: ValueKey([_startTime, _endTime]), onStartChanged: (start) => setState(() { - _startTime = TimeOfDay.fromDateTime(start); + _startTime = start; }), onEndChanged: (end) => setState(() { - _endTime = TimeOfDay.fromDateTime(end); + _endTime = end; }), ); diff --git a/packages/flutter_availability/lib/src/ui/screens/template_day_edit.dart b/packages/flutter_availability/lib/src/ui/screens/template_day_edit.dart index 7565b1a..3d04ec4 100644 --- a/packages/flutter_availability/lib/src/ui/screens/template_day_edit.dart +++ b/packages/flutter_availability/lib/src/ui/screens/template_day_edit.dart @@ -104,22 +104,40 @@ class _AvailabilityDayTemplateEditState var timeSection = TemplateTimeSelection( key: ValueKey(_template.templateData), - startTime: (_template.templateData as DayTemplateData).startTime, - endTime: (_template.templateData as DayTemplateData).endTime, + startTime: TimeOfDay.fromDateTime( + (_template.templateData as DayTemplateData).startTime,), + endTime: TimeOfDay.fromDateTime( + (_template.templateData as DayTemplateData).endTime,), onStartChanged: (start) { + var startTime = (_template.templateData as DayTemplateData).startTime; + var updatedStartTime = DateTime( + startTime.year, + startTime.month, + startTime.day, + start.hour, + start.minute, + ); setState(() { _template = _template.copyWith( templateData: (_template.templateData as DayTemplateData).copyWith( - startTime: start, + startTime: updatedStartTime, ), ); }); }, onEndChanged: (end) { + var endTime = (_template.templateData as DayTemplateData).endTime; + var updatedEndTime = DateTime( + endTime.year, + endTime.month, + endTime.day, + end.hour, + end.minute, + ); setState(() { _template = _template.copyWith( templateData: (_template.templateData as DayTemplateData).copyWith( - endTime: end, + endTime: updatedEndTime, ), ); }); diff --git a/packages/flutter_availability/lib/src/ui/widgets/availabillity_time_selection.dart b/packages/flutter_availability/lib/src/ui/widgets/availabillity_time_selection.dart index 69a0bff..1932408 100644 --- a/packages/flutter_availability/lib/src/ui/widgets/availabillity_time_selection.dart +++ b/packages/flutter_availability/lib/src/ui/widgets/availabillity_time_selection.dart @@ -15,16 +15,16 @@ class AvailabilityTimeSelection extends StatelessWidget { }); /// - final DateTime? startTime; + final TimeOfDay? startTime; /// - final DateTime? endTime; + final TimeOfDay? endTime; /// - final void Function(DateTime) onStartChanged; + final void Function(TimeOfDay) onStartChanged; /// - final void Function(DateTime) onEndChanged; + final void Function(TimeOfDay) onEndChanged; /// The date range for which the availabilities are being managed final DateTimeRange dateRange; diff --git a/packages/flutter_availability/lib/src/ui/widgets/generic_time_selection.dart b/packages/flutter_availability/lib/src/ui/widgets/generic_time_selection.dart index 92dc6c6..cb9ecf4 100644 --- a/packages/flutter_availability/lib/src/ui/widgets/generic_time_selection.dart +++ b/packages/flutter_availability/lib/src/ui/widgets/generic_time_selection.dart @@ -26,16 +26,16 @@ class TimeSelection extends StatelessWidget { final CrossAxisAlignment crossAxisAlignment; /// - final DateTime? startTime; + final TimeOfDay? startTime; /// - final DateTime? endTime; + final TimeOfDay? endTime; /// - final void Function(DateTime) onStartChanged; + final void Function(TimeOfDay) onStartChanged; /// - final void Function(DateTime) onEndChanged; + final void Function(TimeOfDay) onEndChanged; @override Widget build(BuildContext context) { diff --git a/packages/flutter_availability/lib/src/ui/widgets/input_fields.dart b/packages/flutter_availability/lib/src/ui/widgets/input_fields.dart index 7b8ba8b..9cd728a 100644 --- a/packages/flutter_availability/lib/src/ui/widgets/input_fields.dart +++ b/packages/flutter_availability/lib/src/ui/widgets/input_fields.dart @@ -11,10 +11,10 @@ class TimeInputField extends StatelessWidget { }); /// - final DateTime? initialValue; + final TimeOfDay? initialValue; /// - final void Function(DateTime) onTimeChanged; + final void Function(TimeOfDay) onTimeChanged; @override Widget build(BuildContext context) { @@ -24,22 +24,14 @@ class TimeInputField extends StatelessWidget { var translations = options.translations; Future onFieldtap() async { - var initialTime = TimeOfDay.fromDateTime(initialValue ?? DateTime.now()); + var initialTime = initialValue ?? TimeOfDay.now(); var time = await (options.timePickerBuilder?.call(context, initialTime) ?? showTimePicker( context: context, - initialTime: TimeOfDay.fromDateTime(initialValue ?? DateTime.now()), + initialTime: initialTime, )); if (time != null) { - onTimeChanged( - DateTime( - initialValue?.year ?? DateTime.now().year, - initialValue?.month ?? DateTime.now().month, - initialValue?.day ?? DateTime.now().day, - time.hour, - time.minute, - ), - ); + onTimeChanged(time); } } diff --git a/packages/flutter_availability/lib/src/ui/widgets/pause_selection.dart b/packages/flutter_availability/lib/src/ui/widgets/pause_selection.dart index 45a88b6..a733faf 100644 --- a/packages/flutter_availability/lib/src/ui/widgets/pause_selection.dart +++ b/packages/flutter_availability/lib/src/ui/widgets/pause_selection.dart @@ -136,6 +136,15 @@ class BreakDisplay extends StatelessWidget { var colors = options.colors; var translations = options.translations; + var starTime = translations.timeFormatter( + context, + TimeOfDay.fromDateTime(breakModel.startTime), + ); + var endTime = translations.timeFormatter( + context, + TimeOfDay.fromDateTime(breakModel.endTime), + ); + return GestureDetector( onTap: onClick, child: Container( @@ -150,8 +159,8 @@ class BreakDisplay extends StatelessWidget { Text( "${breakModel.duration.inMinutes} " "${translations.timeMinutes} | " - "${translations.timeFormatter(context, breakModel.startTime)} - " - "${translations.timeFormatter(context, breakModel.endTime)}", + "$starTime - " + "$endTime", ), const Spacer(), GestureDetector(onTap: onRemove, child: const Icon(Icons.remove)), @@ -207,15 +216,19 @@ class AvailabilityBreakSelectionDialog extends StatefulWidget { class _AvailabilityBreakSelectionDialogState extends State { - late DateTime? _startTime; - late DateTime? _endTime; + late TimeOfDay? _startTime; + late TimeOfDay? _endTime; late Duration? _duration; @override void initState() { super.initState(); - _startTime = widget.initialBreak?.startTime; - _endTime = widget.initialBreak?.endTime; + _startTime = widget.initialBreak != null + ? TimeOfDay.fromDateTime(widget.initialBreak!.startTime) + : null; + _endTime = widget.initialBreak != null + ? TimeOfDay.fromDateTime(widget.initialBreak!.endTime) + : null; _duration = widget.initialBreak?.duration; } @@ -234,15 +247,15 @@ class _AvailabilityBreakSelectionDialogState }); } - void onUpdateStart(DateTime time) { + void onUpdateStart(TimeOfDay start) { setState(() { - _startTime = time; + _startTime = start; }); } - void onUpdateEnd(DateTime time) { + void onUpdateEnd(TimeOfDay end) { setState(() { - _endTime = time; + _endTime = end; }); } @@ -251,8 +264,20 @@ class _AvailabilityBreakSelectionDialogState var onSaveButtonPress = canSave ? () { var breakModel = AvailabilityBreakModel( - startTime: _startTime!, - endTime: _endTime!, + startTime: DateTime( + DateTime.now().year, + DateTime.now().month, + DateTime.now().day, + _startTime!.hour, + _startTime!.minute, + ), + endTime: DateTime( + DateTime.now().year, + DateTime.now().month, + DateTime.now().day, + _endTime!.hour, + _endTime!.minute, + ), duration: _duration, ); Navigator.of(context).pop(breakModel); diff --git a/packages/flutter_availability/lib/src/ui/widgets/template_time_selection.dart b/packages/flutter_availability/lib/src/ui/widgets/template_time_selection.dart index cfb4299..fd44893 100644 --- a/packages/flutter_availability/lib/src/ui/widgets/template_time_selection.dart +++ b/packages/flutter_availability/lib/src/ui/widgets/template_time_selection.dart @@ -14,16 +14,16 @@ class TemplateTimeSelection extends StatelessWidget { }); /// - final DateTime? startTime; + final TimeOfDay? startTime; /// - final DateTime? endTime; + final TimeOfDay? endTime; /// - final void Function(DateTime) onStartChanged; + final void Function(TimeOfDay) onStartChanged; /// - final void Function(DateTime) onEndChanged; + final void Function(TimeOfDay) onEndChanged; @override Widget build(BuildContext context) {