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;

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

    _events = calendarEvents;

    _events.sort((a, b) => a.startDate.compareTo(b.startDate));

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