import React, { useEffect, useState } from "react";
import { useDispatch, useSelector } from "react-redux";
import { NavLink } from "react-router-dom";
import { createReview, detailsProduct } from "../redux/action/productActions";
import LoadingBox from "./LoadingBox";
import MessageBox from "./MessageBox";
import Rating from "./Rating";
const Product = (props) => {
const dispatch = useDispatch();
const productId = props.match.params.id;
const [qty, setQty] = useState(1);
const productDetails = useSelector((state) => state.productDetails);
const { loading, error, products } = productDetails;
const productReviewCreate = useSelector((state) => state.productReviewCreate);
const {
loading: loadingReviewCreate,
error: errorReviewCreate,
success: successReviewCreate,
} = productReviewCreate;
const userSignin = useSelector((state) => state.userSignin);
const { userInfo } = userSignin;
const [rating, setRating] = useState(0);
const [comment, setComment] = useState("");
console.log(productDetails);
useEffect(() => {
dispatch(detailsProduct(productId));
}, [dispatch, productId]);
const addToCartHandler = () => {
props.history.push(`/cart/${productId}?qty=${qty}`);
};
const submitHandler = (e) => {
e.preventDefault();
if (comment && rating) {
dispatch(
createReview(productId, { rating, comment, name: userInfo.name })
);
} else {
alert("Please enter comment and rating");
}
};
const Review = () => {
return (
<>
<div>
<h2 id="reviews">Reviews</h2>
{products.reviews?.length === 0 && (
<MessageBox>There is no review</MessageBox>
)}
<ul>
{products.reviews?.map((review) => (
<li key={review._id}>
<strong>{review.name}</strong>
<Rating rating={review.rating} caption=" "></Rating>
<p>{review.comment}</p>
</li>
))}
<li>
{userInfo ? (
<form className="form" onSubmit={submitHandler}>
<div>
<h2>Write a customer review</h2>
</div>
<div>
<label htmlFor="rating">Rating</label>
<select
id="rating"
value={rating}
onChange={(e) => setRating(e.target.value)}
>
<option value="">Select...</option>
<option value="1">1- Poor</option>
<option value="2">2- Fair</option>
<option value="3">3- Good</option>
<option value="4">4- Very good</option>
<option value="5">5- Excelent</option>
</select>
</div>
<div>
<label htmlFor="comment">Comment</label>
<textarea
id="comment"
value={comment}
onChange={(e) => setComment(e.target.value)}
></textarea>
</div>
<div>
<label />
<button className="primary" type="submit">
Submit
</button>
</div>
<div>
{loadingReviewCreate && <LoadingBox></LoadingBox>}
{errorReviewCreate && (
<MessageBox variant="danger">
{errorReviewCreate}
</MessageBox>
)}
</div>
</form>
) : (
<MessageBox>
Please <NavLink to="/signin">Sign In</NavLink> to write a
review
</MessageBox>
)}
</li>
</ul>
</div>
</>
);
};
const ShowProduct = () => {
return (
<>
<div className="col-md-6" key={products._id}>
<img
src={products.image}
alt={products.name}
height="400px"
width="400px"
/>
</div>
<div className="col-md-6">
<h4 className="text-uppercase text-black-50">{products.category}</h4>
<h1 className="display-5">
{products.name} {products.reviews}
</h1>
<p className="lead fw-bolder">
{/* Rating {product.rating && product.rating.rate} */}
<i className="fa fa-star"></i>
</p>
<h3 className="display-6 fw-bold my-4">$ {products.price}</h3>
<p className="lead">{products.description}</p>
<>
<div>
<div className="row">
<div>Qty</div>
<div>
<select value={qty} onChange={(e) => setQty(e.target.value)}>
{[...Array(products.countInStock).keys()].map((x) => (
<option key={x + 1} value={x + 1}>
{x + 1}
</option>
))}
</select>
</div>
</div>
<button
onClick={addToCartHandler}
className="btn btn-outline-dark px-4 py-2"
>
Add to Cart
</button>
</div>
</>
{/* <NavLink to="/cart" className="btn btn-dark ms-2 px-3 py-2">
Go to Cart
</NavLink> */}
</div>
</>
);
};
return (
<div>
<div className="container py-5">
<div className="row py-4">
{loading ? (
<LoadingBox></LoadingBox>
) : error ? (
<MessageBox variant="danger">{error}</MessageBox>
) : (
<>
<ShowProduct></ShowProduct>
<Review></Review>
</>
)}
</div>
</div>
</div>
);
};
export default Product;