feat: Implement account management functionality with loading, creation, and error handling
This commit is contained in:
@@ -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];
|
||||
}
|
||||
@@ -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];
|
||||
}
|
||||
@@ -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];
|
||||
}
|
||||
Reference in New Issue
Block a user