initMessages method

void initMessages(
  1. RCIMIWConversation con, {
  2. dynamic onSuccess()?,
})

Implementation

void initMessages(RCIMIWConversation con, {Function()? onSuccess}) {
  _cancelClearUnreadRequest();
  _cancelMessageRequests();
  _cancelMessageEditOperations();
  _cancelEditedDraftOperations();
  _invalidateReferenceRefreshes();
  _con = con;
  _captureSession();
  _sessionInvalid = false;
  _latestModifiedMessages.clear();
  _messageEditOperationIds.clear();
  _messageEditSourceCache.clear();
  _referenceMessageStates.clear();
  _conversationInitialized = true;
  final requestId = ++_messageRequestId;
  final targetEngine = _sessionEngine;
  if (targetEngine == null) {
    _messages = [];
    notifyListeners();
    return;
  }
  RCIMIWMessageOperationPolicy policy =
      RCIMIWMessageOperationPolicy.localRemote;
  if (connectionStatus == RCIMIWConnectionStatus.networkUnavailable ||
      connectionStatus == RCIMIWConnectionStatus.unconnected ||
      connectionStatus == RCIMIWConnectionStatus.suspend ||
      connectionStatus == RCIMIWConnectionStatus.timeout ||
      connectionStatus == RCIMIWConnectionStatus.unknown) {
    policy = RCIMIWMessageOperationPolicy.local;
  }
  var completed = false;
  Timer? timeoutTimer;
  bool completeRequest() {
    if (completed) return false;
    completed = true;
    timeoutTimer?.cancel();
    _messageRequestCancellations.remove(requestId);
    return true;
  }

  void finishWithError(int code) {
    if (!completeRequest() ||
        !_isMessageRequestCurrent(targetEngine, requestId)) {
      return;
    }
    notifyListeners();
    RCIMWrapperPlatform.instance
        .writeLog('RCKChatProvider initMessages', '', code, 'onError');
  }

  timeoutTimer = Timer(
    _requestCompletionTimeout,
    () => finishWithError(-1),
  );
  _messageRequestCancellations[requestId] = () {
    completeRequest();
  };
  unawaited(() async {
    try {
      final immediateCode = await targetEngine.getMessages(
        con.conversationType ?? RCIMIWConversationType.invalid,
        con.targetId ?? '',
        con.channelId,
        0,
        RCIMIWTimeOrder.before,
        policy,
        20,
        callback: IRCIMIWGetMessagesCallback(
          onSuccess: (t, _, __) {
            if (completed) return;
            if (!_isMessageRequestCurrent(targetEngine, requestId)) {
              completeRequest();
              return;
            }
            if (!completeRequest()) return;
            // 将消息列表倒置
            _messages = _mergeLatestModifiedMessages(
              t?.reversed ?? const <RCIMIWMessage>[],
            );
            _queryReadReceiptMessages(_messages);
            // Android Kit 会在引用消息本地扩展信息回调后再提交首屏列表,
            // 远端结果则继续通过刷新回调更新当前页面。Flutter 先赋值,
            // 但把首次通知推迟到本地阶段完成(最多等待一秒)。
            unawaited(() async {
              await _refreshReferenceMessages(
                _messages,
                waitForInitialStage: true,
              );
              if (!_isMessageRequestCurrent(targetEngine, requestId)) return;
              notifyListeners();

              WidgetsBinding.instance.addPostFrameCallback((_) {
                messageListScrollToBottom();
              });
              onSuccess?.call();
              RCIMWrapperPlatform.instance.writeLog(
                  'RCKChatProvider initMessages',
                  '',
                  0,
                  'onSuccess t: ${t?.length}');
            }());
          },
          onError: (code) {
            finishWithError(code ?? -1);
          },
        ),
      );
      if (immediateCode != 0) finishWithError(immediateCode);
    } catch (_) {
      finishWithError(-1);
    }
  }());
}