Product Screen is not showing up product on React, Django code
Im writing a shop using React + Django. After using Redux , the Product screen is giving an error.
Request failed with status code 500
This is the error which i wrote in the codeblock.
However, it should look like this when i choose a product:
The HomeScreen looks like this:
My code blocks:
ProductActions:
`
import axios from 'axios'
import {
PRODUCT_LIST_REQUEST,
PRODUCT_LIST_SUCCESS,
PRODUCT_LIST_FAIL,
PRODUCT_DETAILS_REQUEST,
PRODUCT_DETAILS_SUCCESS,
PRODUCT_DETAILS_FAIL,
} from '../constants/productConstants'
export const listProducts = () => async(dispatch) => {
try {
dispatch({type:PRODUCT_LIST_REQUEST})
const {data} = await axios.get('/api/products/')
dispatch({
type:PRODUCT_LIST_SUCCESS,
payload:data
})
} catch (error) {
dispatch({
type:PRODUCT_LIST_FAIL,
payload:error.response && error.response.data.message
? error.response.data.message
: error.message,
})
}
}
export const listProductDetails = (id) => async(dispatch) => {
try {
dispatch({type:PRODUCT_DETAILS_REQUEST})
const { data } = await axios.get('/api/products/${id}')
dispatch({
type:PRODUCT_DETAILS_SUCCESS,
payload:data
})
} catch (error) {
dispatch({
type:PRODUCT_DETAILS_FAIL,
payload:error.response && error.response.data.message
? error.response.data.message
: error.message,
})
}
}
```
**ProductReducers:**
```
import {
PRODUCT_LIST_REQUEST,
PRODUCT_LIST_SUCCESS,
PRODUCT_LIST_FAIL,
PRODUCT_DETAILS_REQUEST,
PRODUCT_DETAILS_SUCCESS,
PRODUCT_DETAILS_FAIL,
} from '../constants/productConstants'
export const productListReducer = (state = { products: [] },action ) => {
switch(action.type) {
case PRODUCT_LIST_REQUEST:
return {loading: true,products: [] }
case PRODUCT_LIST_SUCCESS:
return {loading:false,products:action.payload}
case PRODUCT_LIST_FAIL:
return {loading:false,error:action.payload}
default:
return state
}
}
export const productDetailsReducer = (state= {product:{reviews:[] }},action) => {
switch(action.type) {
case PRODUCT_DETAILS_REQUEST:
return { loading : true, ...state }
case PRODUCT_DETAILS_SUCCESS:
return { loading:false, product:action.payload}
case PRODUCT_DETAILS_FAIL:
return { loading:false,error:action.payload}
default:
return state
}
}```
**ProductConstants:**
```
export const PRODUCT_LIST_REQUEST = 'PRODUCT_LIST_REQUEST'
export const PRODUCT_LIST_SUCCESS = 'PRODUCT_LIST_SUCCESS'
export const PRODUCT_LIST_FAIL = 'PRODUCT_LIST_FAIL'
export const PRODUCT_DETAILS_REQUEST = 'PRODUCT_DETAILS_REQUEST'
export const PRODUCT_DETAILS_SUCCESS = 'PRODUCT_DETAILS_SUCCESS'
export const PRODUCT_DETAILS_FAIL = 'PRODUCT_DETAILS_FAIL'
```
**Store:**
```
import { legacy_createStore as createStore ,combineReducers,applyMiddleware} from 'redux';
import {thunk} from 'redux-thunk';
import { composeWithDevTools } from '@redux-devtools/extension';
import { productListReducer,productDetailsReducer } from './reducers/productReducers'
const reducer = combineReducers({
productList:productListReducer,
productDetails:productDetailsReducer,
})
const initialState= {}
const middleware = [thunk]
const store=createStore(reducer,initialState,
composeWithDevTools(applyMiddleware(...middleware)))
export default store
```
**HomeScreen:**
```
import React, { useState,useEffect } from 'react'
import { useDispatch,useSelector } from 'react-redux'
import {Row,Col} from 'react-bootstrap'
import Product from '../components/Product'
import Loader from '../components/Loader'
import Message from '../components/Message'
import { listProducts } from '../actions/productActions'
function HomeScreen (){
const dispatch = useDispatch()
const productList = useSelector(state=>state.productList)
const {error,loading,products} = productList
useEffect(() => {
dispatch(listProducts())
},[dispatch])
return (
<div>
<h1>Latest Products</h1>
{loading ? <Loader />
: error ? <Message variant='danger'>{error}</Message>
:
<Row>
{products.map(product =>(
<Col key={product._id} sm={12} md={6} lg={4} xl={3}>
<Product product={product}/>
</Col>
))}
</Row>
}
</div>
)
}
export default HomeScreen
```