Я пытаюсь создать приложение, используя 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);
});
});
});
});
});
};