/// Events for message-related operations in the MessageBloc. /// /// This file defines all possible events that can be dispatched to the MessageBloc /// to trigger message-related state changes and operations such as loading messages, /// sending messages, managing reactions, and performing CRUD operations on chat messages. /// /// Event Categories: /// - **Loading Events**: LoadMessages /// - **Message Operations**: SendMessage, DeleteMessage, UpdateMessage /// - **Reaction Management**: ReactToMessage, RemoveReaction /// /// All events support real-time group chat functionality with features like /// message editing, deletion, and emoji reactions. /// /// All events extend [MessageEvent] and implement [Equatable] for proper /// equality comparison in the BLoC pattern. library; import 'package:equatable/equatable.dart'; /// Base class for all message-related events. /// /// All message events must extend this class and implement the [props] getter /// for proper equality comparison in the BLoC pattern. abstract class MessageEvent extends Equatable { const MessageEvent(); @override List get props => []; } /// Event to load messages for a specific group with real-time updates. /// /// This event initializes the message stream for a group, providing real-time /// updates as new messages are sent, edited, or deleted. The stream will /// continue until the bloc is closed or a new LoadMessages event is dispatched. /// /// Args: /// [groupId]: The unique identifier of the group whose messages should be loaded class LoadMessages extends MessageEvent { /// The unique identifier of the group final String groupId; /// Creates a LoadMessages event. /// /// Args: /// [groupId]: The group ID to load messages for const LoadMessages(this.groupId); @override List get props => [groupId]; } /// Event to send a new message to a group chat. /// /// This event creates and sends a new message to the specified group. /// The message will be immediately visible to all group members through /// the real-time message stream. /// /// Args: /// [groupId]: The unique identifier of the target group /// [text]: The content of the message to send /// [senderId]: The unique identifier of the user sending the message /// [senderName]: The display name of the user sending the message class SendMessage extends MessageEvent { /// The unique identifier of the group final String groupId; /// The content of the message final String text; /// The unique identifier of the sender final String senderId; /// The display name of the sender final String senderName; /// Creates a SendMessage event. /// /// Args: /// [groupId]: The target group ID /// [text]: The message content /// [senderId]: The sender's user ID /// [senderName]: The sender's display name const SendMessage({ required this.groupId, required this.text, required this.senderId, required this.senderName, }); @override List get props => [groupId, text, senderId, senderName]; } /// Event to delete a message from the group chat. /// /// This event permanently removes a message from the chat. The deletion /// will be immediately reflected for all group members through the /// real-time message stream. This action cannot be undone. /// /// Args: /// [groupId]: The unique identifier of the group containing the message /// [messageId]: The unique identifier of the message to delete class DeleteMessage extends MessageEvent { /// The unique identifier of the group final String groupId; /// The unique identifier of the message to delete final String messageId; /// Creates a DeleteMessage event. /// /// Args: /// [groupId]: The group ID containing the message /// [messageId]: The message ID to delete const DeleteMessage({ required this.groupId, required this.messageId, }); @override List get props => [groupId, messageId]; } /// Event to update/edit an existing message in the group chat. /// /// This event allows users to modify the content of a previously sent message. /// The updated message will be immediately visible to all group members /// through the real-time message stream, typically with an "edited" indicator. /// /// Args: /// [groupId]: The unique identifier of the group containing the message /// [messageId]: The unique identifier of the message to update /// [newText]: The new content for the message class UpdateMessage extends MessageEvent { /// The unique identifier of the group final String groupId; /// The unique identifier of the message to update final String messageId; /// The new content for the message final String newText; /// Creates an UpdateMessage event. /// /// Args: /// [groupId]: The group ID containing the message /// [messageId]: The message ID to update /// [newText]: The new message content const UpdateMessage({ required this.groupId, required this.messageId, required this.newText, }); @override List get props => [groupId, messageId, newText]; } /// Event to add an emoji reaction to a message. /// /// This event allows users to react to messages with emojis, providing /// a quick way to express emotions or acknowledgment without sending /// a full message. The reaction will be immediately visible to all group members. /// /// Args: /// [groupId]: The unique identifier of the group containing the message /// [messageId]: The unique identifier of the message to react to /// [userId]: The unique identifier of the user adding the reaction /// [reaction]: The emoji or reaction string to add class ReactToMessage extends MessageEvent { /// The unique identifier of the group final String groupId; /// The unique identifier of the message final String messageId; /// The unique identifier of the user adding the reaction final String userId; /// The emoji or reaction string final String reaction; /// Creates a ReactToMessage event. /// /// Args: /// [groupId]: The group ID containing the message /// [messageId]: The message ID to react to /// [userId]: The user ID adding the reaction /// [reaction]: The emoji/reaction to add const ReactToMessage({ required this.groupId, required this.messageId, required this.userId, required this.reaction, }); @override List get props => [groupId, messageId, userId, reaction]; } /// Event to remove a user's reaction from a message. /// /// This event removes a previously added emoji reaction from a message. /// Only the user who added the reaction can remove it. The removal will /// be immediately reflected for all group members through the real-time stream. /// /// Args: /// [groupId]: The unique identifier of the group containing the message /// [messageId]: The unique identifier of the message with the reaction /// [userId]: The unique identifier of the user removing their reaction class RemoveReaction extends MessageEvent { /// The unique identifier of the group final String groupId; /// The unique identifier of the message final String messageId; /// The unique identifier of the user removing the reaction final String userId; /// Creates a RemoveReaction event. /// /// Args: /// [groupId]: The group ID containing the message /// [messageId]: The message ID with the reaction /// [userId]: The user ID removing the reaction const RemoveReaction({ required this.groupId, required this.messageId, required this.userId, }); @override List get props => [groupId, messageId, userId]; }