Tengo un proveedor de contexto de reacción que tiene una matriz con estado de "publicaciones".
Mi idea es proporcionar 3 métodos, uno para agregar, otro para actualizar y un último para eliminar.
Entonces, si el usuario obtiene 10 publicaciones de la base de datos, deben guardarse en el proveedor de contexto:
const newPosts = await fetchPosts(cursor, startAfter, limit); // Save the new posts in the Posts Context contents.addContents(newPosts);pero, ¿qué pasa si una de estas publicaciones ya está guardada? Necesito ignorar las publicaciones ya agregadas.
Este es mi contexto de contenido:
export function ContentsProvider({ children }) { const [contents, dispatch] = useReducer(contentsReducer, new Map([])); const addContents = (newContents) => { dispatch({ type: "add-contents", newContents, }); } ... return ( <ContentsContext.Provider value={{ addContents, ... }} > {children} </ContentsContext.Provider> ) }¿Cómo puedo evitar agregar contenidos ya guardados? Quiero decir, ¿es la forma correcta de hacerlo dentro del método addContents o dentro de mi reductor?
const contentsReducer = (contents, action) => { switch (action.type) { case "add-contents": { const { newContents } = action; return new Map([...contents, ...newContents]); } ... };Lo pregunto porque el estado de actualización condicional dentro de un reductor me parece extraño, tal vez sea un antipatrón .
¿Algunas ideas?
export default (contents, action) => { switch (action.type) { case "add-contents": { let { newContents } = action; // Avoid storing already added contents newContents = newContents.filter( (newContent) => !contents.get(newContent.id) ); if (!newContents.length) return contents; return new Map([...contents, ...newContents]); } ...