/// BLoC de gestion de la messagerie library messaging_bloc; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:injectable/injectable.dart'; import '../../domain/usecases/get_conversations.dart'; import '../../domain/usecases/get_messages.dart'; import '../../domain/usecases/send_message.dart'; import '../../domain/usecases/send_broadcast.dart'; import 'messaging_event.dart'; import 'messaging_state.dart'; @injectable class MessagingBloc extends Bloc { final GetConversations getConversations; final GetMessages getMessages; final SendMessage sendMessage; final SendBroadcast sendBroadcast; MessagingBloc({ required this.getConversations, required this.getMessages, required this.sendMessage, required this.sendBroadcast, }) : super(MessagingInitial()) { on(_onLoadConversations); on(_onLoadMessages); on(_onSendMessage); on(_onSendBroadcast); } Future _onLoadConversations( LoadConversations event, Emitter emit, ) async { emit(MessagingLoading()); final result = await getConversations( organizationId: event.organizationId, includeArchived: event.includeArchived, ); result.fold( (failure) => emit(MessagingError(failure.message)), (conversations) => emit(ConversationsLoaded(conversations: conversations)), ); } Future _onLoadMessages( LoadMessages event, Emitter emit, ) async { emit(MessagingLoading()); final result = await getMessages( conversationId: event.conversationId, limit: event.limit, beforeMessageId: event.beforeMessageId, ); result.fold( (failure) => emit(MessagingError(failure.message)), (messages) => emit(MessagesLoaded( conversationId: event.conversationId, messages: messages, hasMore: messages.length == (event.limit ?? 50), )), ); } Future _onSendMessage( SendMessageEvent event, Emitter emit, ) async { final result = await sendMessage( conversationId: event.conversationId, content: event.content, attachments: event.attachments, priority: event.priority, ); result.fold( (failure) => emit(MessagingError(failure.message)), (message) => emit(MessageSent(message)), ); } Future _onSendBroadcast( SendBroadcastEvent event, Emitter emit, ) async { final result = await sendBroadcast( organizationId: event.organizationId, subject: event.subject, content: event.content, priority: event.priority, attachments: event.attachments, ); result.fold( (failure) => emit(MessagingError(failure.message)), (message) => emit(BroadcastSent(message)), ); } }