Tengo una pantalla "Mis chats" con un componente "ChatList" en mi aplicación web.
Cada "ChatListItem" tiene el avatar del usuario, la fecha del último mensaje, el contenido del último mensaje (que se puede eliminar), etc.
Se representa así en mi base de datos
ChatRoom doc = { lastMessage: { date, content, senderId }, members: {id1: { username, avatar }, id2: { username, avatar }}, membersIds: [id1, id2], read: false, }Y almacenado en Firestore siguiendo esta estructura NoSQL:
/ chatsCollection/ chatDoc1 chatDoc2 ...Así es como estoy escuchando todos los chats de los usuarios actuales:
export function listenMyChats(limitToLast, onNext, onError) { const currentUserId = getCurrentUser().uid; const query = firestore .collection("chats") .where("membersIds", "array-contains", currentUserId) .orderBy("lastMessage.date", "asc"); return query.limitToLast(limitToLast).onSnapshot(onNext, onError); }Si limito los resultados de escucha a 20, entonces no será posible manejar los cambios de, por ejemplo, el elemento 80 de mi ChatList.
Imagina que el otro usuario elimina el último mensaje que envió, actualizando los datos del documento de la sala de chat a:
ChatRoom doc = { lastMessage: { date, <---- DATE HAS NOT CHANGED! deleted: true, <----- senderId }, members: {id1: { username, avatar }, id2: { username, avatar }}, membersIds: [id1, id2], read: false, }Como puede ver, la fecha del último mensaje no ha cambiado, y estoy escuchando los 20 primeros elementos ordenados por la fecha del último mensaje.
Esto causará un problema. Si el documento está en la posición 21 de mi ChatList, no podré actualizar la GUI con los nuevos datos respectivos, ya que el oyente no detectará ningún cambio.
Pensé en combinar el oyente con un sistema de actualización dentro de la pantalla "Mis chats". Pero, ¿hay algún otro enfoque para manejar todos los elementos sin eliminar limitToLast(20) ?
El problema probablemente es que está tratando de modelar sus datos de una manera diferente a cómo está diseñado Firestore.
está tratando documentos que llegan a través del oyente como eventos. Pero, de hecho, lo que debe hacer es crear una consulta que muestre exactamente qué datos desea ver en la interfaz de usuario, por ejemplo, los 20 chats más recientes que no se eliminaron.
El SDK de Firestore le informará cada vez que cambie el conjunto de documentos que coinciden con la consulta. Luego, debe actualizar la interfaz de usuario para que coincida con el nuevo conjunto de documentos en la lista de observación. Si se elimina un chat, el SDK de Firestore aún le avisará porque rastrea los documentos que desaparecen de los resultados de la consulta y los documentos que aparecen.
Otra opción, quizás más similar a lo que está haciendo ahora, sería tener eventos reales almacenados en una colección en alguna parte. Un evento de eliminación incluiría la marca de tiempo en la que se eliminó, por lo que puede estar seguro de que al mirar los documentos más recientes es probable que se incluyan los cambios que le interesan.
Para obtener más información relacionada con el "desplazamiento infinito de Firestore", puede consultar el caso y el documento de stackoverflow donde se menciona una breve descripción sobre el desplazamiento infinito y cómo puede hacerlo en su aplicación.