ProductRegist.js 10.1 KB
Newer Older
Kim, Subin's avatar
Kim, Subin committed
1
import React, { useState, useEffect, useRef } from 'react';
2
import { Redirect } from 'react-router-dom';
kusang96's avatar
dd    
kusang96 committed
3
import { Row, Col, Button, Form, Container, Alert } from 'react-bootstrap';
kusang96's avatar
kusang96 committed
4
import axios from 'axios';
5
import catchErrors from '../utils/catchErrors';
Jiwon Yoon's avatar
Jiwon Yoon committed
6

Jiwon Yoon's avatar
Jiwon Yoon committed
7
8
let preColors = []
let colorHtml = []
9
let list = []
Kim, Subin's avatar
Kim, Subin committed
10
11

function ProductsRegist() {
12
13
14
15
16
17
    const INIT_PRODUCT = {
        pro_name: '',
        price: 0,
        stock: 0,
        main_category: '',
        sub_category: [],
Jiwon Yoon's avatar
Jiwon Yoon committed
18
19
        sizes: [],
        colors: [],
20
21
22
23
        description: '',
        main_image: [],
        detail_image: []
    }
Jiwon Yoon's avatar
Jiwon Yoon committed
24
    const [categories, setCategories] = useState({ 0: [], 1: [[]] })
25
26
27
    const [product, setProduct] = useState(INIT_PRODUCT)
    const [categoryNum, setCategoryNum] = useState(0)
    const [tag, setTag] = useState(0)
Jiwon Yoon's avatar
Jiwon Yoon committed
28
29
    const [subCate, setSubCate] = useState('')
    const [color, setColor] = useState({})
kusang96's avatar
dd    
kusang96 committed
30
    const [error, setError] = useState('')
31
32
33
    const [success, setSuccess] = useState(false)
    const [checked, setChecked] = useState({ "Free": false, "XL": false, "L": false, "M": false, "S": false, "XS": false })

kusang96's avatar
kusang96 committed
34
35
    useEffect(async () => {
        try {
이재연's avatar
이재연 committed
36
            const response = await axios.get('/api/categories/main')
kusang96's avatar
kusang96 committed
37
            const data = response.data[0]
Jiwon Yoon's avatar
Jiwon Yoon committed
38
            setCategories([Object.keys(data), Object.values(data)])
kusang96's avatar
kusang96 committed
39
40
41
42
        } catch (error) {
            catchErrors(error, setError)
        }
    }, [])
43
44
45
46

    function addCategory() {
        list.push(
            <div>
Jiwon Yoon's avatar
Jiwon Yoon committed
47
48
                <span name={subCate} >{product["main_category"]} / {subCate} </span>
                <input name={subCate} type="image" src="https://img.icons8.com/fluent-systems-regular/24/000000/close-window.png" className="float-right align-middle" onClick={deleteCategory} />
49
50
            </div>)
        setTag(tag + 1)
Jiwon Yoon's avatar
Jiwon Yoon committed
51
        console.log(list)
52
    }
kusang96's avatar
kusang96 committed
53

54
    function deleteCategory(e) {
Jiwon Yoon's avatar
Jiwon Yoon committed
55
56
57
58
59
60
        e.target.parentNode.remove()
        const index = product["sub_category"].findIndex((item)=>{return item === e.target.name})
        product["sub_category"].splice(index, 1)
        setSubCate('')
        console.log(product["sub_category"].length)
    }
61

Jiwon Yoon's avatar
Jiwon Yoon committed
62
63
64
65
66
67
68
69
70
71
72
73
    function handleCategory(e) {
        const { name, value } = e.target
        if (e.target.name === "main_category") {
            setCategoryNum(e.target.selectedIndex - 1)
        }
        if (name === "sub_category") {
            product[name].push(value)
            setSubCate(value)
        } else {
            setProduct({ ...product, [name]: value })
        }
        console.log(value)
74
    }
kusang96's avatar
kusang96 committed
75

76
77
78
    function handleCheckBox(e) {
        setChecked({ ...checked, [e.target.value]: !checked[`${e.target.value}`] })
    }
Jiwon Yoon's avatar
Jiwon Yoon committed
79

80
    function addColor() {
Jiwon Yoon's avatar
Jiwon Yoon committed
81
82
        preColors.push(color["colors"])
        colorHtml.push(
Jiwon Yoon's avatar
Jiwon Yoon committed
83
84
85
86
            <div>
                <span>{color["colors"]}</span>
                <input name={subCate} type="image" src="https://img.icons8.com/fluent-systems-regular/24/000000/close-window.png" className="float-right align-middle" onClick={deleteColor} />
            </div>
87
        )
Jiwon Yoon's avatar
Jiwon Yoon committed
88
        setColor({})
kusang96's avatar
kusang96 committed
89
        setProduct({ ...product, "colors": preColors })
Jiwon Yoon's avatar
Jiwon Yoon committed
90
    }
91

Jiwon Yoon's avatar
Jiwon Yoon committed
92
93
94
95
96
97
    function deleteColor(e) {
        e.target.parentNode.remove()
        product["colors"].splice(e.name, 1)
        setColor({})
        console.log(product)
    }
98

Jiwon Yoon's avatar
Jiwon Yoon committed
99
    function handleColor(e) {
kusang96's avatar
kusang96 committed
100
        color[e.target.name] = e.target.value
101
    }
Jiwon Yoon's avatar
Jiwon Yoon committed
102
103

    function handleChange(event) {
Jiwon Yoon's avatar
0111    
Jiwon Yoon committed
104
        const { name, value, files } = event.target
kusang96's avatar
kusang96 committed
105
        console.log("event.target.name=", name, "event.target.value=", value)
Jiwon Yoon's avatar
Jiwon Yoon committed
106
        if (files) {
kusang96's avatar
dd    
kusang96 committed
107
108
109
110
            setProduct({ ...product, [name]: files })
        } else {
            setProduct({ ...product, [name]: value })
        }
Jiwon Yoon's avatar
Jiwon Yoon committed
111

Jiwon Yoon's avatar
Jiwon Yoon committed
112
113
    }

kusang96's avatar
dd    
kusang96 committed
114
    async function handleSubmit(e) {
Jiwon Yoon's avatar
Jiwon Yoon committed
115
        e.preventDefault()
116
117
118
119
120
121
        const sizes = []
        for (let [key, value] of Object.entries(checked)) {
            if (value === true) {
                sizes.push(key)
            }
        }
kusang96's avatar
kusang96 committed
122
        product["sizes"] = sizes
kusang96's avatar
kusang96 committed
123
        const formData = new FormData();
이재연's avatar
0113    
이재연 committed
124
        for (let key in product) {
이재연's avatar
dd    
이재연 committed
125
            if (key === "main_image" ||key === "detail_image") {
이재연's avatar
0113    
이재연 committed
126
127
                console.log(product[key][0])
                formData.append(key, product[key][0])
kusang96's avatar
dd    
kusang96 committed
128
129
130
131
132
            } else {
                formData.append(key, product[key])
            }
        }
        try {
kusang96's avatar
0115    
kusang96 committed
133
            const response = await axios.post('/api/product/regist', formData)
이재연's avatar
0113    
이재연 committed
134
            console.log(response)
kusang96's avatar
0115    
kusang96 committed
135
            setSuccess(true)
kusang96's avatar
dd    
kusang96 committed
136
137
        } catch (error) {
            catchErrors(error, setError)
kusang96's avatar
kusang96 committed
138
        }
Jiwon Yoon's avatar
Jiwon Yoon committed
139
140
    }

141
    if (success) {
kusang96's avatar
0115    
kusang96 committed
142
        return <Redirect to='/admin' />
143
    }
kusang96's avatar
kusang96 committed
144

Kim, Subin's avatar
Kim, Subin committed
145
    return (
146
        <Container>
kusang96's avatar
kusang96 committed
147
148
            <Row className="justify-content-md-center">
                <Col md={8} className="border p-1" style={{ background: '#F7F3F3' }}>
149
                    {error && <Alert variant="danger" className="text-center">{error}</Alert>}
kusang96's avatar
kusang96 committed
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
                    <h2 className="text-center mt-5 font-weight-bold">상품등록</h2>
                    <Form className="p-5" onSubmit={handleSubmit}>
                        <Form.Group controlId="productNameform">
                            <Form.Label>상품명</Form.Label>
                            <Form.Control type="text" name="pro_name" placeholder="상품명" onChange={handleChange} />
                        </Form.Group>
                        <Form.Group controlId="productAmountform">
                            <Form.Label>재고</Form.Label>
                            <Form.Control type="text" name="stock" placeholder="숫자만 입력해주세요" onChange={handleChange} />
                        </Form.Group>
                        <Form.Group controlId="productPriceform">
                            <Form.Label>가격</Form.Label>
                            <Form.Control type="text" name="price" placeholder="숫자만 입력해주세요" onChange={handleChange} />
                        </Form.Group>
                        <Form.Group>
                            <Form.Label>분류</Form.Label>
                            <Row>
                                <Col md={4}>
Jiwon Yoon's avatar
Jiwon Yoon committed
168
                                    <Form.Control as="select" name="main_category" onChange={handleCategory} disabled={product["sub_category"].length > 0}>
kusang96's avatar
kusang96 committed
169
                                        <option value="" >상위분류</option>
Jiwon Yoon's avatar
Jiwon Yoon committed
170
                                        {categories[0].map((main) => (
kusang96's avatar
kusang96 committed
171
172
173
174
175
                                            <option value={main}>{main}</option>
                                        ))}
                                    </Form.Control>
                                </Col>
                                <Col md={6}>
Jiwon Yoon's avatar
Jiwon Yoon committed
176
                                    <Form.Control as="select" name="sub_category" onChange={handleCategory} disabled={product["main_category"] === "TRAINING"}>
kusang96's avatar
kusang96 committed
177
                                        <option value="" >하위분류</option>
Jiwon Yoon's avatar
Jiwon Yoon committed
178
                                        {categories[1][categoryNum].map((sub) => (
kusang96's avatar
kusang96 committed
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
                                            <option value={sub}>{sub}</option>
                                        ))}
                                    </Form.Control>
                                </Col>
                                <Col >
                                    <Button className="float-right" style={{ background: '#91877F', borderColor: '#91877F' }} onClick={addCategory}>추가</Button>
                                </Col>
                            </Row>
                            {list.map((element) => element)}
                        </Form.Group>
                        <Form.Group>
                            <Form.Label>사이즈</Form.Label>
                            <Form.Check type="checkbox" name="sizes" label="Free" value="Free" onChange={handleCheckBox} />
                            <Form.Check type="checkbox" name="sizes" label="XL" value="XL" onChange={handleCheckBox} />
                            <Form.Check type="checkbox" name="sizes" label="L" value="L" onChange={handleCheckBox} />
                            <Form.Check type="checkbox" name="sizes" label="M" value="M" onChange={handleCheckBox} />
                            <Form.Check type="checkbox" name="sizes" label="S" value="S" onChange={handleCheckBox} />
                            <Form.Check type="checkbox" name="sizes" label="XS" value="XS" onChange={handleCheckBox} />
                        </Form.Group>
                        <Form.Group>
                            <Form.Label>색상</Form.Label>
                            <Row>
                                <Col md={10}>
Jiwon Yoon's avatar
Jiwon Yoon committed
202
                                    <Form.Control as="textarea" rows={1} name="colors" value={color["colors"]} placeholder="색상" onChange={handleColor} />
kusang96's avatar
kusang96 committed
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
                                </Col>
                                <Col>
                                    <Button className="float-right" style={{ background: '#91877F', borderColor: '#91877F' }} onClick={addColor}>추가</Button>
                                </Col>
                            </Row>
                            {colorHtml.map((element) => element)}
                        </Form.Group>

                        <Form.Group controlId="productDescriptionform">
                            <Form.Label>상품설명</Form.Label>
                            <Form.Control as="textarea" name="description" rows={3} placeholder="상품을 설명해주세요" onChange={handleChange} />
                        </Form.Group>
                        <Form.Group>
                            <Form.Label>대표이미지</Form.Label>
                            <Form.File id="productImageform" name="main_image" onChange={handleChange} />
                        </Form.Group>
                        <Form.Group>
                            <Form.Label>상세이미지</Form.Label>
                            <Form.File id="productImageform" name="detail_image" onChange={handleChange} />
                        </Form.Group>
                        <Button className="float-right" type="submit" style={{ background: '#91877F', borderColor: '#91877F' }}>등록</Button>
                    </Form>
                </Col>
            </Row>
        </Container>
Kim, Subin's avatar
Kim, Subin committed
228
229
230
231
    )
}

export default ProductsRegist