Я хочу достичь:
- Я хочу получить все новые SMS после указанной c Дата.
Я разрабатываю SMS на основе приложение чата. У меня много ChatRooms
, и у каждого ChatRoom
много messages
.
Каждый раз, когда я нажимаю на комнату чата, я сохраняю строку метки времени в базе данных FireStore (как в последний раз, когда я посещал ее). чат-комната)
Если после этого приходит новое сообщение, я хочу показать уведомление о номере (как, например, WhatsApp).
Что / Где ошибка:
- Новое клиентское сообщение приходит от клиента
- L oop по всем
ChatRooms
в поисках новых входящих SMS - Соберите (поместите в массив) те, которые были новее (больше, чем) в последний раз, когда я посещал эту комнату чата.
- Обновите базу данных Firestore новыми входящими SMS.
- Показывать уведомление конечному пользователю.
Во второй раз, когда я нажимаю на эту комнату чата, она обновляет отметку времени в базе данных, но мой код продолжает получать предыдущее посещение. .
Вот скриншот базы данных:
Смотрите на моем отладчи Красные линии показывают, что отметка времени не совпадает вообще (она никогда не обновляется)
И код:
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();
};
Почему 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);
});
});
});
});
});
});
};