Как (используя React JS web) и Firestore, узнать, когда chatRoom (в базе данных Firestore) получает новые сообщения? - PullRequest
0 голосов
/ 26 марта 2020

Я пытаюсь создать приложение, используя FireStore и React JS (Web)

Моя база данных Firestore в основном содержит:

  • Коллекция ChatRooms ChatRooms
  • В каждом чате есть множество messages, которое является подколлекцией, например:

this.db.collection("ChatRooms").doc(phone-number-here).collection("messages")

Кроме того, в каждом чате есть информация о клиенте, например: first-name, last-name et c, и очень важный:

lastVisited, который является меткой времени (или любой другой меткой)

Я подумал, что я бы поставил React Hook, который обновляется каждую секунду поле lastVisited, которое означает попытку максимально точной записи в Firestore того времени, когда я последний раз выходил из чата.

Исходя из этого, я хочу получить все messages для каждого клиента (чат), который вошел после последнего посещения, поле

=> lastVisited. :)

И показать уведомление.

Я пытался из .onSnapshot слушателя на подколлекции messages и комбинации Firestore Transactions, но мне не повезло. Мое приложение глючит, и оно продолжает показывать два, затем один, затем ничего, обратно к двум и т. Д. c, и я сильно страдаю.

Вот мой код!

Пожалуйста, я ценю ЛЮБАЯ помощь !!!

unread_messages = currentUser => {
    const chatRoomsQuery = this.db.collection("ChatRooms");
    // const messagesQuery = this.db.collection("ChatRooms");

    return chatRoomsQuery.get().then(snapshot => {
      return snapshot.forEach(chatRoom => {
        const mess = chatRoomsQuery
          .doc(chatRoom.id)
          .collection("messages")
          .where("from", "==", chatRoom.id)
          .orderBy("firestamp", "desc")
          .limit(5);
        // the limit of the messages could change to 10 on production
        return mess.onSnapshot(snapshot => {
          console.log("snapshot SIZE: ", snapshot.size);
          return snapshot.forEach(message => {
            // console.log(message.data());
            const chatRef = this.db
              .collection("ChatRooms")
              .doc(message.data().from);

            // run transaction
            return this.db
              .runTransaction(transaction => {
                return transaction.get(chatRef).then(doc => {
                  // console.log("currentUser: ", currentUser);
                  // console.log("doc: ", doc.data());
                  if (!doc.exists) return;

                  if (
                    currentUser !== null &&
                    message.data().from === currentUser.phone
                  ) {
                    // the update it
                    transaction.update(chatRef, {
                      unread_messages: []
                    });
                  }
                  // else
                  else if (
                    new Date(message.data().timestamp).getTime() >
                    new Date(doc.data().lastVisited).getTime()
                  ) {
                    console.log("THIS IS/ARE THE ONES:", message.data());
                    // newMessages.push(message.data().customer_response);

                    // the update it
                    transaction.update(chatRef, {
                      unread_messages: Array.from(
                        new Set([
                          ...doc.data().unread_messages,
                          message.data().customer_response
                        ])
                      )
                    });
                  }
                });
              })
              .then(function() {
                console.log("Transaction successfully committed!");
              })
              .catch(function(error) {
                console.log("Transaction failed: ", error);
              });
          });
        });
      });
    });
  };

1 Ответ

2 голосов
/ 26 марта 2020

В поисках этого, кажется, что лучшим вариантом для достижения этого сравнения будет преобразование вашего timestamps в миллисекундах, используя метод toMillis(). Таким образом, вы сможете сравнивать результаты лучше и проще - более подробную информацию о методе можно найти в официальной документации здесь - timestamps последнего сообщения и последнего доступа.

Я считаю, что это будет вашим лучшим вариантом, поскольку в этом сообщении Сообщества упоминается здесь , что это будет единственным решением для сравнения timestamps в Firestore - есть метод, называемый isEqual(), но это не имеет смысла для вашего варианта использования.

Я бы порекомендовал вам попробовать, используя это для сравнения timestamps для вашего приложения. Помимо этого, есть еще один вопрос от Сообщества - доступный здесь: Как сравнить временные метки Firebase? - где у пользователя есть такие же сценарии использования и цели, как у вас, что, я считаю, может помочь вам с некоторыми идеями и мысли, а также.

Дайте мне знать, помогла ли вам информация!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...