fetchEvents method

Future<void> fetchEvents(
  1. DateTime displayDate
)

Fetches calendar events for the given displayDate and selected template.

Updates loading and error states, and sorts events by start date. On initial load, it may adjust the display date if the current month has no events and other months do.

Implementation

Future<void> fetchEvents(DateTime displayDate) async {
  _displayDate = displayDate;
  final selectedTemplateId = _templateProvider?.selectedTemplateId;

  _isLoading = true;
  _errorMessage = null;
  notifyListeners();

  try {
    final calendarEvents = await _calendarRepository.fetchMonthEvents(
      templateId: selectedTemplateId,
      displayDate: _displayDate,
      parentElementsOnly: false,
    );

    _events =
        calendarEvents; // The repository now directly returns CalendarMonthEvent

    // Sort events to make sure `_events.first` is the earliest one.
    _events.sort((a, b) => a.startDate.compareTo(b.startDate));

    // On the first load, if the current month has no events, jump to the first event's month.
    if (_isInitialLoad) {
      final firstDayOfDisplayMonth =
          DateTime(_displayDate.year, _displayDate.month, 1);
      final lastDayOfDisplayMonth =
          DateTime(_displayDate.year, _displayDate.month + 1, 0)
              .add(const Duration(days: 1));
      final bool hasEventsInCurrentMonth = _events.any((event) =>
          event.startDate.isBefore(lastDayOfDisplayMonth) &&
          event.endDate.isAfter(firstDayOfDisplayMonth));

      if (!hasEventsInCurrentMonth && _events.isNotEmpty) {
        _displayDate = _events.first.startDate;
      }
      _isInitialLoad = false;
    }
  } catch (e) {
    _errorMessage = 'Failed to load calendar events: $e';
    debugPrint('Error fetching events in CalendarMonthViewModel: $e');
    _events = [];
  } finally {
    _isLoading = false;
    notifyListeners();
  }
}