getMessageByRefer method

  1. @override
Future<NIMResult<NIMMessage>> getMessageByRefer(
  1. NIMMessageRefer messageRefer
)
override

Resolves the full message represented by a message reference.

Implementation

@override
Future<NIMResult<NIMMessage>> getMessageByRefer(
  NIMMessageRefer messageRefer,
) async {
  final localResult = await super.getMessageByRefer(messageRefer);
  if (localResult.isSuccess && localResult.data != null) {
    return localResult;
  }

  final topic = _currentTopic;
  final createTime = messageRefer.createTime;
  if (topic == null || createTime == null || createTime <= 0) {
    return localResult;
  }

  final result = await TopicRepo.instance.getTopicMessageList(
    V2NIMTopicMessageListOption(
      topic: topic,
      beginTime: createTime,
      endTime: createTime,
      limit: 100,
      direction: NIMQueryDirection.desc,
    ),
  );
  if (!result.isSuccess) {
    Alog.e(
      tag: 'TopicChatViewModel',
      moduleName: 'getTopicMessageList',
      content: 'getTopicMessageList error code: ${result.code}',
    );
    return NIMResult.failure(
      message: result.errorDetails,
      code: result.code,
    );
  }

  final candidates = <NIMMessage>[
    ...?result.data?.replyList,
    if (result.data?.anchorMessage != null) result.data!.anchorMessage!,
  ];
  for (final message in candidates) {
    if (TopicMessageHelper.matchesMessageRefer(message, messageRefer)) {
      return NIMResult.success(data: message);
    }
  }
  return NIMResult.failure(message: 'message not found');
}