Я создаю чат, используя Angular и Firebase Cloud Firestore.
То, чего я пытаюсь добиться, это обновлять счетчик на стороне клиента каждый раз, когда обновляется любой документ в «группах» коллекции;
В моем клиентском приложении каждый раз, когда пользователь отправляет сообщение, новый документ сообщения добавляется в коллекцию groups/{group_uid}/messages/
.
В то же время поле документа groups/{group_uid}.current_index
увеличивается на 1.
У меня также есть groups/{group_uid}.last_read_index
, который является объектом пар ключ-значение, который для каждого члена группового чата сохраняет uid в качестве ключа и индекс в качестве значения;
Я пытаюсь обнаружить непрочитанные сообщения пользователя, проверяя last_read_index
пользователя по current_index
.
группы.
Для этого в конструкторе app.component, который я сейчас делаю:
constructor(private _auth: AuthService,
private _chat: ChatService,
private afDb: AngularFireDatabase) {
this.afDb.list<any>('groups').valueChanges().subscribe(() => {
this._chat.getUserGroups().get().then(groups => {
this.counter = 0;
groups.docs.forEach(group => {
const groupData = group.data();
const groupUnreadMessages = groupData.current_index - groupData.last_read_index[this._auth.currentUserId];
this.counter = this.counter + groupUnreadMessages;
});
});
});
}
Где this._chat.getUserGroups()
возвращает коллекцию всех групп, в которые входит пользователь.
Проблема в том, что при создании нового сообщения в базе данных, чтобы счетчик обновил свое значение, мне нужно обновить страницу.
Вместо этого я хотел бы, чтобы изменения произошли в режиме реального времени, как мне этого добиться?