feat: Simplify message state management by removing intermediate states and updating UI logic

This commit is contained in:
Dayron
2025-10-20 17:51:16 +02:00
parent a2e366e1ce
commit 633d2c5e5c
3 changed files with 17 additions and 127 deletions

View File

@@ -55,31 +55,16 @@ class MessageBloc extends Bloc<MessageEvent, MessageState> {
SendMessage event, SendMessage event,
Emitter<MessageState> emit, Emitter<MessageState> emit,
) async { ) async {
final currentState = state;
try { try {
emit(MessageSending()); // Juste effectuer l'action, le stream mettra à jour
await _messageService.sendMessage( await _messageService.sendMessage(
groupId: event.groupId, groupId: event.groupId,
text: event.text, text: event.text,
senderId: event.senderId, senderId: event.senderId,
senderName: event.senderName, senderName: event.senderName,
); );
emit(MessageSent());
// Retourner à l'état précédent si c'était MessagesLoaded
if (currentState is MessagesLoaded) {
emit(currentState);
}
} catch (e) { } catch (e) {
emit(MessageError('Erreur lors de l\'envoi du message: $e')); emit(MessageError('Erreur lors de l\'envoi du message: $e'));
// Retourner à l'état précédent
if (currentState is MessagesLoaded) {
emit(currentState);
}
} }
} }
@@ -87,29 +72,15 @@ class MessageBloc extends Bloc<MessageEvent, MessageState> {
DeleteMessage event, DeleteMessage event,
Emitter<MessageState> emit, Emitter<MessageState> emit,
) async { ) async {
final currentState = state;
try { try {
emit(MessageDeleting()); // Ne pas émettre d'état, juste effectuer l'action
// Le stream Firestore mettra à jour automatiquement
await _messageService.deleteMessage( await _messageService.deleteMessage(
groupId: event.groupId, groupId: event.groupId,
messageId: event.messageId, messageId: event.messageId,
); );
emit(MessageDeleted());
// Retourner à l'état précédent si c'était MessagesLoaded
if (currentState is MessagesLoaded) {
emit(currentState);
}
} catch (e) { } catch (e) {
emit(MessageError('Erreur lors de la suppression du message: $e')); emit(MessageError('Erreur lors de la suppression du message: $e'));
// Retourner à l'état précédent
if (currentState is MessagesLoaded) {
emit(currentState);
}
} }
} }
@@ -117,30 +88,16 @@ class MessageBloc extends Bloc<MessageEvent, MessageState> {
UpdateMessage event, UpdateMessage event,
Emitter<MessageState> emit, Emitter<MessageState> emit,
) async { ) async {
final currentState = state;
try { try {
emit(MessageUpdating()); // Ne pas émettre d'état, juste effectuer l'action
// Le stream Firestore mettra à jour automatiquement
await _messageService.updateMessage( await _messageService.updateMessage(
groupId: event.groupId, groupId: event.groupId,
messageId: event.messageId, messageId: event.messageId,
newText: event.newText, newText: event.newText,
); );
emit(MessageUpdated());
// Retourner à l'état précédent si c'était MessagesLoaded
if (currentState is MessagesLoaded) {
emit(currentState);
}
} catch (e) { } catch (e) {
emit(MessageError('Erreur lors de la modification du message: $e')); emit(MessageError('Erreur lors de la modification du message: $e'));
// Retourner à l'état précédent
if (currentState is MessagesLoaded) {
emit(currentState);
}
} }
} }
@@ -148,31 +105,17 @@ class MessageBloc extends Bloc<MessageEvent, MessageState> {
ReactToMessage event, ReactToMessage event,
Emitter<MessageState> emit, Emitter<MessageState> emit,
) async { ) async {
final currentState = state;
try { try {
emit(MessageReacting()); // Ne pas émettre d'état, juste effectuer l'action
// Le stream Firestore mettra à jour automatiquement
await _messageService.reactToMessage( await _messageService.reactToMessage(
groupId: event.groupId, groupId: event.groupId,
messageId: event.messageId, messageId: event.messageId,
userId: event.userId, userId: event.userId,
reaction: event.reaction, reaction: event.reaction,
); );
emit(MessageReacted());
// Retourner à l'état précédent si c'était MessagesLoaded
if (currentState is MessagesLoaded) {
emit(currentState);
}
} catch (e) { } catch (e) {
emit(MessageError('Erreur lors de l\'ajout de la réaction: $e')); emit(MessageError('Erreur lors de l\'ajout de la réaction: $e'));
// Retourner à l'état précédent
if (currentState is MessagesLoaded) {
emit(currentState);
}
} }
} }
@@ -180,30 +123,16 @@ class MessageBloc extends Bloc<MessageEvent, MessageState> {
RemoveReaction event, RemoveReaction event,
Emitter<MessageState> emit, Emitter<MessageState> emit,
) async { ) async {
final currentState = state;
try { try {
emit(MessageReacting()); // Ne pas émettre d'état, juste effectuer l'action
// Le stream Firestore mettra à jour automatiquement
await _messageService.removeReaction( await _messageService.removeReaction(
groupId: event.groupId, groupId: event.groupId,
messageId: event.messageId, messageId: event.messageId,
userId: event.userId, userId: event.userId,
); );
emit(MessageReacted());
// Retourner à l'état précédent si c'était MessagesLoaded
if (currentState is MessagesLoaded) {
emit(currentState);
}
} catch (e) { } catch (e) {
emit(MessageError('Erreur lors de la suppression de la réaction: $e')); emit(MessageError('Erreur lors de la suppression de la réaction: $e'));
// Retourner à l'état précédent
if (currentState is MessagesLoaded) {
emit(currentState);
}
} }
} }

