1- import React , { useState , useEffect } from "react" ;
1+ import React , { useEffect , useState } from "react" ;
2+ import { useDispatch , useSelector } from "react-redux" ;
23import { LinkContainer } from "react-router-bootstrap" ;
34import {
45 Container ,
@@ -9,21 +10,31 @@ import {
910 Button ,
1011 Card ,
1112 Badge ,
13+ Form ,
1214} from "react-bootstrap" ;
1315import Rating from "../components/Rating" ;
14- import axios from "axios" ;
16+ import { listProductDetails } from "../actions/productActions" ;
17+ import Loader from "../components/Loader" ;
18+ import Message from "../components/Message" ;
19+
20+ function ProductPage ( { match, history } ) {
21+ const productId = match . params . id ;
22+ const [ qtn , setQtn ] = useState ( 1 ) ;
23+
24+ const dispatch = useDispatch ( ) ;
25+
26+ const { loading, error, product } = useSelector (
27+ ( state ) => state . productDetails
28+ ) ;
1529
16- function ProductPage ( props ) {
17- const [ product , setProduct ] = useState ( { } ) ;
1830 useEffect ( ( ) => {
19- async function fetchProduct ( ) {
20- const { data } = await axios . get (
21- `/api/product/${ props . match . params . id } `
22- ) ;
23- setProduct ( data ) ;
24- }
25- fetchProduct ( ) ;
26- } , [ ] ) ;
31+ dispatch ( listProductDetails ( productId ) ) ;
32+ } , [ dispatch , productId ] ) ;
33+
34+ const addToCartHandler = ( ) => {
35+ history . push ( `/cart/${ productId } ?qtn=${ qtn } ` ) ;
36+ } ;
37+
2738 return (
2839 < Container >
2940 < LinkContainer to = "/" >
@@ -32,72 +43,99 @@ function ProductPage(props) {
3243 < br />
3344 < br />
3445
35- < Row >
36- < Col md = { 6 } >
37- < Image src = { product . image } alt = { product . name } > </ Image >
38- </ Col >
39- < Col md = { 3 } >
40- < ListGroup variant = "flush" >
41- < ListGroup . Item >
42- < h3 > { product . name } </ h3 >
43- </ ListGroup . Item >
44- < ListGroup . Item >
45- < Rating
46- value = { product . rating }
47- text = { `${ product . numReviews } reviews` }
48- color = { `#f8e825` }
49- />
50- </ ListGroup . Item >
51- < ListGroup . Item >
52- < span > Price: Rs. { product . price } </ span >
53- </ ListGroup . Item >
54- < ListGroup . Item >
55- < span > Description: { product . description } </ span >
56- </ ListGroup . Item >
57- </ ListGroup >
58- </ Col >
59- < Col md = { 3 } >
60- < Card >
46+ { loading ? (
47+ < Loader />
48+ ) : error ? (
49+ < Message variant = "danger" > { error } </ Message >
50+ ) : (
51+ < Row >
52+ < Col md = { 6 } >
53+ < Image src = { product . image } alt = { product . name } > </ Image >
54+ </ Col >
55+ < Col md = { 3 } >
6156 < ListGroup variant = "flush" >
6257 < ListGroup . Item >
63- < Row >
64- < Col > Price: </ Col >
65- < Col >
66- < strong > Rs. { product . price } </ strong >
67- </ Col >
68- </ Row >
58+ < h3 > { product . name } </ h3 >
59+ </ ListGroup . Item >
60+ < ListGroup . Item >
61+ < Rating
62+ value = { product . rating }
63+ text = { `${ product . numReview } reviews` }
64+ color = { `#f8e825` }
65+ />
6966 </ ListGroup . Item >
7067 < ListGroup . Item >
71- < Row >
72- < Col > Status: </ Col >
73- < Col >
74- { product . countInStock > 0 ? (
75- < Badge variant = "success" >
76- { " " }
77- < b > Available</ b > { " " }
78- </ Badge >
79- ) : (
80- < Badge variant = "danger" >
81- { " " }
82- < b > Not Available</ b > { " " }
83- </ Badge >
84- ) }
85- </ Col >
86- </ Row >
68+ < span > Price: Rs. { product . price } </ span >
8769 </ ListGroup . Item >
8870 < ListGroup . Item >
89- < Button
90- className = "btn-block"
91- type = "button"
92- disabled = { product . countInStock === 0 }
93- >
94- Add To Cart
95- </ Button >
71+ < span > Description: { product . description } </ span >
9672 </ ListGroup . Item >
9773 </ ListGroup >
98- </ Card >
99- </ Col >
100- </ Row >
74+ </ Col >
75+ < Col md = { 3 } >
76+ < Card >
77+ < ListGroup variant = "flush" >
78+ < ListGroup . Item >
79+ < Row >
80+ < Col > Price: </ Col >
81+ < Col >
82+ < strong > Rs. { product . price } </ strong >
83+ </ Col >
84+ </ Row >
85+ </ ListGroup . Item >
86+ < ListGroup . Item >
87+ < Row >
88+ < Col > Status: </ Col >
89+ < Col >
90+ { product . countInStock > 0 ? (
91+ < Badge variant = "success" >
92+ { " " }
93+ < b > Available</ b > { " " }
94+ </ Badge >
95+ ) : (
96+ < Badge variant = "danger" >
97+ { " " }
98+ < b > Not Available</ b > { " " }
99+ </ Badge >
100+ ) }
101+ </ Col >
102+ </ Row >
103+ </ ListGroup . Item >
104+ { product . countInStock > 0 && (
105+ < ListGroup . Item >
106+ < Row >
107+ < Col > Qty</ Col >
108+ < Col xs = "auto" className = "my-1" >
109+ < Form . Control
110+ as = "select"
111+ value = { qtn }
112+ onChange = { ( e ) => setQtn ( e . target . value ) }
113+ >
114+ { [ ...Array ( product . countInStock ) . keys ( ) ] . map ( ( x ) => (
115+ < option value = { x + 1 } key = { x } >
116+ { x + 1 }
117+ </ option >
118+ ) ) }
119+ </ Form . Control >
120+ </ Col >
121+ </ Row >
122+ </ ListGroup . Item >
123+ ) }
124+ < ListGroup . Item >
125+ < Button
126+ className = "btn-block"
127+ type = "button"
128+ disabled = { product . countInStock === 0 }
129+ onClick = { addToCartHandler }
130+ >
131+ Add To Cart
132+ </ Button >
133+ </ ListGroup . Item >
134+ </ ListGroup >
135+ </ Card >
136+ </ Col >
137+ </ Row >
138+ ) }
101139 </ Container >
102140 ) ;
103141}
0 commit comments