import 'dart:async'; import 'package:flutter_bloc/flutter_bloc.dart'; import '../../data/models/message.dart'; import '../../services/message_service.dart'; import '../../repositories/message_repository.dart'; import 'message_event.dart'; import 'message_state.dart'; class MessageBloc extends Bloc { final MessageService _messageService; StreamSubscription>? _messagesSubscription; MessageBloc({MessageService? messageService}) : _messageService = messageService ?? MessageService( messageRepository: MessageRepository(), ), super(MessageInitial()) { on(_onLoadMessages); on(_onSendMessage); on(_onDeleteMessage); on(_onUpdateMessage); on(_onReactToMessage); on(_onRemoveReaction); on<_MessagesUpdated>(_onMessagesUpdated); } Future _onLoadMessages( LoadMessages event, Emitter emit, ) async { emit(MessageLoading()); await _messagesSubscription?.cancel(); _messagesSubscription = _messageService .getMessagesStream(event.groupId) .listen( (messages) { add(_MessagesUpdated(messages: messages, groupId: event.groupId)); }, onError: (error) { add(_MessagesError('Erreur lors du chargement des messages: $error')); }, ); } void _onMessagesUpdated( _MessagesUpdated event, Emitter emit, ) { emit(MessagesLoaded(messages: event.messages, groupId: event.groupId)); } Future _onSendMessage( SendMessage event, Emitter emit, ) async { try { // Juste effectuer l'action, le stream mettra à jour await _messageService.sendMessage( groupId: event.groupId, text: event.text, senderId: event.senderId, senderName: event.senderName, ); } catch (e) { emit(MessageError('Erreur lors de l\'envoi du message: $e')); } } Future _onDeleteMessage( DeleteMessage event, Emitter emit, ) async { try { // Ne pas émettre d'état, juste effectuer l'action // Le stream Firestore mettra à jour automatiquement await _messageService.deleteMessage( groupId: event.groupId, messageId: event.messageId, ); } catch (e) { emit(MessageError('Erreur lors de la suppression du message: $e')); } } Future _onUpdateMessage( UpdateMessage event, Emitter emit, ) async { try { // Ne pas émettre d'état, juste effectuer l'action // Le stream Firestore mettra à jour automatiquement await _messageService.updateMessage( groupId: event.groupId, messageId: event.messageId, newText: event.newText, ); } catch (e) { emit(MessageError('Erreur lors de la modification du message: $e')); } } Future _onReactToMessage( ReactToMessage event, Emitter emit, ) async { try { // Ne pas émettre d'état, juste effectuer l'action // Le stream Firestore mettra à jour automatiquement await _messageService.reactToMessage( groupId: event.groupId, messageId: event.messageId, userId: event.userId, reaction: event.reaction, ); } catch (e) { emit(MessageError('Erreur lors de l\'ajout de la réaction: $e')); } } Future _onRemoveReaction( RemoveReaction event, Emitter emit, ) async { try { // Ne pas émettre d'état, juste effectuer l'action // Le stream Firestore mettra à jour automatiquement await _messageService.removeReaction( groupId: event.groupId, messageId: event.messageId, userId: event.userId, ); } catch (e) { emit(MessageError('Erreur lors de la suppression de la réaction: $e')); } } @override Future close() { _messagesSubscription?.cancel(); return super.close(); } } // Events internes class _MessagesUpdated extends MessageEvent { final List messages; final String groupId; const _MessagesUpdated({ required this.messages, required this.groupId, }); @override List get props => [messages, groupId]; } class _MessagesError extends MessageEvent { final String error; const _MessagesError(this.error); @override List get props => [error]; }