generateCumulativeTimeSlots static method

List<DateTime> generateCumulativeTimeSlots(
  1. DateTime from,
  2. DateTime to,
  3. int limit,
  4. Map<String, List<TimeRange>>? availability,
  5. Map<String, Map<String, dynamic>> blockedDates,
  6. int interval,
  7. Duration bufferTime,
  8. String messageTimeZone,
  9. String localTimeZone,
)

Implementation

static List<DateTime> generateCumulativeTimeSlots(
  DateTime from,
  DateTime to,
  int limit,
  Map<String, List<TimeRange>>? availability,
  Map<String, Map<String, dynamic>> blockedDates,
  int interval,
  Duration bufferTime,
  String messageTimeZone,
  String localTimeZone,
) {
  List<DateTime> cumulativeTimeSlots = [];
  while (cumulativeTimeSlots.length < limit && from.isBefore(to)) {
    String day = DateFormat('yMd').format(from);
    List<DateTimeRange>? blockedTime;
    List<DateTimeRange>? availableSlots;
    if (blockedDates.containsKey(day)) {
      blockedTime = blockedDates[day]!["timings"].cast<DateTimeRange>();
    }

    List<DateTimeRange>? nextDayBlockedTime;
    String day2 = DateFormat('yMd').format(from.add(const Duration(days: 1)));
    if (blockedDates.containsKey(day2)) {
      nextDayBlockedTime = blockedDates[day2]!["timings"]
          .cast<DateTimeRange>();
    }

    availableSlots = getAvailableSlots(
      from,
      messageTimeZone,
      localTimeZone,
      availability,
    );

    DateTime nextDay = from.add(const Duration(days: 1));
    List<DateTimeRange>? nextDayAvailableSlots;

    nextDayAvailableSlots = getAvailableSlots(
      nextDay,
      messageTimeZone,
      localTimeZone,
      availability,
    );

    List<DateTime> generatedTimeStamps = generateTimeStamps(
      from,
      availableSlots,
      blockedTime ?? [],
      interval,
      bufferTime,
      TimeFormat.twelveHour,
      nextDayAvailableSlots,
      nextDayBlockedTime ?? [],
    );

    if (generatedTimeStamps.isNotEmpty) {
      if (generatedTimeStamps.length > limit - cumulativeTimeSlots.length) {
        cumulativeTimeSlots.addAll(
          generatedTimeStamps
              .sublist(0, limit - cumulativeTimeSlots.length)
              .toList(),
        );
      } else {
        cumulativeTimeSlots.addAll(generatedTimeStamps);
      }
    }

    from = from.add(const Duration(days: 1));
  }
  return cumulativeTimeSlots;
}