// Version: 1.0.0 | Created: 2026-04-01 // Immutable message model for the chat timeline. import 'package:freezed_annotation/freezed_annotation.dart'; part 'message_model.freezed.dart'; /// Content type of a message event. enum MessageType { text, image, file, audio, video, sticker, redacted, unsupported, } @freezed abstract class MessageModel with _$MessageModel { const factory MessageModel({ required String eventId, required String roomId, required String senderId, required String senderDisplayName, String? senderAvatarUrl, required DateTime timestamp, required MessageType type, // Text content (for text messages). String? body, // URL for media messages. String? mediaUrl, // MXC URI for the media (used to download from homeserver). String? mxcUrl, // If this is a reply, the event ID of the original message. String? inReplyToEventId, // Reactions: emoji → list of sender IDs. @Default({}) Map> reactions, // Read receipts: sender IDs of users who have read up to this event. @Default([]) List readByUserIds, @Default(false) bool isEdited, @Default(false) bool isMine, }) = _MessageModel; }