import 'dart:async'; import 'package:flutter_bloc/flutter_bloc.dart'; import '../../services/group_service.dart'; import 'group_event.dart'; import 'group_state.dart'; import '../../data/models/group.dart'; class GroupBloc extends Bloc { final GroupService _groupService; StreamSubscription? _groupsSubscription; GroupBloc({GroupService? groupService}) : _groupService = groupService ?? GroupService(), super(GroupInitial()) { on(_onLoadRequested); on<_GroupUpdated>(_onGroupUpdated); on(_onCreateRequested); on(_onUpdateRequested); on(_onDeleteRequested); on(_onMemberAddRequested); on(_onMemberRemoveRequested); } Future _onLoadRequested( GroupLoadRequested event, Emitter emit, ) async { emit(GroupLoading()); await _groupsSubscription?.cancel(); _groupsSubscription = _groupService.getGroupsStreamByUser(event.userId).listen( (groups) => add(_GroupUpdated(groups: groups)), onError: (error) => emit(GroupError(message: error.toString())), ); } Future _onGroupUpdated( _GroupUpdated event, Emitter emit, ) async { emit(GroupLoaded(groups: event.groups)); } Future _onCreateRequested( GroupCreateRequested event, Emitter emit, ) async { try { await _groupService.createGroup(event.group); emit(const GroupOperationSuccess(message: 'Groupe créé avec succès')); } catch (e) { emit(GroupError(message: e.toString())); } } Future _onUpdateRequested( GroupUpdateRequested event, Emitter emit, ) async { try { await _groupService.updateGroup(event.group); emit(const GroupOperationSuccess(message: 'Groupe mis à jour')); } catch (e) { emit(GroupError(message: e.toString())); } } Future _onDeleteRequested( GroupDeleteRequested event, Emitter emit, ) async { try { await _groupService.deleteGroup(event.groupId); emit(const GroupOperationSuccess(message: 'Groupe supprimé')); } catch (e) { emit(GroupError(message: e.toString())); } } Future _onMemberAddRequested( GroupMemberAddRequested event, Emitter emit, ) async { try { await _groupService.addMemberToGroup(event.groupId, event.memberId); emit(const GroupOperationSuccess(message: 'Membre ajouté')); } catch (e) { emit(GroupError(message: e.toString())); } } Future _onMemberRemoveRequested( GroupMemberRemoveRequested event, Emitter emit, ) async { try { await _groupService.removeMemberFromGroup(event.groupId, event.memberId); emit(const GroupOperationSuccess(message: 'Membre retiré')); } catch (e) { emit(GroupError(message: e.toString())); } } @override Future close() { _groupsSubscription?.cancel(); return super.close(); } } // Événement interne pour les mises à jour du stream class _GroupUpdated extends GroupEvent { final List groups; const _GroupUpdated({required this.groups}); @override List get props => [groups]; }