ProductRegist.js 9.17 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

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

function ProductsRegist() {
13
14
15
16
17
18
    const INIT_PRODUCT = {
        pro_name: '',
        price: 0,
        stock: 0,
        main_category: '',
        sub_category: [],
Jiwon Yoon's avatar
Jiwon Yoon committed
19
20
        sizes: [],
        colors: [],
21
22
23
24
        description: '',
        main_image: [],
        detail_image: []
    }
kusang96's avatar
kusang96 committed
25
    const [categorys, setCategorys] = useState({ 0: [], 1: [[]] })
26
27
28
    const [product, setProduct] = useState(INIT_PRODUCT)
    const [categoryNum, setCategoryNum] = useState(0)
    const [tag, setTag] = useState(0)
kusang96's avatar
dd    
kusang96 committed
29
    const [error, setError] = useState('')
30
31
32
    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
33
34
    useEffect(async () => {
        try {
kusang96's avatar
0115    
kusang96 committed
35
            const response = await axios.get('/api/categories')
kusang96's avatar
kusang96 committed
36
37
38
39
40
41
            const data = response.data[0]
            setCategorys([Object.keys(data), Object.values(data)])
        } catch (error) {
            catchErrors(error, setError)
        }
    }, [])
42
43
44
45
46
47
48
49
50
51

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

53
54
55
    function deleteCategory(e) {
        const categ = e.target.parentNode
        categ.remove()
kusang96's avatar
kusang96 committed
56
        product["sub_category"].splice(categ.firstElementChild.getAttribute("i"), 1)
57
    }
kusang96's avatar
kusang96 committed
58

59
60
61
    function handleCheckBox(e) {
        setChecked({ ...checked, [e.target.value]: !checked[`${e.target.value}`] })
    }
Jiwon Yoon's avatar
Jiwon Yoon committed
62

63
    function addColor() {
Jiwon Yoon's avatar
Jiwon Yoon committed
64
65
66
        preColors.push(color["colors"])
        colorHtml.push(
            <p>{color["colors"]}</p>
67
        )
kusang96's avatar
kusang96 committed
68
        setProduct({ ...product, "colors": preColors })
Jiwon Yoon's avatar
Jiwon Yoon committed
69
    }
70

kusang96's avatar
kusang96 committed
71
72
    function colorChange(e) {
        color[e.target.name] = e.target.value
73
    }
Jiwon Yoon's avatar
Jiwon Yoon committed
74
75

    function handleChange(event) {
Jiwon Yoon's avatar
0111    
Jiwon Yoon committed
76
        const { name, value, files } = event.target
kusang96's avatar
kusang96 committed
77
78
79
        console.log("event.target.name=", name, "event.target.value=", value)
        if (name === "sub_category") {
            product[name].push(value)
Jiwon Yoon's avatar
0111    
Jiwon Yoon committed
80
        } else if (files) {
kusang96's avatar
dd    
kusang96 committed
81
            setProduct({ ...product, [name]: files })
Jiwon Yoon's avatar
0111    
Jiwon Yoon committed
82

kusang96's avatar
dd    
kusang96 committed
83
84
85
        } else {
            setProduct({ ...product, [name]: value })
        }
86
87
88
        if (event.target.name === "main_category") {
            setCategoryNum(event.target.selectedIndex - 1)
        }
Jiwon Yoon's avatar
Jiwon Yoon committed
89
90
    }

kusang96's avatar
dd    
kusang96 committed
91
    async function handleSubmit(e) {
Jiwon Yoon's avatar
Jiwon Yoon committed
92
        e.preventDefault()
93
94
95
96
97
98
        const sizes = []
        for (let [key, value] of Object.entries(checked)) {
            if (value === true) {
                sizes.push(key)
            }
        }
kusang96's avatar
kusang96 committed
99
        product["sizes"] = sizes
kusang96's avatar
kusang96 committed
100
        const formData = new FormData();
이재연's avatar
0113    
이재연 committed
101
        for (let key in product) {
102
            if (key === "main_image" || key === "detail_image") {
이재연's avatar
0113    
이재연 committed
103
104
                console.log(product[key][0])
                formData.append(key, product[key][0])
kusang96's avatar
dd    
kusang96 committed
105
106
107
108
109
            } else {
                formData.append(key, product[key])
            }
        }
        try {
kusang96's avatar
0115    
kusang96 committed
110
            const response = await axios.post('/api/product/regist', formData)
이재연's avatar
0113    
이재연 committed
111
            console.log(response)
kusang96's avatar
0115    
kusang96 committed
112
            setSuccess(true)
kusang96's avatar
dd    
kusang96 committed
113
114
        } catch (error) {
            catchErrors(error, setError)
kusang96's avatar
kusang96 committed
115
        }
Jiwon Yoon's avatar
Jiwon Yoon committed
116
117
    }

118
    if (success) {
kusang96's avatar
0115    
kusang96 committed
119
        return <Redirect to='/admin' />
120
    }
kusang96's avatar
kusang96 committed
121

Kim, Subin's avatar
Kim, Subin committed
122
    return (
kusang96's avatar
kusang96 committed
123
124
125
        <Container className="mt-5">
            <Row className="justify-content-md-center">
                <Col md={8} className="border p-1" style={{ background: '#F7F3F3' }}>
126
                    {error && <Alert variant="danger" className="text-center">{error}</Alert>}
kusang96's avatar
kusang96 committed
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
                    <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}>
                                    <Form.Control as="select" name="main_category" onChange={handleChange}>
                                        <option value="" >상위분류</option>
                                        {categorys[0].map((main) => (
                                            <option value={main}>{main}</option>
                                        ))}
                                    </Form.Control>
                                </Col>
                                <Col md={6}>
                                    <Form.Control as="select" name="sub_category" onChange={handleChange}>
                                        <option value="" >하위분류</option>
                                        {categorys[1][categoryNum].map((sub) => (
                                            <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}>
                                    <Form.Control as="textarea" rows={1} name="colors" placeholder="색상" onChange={colorChange} />

                                </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
207
208
209
210
    )
}

export default ProductsRegist