I am using context api to have a global state of products, for this I have ProductsContext.js
I have an empty state of array defined like this in ProductsContext.js
const [products, setProducts] = useState([]);
In the same file (ProductsContext.js) I am using useEffect to retrive all the products from firebase and then updating the products state. Below is all the code of ProductsContext.js
import React, { createContext, useState, useEffect } from 'react'
import { db } from '../Config/Config'
export const ProductsContext = createContext();
export const ProductsContextProvider = (props) => {
// console.log(props);
const [products, setProducts] = useState([]);
useEffect(() => {
// console.log('use effect');
const prevProducts = products;
db.collection('Products').onSnapshot(snapshot => {
let changes = snapshot.docChanges();
changes.forEach(change => {
if (change.type === 'added') {
prevProducts.push({
ProductID: change.doc.id,
ProductName: change.doc.data().ProductName,
ProductDescription: change.doc.data().ProductDescription,
ProductPrice: change.doc.data().ProductPrice,
ProductImg: change.doc.data().ProductImg
})
}
// console.log(prevProducts);
setProducts(prevProducts);
console.log(products); // I am able to see the products in console
})
})
})
return (
<ProductsContext.Provider value={{ products: [...products] }}>
{props.children}
</ProductsContext.Provider>
)
}
My problem is Home.js is my child component and I am using useContext in this file but it is not returning the updated state but only returning an empty array
import React, { useContext } from 'react'
import { ProductsContext } from '../Global/ProductsContext'
export const Home = () => {
const { products } = useContext(ProductsContext);
console.log(products); // empty array
return (
<div>
</div>
)
}
this is my app.js
import React, { Component } from 'react'
import { ProductsContextProvider } from './Global/ProductsContext'
import { Home } from './Components/Home'
export class App extends Component {
render() {
return (
<ProductsContextProvider>
<Home />
</ProductsContextProvider>
)
}
}
export default App