CinemaEdit.js 5.67 KB
Newer Older
1
import { useState, useEffect, useRef } from "react";
2
3
import TicketEditForm from "./TicketEditForm.js";
import TicketFeeTable from "./TicketFeeTable.js";
Kim, Subin's avatar
Kim, Subin committed
4
import cinemaApi from "../../apis/cinema.api.js";
Kim, Subin's avatar
Kim, Subin committed
5
import theaterApi from "../../apis/theater.api.js";
Kim, Subin's avatar
Kim, Subin committed
6
import catchErrors from "../../utils/catchErrors.js";
Kim, Subin's avatar
Kim, Subin committed
7
8
import styles from "./admin.module.scss";

Kim, Subin's avatar
Kim, Subin committed
9
const INIT_CINEMAINFO = {
10
11
12
13
14
    cinemaName: "",
    transportation: "",
    parking: "",
    address: "",
    moreFeeInfo: ""
Kim, Subin's avatar
Kim, Subin committed
15
16
}

Kim, Subin's avatar
Kim, Subin committed
17
const CinemaEdit = () => {
Kim, Subin's avatar
Kim, Subin committed
18
    const [cinemaInfo, setCinemaInfo] = useState(INIT_CINEMAINFO)
Kim, Subin's avatar
Kim, Subin committed
19
    const [theaterTypeList, setTheaterTypeList] = useState([])
Jiwon Yoon's avatar
Jiwon Yoon committed
20
    const [theaterInfo, setTheaterInfo] = useState({ theaterCount: 0, seatCount: 0 })
Kim, Subin's avatar
Kim, Subin committed
21
    const [selectTheater, setSelectTheater] = useState(0)
22
    const [ticketFee, setTicketFee] = useState({})
Kim, Subin's avatar
Kim, Subin committed
23
    const [error, setError] = useState("")
24
    const formRef = useRef(null)
Kim, Subin's avatar
Kim, Subin committed
25
26
27

    useEffect(() => {
        getInfo()
Kim, Subin's avatar
Kim, Subin committed
28
        getTicketFeeInfo()
Jiwon Yoon's avatar
Jiwon Yoon committed
29
        getTheaterInfo()
Kim, Subin's avatar
Kim, Subin committed
30
    }, [])
Kim, Subin's avatar
Kim, Subin committed
31

Kim, Subin's avatar
Kim, Subin committed
32
33
    function handleChange(e) {
        const { name, value } = e.target
Kim, Subin's avatar
Kim, Subin committed
34
        setCinemaInfo({ ...cinemaInfo, [name]: value })
Kim, Subin's avatar
Kim, Subin committed
35
36
    }

Kim, Subin's avatar
Kim, Subin committed
37
38
39
    async function getInfo() {
        try {
            setError("")
40
            const info = await cinemaApi.getCinemaInfo()
Kim, Subin's avatar
Kim, Subin committed
41
42
43
44
45
46
47
48
49
50
            if (info) setCinemaInfo(info)
            else setCinemaInfo(INIT_CINEMAINFO)
        } catch (error) {
            catchErrors(error, setError)
        }
    }

    async function handleSubmit() {
        try {
            setError("")
51
            await cinemaApi.editCinema(cinemaInfo)
Kim, Subin's avatar
Kim, Subin committed
52
53
54
55
56
57
            window.location.reload()
        } catch (error) {
            catchErrors(error, setError)
        }
    }

Kim, Subin's avatar
Kim, Subin committed
58
59
    async function getTicketFeeInfo() {
        try {
Kim, Subin's avatar
Kim, Subin committed
60
            setError("")
Kim, Subin's avatar
Kim, Subin committed
61
62
63
64
65
66
67
            const res = await theaterApi.getTheaterType()
            setTheaterTypeList(res)
        } catch (error) {
            catchErrors(error, setError)
        }
    }

Jiwon Yoon's avatar
Jiwon Yoon committed
68
69
70
71
72
73
74
75
76
77
78
79
80
81
    async function getTheaterInfo() {
        try {
            const theaterInfo = await theaterApi.getAll()
            if (theaterInfo) {
                const theaterCount = theaterInfo.length
                const seatCount = theaterInfo.map(el=>el.rows*el.columns).reduce((acc, cur, idx) => { return acc += cur }, 0)
                console.log(seatCount)
                setTheaterInfo({ theaterCount: theaterCount, seatCount: seatCount })
            }
        } catch (error) {
            catchErrors(error, setError)
        }
    }

Kim, Subin's avatar
Kim, Subin committed
82
83
84
    return (
        <>
            <h2 className="border-bottom border-2 text-center pb-2 me-2">현재 영화관 정보</h2>
Kim, Subin's avatar
Kim, Subin committed
85
            <div className="mb-3">
Kim, Subin's avatar
theater    
Kim, Subin committed
86
                <label htmlfor="cinemaName" className="form-label">영화관 이름</label>
Kim, Subin's avatar
Kim, Subin committed
87
                <input type="text" className={`form-control mb-2 ${styles.shadowNone}`} id="cinemaName" name="cinemaName" value={cinemaInfo.cinemaName} onChange={handleChange} />
Jiwon Yoon's avatar
Jiwon Yoon committed
88
                <p> 상영관 : {theaterInfo.theaterCount}개관 |  좌석 : {theaterInfo.seatCount}</p>
Kim, Subin's avatar
Kim, Subin committed
89
            </div>
Kim, Subin's avatar
Kim, Subin committed
90
            <div className="mb-3">
Kim, Subin's avatar
theater    
Kim, Subin committed
91
                <label htmlfor="transportation" className="form-label">대중교통 안내</label>
Kim, Subin's avatar
Kim, Subin committed
92
                <textarea className={`form-control ${styles.shadowNone} ${styles.textarea}`} rows="7" id="transportation" name="transportation" value={cinemaInfo.transportation} onChange={handleChange}></textarea>
Kim, Subin's avatar
Kim, Subin committed
93
94
            </div>
            <div className="mb-3">
Kim, Subin's avatar
theater    
Kim, Subin committed
95
                <label htmlfor="parking" className="form-label">자가용/주차안내</label>
Kim, Subin's avatar
Kim, Subin committed
96
                <textarea className={`form-control ${styles.shadowNone} ${styles.textarea}`} rows="7" id="parking" name="parking" value={cinemaInfo.parking} onChange={handleChange}></textarea>
Kim, Subin's avatar
Kim, Subin committed
97
            </div>
Kim, Subin's avatar
theater    
Kim, Subin committed
98
            <label htmlfor="keyword" className="form-label">지도보기</label>
Kim, Subin's avatar
Kim, Subin committed
99
            <div className="input-group mb-3">
Kim, Subin's avatar
Kim, Subin committed
100
                <span className="input-group-text" id="address"><i className="bi bi-geo-alt-fill"></i></span>
Kim, Subin's avatar
Kim, Subin committed
101
102
                <input type="text" className={`form-control ${styles.shadowNone}`} id="address" name="address" value={cinemaInfo.address} onChange={handleChange} value={cinemaInfo.address} />
            </div>
103
104
            <p className="mb-0">영화관람료 설정</p>
            <p className="text-danger">*추가금액 정보를 입력바랍니다. 필요에 따라 기본가격 또한 변경 가능합니다.</p>
105
            <TicketEditForm editFee={ticketFee} formRef={formRef} />
Kim, Subin's avatar
Kim, Subin committed
106
107
            <label className="form-label">영화관람료 안내</label>
            <nav aria-label="breadcrumb">
Jiwon Yoon's avatar
Jiwon Yoon committed
108
109
110
                <ol className={"breadcrumb" + (theaterTypeList.length === 0 ? " d-flex justify-content-center" : "")}>
                    {theaterTypeList.length !== 0 ? theaterTypeList.map(theater => <li className={`breadcrumb-item ${styles.cursor}`} key={theater.id} onClick={() => setSelectTheater(theater.id)}>{theater.theaterTypeName}</li>)
                        : <li>등록된 관람료 관련 정보가 없습니다.</li>}
Kim, Subin's avatar
Kim, Subin committed
111
112
113
                </ol>
            </nav>
            <TicketFeeTable selectTheater={selectTheater} setEditFee={setTicketFee} formRef={formRef} />
114
            <div className="mb-3">
Kim, Subin's avatar
theater    
Kim, Subin committed
115
                <label htmlfor="moreFeeInfo" className="form-label">관람료 추가정보</label>
116
117
                <textarea className={`form-control ${styles.shadowNone} ${styles.textarea}`} rows="7" id="moreFeeInfo" name="moreFeeInfo" value={cinemaInfo.moreFeeInfo} onChange={handleChange}></textarea>
            </div>
Kim, Subin's avatar
Kim, Subin committed
118
119
            <div className="d-grid gap-2 mb-5">
                <button type="submit" className={`btn btn-dark shadow-none ${styles.customBtn}`} onClick={handleSubmit}>수정</button>
Kim, Subin's avatar
Kim, Subin committed
120
            </div>
Kim, Subin's avatar
Kim, Subin committed
121
122
123
124
        </>
    )
}
export default CinemaEdit