getTeamuserState method

NetClientAzState getTeamuserState(
  1. dynamic tid
)

读取群组成员状态

Implementation

NetClientAzState getTeamuserState(ObjectId tid) {
  final teamuserState = _teamuserStateMap[tid];
  final teamuserMap = _teamuserMapMap[tid];
  final dirtyTeamuserState = _dirtyTeamuserStateMap[tid];
  if (teamuserState == null || teamuserMap == null || dirtyTeamuserState == null) {
    return NetClientAzState()..update(azList: [0]); //这种情况说明没有加入这个群组
  }
  if (dirtyTeamuserState) {
    //构建列表
    final team = getTeam(tid);
    final admins = <Object>[];
    final azList = <Object>[...NetClientAzState.letters];
    teamuserMap.forEach((key, value) {
      if (ComTools.isTeamSuperAdmin(team, value.uid)) {
        admins.insert(0, value);
      } else if (ComTools.isTeamNormalAdmin(team, value.uid)) {
        admins.add(value);
      } else {
        azList.add(value);
      }
      //计算展示信息
      final target = getUser(value.uid);
      value.displayNick = ComTools.formatTeamUserNick(value, target);
      value.displayIcon = target.icon;
      value.displayHead = target.head;
      value.displayPinyin = PinyinHelper.getPinyinE(value.displayNick, separator: '', defPinyin: '#', format: PinyinFormat.WITHOUT_TONE).toUpperCase();
      if (value.displayPinyin.isEmpty || !NetClientAzState.letters.contains(value.displayPinyin[0])) value.displayPinyin = '#${value.displayPinyin}';
    });
    //字母列表排序
    azList.sort((a, b) {
      final pyA = a is TeamShip ? a.displayPinyin : (a as String);
      final pyB = b is TeamShip ? b.displayPinyin : (b as String);
      if (pyA.startsWith('#') && !pyB.startsWith('#')) {
        return 1;
      } else if (!pyA.startsWith('#') && pyB.startsWith('#')) {
        return -1;
      } else {
        return Comparable.compare(pyA, pyB);
      }
    });
    //生成字母索引
    final azMap = <String, int>{};
    for (int i = 0; i < azList.length;) {
      final item = azList[i];
      if (item is String) {
        if (i == azList.length - 1) {
          azList.removeAt(i); //此字母分组无内容,索引i无需自增
        } else {
          final nextItem = azList[i + 1];
          if (nextItem is String) {
            azList.removeAt(i); //此字母分组无内容,索引i无需自增
          } else {
            azMap[item] = i;
            i++;
          }
        }
      } else {
        i++;
      }
    }
    //插入管理员
    admins.insert(0, NetClientAzState.header);
    azMap.forEach((key, value) => azMap[key] = value + admins.length);
    azMap[NetClientAzState.header] = 0;
    azList.insertAll(0, admins);
    //最后插入数量
    azList.add(teamuserMap.length);
    //更新状态
    teamuserState.update(azMap: azMap, azList: azList);
    _dirtyTeamuserStateMap[tid] = false;
  }
  return teamuserState;
}