106 lines
3.1 KiB
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;
|
|
}
|
|
}
|
|
}
|