mergeIncomeNewMessages<T> method

  1. @override
List<T> mergeIncomeNewMessages<T>({
  1. required List<T> messages,
  2. required bool isAddTop,
  3. required List<T> addedMsgs,
  4. required DateTime getMsgTime(
    1. T msg
    ),
  5. required bool isTimeTagMsg(
    1. T msg
    ),
  6. required T onCreateTimeTag(
    1. DateTime time
    ),
  7. required List<String> timeTagPolicies,
  8. required String getMsgId(
    1. T msg
    ),
  9. bool needRegenerateTimeTag = false,
})
override
  1. Add addedMsgs into messages and remove duplicated messages
  2. Generate time tag amount addedMsgs (keep time tag in messages not to change) if timeTagPolicies is "5m", "20m", "1h", "3h", is mean create a tag in 5min, 20min, 1hour and 3 hour, after that 3hours, create a time tag each 3 hours Notice, messsages and addedMsgs should be already ordered by time dasc. It mean the function will not sort again

Implementation

@override
List<T> mergeIncomeNewMessages<T>(
    {required List<T> messages,
    required bool isAddTop,
    required List<T> addedMsgs,
    required DateTime Function(T msg) getMsgTime,
    required bool Function(T msg) isTimeTagMsg,
    required T Function(DateTime time) onCreateTimeTag,
    required List<String> timeTagPolicies,
    required String Function(T msg) getMsgId,
    bool needRegenerateTimeTag = false}) {
  // create map to enhance performance
  var addedMsgMap = <String, T>{};
  for (var addedMsg in addedMsgs) {
    addedMsgMap[getMsgId(addedMsg)] = addedMsg;
  }

  var result = <T>[];

  // remove duplicate
  for (var msg in messages) {
    var newMsg = msg;
    if (!isTimeTagMsg(msg)) {
      var msgId = getMsgId(msg);
      if (addedMsgMap[msgId] != null) {
        newMsg = addedMsgMap[msgId]!;
        addedMsgMap.remove(msgId);
      }
      result.add(newMsg);
    } else {
      if (!needRegenerateTimeTag) {
        result.add(newMsg);
      }
    }
  }

  // remove duplicate msg
  var newAddedMsgs = <T>[];
  for (var addedMsg in addedMsgs) {
    if (addedMsgMap[getMsgId(addedMsg)] != null) {
      newAddedMsgs.add(addedMsg);
    }
  }
  if (!needRegenerateTimeTag) {
    newAddedMsgs = generateTimeTags(
        messages: newAddedMsgs,
        getMsgTime: getMsgTime,
        onCreateTimeTag: onCreateTimeTag,
        timeTagPolicies: timeTagPolicies);

    // Add to top, It mean load prev
    if (isAddTop) {
      for (var i = newAddedMsgs.length - 1; i >= 0; i--) {
        result.insert(0, newAddedMsgs[i]);
      }
    } else {
      result.addAll(newAddedMsgs);
    }
  } else {
    if (isAddTop) {
      for (var i = newAddedMsgs.length - 1; i >= 0; i--) {
        result.insert(0, newAddedMsgs[i]);
      }
    } else {
      result.addAll(newAddedMsgs);
    }

    result = generateTimeTags(
        messages: result,
        getMsgTime: getMsgTime,
        onCreateTimeTag: onCreateTimeTag,
        timeTagPolicies: timeTagPolicies);
  }

  return result;
}