getChatMessages function

Future<String?> getChatMessages(
  1. dynamic _redraw(), {
  2. String app = "customer",
})

Implementation

Future<String?> getChatMessages(Function() _redraw, {String app = "customer", }) async {
  var _unread = 0;
  try{
    if (app == "provider"){
      customersChat = [];
      customersChat.addAll(users);
    }
    if (app == "customer")
      _createChatUsersList();
    if (app == "admin"){
      customersChat = [];
      customersChat.addAll(users);
    }

    var user = FirebaseAuth.instance.currentUser;
    if (user == null)
      return "user == null";
    //
    for (var item in customersChat) {
      var data = await FirebaseFirestore.instance.collection("chatRoom").doc(
          getChatRoomId(item.id, user.uid)).get();
      if (data.data() != null) {
        var _data = data.data()!;
        item.all = (_data['all'] != null) ? _data['all'] : 0;
        item.unread = (_data['unread_${user.uid}'] != null) ? _data['unread_${user.uid}'] : 0;
        item.lastMessage = (_data['last_message'] != null) ? _data['last_message'] : "";
        item.lastMessageTime = (_data['last_message_time'] != null) ? _data['last_message_time'].toDate().toLocal() : DateTime.now();
        _unread += item.unread;
      }
      if (!userAccountData.blockedUsers.contains(item.id))
        item.listen = FirebaseFirestore.instance.collection("chatRoom")
            .doc(getChatRoomId(item.id, user.uid)).snapshots().listen((querySnapshot) async {
          if (querySnapshot.data() != null) {
            var _data = querySnapshot.data()!;
            addStat("chat listen", _data.length);
            item.all = (_data['all'] != null) ? _data['all'] : 0;
            item.unread = (_data['unread_${user.uid}'] != null) ? _data['unread_${user.uid}'] : 0;
            item.lastMessage = (_data['last_message'] != null) ? _data['last_message'] : "";
            item.lastMessageTime = (_data['last_message_time'] != null) ? _data['last_message_time'].toDate().toLocal() : DateTime.now();
            if (chatId == item.id) {
              if (item.unread != 0) {
                await FirebaseFirestore.instance.collection("chatRoom").doc(getChatRoomId(item.id, user.uid)).set({
                  "unread_${user.uid}": 0,}, SetOptions(merge: true));
                await FirebaseFirestore.instance.collection("listusers").doc(user.uid).set({
                  "unread_chat": FieldValue.increment(-item.unread),
                }, SetOptions(merge: true));
              }
            }
            customersChat.sort((a, b) => a.compareToAll(b));
            customersChat.sort((a, b) => a.compareToUnread(b));
            redrawMainWindow();
          }
        });
    }
    customersChat.sort((a, b) => a.compareToAll(b));
    customersChat.sort((a, b) => a.compareToUnread(b));
    if (_unread != chatCount)
      await FirebaseFirestore.instance.collection("listusers").doc(user.uid).set({
        "unread_chat": _unread,
      }, SetOptions(merge: true));
  }catch(ex){
    return "getChatMessages " + ex.toString();
  }
  return null;
}