feat: Simplify message state management by removing intermediate states and updating UI logic
This commit is contained in:
@@ -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);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|
||||||
|
|||||||
@@ -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),
|
|
||||||
),
|
|
||||||
);
|
|
||||||
},
|
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
|
|||||||
Reference in New Issue
Block a user