Переменная Firestore => не обновляется с последним значением из базы данных FireStore внутри .onSnapShot - PullRequest
0 голосов
/ 23 марта 2020

Я хочу достичь:

  • Я хочу получить все новые SMS после указанной c Дата.

Я разрабатываю SMS на основе приложение чата. У меня много ChatRooms, и у каждого ChatRoom много messages.

Каждый раз, когда я нажимаю на комнату чата, я сохраняю строку метки времени в базе данных FireStore (как в последний раз, когда я посещал ее). чат-комната)

Если после этого приходит новое сообщение, я хочу показать уведомление о номере (как, например, WhatsApp).

Here's an example from my own app

Что / Где ошибка:

  • Новое клиентское сообщение приходит от клиента
  • L oop по всем ChatRooms в поисках новых входящих SMS
  • Соберите (поместите в массив) те, которые были новее (больше, чем) в последний раз, когда я посещал эту комнату чата.
  • Обновите базу данных Firestore новыми входящими SMS.
  • Показывать уведомление конечному пользователю.

Во второй раз, когда я нажимаю на эту комнату чата, она обновляет отметку времени в базе данных, но мой код продолжает получать предыдущее посещение. .

Вот скриншот базы данных:

firestore screenshot

Смотрите на моем отладчи Красные линии показывают, что отметка времени не совпадает вообще (она никогда не обновляется)

enter image description here

И код:

unread_messages = currentUser => {
    // console.log("is this firing");
    const chatRoomsQuery = this.db.collection("ChatRooms");
    const clientsQuery = this.db.collection("Clients_development");
    let data = [];

    // put a listener on every chatRoom
    let unsubscribe2 = chatRoomsQuery.onSnapshot(messages => {
      messages.docs.forEach(message => {
        console.log("message.data().lastVisited", message.data().lastVisited);
        let phoneId = message.id;
        // console.log("phoneId: ", phoneId);
        //! get messages sent ONLY by clients NOT the ones the agent sent to users
        let unsubscribe = this.db
          .collection("ChatRooms")
          .doc(phoneId)
          .collection("messages")
          .where("from", "==", phoneId)
          .onSnapshot(querySnapshot => {
            // ! LOOP OVER ALL INCOMING SMS FOR EVERY CLIENT
            querySnapshot.forEach(sms => {
              const smsMsg = new Date(sms.data().timestamp);
              const lastVisit = new Date(message.data().lastVisited);
              // update it
              if (smsMsg.getTime() > lastVisit.getTime()) {
                data.push(sms.data());
                console.log("this one:", sms.data());
                clientsQuery
                  .where("phone", "==", sms.data().from)
                  .get()
                  .then(querySnapshot => {
                    querySnapshot.forEach(doc => {
                      this.db
                        .collection("Clients_development")
                        .doc(doc.id)
                        .update({
                          unread_messages: Array.from(new Set(data))
                        })
                        .then(() => {
                          console.log("updated");
                          data = [];
                        })
                        .catch(e => console.log(e));
                    });
                  })
                  .catch(e => console.log(e));
              }
              // data = [];
            });
          });
        return () => unsubscribe();
      });
    });
    return () => unsubscribe2();
  };

An a picture of the code

Почему lastVisited var НЕ обновляется внутри .OnSnapShot ???

Кроме того, после нескольких дней попыток выяснить это, этот код теперь ведет меня к бесконечному л oop:

unread_messages = () => {
    const chatRoomsQuery = this.db.collection("ChatRooms");
    const messagesQuery = this.db.collection("ChatRooms");
    let newMessages = [];

    chatRoomsQuery.onSnapshot(snapshot => {
      snapshot.forEach(chatRoom => {
        const id = chatRoom.id;
        console.log("current customer id: ", id);

        messagesQuery
          .doc(id)
          .collection("messages")
          .onSnapshot(query => {
            query.forEach(message => {
              console.log(
                "current query message: ",
                message.data().customer_response
              );
              newMessages.push(message.data());
            });

            // we're mapping over all SMS messages
            newMessages.forEach(message => {
              console.log("current message: ", message);
              // here you can run the transaction
              return this.db.runTransaction(transaction => {
                const currRef = this.db
                  .collection("ChatRooms")
                  .doc(message.from);

                return transaction
                  .get(currRef)
                  .then(doc => {
                    if (!doc.exists) {
                      return;
                    }
                    // update it
                    if (
                      new Date(message.timestamp).getTime() >
                      new Date(doc.data().lastVisited)
                    ) {
                      transaction.update(currRef, {
                        unread_messages: Array.from(
                          new Set([message.customer_response])
                        )
                      });
                    }
                  })
                  .then(function() {
                    console.log("Transaction successfully committed!");
                    newMessages = [];
                  })
                  .catch(function(error) {
                    console.log("Transaction failed: ", error);
                  });
              });
            });
          });
      });
    });
  };

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