feat: Implement group balance and expense management with new navigation and data handling

This commit is contained in:
Dayron
2025-10-28 13:06:42 +01:00
parent 94f1abfbc7
commit df1bb6da4a
10 changed files with 390 additions and 54 deletions

View File

@@ -5,6 +5,7 @@ import '../../services/balance_service.dart';
import '../../services/error_service.dart';
import 'balance_event.dart';
import 'balance_state.dart';
class BalanceBloc extends Bloc<BalanceEvent, BalanceState> {
final BalanceRepository _balanceRepository;
final BalanceService _balanceService;
@@ -19,20 +20,28 @@ class BalanceBloc extends Bloc<BalanceEvent, BalanceState> {
_balanceService = balanceService ?? BalanceService(balanceRepository: balanceRepository, expenseRepository: expenseRepository),
_errorService = errorService ?? ErrorService(),
super(BalanceInitial()) {
on<LoadGroupBalance>(_onLoadGroupBalance);
on<LoadGroupBalances>(_onLoadGroupBalance);
on<RefreshBalance>(_onRefreshBalance);
on<MarkSettlementAsCompleted>(_onMarkSettlementAsCompleted);
}
Future<void> _onLoadGroupBalance(
LoadGroupBalance event,
LoadGroupBalances event,
Emitter<BalanceState> emit,
) async {
try {
emit(BalanceLoading());
final groupBalance = await _balanceRepository.calculateGroupBalance(event.groupId);
emit(BalanceLoaded(groupBalance));
// Calculer les balances du groupe
final userBalances = await _balanceRepository.calculateGroupUserBalances(event.groupId);
// Calculer les règlements optimisés
final settlements = await _balanceService.calculateOptimalSettlements(event.groupId);
emit(GroupBalancesLoaded(
balances: userBalances,
settlements: settlements,
));
} catch (e) {
_errorService.logError('BalanceBloc', 'Erreur chargement balance: $e');
emit(BalanceError(e.toString()));
@@ -45,12 +54,20 @@ class BalanceBloc extends Bloc<BalanceEvent, BalanceState> {
) async {
try {
// Garde l'état actuel pendant le refresh si possible
if (state is! BalanceLoaded) {
if (state is! GroupBalancesLoaded) {
emit(BalanceLoading());
}
final groupBalance = await _balanceRepository.calculateGroupBalance(event.groupId);
emit(BalanceLoaded(groupBalance));
// Calculer les balances du groupe
final userBalances = await _balanceRepository.calculateGroupUserBalances(event.groupId);
// Calculer les règlements optimisés
final settlements = await _balanceService.calculateOptimalSettlements(event.groupId);
emit(GroupBalancesLoaded(
balances: userBalances,
settlements: settlements,
));
} catch (e) {
_errorService.logError('BalanceBloc', 'Erreur refresh balance: $e');
emit(BalanceError(e.toString()));

View File

@@ -7,13 +7,13 @@ abstract class BalanceEvent extends Equatable {
List<Object?> get props => [];
}
class LoadGroupBalance extends BalanceEvent {
class LoadGroupBalances extends BalanceEvent {
final String groupId;
const LoadGroupBalance(this.groupId);
const LoadGroupBalances(this.groupId);
@override
List<Object?> get props => [groupId];
List<Object> get props => [groupId];
}
class RefreshBalance extends BalanceEvent {

View File

@@ -1,5 +1,6 @@
import 'package:equatable/equatable.dart';
import '../../models/group_balance.dart';
import '../../models/settlement.dart';
import '../../models/user_balance.dart';
abstract class BalanceState extends Equatable {
const BalanceState();
@@ -12,13 +13,17 @@ class BalanceInitial extends BalanceState {}
class BalanceLoading extends BalanceState {}
class BalanceLoaded extends BalanceState {
final GroupBalance groupBalance;
const BalanceLoaded(this.groupBalance);
class GroupBalancesLoaded extends BalanceState {
final List<UserBalance> balances;
final List<Settlement> settlements;
const GroupBalancesLoaded({
required this.balances,
required this.settlements,
});
@override
List<Object?> get props => [groupBalance];
List<Object> get props => [balances, settlements];
}
class BalanceOperationSuccess extends BalanceState {