Initial Commit
This commit is contained in:
133
lib/models/message.dart
Normal file
133
lib/models/message.dart
Normal file
@@ -0,0 +1,133 @@
|
||||
class Message {
|
||||
final String id;
|
||||
final String text;
|
||||
final int time;
|
||||
final int senderId;
|
||||
final String? status; // EDITED, DELETED, etc.
|
||||
final int? updateTime; // Время последнего редактирования
|
||||
final List<Map<String, dynamic>> attaches;
|
||||
final int? cid; // клиентский id (timestamp)
|
||||
final Map<String, dynamic>? reactionInfo; // Информация о реакциях
|
||||
final Map<String, dynamic>? link; // Информация об ответе на сообщение
|
||||
|
||||
Message({
|
||||
required this.id,
|
||||
required this.text,
|
||||
required this.time,
|
||||
required this.senderId,
|
||||
this.status,
|
||||
this.updateTime,
|
||||
this.attaches = const [],
|
||||
this.cid,
|
||||
this.reactionInfo,
|
||||
this.link,
|
||||
});
|
||||
|
||||
factory Message.fromJson(Map<String, dynamic> json) {
|
||||
|
||||
|
||||
|
||||
|
||||
int senderId;
|
||||
if (json['sender'] is int) {
|
||||
senderId = json['sender'];
|
||||
} else {
|
||||
|
||||
senderId = 0;
|
||||
}
|
||||
|
||||
|
||||
int time;
|
||||
if (json['time'] is int) {
|
||||
time = json['time'];
|
||||
} else {
|
||||
time = 0;
|
||||
}
|
||||
|
||||
return Message(
|
||||
|
||||
id:
|
||||
json['id']?.toString() ??
|
||||
'local_${DateTime.now().millisecondsSinceEpoch}',
|
||||
text: json['text'] ?? '',
|
||||
time: time,
|
||||
senderId: senderId, // Use the new safe logic
|
||||
status: json['status'],
|
||||
updateTime: json['updateTime'],
|
||||
attaches:
|
||||
(json['attaches'] as List?)
|
||||
?.map((e) => (e as Map).cast<String, dynamic>())
|
||||
.toList() ??
|
||||
const [],
|
||||
cid: json['cid'],
|
||||
reactionInfo: json['reactionInfo'],
|
||||
link: json['link'],
|
||||
);
|
||||
}
|
||||
|
||||
Message copyWith({
|
||||
String? id,
|
||||
String? text,
|
||||
int? time,
|
||||
int? senderId,
|
||||
String? status,
|
||||
int? updateTime,
|
||||
List<Map<String, dynamic>>? attaches,
|
||||
int? cid,
|
||||
Map<String, dynamic>? reactionInfo,
|
||||
Map<String, dynamic>? link,
|
||||
}) {
|
||||
return Message(
|
||||
id: id ?? this.id,
|
||||
text: text ?? this.text,
|
||||
time: time ?? this.time,
|
||||
senderId: senderId ?? this.senderId,
|
||||
status: status ?? this.status,
|
||||
updateTime: updateTime ?? this.updateTime,
|
||||
attaches: attaches ?? this.attaches,
|
||||
cid: cid ?? this.cid,
|
||||
reactionInfo: reactionInfo ?? this.reactionInfo,
|
||||
link: link ?? this.link,
|
||||
);
|
||||
}
|
||||
|
||||
bool get isEdited => status == 'EDITED';
|
||||
bool get isDeleted => status == 'DELETED';
|
||||
bool get isReply => link != null && link!['type'] == 'REPLY';
|
||||
bool get isForwarded => link != null && link!['type'] == 'FORWARD';
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
bool canEdit(int currentUserId) {
|
||||
if (isDeleted) return false;
|
||||
if (senderId != currentUserId) return false;
|
||||
if (attaches.isNotEmpty) {
|
||||
return false; // Нельзя редактировать сообщения с вложениями
|
||||
}
|
||||
|
||||
|
||||
final now = DateTime.now().millisecondsSinceEpoch;
|
||||
final messageTime = time;
|
||||
final hoursSinceCreation = (now - messageTime) / (1000 * 60 * 60);
|
||||
|
||||
return hoursSinceCreation <= 24;
|
||||
}
|
||||
|
||||
Map<String, dynamic> toJson() {
|
||||
return {
|
||||
'id': id,
|
||||
'text': text,
|
||||
'time': time,
|
||||
'sender': senderId,
|
||||
'status': status,
|
||||
'updateTime': updateTime,
|
||||
'cid': cid,
|
||||
'attaches': attaches,
|
||||
'link': link,
|
||||
'reactionInfo': reactionInfo,
|
||||
};
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user