View File

@@ -25,22 +25,6 @@ class MessagesLoaded extends MessageState {
List<Object?> get props => [messages, groupId]; List<Object?> get props => [messages, groupId];
} }
class MessageSending extends MessageState {}
class MessageSent extends MessageState {}
class MessageDeleting extends MessageState {}
class MessageDeleted extends MessageState {}
class MessageUpdating extends MessageState {}
class MessageUpdated extends MessageState {}
class MessageReacting extends MessageState {}
class MessageReacted extends MessageState {}
class MessageError extends MessageState { class MessageError extends MessageState {
final String message; final String message;

View File

@@ -159,17 +159,6 @@ class _ChatGroupContentState extends State<ChatGroupContent> {
backgroundColor: Colors.red, backgroundColor: Colors.red,
), ),
); );
} else if (state is MessageSent || state is MessageUpdated) {
// Scroller vers le bas après l'envoi
WidgetsBinding.instance.addPostFrameCallback((_) {
if (_scrollController.hasClients) {
_scrollController.animateTo(
_scrollController.position.maxScrollExtent,
duration: const Duration(milliseconds: 300),
curve: Curves.easeOut,
);
}
});
} }
}, },
builder: (context, state) { builder: (context, state) {
@@ -277,26 +266,14 @@ class _ChatGroupContentState extends State<ChatGroupContent> {
), ),
), ),
const SizedBox(width: 8), const SizedBox(width: 8),
BlocBuilder<MessageBloc, MessageState>( IconButton(
builder: (context, state) { onPressed: () => _sendMessage(currentUser),
if (state is MessageSending || state is MessageUpdating) { icon: Icon(_editingMessage != null ? Icons.check : Icons.send),
return Container( style: IconButton.styleFrom(
width: 48, backgroundColor: Theme.of(context).colorScheme.primary,
height: 48, foregroundColor: Colors.white,
padding: const EdgeInsets.all(12), padding: const EdgeInsets.all(12),
child: const CircularProgressIndicator(strokeWidth: 2), ),
);
}
return IconButton(
onPressed: () => _sendMessage(currentUser),
icon: Icon(_editingMessage != null ? Icons.check : Icons.send),
style: IconButton.styleFrom(
backgroundColor: Theme.of(context).colorScheme.primary,
foregroundColor: Colors.white,
padding: const EdgeInsets.all(12),
),
);
},
), ),
], ],
), ),