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;
}