From 40d80801a0b54f0af5bb25e6ee207f8b96377e72 Mon Sep 17 00:00:00 2001 From: Freek van de Ven Date: Wed, 24 Jul 2024 13:32:46 +0200 Subject: [PATCH] fix: only change availability details when entire range is covered by a template --- .../view_models/availability_view_model.dart | 40 +++++++++++++------ 1 file changed, 28 insertions(+), 12 deletions(-) diff --git a/packages/flutter_availability/lib/src/ui/view_models/availability_view_model.dart b/packages/flutter_availability/lib/src/ui/view_models/availability_view_model.dart index 3df4a70..20fbedc 100644 --- a/packages/flutter_availability/lib/src/ui/view_models/availability_view_model.dart +++ b/packages/flutter_availability/lib/src/ui/view_models/availability_view_model.dart @@ -31,7 +31,10 @@ class AvailabilityViewModel { List models, DateTimeRange range, ) { - var coveredByAvailabilities = models.length == (range.duration.inDays + 1); + var coveredByAvailabilities = _rangeIsCoveredWithAvailabilities( + models.length, + range, + ); var userId = models.firstOrNull?.availabilityModel.userId; // if there is no availability there is no conflicting time or pauses var conflictingPauses = models.isNotEmpty; @@ -128,17 +131,23 @@ class AvailabilityViewModel { var breaks = []; var appliedAvailabilities = template.apply(selectedRange.start, selectedRange.end); - - if (_availabilityTimesAreEqual(appliedAvailabilities)) { - conflictingTime = false; - startTime = TimeOfDay.fromDateTime(appliedAvailabilities.first.startDate); - endTime = TimeOfDay.fromDateTime(appliedAvailabilities.first.endDate); - } - if (_availabilityBreaksAreEqual(appliedAvailabilities)) { - conflictingPauses = false; - breaks = appliedAvailabilities.first.breaks - .map(BreakViewModel.fromAvailabilityBreakModel) - .toList(); + // If there are missing days in the range, the time cannot be applied + if (_rangeIsCoveredWithAvailabilities( + appliedAvailabilities.length, + selectedRange, + )) { + if (_availabilityTimesAreEqual(appliedAvailabilities)) { + conflictingTime = false; + startTime = + TimeOfDay.fromDateTime(appliedAvailabilities.first.startDate); + endTime = TimeOfDay.fromDateTime(appliedAvailabilities.first.endDate); + } + if (_availabilityBreaksAreEqual(appliedAvailabilities)) { + conflictingPauses = false; + breaks = appliedAvailabilities.first.breaks + .map(BreakViewModel.fromAvailabilityBreakModel) + .toList(); + } } return copyWith( @@ -237,3 +246,10 @@ bool _availabilityBreaksAreEqual(List availabilityModels) { var breaks = firstModel.breaks; return availabilityModels.every((model) => model.breaksEqual(breaks)); } + +/// Checks if there are as many availabilities as days in the range +bool _rangeIsCoveredWithAvailabilities( + int amountOfAvailabilities, + DateTimeRange range, +) => + amountOfAvailabilities == (range.duration.inDays + 1);