feat(App): update Finlytic Flutter app UI and blocs
This commit is contained in:
@@ -0,0 +1,65 @@
|
||||
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();
|
||||
emit(CalendarLoaded(
|
||||
allEvents: events,
|
||||
currentMonth: DateTime.now(),
|
||||
));
|
||||
} 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,
|
||||
));
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,37 @@
|
||||
import 'package:equatable/equatable.dart';
|
||||
|
||||
abstract class CalendarEvent extends Equatable {
|
||||
const CalendarEvent();
|
||||
|
||||
@override
|
||||
List<Object?> get props => [];
|
||||
}
|
||||
|
||||
class FetchCalendarEvents extends CalendarEvent {}
|
||||
|
||||
class FilterCategoryChanged extends CalendarEvent {
|
||||
final String category;
|
||||
|
||||
const FilterCategoryChanged(this.category);
|
||||
|
||||
@override
|
||||
List<Object?> get props => [category];
|
||||
}
|
||||
|
||||
class FilterDateSelected extends CalendarEvent {
|
||||
final DateTime? date;
|
||||
|
||||
const FilterDateSelected(this.date);
|
||||
|
||||
@override
|
||||
List<Object?> get props => [date];
|
||||
}
|
||||
|
||||
class MonthChanged extends CalendarEvent {
|
||||
final DateTime newMonth;
|
||||
|
||||
const MonthChanged(this.newMonth);
|
||||
|
||||
@override
|
||||
List<Object?> get props => [newMonth];
|
||||
}
|
||||
@@ -0,0 +1,70 @@
|
||||
import 'package:equatable/equatable.dart';
|
||||
import 'package:finlytic_app/features/calendar/models/corporate_event_model.dart';
|
||||
|
||||
abstract class CalendarState extends Equatable {
|
||||
const CalendarState();
|
||||
|
||||
@override
|
||||
List<Object?> get props => [];
|
||||
}
|
||||
|
||||
class CalendarInitial extends CalendarState {}
|
||||
|
||||
class CalendarLoading extends CalendarState {}
|
||||
|
||||
class CalendarLoaded extends CalendarState {
|
||||
final List<CorporateEventModel> allEvents;
|
||||
final String selectedCategory;
|
||||
final DateTime currentMonth;
|
||||
final DateTime? selectedDate;
|
||||
|
||||
const CalendarLoaded({
|
||||
required this.allEvents,
|
||||
this.selectedCategory = 'Alle',
|
||||
required this.currentMonth,
|
||||
this.selectedDate,
|
||||
});
|
||||
|
||||
List<CorporateEventModel> get filteredEvents {
|
||||
return allEvents.where((e) {
|
||||
if (selectedCategory != 'Alle' && e.eventType != selectedCategory) {
|
||||
return false;
|
||||
}
|
||||
if (selectedDate != null) {
|
||||
if (e.eventDate.year != selectedDate!.year ||
|
||||
e.eventDate.month != selectedDate!.month ||
|
||||
e.eventDate.day != selectedDate!.day) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}).toList();
|
||||
}
|
||||
|
||||
CalendarLoaded copyWith({
|
||||
List<CorporateEventModel>? allEvents,
|
||||
String? selectedCategory,
|
||||
DateTime? currentMonth,
|
||||
DateTime? selectedDate,
|
||||
bool clearSelectedDate = false,
|
||||
}) {
|
||||
return CalendarLoaded(
|
||||
allEvents: allEvents ?? this.allEvents,
|
||||
selectedCategory: selectedCategory ?? this.selectedCategory,
|
||||
currentMonth: currentMonth ?? this.currentMonth,
|
||||
selectedDate: clearSelectedDate ? null : (selectedDate ?? this.selectedDate),
|
||||
);
|
||||
}
|
||||
|
||||
@override
|
||||
List<Object?> get props => [allEvents, selectedCategory, currentMonth, selectedDate];
|
||||
}
|
||||
|
||||
class CalendarError extends CalendarState {
|
||||
final String message;
|
||||
|
||||
const CalendarError(this.message);
|
||||
|
||||
@override
|
||||
List<Object?> get props => [message];
|
||||
}
|
||||
Reference in New Issue
Block a user