Message.parse constructor

Message.parse(
  1. Object? source, {
  2. 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),
  };
}