feat(App): update Finlytic Flutter app UI and blocs

This commit is contained in:
2026-08-09 21:01:46 +02:00
parent e7427b7464
commit a708d2977c
591 changed files with 1095105 additions and 0 deletions
@@ -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];
}