import 'dart:async'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:travel_mate/services/error_service.dart'; import 'group_event.dart'; import 'group_state.dart'; import '../../repositories/group_repository.dart'; import '../../models/group.dart'; class GroupBloc extends Bloc { final GroupRepository _repository; StreamSubscription? _groupsSubscription; final _errorService = ErrorService(); GroupBloc(this._repository) : super(GroupInitial()) { on(_onLoadGroupsByUserId); on<_GroupsUpdated>(_onGroupsUpdated); on(_onLoadGroupsByTrip); on(_onCreateGroup); on(_onCreateGroupWithMembers); on(_onAddMemberToGroup); on(_onRemoveMemberFromGroup); on(_onUpdateGroup); on(_onDeleteGroup); } Future _onLoadGroupsByUserId( LoadGroupsByUserId event, Emitter emit, ) async { try { emit(GroupLoading()); await _groupsSubscription?.cancel(); _groupsSubscription = _repository.getGroupsByUserId(event.userId).listen( (groups) { add(_GroupsUpdated(groups)); }, onError: (error) { add(_GroupsUpdated([], error: error.toString())); }, ); } catch (e, stackTrace) { _errorService.logError(e.toString(), stackTrace); emit(GroupError(e.toString())); } } Future _onGroupsUpdated( _GroupsUpdated event, Emitter emit, ) async { if (event.error != null) { _errorService.logError(event.error!, StackTrace.current); emit(GroupError(event.error!)); } else { emit(GroupsLoaded(event.groups)); } } Future _onLoadGroupsByTrip( LoadGroupsByTrip event, Emitter emit, ) async { try { emit(GroupLoading()); final group = await _repository.getGroupByTripId(event.tripId); if (group != null) { emit(GroupsLoaded([group])); } else { emit(const GroupsLoaded([])); } } catch (e) { emit(GroupError(e.toString())); } } Future _onCreateGroup( CreateGroup event, Emitter emit, ) async { try { emit(GroupLoading()); await _repository.createGroupWithMembers( group: event.group, members: [], ); emit(const GroupOperationSuccess('Groupe créé avec succès')); } catch (e) { emit(GroupError('Erreur lors de la création: $e')); } } Future _onCreateGroupWithMembers( CreateGroupWithMembers event, Emitter emit, ) async { try { emit(GroupLoading()); await _repository.createGroupWithMembers( group: event.group, members: event.members, ); emit(const GroupOperationSuccess('Groupe créé avec succès')); } catch (e) { emit(GroupError('Erreur lors de la création: $e')); } } Future _onAddMemberToGroup( AddMemberToGroup event, Emitter emit, ) async { try { // CORRECTION : Utiliser addMemberToGroup au lieu de addMember await _repository.addMember(event.groupId, event.member); emit(const GroupOperationSuccess('Membre ajouté')); } catch (e) { emit(GroupError('Erreur lors de l\'ajout: $e')); } } Future _onRemoveMemberFromGroup( RemoveMemberFromGroup event, Emitter emit, ) async { try { // CORRECTION : Utiliser removeMemberFromGroup au lieu de removeMember await _repository.removeMember(event.groupId, event.userId); emit(const GroupOperationSuccess('Membre supprimé')); } catch (e) { emit(GroupError('Erreur lors de la suppression: $e')); } } Future _onUpdateGroup( UpdateGroup event, Emitter emit, ) async { try { await _repository.updateGroup(event.groupId, event.group); emit(const GroupOperationSuccess('Groupe mis à jour')); } catch (e) { emit(GroupError('Erreur lors de la mise à jour: $e')); } } Future _onDeleteGroup( DeleteGroup event, Emitter emit, ) async { try { await _repository.deleteGroup(event.tripId); emit(const GroupOperationSuccess('Groupe supprimé')); } catch (e) { emit(GroupError('Erreur lors de la suppression: $e')); } } @override Future close() { _groupsSubscription?.cancel(); return super.close(); } } class _GroupsUpdated extends GroupEvent { final List groups; final String? error; const _GroupsUpdated(this.groups, {this.error}); @override List get props => [groups, error]; }