feat: Implement account management functionality with loading, creation, and error handling

This commit is contained in:
Dayron
2025-10-21 10:48:12 +02:00
parent c69618cbd9
commit 62eb434548
9 changed files with 520 additions and 245 deletions

View File

@@ -0,0 +1,103 @@
import 'dart:async';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:travel_mate/services/error_service.dart';
import 'account_event.dart';
import 'account_state.dart';
import '../../repositories/account_repository.dart';
import '../../data/models/account.dart';
class AccountBloc extends Bloc<AccountEvent, AccountState> {
final AccountRepository _repository;
StreamSubscription? _accountsSubscription;
final _errorService = ErrorService();
AccountBloc(this._repository) : super(AccountInitial()) {
on<LoadAccountsByUserId>(_onLoadAccountsByUserId);
on<_AccountsUpdated>(_onAccountsUpdated);
on<CreateAccount>(_onCreateAccount);
on<CreateAccountWithMembers>(_onCreateAccountWithMembers);
}
Future<void> _onLoadAccountsByUserId(
LoadAccountsByUserId event,
Emitter<AccountState> emit,
) async {
try {
emit(AccountLoading());
await _accountsSubscription?.cancel();
_accountsSubscription = _repository.getAccountByUserId(event.userId).listen(
(accounts) {
add(_AccountsUpdated(accounts));
},
onError: (error) {
add(_AccountsUpdated([], error: error.toString()));
},
);
} catch (e, stackTrace) {
_errorService.logError(e.toString(), stackTrace);
emit(AccountError(e.toString()));
}
}
Future<void> _onAccountsUpdated(
_AccountsUpdated event,
Emitter<AccountState> emit,
) async {
if (event.error != null) {
_errorService.logError(event.error!, StackTrace.current);
emit(AccountError(event.error!));
} else {
emit(AccountsLoaded(event.accounts));
}
}
Future<void> _onCreateAccount(
CreateAccount event,
Emitter<AccountState> emit,
) async {
try {
emit(AccountLoading());
final accountId = await _repository.createAccountWithMembers(
account: event.account,
members: [],
);
emit(AccountOperationSuccess('Compte créé avec succès. ID: $accountId'));
} catch (e, stackTrace) {
_errorService.logError(e.toString(), stackTrace);
emit(AccountError('Erreur lors de la création du compte: ${e.toString()}'));
}
}
Future<void> _onCreateAccountWithMembers(
CreateAccountWithMembers event,
Emitter<AccountState> emit,
) async {
try{
emit(AccountLoading());
final accountId = await _repository.createAccountWithMembers(
account: event.account,
members: event.members,
);
emit(AccountOperationSuccess('Compte créé avec succès. ID: $accountId'));
} catch (e, stackTrace) {
_errorService.logError(e.toString(), stackTrace);
emit(AccountError('Erreur lors de la création du compte: ${e.toString()}'));
}
}
@override
Future<void> close() {
_accountsSubscription?.cancel();
return super.close();
}
}
class _AccountsUpdated extends AccountEvent {
final List<Account> accounts;
final String? error;
const _AccountsUpdated(this.accounts, {this.error});
@override
List<Object?> get props => [accounts, error];
}

View File

@@ -0,0 +1,63 @@
import 'package:equatable/equatable.dart';
import '../../data/models/account.dart';
import '../../data/models/group_member.dart';
abstract class AccountEvent extends Equatable {
const AccountEvent();
@override
List<Object?> get props => [];
}
class LoadAccountsByUserId extends AccountEvent {
final String userId;
const LoadAccountsByUserId(this.userId);
@override
List<Object?> get props => [userId];
}
class LoadAccountsByTrip extends AccountEvent {
final String tripId;
const LoadAccountsByTrip(this.tripId);
@override
List<Object?> get props => [tripId];
}
class CreateAccount extends AccountEvent {
final Account account;
const CreateAccount(this.account);
@override
List<Object?> get props => [account];
}
class UpdateAccount extends AccountEvent {
final String accountId;
final Account account;
const UpdateAccount({
required this.accountId,
required this.account,
});
@override
List<Object?> get props => [accountId, account];
}
class CreateAccountWithMembers extends AccountEvent {
final Account account;
final List<GroupMember> members;
const CreateAccountWithMembers({
required this.account,
required this.members,
});
@override
List<Object?> get props => [account, members];
}

View File

@@ -0,0 +1,40 @@
import 'package:equatable/equatable.dart';
import '../../data/models/account.dart';
abstract class AccountState extends Equatable {
const AccountState();
@override
List<Object?> get props => [];
}
class AccountInitial extends AccountState {}
class AccountLoading extends AccountState {}
class AccountsLoaded extends AccountState {
final List<Account> accounts;
const AccountsLoaded(this.accounts);
@override
List<Object?> get props => [accounts];
}
class AccountOperationSuccess extends AccountState {
final String message;
const AccountOperationSuccess(this.message);
@override
List<Object?> get props => [message];
}
class AccountError extends AccountState {
final String message;
const AccountError(this.message);
@override
List<Object?> get props => [message];
}