Files
TravelMate/lib/blocs/balance/balance_bloc.dart
Dayron 4edbd1cf34 feat: Add User and UserBalance models with serialization methods
feat: Implement BalanceRepository for group balance calculations

feat: Create ExpenseRepository for managing expenses

feat: Add services for handling expenses and storage operations

fix: Update import paths for models in repositories and services

refactor: Rename CountContent to AccountContent in HomePage

chore: Add StorageService for image upload and management
2025-10-21 16:02:58 +02:00

81 lines
2.7 KiB
Dart

import 'package:flutter_bloc/flutter_bloc.dart';
import '../../repositories/balance_repository.dart';
import '../../repositories/expense_repository.dart';
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;
final ErrorService _errorService;
BalanceBloc({
required BalanceRepository balanceRepository,
required ExpenseRepository expenseRepository,
BalanceService? balanceService,
ErrorService? errorService,
}) : _balanceRepository = balanceRepository,
_balanceService = balanceService ?? BalanceService(balanceRepository: balanceRepository, expenseRepository: expenseRepository),
_errorService = errorService ?? ErrorService(),
super(BalanceInitial()) {
on<LoadGroupBalance>(_onLoadGroupBalance);
on<RefreshBalance>(_onRefreshBalance);
on<MarkSettlementAsCompleted>(_onMarkSettlementAsCompleted);
}
Future<void> _onLoadGroupBalance(
LoadGroupBalance event,
Emitter<BalanceState> emit,
) async {
try {
emit(BalanceLoading());
final groupBalance = await _balanceRepository.calculateGroupBalance(event.groupId);
emit(BalanceLoaded(groupBalance));
} catch (e) {
_errorService.logError('BalanceBloc', 'Erreur chargement balance: $e');
emit(BalanceError(e.toString()));
}
}
Future<void> _onRefreshBalance(
RefreshBalance event,
Emitter<BalanceState> emit,
) async {
try {
// Garde l'état actuel pendant le refresh si possible
if (state is! BalanceLoaded) {
emit(BalanceLoading());
}
final groupBalance = await _balanceRepository.calculateGroupBalance(event.groupId);
emit(BalanceLoaded(groupBalance));
} catch (e) {
_errorService.logError('BalanceBloc', 'Erreur refresh balance: $e');
emit(BalanceError(e.toString()));
}
}
Future<void> _onMarkSettlementAsCompleted(
MarkSettlementAsCompleted event,
Emitter<BalanceState> emit,
) async {
try {
await _balanceService.markSettlementAsCompleted(
groupId: event.groupId,
fromUserId: event.fromUserId,
toUserId: event.toUserId,
amount: event.amount,
);
emit(const BalanceOperationSuccess('Règlement marqué comme effectué'));
// Recharger la balance après le règlement
add(RefreshBalance(event.groupId));
} catch (e) {
_errorService.logError('BalanceBloc', 'Erreur mark settlement: $e');
emit(BalanceError(e.toString()));
}
}
}