adjustAvailableSlots static method

List<DateTimeRange<DateTime>> adjustAvailableSlots(
  1. List<DateTimeRange<DateTime>> availableSlots,
  2. List<DateTimeRange<DateTime>> blockedSlots,
  3. Duration bufferTime,
  4. DateTime selectedDate,
)

Implementation

static List<DateTimeRange> adjustAvailableSlots(
  List<DateTimeRange> availableSlots,
  List<DateTimeRange> blockedSlots,
  Duration bufferTime,
  DateTime selectedDate,
) {
  List<DateTimeRange> adjustedSlots = [];

  for (var availableSlot in availableSlots) {
    for (var blockedSlot in blockedSlots) {
      DateTime availableStart = availableSlot.start;
      DateTime availableEnd = availableSlot.end;
      DateTime blockedStart = blockedSlot.start;
      DateTime blockedEnd = blockedSlot.end;
      if (blockedEnd.day > selectedDate.day) {
        blockedEnd = DateTime(
          selectedDate.year,
          selectedDate.month,
          selectedDate.day,
          23,
          59,
          59,
        );
        // bufferTime = Duration.zero;
      }
      if (blockedStart.day < selectedDate.day) {
        blockedStart = DateTime(
          selectedDate.year,
          selectedDate.month,
          selectedDate.day,
          0,
          0,
          0,
        );
      }

      if (availableStart.isBefore(blockedEnd) &&
          availableEnd.isAfter(blockedStart)) {
        // Adjust the available slot
        if (availableStart.isBefore(blockedStart)) {
          if (blockedEnd.add(bufferTime).isBefore(availableEnd)) {
            adjustedSlots.add(
              DateTimeRange(start: availableStart, end: blockedStart),
            );
            availableStart = blockedEnd.add(bufferTime);
          }
          adjustedSlots.add(
            DateTimeRange(start: availableStart, end: availableEnd),
          );
        } else {
          if (blockedEnd.isBefore(availableEnd)) {
            adjustedSlots.add(
              DateTimeRange(
                start: blockedEnd.add(bufferTime),
                end: availableEnd,
              ),
            );
          }
        }
      } else if (blockedEnd.isAtSameMomentAs(availableStart)) {
        adjustedSlots.add(
          DateTimeRange(start: blockedEnd.add(bufferTime), end: availableEnd),
        );
      } else {
        adjustedSlots.add(availableSlot);
      }
    }
  }

  return adjustedSlots;
}