import 'dart:async'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'group_event.dart'; import 'group_state.dart'; import '../../repositories/group_repository.dart'; class GroupBloc extends Bloc { final GroupRepository _repository; StreamSubscription? _groupsSubscription; GroupBloc(this._repository) : super(GroupInitial()) { on(_onLoadGroupsByUserId); on(_onLoadGroupsByTrip); on(_onCreateGroup); on(_onCreateGroupWithMembers); on(_onAddMemberToGroup); on(_onRemoveMemberFromGroup); on(_onUpdateGroup); on(_onDeleteGroup); } // NOUVEAU : Charger les groupes par userId Future _onLoadGroupsByUserId( LoadGroupsByUserId event, Emitter emit, ) async { emit(GroupLoading()); await _groupsSubscription?.cancel(); _groupsSubscription = _repository.getGroupsByUserId(event.userId).listen( (groups) => emit(GroupsLoaded(groups)), onError: (error) => emit(GroupError(error.toString())), ); } // Charger les groupes d'un voyage (conservé) 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())); } } // Créer un groupe simple 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')); } } // Créer un groupe avec ses membres 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')); } } // Ajouter un membre Future _onAddMemberToGroup( AddMemberToGroup event, Emitter emit, ) async { try { await _repository.addMember(event.groupId, event.member); emit(const GroupOperationSuccess('Membre ajouté')); } catch (e) { emit(GroupError('Erreur lors de l\'ajout: $e')); } } // Supprimer un membre Future _onRemoveMemberFromGroup( RemoveMemberFromGroup event, Emitter emit, ) async { try { await _repository.removeMember(event.groupId, event.userId); emit(const GroupOperationSuccess('Membre supprimé')); } catch (e) { emit(GroupError('Erreur lors de la suppression: $e')); } } // Mettre à jour un groupe 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')); } } // Supprimer un groupe Future _onDeleteGroup( DeleteGroup event, Emitter emit, ) async { try { await _repository.deleteGroup(event.groupId); emit(const GroupOperationSuccess('Groupe supprimé')); } catch (e) { emit(GroupError('Erreur lors de la suppression: $e')); } } @override Future close() { _groupsSubscription?.cancel(); return super.close(); } }