ProductRegist.js 13.2 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
kusang96 committed
3
import { Row, Col, Button, Form, Container, Alert, Spinner } 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

Kim, Subin's avatar
Kim, Subin committed
7
8

function ProductsRegist() {
9
10
11
12
13
14
    const INIT_PRODUCT = {
        pro_name: '',
        price: 0,
        stock: 0,
        main_category: '',
        sub_category: [],
Jiwon Yoon's avatar
Jiwon Yoon committed
15
16
        sizes: [],
        colors: [],
17
18
19
20
        description: '',
        main_image: [],
        detail_image: []
    }
21
    const [preColors, setPreColors] = useState([])
Jiwon Yoon's avatar
Jiwon Yoon committed
22
    const [categories, setCategories] = useState({ 0: [], 1: [[]] })
23
    const [product, setProduct] = useState(INIT_PRODUCT)
kusang96's avatar
kusang96 committed
24
    const [categoryNum, setCategoryNum] = useState('')
25
    const [tag, setTag] = useState(0)
26
27
    const [subCate, setSubCate] = useState([])
    const [cateList, setCateList] = useState([])
Jiwon Yoon's avatar
Jiwon Yoon committed
28
    const [color, setColor] = useState({})
kusang96's avatar
dd    
kusang96 committed
29
    const [error, setError] = useState('')
30
31
    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
32
33
34
35
    const [disabled, setDisabled] = useState(true)
    const [loading, setLoading] = useState(false)
    const selectRef = useRef(null)
    const colorRef = useRef(null)
36

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

kusang96's avatar
kusang96 committed
47
48
49
50
51
    useEffect(() => {
        const isProduct = Object.values(product).every(el => { console.log("el=", el); Boolean(el) })
        isProduct ? setDisabled(false) : setDisabled(true)
    }, [product])

52
    function deleteCategory(e) {
53
54
55
        const pdcate = product.sub_category.filter((el) => el !== e.target.name)
        setProduct({ ...product, "sub_category": pdcate })
        setSubCate([])
Jiwon Yoon's avatar
Jiwon Yoon committed
56
    }
57

Jiwon Yoon's avatar
Jiwon Yoon committed
58
    function handleCategory(e) {
kusang96's avatar
kusang96 committed
59
60
        const { name, value, selectedIndex } = e.target
        if (name === "main_category") {
61
            setProduct({ ...product, [name]: value })
kusang96's avatar
kusang96 committed
62
            setCategoryNum(selectedIndex - 1)
Jiwon Yoon's avatar
Jiwon Yoon committed
63
        }
64
65
66
67
        else {
            subCate.push(value)
            setProduct({ ...product, [name]: subCate })
            selectRef.current.selectedIndex = 0
Jiwon Yoon's avatar
Jiwon Yoon committed
68
        }
69
    }
kusang96's avatar
kusang96 committed
70

71
72
73
    function handleCheckBox(e) {
        setChecked({ ...checked, [e.target.value]: !checked[`${e.target.value}`] })
    }
Jiwon Yoon's avatar
Jiwon Yoon committed
74

75
    function addColor() {
kusang96's avatar
kusang96 committed
76
        colorRef.current.value = ''
77
        setProduct({ ...product, "colors":[...product.colors, color["colors"]] })
Jiwon Yoon's avatar
Jiwon Yoon committed
78
    }
79

Jiwon Yoon's avatar
Jiwon Yoon committed
80
    function deleteColor(e) {
81
82
83
84
        console.log(product.colors)
        console.log(e.target.name)
        const pdcolors = product.colors.filter((el) => el !== e.target.name)
        setProduct({ ...product, "colors": pdcolors })
Jiwon Yoon's avatar
Jiwon Yoon committed
85
    }
86

Jiwon Yoon's avatar
Jiwon Yoon committed
87
    function handleColor(e) {
kusang96's avatar
kusang96 committed
88
        color[e.target.name] = e.target.value
89
    }
Jiwon Yoon's avatar
Jiwon Yoon committed
90
91

    function handleChange(event) {
Jiwon Yoon's avatar
0111    
Jiwon Yoon committed
92
        const { name, value, files } = event.target
Jiwon Yoon's avatar
Jiwon Yoon committed
93
        if (files) {
kusang96's avatar
dd    
kusang96 committed
94
95
96
97
            setProduct({ ...product, [name]: files })
        } else {
            setProduct({ ...product, [name]: value })
        }
Jiwon Yoon's avatar
Jiwon Yoon committed
98
99
    }

kusang96's avatar
dd    
kusang96 committed
100
    async function handleSubmit(e) {
Jiwon Yoon's avatar
Jiwon Yoon committed
101
        e.preventDefault()
102
103
104
105
106
107
        const sizes = []
        for (let [key, value] of Object.entries(checked)) {
            if (value === true) {
                sizes.push(key)
            }
        }
kusang96's avatar
kusang96 committed
108
        product["sizes"] = sizes
Jiwon Yoon's avatar
Jiwon Yoon committed
109
        console.log(product)
kusang96's avatar
kusang96 committed
110
        const formData = new FormData();
이재연's avatar
0113    
이재연 committed
111
        for (let key in product) {
kusang96's avatar
kusang96 committed
112
            if (key === "main_image" || key === "detail_image") {
이재연's avatar
0113    
이재연 committed
113
                formData.append(key, product[key][0])
Jiwon Yoon's avatar
Jiwon Yoon committed
114
115
            } else if (key === "sizes" || key === "colors" || key === "sub_category") {
                for (let i = 0; i < product[key].length; i++) {
Jiwon Yoon's avatar
Jiwon Yoon committed
116
117
                    formData.append([key], product[key][i])
                }
Jiwon Yoon's avatar
Jiwon Yoon committed
118
            }
Jiwon Yoon's avatar
Jiwon Yoon committed
119
            else {
kusang96's avatar
dd    
kusang96 committed
120
121
122
123
                formData.append(key, product[key])
            }
        }
        try {
kusang96's avatar
kusang96 committed
124
125
            setLoading(true)
            setError('')
kusang96's avatar
0115    
kusang96 committed
126
            const response = await axios.post('/api/product/regist', formData)
이재연's avatar
0113    
이재연 committed
127
            console.log(response)
kusang96's avatar
0115    
kusang96 committed
128
            setSuccess(true)
kusang96's avatar
dd    
kusang96 committed
129
130
        } catch (error) {
            catchErrors(error, setError)
kusang96's avatar
kusang96 committed
131
132
        } finally {
            setLoading(false)
kusang96's avatar
kusang96 committed
133
        }
Jiwon Yoon's avatar
Jiwon Yoon committed
134
135
    }

136
    if (success) {
kusang96's avatar
kusang96 committed
137
        alert('상품 등록을 완료하였습니다.')
kusang96's avatar
0115    
kusang96 committed
138
        return <Redirect to='/admin' />
139
    }
kusang96's avatar
kusang96 committed
140

Kim, Subin's avatar
Kim, Subin committed
141
    return (
142
        <Container>
143
            {console.log(product)}
kusang96's avatar
kusang96 committed
144
145
            <Row className="justify-content-md-center">
                <Col md={8} className="border p-1" style={{ background: '#F7F3F3' }}>
146
                    {error && <Alert variant="danger" className="text-center">{error}</Alert>}
kusang96's avatar
kusang96 committed
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
                    <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>
박상호's avatar
good    
박상호 committed
164
165
                                <Col md={4} className="mb-1">
                                    <Form.Control as="select" name="main_category" onChange={handleCategory} disabled={product["sub_category"].length > 0} >
kusang96's avatar
kusang96 committed
166
                                        <option value="" >상위분류</option>
Jiwon Yoon's avatar
Jiwon Yoon committed
167
                                        {categories[0].map((main) => (
kusang96's avatar
kusang96 committed
168
169
170
171
                                            <option value={main}>{main}</option>
                                        ))}
                                    </Form.Control>
                                </Col>
박상호's avatar
good    
박상호 committed
172
                                <Col md={6} className="mb-2">
kusang96's avatar
kusang96 committed
173
                                    <Form.Control as="select" ref={selectRef} name="sub_category" onChange={handleCategory}>
kusang96's avatar
kusang96 committed
174
                                        <option value="" >하위분류</option>
kusang96's avatar
kusang96 committed
175
                                        {(categoryNum === '') ? '' : (categories[1][categoryNum].map((sub) => (
kusang96's avatar
kusang96 committed
176
                                            <option value={sub}>{sub}</option>
kusang96's avatar
kusang96 committed
177
                                        )))}
kusang96's avatar
kusang96 committed
178
179
180
                                    </Form.Control>
                                </Col>
                            </Row>
181
182
183
184
185
186
187
188
                            {product.sub_category.map((el) => (
                                <div className="my-2">
                                    <p name={el} className="mb-0" style={{ display: 'inline-block'}} >{product["main_category"]} / {el} </p>
                                    <Button name={el} type="button" className="float-right p-0 btn-light" style={{ display: 'inline-block' }} onClick={deleteCategory} >
                                        <img className="align-top" name={el} alt="삭제" src="https://img.icons8.com/fluent-systems-regular/24/000000/close-window.png" />
                                    </Button>
                                </div>
                            ))}
kusang96's avatar
kusang96 committed
189
190
191
                        </Form.Group>
                        <Form.Group>
                            <Form.Label>사이즈</Form.Label>
박상호's avatar
good    
박상호 committed
192
                            <Row className="px-3">
kusang96's avatar
kusang96 committed
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
                                <Col>
                                    <Form.Check type="checkbox" name="sizes" label="210" value="210" onChange={handleCheckBox} />
                                    <Form.Check type="checkbox" name="sizes" label="215" value="215" onChange={handleCheckBox} />
                                    <Form.Check type="checkbox" name="sizes" label="220" value="220" onChange={handleCheckBox} />
                                    <Form.Check type="checkbox" name="sizes" label="225" value="225" onChange={handleCheckBox} />
                                    <Form.Check type="checkbox" name="sizes" label="230" value="230" onChange={handleCheckBox} />
                                    <Form.Check type="checkbox" name="sizes" label="235" value="235" onChange={handleCheckBox} />
                                    <Form.Check type="checkbox" name="sizes" label="240" value="240" onChange={handleCheckBox} />
                                    <Form.Check type="checkbox" name="sizes" label="245" value="245" onChange={handleCheckBox} />
                                    <Form.Check type="checkbox" name="sizes" label="250" value="250" onChange={handleCheckBox} />
                                    <Form.Check type="checkbox" name="sizes" label="255" value="255" onChange={handleCheckBox} />
                                    <Form.Check type="checkbox" name="sizes" label="260" value="260" onChange={handleCheckBox} />
                                    <Form.Check type="checkbox" name="sizes" label="265" value="265" onChange={handleCheckBox} />
                                    <Form.Check type="checkbox" name="sizes" label="270" value="270" onChange={handleCheckBox} />
                                </Col>
                                <Col>
                                    <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} />
                                </Col>
                            </Row>
kusang96's avatar
kusang96 committed
217
218
219
220
                        </Form.Group>
                        <Form.Group>
                            <Form.Label>색상</Form.Label>
                            <Row>
221
                                <Col md={9} xs={9} className="pr-0">
222
                                    <Form.Control as="input" ref={colorRef} name="colors" placeholder="색상" onChange={handleColor} />
kusang96's avatar
kusang96 committed
223
                                </Col>
224
                                <Col className="pl-0">
kusang96's avatar
kusang96 committed
225
226
227
                                    <Button className="float-right" style={{ background: '#91877F', borderColor: '#91877F' }} onClick={addColor}>추가</Button>
                                </Col>
                            </Row>
228
229
230
231
232
233
234
235
                            {product.colors.map((el) => (
                                <div className="my-2">
                                    <p className="mb-0"  style={{ display: 'inline-block' }}>{el}</p>
                                    <Button style={{ display: 'inline-block' }} name={el} type="button" className="float-right p-0 btn-light" onClick={deleteColor}>
                                        <img className="align-top"  name={el} alt="삭제" src="https://img.icons8.com/fluent-systems-regular/24/000000/close-window.png" />
                                    </Button>
                                </div>
                            ))}
kusang96's avatar
kusang96 committed
236
237
238
239
240
241
242
243
244
245
246
247
248
                        </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>
kusang96's avatar
kusang96 committed
249
250
251
                        <Button type="submit" style={{ background: '#91877F', borderColor: '#91877F' }} block>
                            {loading && <Spinner as='span' animation='border' size='sm' role='status' aria-hidden='true' />}{' '}등록
                        </Button>
kusang96's avatar
kusang96 committed
252
253
254
255
                    </Form>
                </Col>
            </Row>
        </Container>
Kim, Subin's avatar
Kim, Subin committed
256
257
258
259
    )
}

export default ProductsRegist