Message.parse constructor
Message.parse(
- Object? source, {
- MessageExtra? extra,
Implementation
factory Message.parse(Object? source, {MessageExtra? extra}) {
if (source is Message) return source;
if (source is! Map) return Message.empty();
final keys = MessageKeys.i;
final id = source[keys.id];
final roomId = source[keys.roomId];
final senderId = source[keys.senderId];
final type = source[keys.type];
final statuses = source[keys.statuses];
final createdAt = source[keys.createdAt];
final updatedAt = source[keys.updatedAt];
final replyId = source[keys.replyId];
final reactions = source[keys.reactions];
final pins = source[keys.pins];
final deletes = source[keys.deletes];
final removes = source[keys.removes];
final isDeleted = source[keys.isDeleted];
final isEdited = source[keys.isEdited];
final editedAt = source[keys.editedAt];
final isForwarded = source[keys.isForwarded];
final ex = source[keys.extra];
final content = source[keys.content];
final url = source[keys.url];
final duration = source[keys.durationInSec];
final msg = Message(
id: id is String && id.isNotEmpty ? id : '',
roomId: roomId is String && roomId.isNotEmpty ? roomId : '',
senderId: senderId is String && senderId.isNotEmpty ? senderId : '',
type: MessageType.values.parse(type),
statuses: MessageStatus.values.references(statuses),
createdAt: ChatValueTimestamp.parse(createdAt),
updatedAt: ChatValueTimestamp.parse(updatedAt),
editedAt: ChatValueTimestamp.parse(editedAt),
reactions: reactions is Map ? reactions.parse() : {},
deletes: deletes is Map ? deletes.parse() : {},
pins: pins is Map ? pins.parse() : {},
removes: removes is Map ? removes.parse() : {},
replyId: replyId is String && replyId.isNotEmpty ? replyId : null,
isEdited: isEdited is bool ? isEdited : false,
isForwarded: isForwarded is bool ? isForwarded : false,
isDeleted: isDeleted is bool ? isDeleted : false,
extra: extra ?? (ex is Map ? ex.parse() : {}),
);
final mContent = content is String && content.isNotEmpty ? content : null;
final mDuration = duration is num && duration > 0 ? duration.toInt() : null;
final mUrl = url is String && url.isNotEmpty ? url : null;
return switch (msg.type) {
MessageType.none => const Message.empty(),
MessageType.text =>
mContent == null
? const Message.empty()
: TextMessage.from(msg, mContent),
MessageType.link =>
mContent == null
? const Message.empty()
: LinkMessage.from(msg, mContent),
MessageType.image => _parseImage(msg, source, keys, mContent),
MessageType.audio => _parseAudio(msg, source, keys, mDuration, mUrl),
MessageType.video => _parseVideo(
msg,
source,
keys,
mContent,
mDuration,
mUrl,
),
MessageType.custom => _parseCustom(msg, source, keys),
};
}