Product.js 10.5 KB
Newer Older
1
import axios from 'axios';
kusang96's avatar
kusang96 committed
2
import React, { useState, useEffect, useRef } from 'react';
박상호's avatar
박상호 committed
3
import { Row, Col, Form, Card, Button, Image } from 'react-bootstrap';
Jiwon Yoon's avatar
Jiwon Yoon committed
4
import { Redirect } from 'react-router-dom';
5
import catchErrors from '../utils/catchErrors';
kusang96's avatar
kusang96 committed
6
7


8
function Product({ match, location }) {
kusang96's avatar
0115    
kusang96 committed
9
    const [product, setProduct] = useState(location.state)
Jiwon Yoon's avatar
Jiwon Yoon committed
10
11
12
    const [color, setColor] = useState("")
    const [size, setSize] = useState("")
    const [cart, setCart] = useState([])
13
    const [error, setError] = useState('')
14
    const [selected, setSelected] = useState({ sizes: false, colors: false })
Jiwon Yoon's avatar
Jiwon Yoon committed
15
    const [count, setCount] = useState(1)
Jiwon Yoon's avatar
0113    
Jiwon Yoon committed
16
    const [price, setPrice] = useState(0)
17
    // let price = 0
Jiwon Yoon's avatar
Jiwon Yoon committed
18

19
    useEffect(() => {
Jiwon Yoon's avatar
Jiwon Yoon committed
20
        if (size && color) {
21
            pushOptions()
Jiwon Yoon's avatar
Jiwon Yoon committed
22
            console.log(cart)
Jiwon Yoon's avatar
Jiwon Yoon committed
23
        }
Jiwon Yoon's avatar
Jiwon Yoon committed
24
    }, [size, color])
kusang96's avatar
kusang96 committed
25
26
27
28
29
30

    function handleClick(e) {
        const box = e.target.parentNode.parentNode
        box.style.display = "none"
    }

31
    function pushOptions() {
박상호's avatar
박상호 committed
32
        setCart([...cart, { color, size, productId: product.id, count: 1 }])
33
34
        selected.sizes = false
        selected.colors = false
35
        console.log(product)
Jiwon Yoon's avatar
Jiwon Yoon committed
36
37
38
        setColor("")
        setSize("")
        setPrice(product.price + price)
39
    }
Jiwon Yoon's avatar
Jiwon Yoon committed
40

kusang96's avatar
kusang96 committed
41
42
    function handleChange(e) {
        const { name, value } = e.target
Jiwon Yoon's avatar
Jiwon Yoon committed
43
44
        if (name === "sizes") {
            setSize(value)
45
            selected.sizes = true
Jiwon Yoon's avatar
Jiwon Yoon committed
46
47
        } else if (name === "colors") {
            setColor(value)
48
49
            selected.colors = true
        }
kusang96's avatar
kusang96 committed
50
51
    }

Jiwon Yoon's avatar
Jiwon Yoon committed
52
    function deleteOption(e) {
kusang96's avatar
kusang96 committed
53
        e.preventDefault()
54
        let preprice = 0
Jiwon Yoon's avatar
Jiwon Yoon committed
55
        const asd = cart.filter((el) => el.color !== e.target.id || el.size !== e.target.name)
박상호's avatar
박상호 committed
56
57
        asd.map((el) => {
            preprice = preprice + el.count * product.price
58
        })
Jiwon Yoon's avatar
Jiwon Yoon committed
59
        setCart(asd)
60
        setPrice(Number(preprice))
kusang96's avatar
kusang96 committed
61
62
    }

Jiwon Yoon's avatar
Jiwon Yoon committed
63
    function handleCount(e) {
64
65
66
        const addCount = cart.map((el) => {
            if (el.color !== e.target.id || el.size !== e.target.name) {
                return { ...el }
Jiwon Yoon's avatar
Jiwon Yoon committed
67
            } else {
68
                return { ...el, count: e.target.value }
Jiwon Yoon's avatar
Jiwon Yoon committed
69
70
            }
        })
71
        let preprice = 0
박상호's avatar
박상호 committed
72
73
        addCount.map((el) => {
            preprice = preprice + el.count * product.price
74
75
        })
        setPrice(Number(preprice))
Jiwon Yoon's avatar
Jiwon Yoon committed
76
        setCart(addCount)
Jiwon Yoon's avatar
Jiwon Yoon committed
77
        setCount(e.value)
kusang96's avatar
kusang96 committed
78
79
    }

80
    async function addCart() {
Jiwon Yoon's avatar
Jiwon Yoon committed
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
        console.log(cart)
        if (localStorage.getItem('id')) {
            // preCart(color, size, count), productId(productlist에서 props), userId(로컬) 를 보내줌
            try {
                setError('')
                const response = await axios.put('/api/cart/addcart', {
                    userId: localStorage.getItem('id'),
                    products: cart
                })
                console.log(response)
            } catch (error) {
                catchErrors(error, setError)
            }
        } else {
            alert("로그인을 해주세요.")
            return <Redirect to='/login' />
97
98
99
        }
    }

kusang96's avatar
kusang96 committed
100
101
102

    return (
        <div>
103
            {console.log(cart)}
kusang96's avatar
kusang96 committed
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
            <style type="text/css">
                {`
                .btn {
                    background-color: #CDC5C2;
                    border-color: #CDC5C2;
                }

                .btn:hover, .btn:active, .btn:focus {
                    background-color: #91877F;
                    border-color: #91877F;
                }
                `}
            </style>
            <Row className="justify-content-center mt-5 mx-0">
                <Col sm={11} md={4}>
Jiwon Yoon's avatar
asdf    
Jiwon Yoon committed
119
                    <img src={`/images/${product.main_img}`} style={{ objectFit: "contain", width: "100%" }} />
kusang96's avatar
kusang96 committed
120
121
                </Col>
                <Col sm={11} md={4} className="align-middle mt-4">
kusang96's avatar
0115    
kusang96 committed
122
123
                    <h3 className="mb-4">{product.name}</h3>
                    <h5 className="mb-4">가격 : {product.price}</h5>
kusang96's avatar
kusang96 committed
124
125
126
                    <Form style={{ borderBottom: "1px solid" }}>
                        <Form.Group style={{ borderBottom: "1px solid", paddingBottom: "2rem" }}>
                            <Form.Label>색상</Form.Label>
Jiwon Yoon's avatar
Jiwon Yoon committed
127
                            <Form.Control as="select" className="mb-2" name="colors" value={color} defaultValue="옵션 선택" onChange={handleChange}>
kusang96's avatar
kusang96 committed
128
                                <option>옵션선택</option>
Jiwon Yoon's avatar
qwr    
Jiwon Yoon committed
129
130
131
                                {product.colors.map((e) => (
                                    <option>{e}</option>
                                ))}
kusang96's avatar
kusang96 committed
132
133
                            </Form.Control>
                            <Form.Label>사이즈</Form.Label>
Jiwon Yoon's avatar
Jiwon Yoon committed
134
                            <Form.Control as="select" className="mb-2" name="sizes" value={size} defaultValue="옵션 선택" onChange={handleChange}>
kusang96's avatar
kusang96 committed
135
                                <option>옵션선택</option>
Jiwon Yoon's avatar
qwr    
Jiwon Yoon committed
136
137
138
                                {product.sizes.map((e) => (
                                    <option>{e}</option>
                                ))}
kusang96's avatar
kusang96 committed
139
140
                            </Form.Control>
                        </Form.Group>
Jiwon Yoon's avatar
Jiwon Yoon committed
141
                        {cart.map((e) => (
142
143
144
                            <Row className="mx-1">
                                <Col xs={6}>{e.color}/{e.size}</Col>
                                <Col xs={4} className="text-right" >
Jiwon Yoon's avatar
Jiwon Yoon committed
145
                                    <input type='number' id={e.color} name={e.size} onChange={handleCount} value={count} style={{ width: '3rem' }} className="text-center" />
146
147
148
149
150
                                </Col>
                                <Col xs={2} className="text-right">
                                    <input onClick={deleteOption} id={e.color} name={e.size} type="image" alt="삭제버튼" src="https://img.icons8.com/fluent-systems-regular/24/000000/close-window.png" className="align-middle" />
                                </Col>
                            </Row>
Jiwon Yoon's avatar
Jiwon Yoon committed
151

152
                        ))}
kusang96's avatar
kusang96 committed
153
154
                        <Row className="justify-content-between mx-0 my-3" style={{ width: "100%" }}>
                            <Col> 금액</Col>
Jiwon Yoon's avatar
0113    
Jiwon Yoon committed
155
                            <Col className="text-right">{price}</Col>
kusang96's avatar
kusang96 committed
156
157
                        </Row>
                        <Row className="justify-content-between mx-0 my-3" style={{ width: "100%" }}>
Jiwon Yoon's avatar
Jiwon Yoon committed
158
                            <Button type='button' onClick={addCart} style={{ width: "49%" }}>장바구니</Button>
kusang96's avatar
kusang96 committed
159
160
161
162
163
164
165
                            <Button style={{ width: "49%" }}>구매하기</Button>
                        </Row>
                    </Form>
                </Col>
            </Row>
            <Row className="justify-content-center mt-5 mx-0">
                <Col sm={11} md={8}>
박상호's avatar
박상호 committed
166
167
168
                    <h3 style={{ borderBottom: "1px solid #91877F", paddingBottom: "5px", marginBottom: "1em" }} className="p-3">
                        설명
                        </h3>
박상호's avatar
박상호 committed
169
170
                    <Col className='justify-content-center '>
                            <h2 className='p-2 text-center border' style={{background : '#CDC5C2'}}>{product.name} </h2>
박상호's avatar
박상호 committed
171
                            <>
박상호's avatar
박상호 committed
172
                            <Image src={`/images/${product.main_img}`} style={{ objectFit: "contain", maxWidth: "100%"}} />
박상호's avatar
박상호 committed
173
174
                            </>
                            <Card className='m-3 d-flex justify-content-center'>
박상호's avatar
박상호 committed
175
                                <Card.Body className='text-center'>
박상호's avatar
박상호 committed
176
177
178
                                    {product.description}
                                </Card.Body>
                            </Card>
박상호's avatar
박상호 committed
179
180
181
182
                            <>
                            <h4 className='my-4 text-center'>[ Detail Images ]</h4>
                            <Image src={`/images/${product.detail_imgs}`} style={{ objectFit: "contain",  maxWidth: "100%"}}/>
                            </>
박상호's avatar
박상호 committed
183
                    </Col>
kusang96's avatar
kusang96 committed
184
185
186
187
188
                </Col>
            </Row>
            <Row className="justify-content-center mx-0 pt-3 px-2" style={{ position: "fixed", bottom: "0", width: "100%", backgroundColor: "#fff" }}>
                <Col sm={12} md={9}>
                    <h6 style={{ borderBottom: "1px solid", paddingBottom: "5px", marginBottom: "1em" }}>회원님이 선호할만한 상품 추천
박상호's avatar
0120    
박상호 committed
189
                        <a className="close float-right" onClick={(e) => handleClick(e)} style={{ fontSize: "1rem", cursor: "pointer" }}>X</a>
kusang96's avatar
kusang96 committed
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
                    </h6>
                    <Row className="justify-content-space mx-0" style={{ flexWrap: "nowrap", width: "100%", overflowX: "auto" }}>
                        <Col as={Card} style={{ minWidth: "10rem", marginRight: "1rem" }}>
                            <Card.Img variant="top" src="https://img.sonyunara.com/files/goods/67504/1607328307_0.jpg" style={{ objectFit: "contain" }} />
                            <Card.Body className="px-0">
                                <Card.Title>클로타탄원피스</Card.Title>
                                <Card.Text>구매자 : 30</Card.Text>
                            </Card.Body>
                        </Col>
                        <Col as={Card} style={{ minWidth: "10rem", marginRight: "1rem" }}>
                            <Card.Img variant="top" src="https://img.sonyunara.com/files/goods/67504/1607328307_0.jpg" style={{ objectFit: "contain" }} />
                            <Card.Body className="px-0">
                                <Card.Title>클로타탄원피스</Card.Title>
                                <Card.Text>구매자 : 30</Card.Text>
                            </Card.Body>
                        </Col>
                        <Col as={Card} style={{ minWidth: "10rem", marginRight: "1rem" }}>
                            <Card.Img variant="top" src="https://img.sonyunara.com/files/goods/67504/1607328307_0.jpg" style={{ objectFit: "contain" }} />
                            <Card.Body className="px-0">
                                <Card.Title>클로타탄원피스</Card.Title>
                                <Card.Text>구매자 : 30</Card.Text>
                            </Card.Body>
                        </Col>
                        <Col as={Card} style={{ minWidth: "10rem", marginRight: "1rem" }}>
                            <Card.Img variant="top" src="https://img.sonyunara.com/files/goods/67504/1607328307_0.jpg" style={{ objectFit: "contain" }} />
                            <Card.Body className="px-0">
                                <Card.Title>클로타탄원피스</Card.Title>
                                <Card.Text>구매자 : 30</Card.Text>
                            </Card.Body>
                        </Col>
                    </Row>
                </Col>
            </Row>
        </div>
    )
}

export default Product