69 lines
2.3 KiB
Dart
69 lines
2.3 KiB
Dart
import 'dart:async';
|
|
import 'package:flutter_bloc/flutter_bloc.dart';
|
|
import 'package:finlytic_app/features/calendar/repositories/calendar_repository.dart';
|
|
import 'calendar_event.dart';
|
|
import 'calendar_state.dart';
|
|
|
|
export 'calendar_event.dart';
|
|
export 'calendar_state.dart';
|
|
|
|
class CalendarBloc extends Bloc<CalendarEvent, CalendarState> {
|
|
final CalendarRepository repository;
|
|
|
|
CalendarBloc({required this.repository}) : super(CalendarInitial()) {
|
|
on<FetchCalendarEvents>(_onFetchEvents);
|
|
on<FilterCategoryChanged>(_onFilterCategoryChanged);
|
|
on<FilterDateSelected>(_onFilterDateSelected);
|
|
on<MonthChanged>(_onMonthChanged);
|
|
}
|
|
|
|
Future<void> _onFetchEvents(FetchCalendarEvents event, Emitter<CalendarState> emit) async {
|
|
emit(CalendarLoading());
|
|
try {
|
|
final events = await repository.fetchEvents(event.year, event.month);
|
|
emit(CalendarLoaded(
|
|
allEvents: events,
|
|
currentMonth: DateTime(event.year, event.month),
|
|
));
|
|
} catch (e) {
|
|
emit(const CalendarError("Fehler beim Laden des Kalenders."));
|
|
}
|
|
}
|
|
|
|
void _onFilterCategoryChanged(FilterCategoryChanged event, Emitter<CalendarState> emit) {
|
|
if (state is CalendarLoaded) {
|
|
final current = state as CalendarLoaded;
|
|
emit(current.copyWith(selectedCategory: event.category));
|
|
}
|
|
}
|
|
|
|
void _onFilterDateSelected(FilterDateSelected event, Emitter<CalendarState> emit) {
|
|
if (state is CalendarLoaded) {
|
|
final current = state as CalendarLoaded;
|
|
if (event.date == null) {
|
|
emit(current.copyWith(clearSelectedDate: true));
|
|
} else if (current.selectedDate != null &&
|
|
current.selectedDate!.year == event.date!.year &&
|
|
current.selectedDate!.month == event.date!.month &&
|
|
current.selectedDate!.day == event.date!.day) {
|
|
emit(current.copyWith(clearSelectedDate: true));
|
|
} else {
|
|
emit(current.copyWith(selectedDate: event.date));
|
|
}
|
|
}
|
|
}
|
|
|
|
void _onMonthChanged(MonthChanged event, Emitter<CalendarState> emit) {
|
|
if (state is CalendarLoaded) {
|
|
final current = state as CalendarLoaded;
|
|
emit(current.copyWith(
|
|
currentMonth: event.newMonth,
|
|
clearSelectedDate: true,
|
|
));
|
|
|
|
// Trigger new fetch for the selected month
|
|
add(FetchCalendarEvents(year: event.newMonth.year, month: event.newMonth.month));
|
|
}
|
|
}
|
|
}
|