Untitled
unknown
javascript
3 years ago
6.3 kB
4
Indexable
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;
Editor is loading...