처음 시작 할때 체크박스 부분을 눌렀을때 나오게 하기 위해 아래부분을 수정
<Collapse defaultActiveKey={["0"]}>
<Panel header="Price" key="1">
<Collapse defaultActiveKey={["0"]}>
<Panel header="Continents" key="1">
import React, { useEffect, useState } from "react";
import axios from "axios";
import ProductImage from "./Sections/ProductImage";
import ProductInfo from "./Sections/ProductInfo";
import { Row, Col } from "antd";
function DetailProductPage(props) {
const productId = props.match.params.productId;
const [Product, setProduct] = useState({});
useEffect(() => {
axios
.get(`/api/product/products_by_id?id=${productId}&type=single`)
.then((response) => {
setProduct(response.data[0]);
})
.catch((err) => alert(err));
}, []);
export default DetailProductPage;
Product.find({ _id: { $in: productIds } })
.populate("writer")
.exec((err, product) => {
if (err) return res.status(400).send(err);
return res.status(200).send(product);
});
});
npm install react-image-gallery --save
return (
<div style={{ width: "100%", padding: "3rem 4rem" }}>
<div style={{ display: "flex", justifyContent: "center" }}>
<h1>{Product.title}</h1>
</div>
<br />
<Row gutter={[16, 16]}>
<Col lg={12} sm={24}>
{/* ProductImage */}
<ProductImage detail={Product} />
</Col>
<Col lg={12} sm={24}>
{/* ProductInfo */}
<ProductInfo detail={Product} />
</Col>
</Row>
</div>
);
}
// productImage.js
import React, { useState, useEffect } from 'react'
import ImageGallery from 'react-image-gallery';
function ProductImage(props) {
const [Images, setImages] = useState([])
useEffect(() => {
if (props.detail.images && props.detail.images.length > 0) {
let images = []
props.detail.images.map(item => {
images.push({
original: `http://localhost:5000/${item}`,
thumbnail: `http://localhost:5000/${item}`
})
})
setImages(images)
}
}, [props.detail])
return (
<div>
<ImageGallery items={Images} />
</div>
)
}
export default ProductImage
//productInfo.js
import React from "react";
import { Button, Descriptions } from "antd";
import { useDispatch } from "react-redux";
import { addToCart } from "../../../../_actions/user_actions";
function ProductInfo(props) {
const dispatch = useDispatch();
const clickHandler = () => {
//필요한 정보를 Cart 필드에다가 넣어 준다.
dispatch(addToCart(props.detail._id));
};
return (
<div>
<Descriptions title="Product Info">
<Descriptions.Item label="Price">
{props.detail.price}
</Descriptions.Item>
<Descriptions.Item label="Sold">{props.detail.sold}</Descriptions.Item>
<Descriptions.Item label="View">{props.detail.views}</Descriptions.Item>
<Descriptions.Item label="Description">
{props.detail.description}
</Descriptions.Item>
</Descriptions>
<br />
<br />
<br />
<div style={{ display: "flex", justifyContent: "center" }}>
<Button size="large" shape="round" type="danger" onClick={clickHandler}>
Add to Cart
</Button>
</div>
</div>
);
}
export default ProductInfo;
user colletion에 cart를 넣기 그리고 구매를 하고 나서 기록이 남아야하기 때문에 history도 User.js에 추가한다.
cart: {
type: Array,
default: []
},
history: {
type: Array,
default: []
},
몽고 DB 부분에 추가된 cart, history
카트안에 상품이 있다면 -> 상품개수 1개 올리기
카트안에 상품이 없다면 -> 필요한 상품 정보, 상품ID, 개수, 날짜정보 등 넣어줘야 함
router.post("/addToCart", auth, (req, res) => {
//먼저 User Collection에 해당 유저의 정보를 가져오기
User.findOne({ _id: req.user._id }, (err, userInfo) => {
// 가져온 정보에서 카트에다 넣으려 하는 상품이 이미 들어 있는지 확인
let duplicate = false;
userInfo.cart.forEach((item) => {
if (item.id === req.body.productId) {
duplicate = true;
}
});
//상품이 이미 있을때
if (duplicate) {
User.findOneAndUpdate(
{ _id: req.user._id, "cart.id": req.body.productId },
{ $inc: { "cart.$.quantity": 1 } },
{ new: true },
(err, userInfo) => {
if (err) return res.status(200).json({ success: false, err });
res.status(200).send(userInfo.cart);
}
);
}
//상품이 이미 있지 않을때
else {
User.findOneAndUpdate(
{ _id: req.user._id },
{
$push: {
cart: {
id: req.body.productId,
quantity: 1,
date: Date.now(),
},
},
},
{ new: true },
(err, userInfo) => {
if (err) return res.status(400).json({ success: false, err });
res.status(200).send(userInfo.cart);
}
);
}
});
});