MIF_E31222656/lib/screens/community/models/message.dart

106 lines
3.1 KiB
Dart

class Message {
final String id;
final String content;
final String senderEmail;
final String senderUsername;
final String senderUserId;
final String? imageUrl;
final DateTime createdAt;
final String? replyToId;
final String? replyToContent;
final String? replyToSenderEmail;
final String? avatarUrl;
final bool isRead;
Message({
required this.id,
required this.content,
required this.senderEmail,
required this.senderUsername,
required this.senderUserId,
this.imageUrl,
required this.createdAt,
this.replyToId,
this.replyToContent,
this.replyToSenderEmail,
this.avatarUrl,
this.isRead = false,
});
// Create a copy of this message
factory Message.copy(Message source) {
return Message(
id: source.id,
content: source.content,
senderEmail: source.senderEmail,
senderUsername: source.senderUsername,
senderUserId: source.senderUserId,
imageUrl: source.imageUrl,
createdAt: source.createdAt,
replyToId: source.replyToId,
replyToContent: source.replyToContent,
replyToSenderEmail: source.replyToSenderEmail,
avatarUrl: source.avatarUrl,
isRead: source.isRead,
);
}
// Create from database Map
factory Message.fromMap(
Map<String, dynamic> map, {
required String? senderEmail,
required String? senderUsername,
required String? avatarUrl,
}) {
final createdAtStr = map['created_at'] as String?;
final DateTime createdAt =
createdAtStr != null ? DateTime.parse(createdAtStr) : DateTime.now();
return Message(
id:
map['id'] as String? ??
'msg-${DateTime.now().millisecondsSinceEpoch}',
content: map['content'] as String? ?? '',
senderEmail: senderEmail ?? '',
senderUsername: senderUsername ?? '',
senderUserId: map['sender_id'] as String? ?? '',
imageUrl: map['image_url'] as String?,
createdAt: createdAt,
replyToId: map['reply_to_id'] as String?,
replyToContent: map['reply_to_content'] as String?,
replyToSenderEmail: map['reply_to_sender_email'] as String?,
avatarUrl: avatarUrl,
);
}
// Convert to database Map
Map<String, dynamic> toMap() {
return {
'id': id,
'content': content,
'sender_id': senderUserId,
'sender_email': senderEmail,
'created_at': createdAt.toIso8601String(),
if (imageUrl != null && imageUrl!.isNotEmpty) 'image_url': imageUrl,
if (replyToId != null && replyToId!.isNotEmpty) 'reply_to_id': replyToId,
if (replyToContent != null && replyToContent!.isNotEmpty)
'reply_to_content': replyToContent,
if (replyToSenderEmail != null && replyToSenderEmail!.isNotEmpty)
'reply_to_sender_email': replyToSenderEmail,
};
}
// Get a short preview of this message content (for reply previews)
String get contentPreview {
if (content.isEmpty && imageUrl != null) {
return '[Gambar]';
} else if (content.isEmpty) {
return '[Kosong]';
} else if (content.length > 50) {
return '${content.substring(0, 50)}...';
} else {
return content;
}
}
}