TimeTable.js 3.82 KB
Newer Older
1
2
import { useState, useEffect } from "react";
import moment from 'moment';
3
import HorizontalCalender from "../Calender/HorizontalCalender.js";
4
5
import timetableApi from "../../apis/timetable.api.js";
import catchErrors from "../../utils/catchErrors.js";
6
import styles from "./admin.module.scss";
7

Kim, Subin's avatar
Kim, Subin committed
8
const TimeTable = ({ ticketInfo = { movieId: 0 }, setTicketInfo }) => {
9
10
11
12
13
    const [selectDate, setSelectDate] = useState(moment().format('YYYY-MM-DD'))
    const [timeList, setTimeList] = useState([])
    const [error, setError] = useState("")

    useEffect(() => {
Kim, Subin's avatar
Kim, Subin committed
14
        getTimeTable(selectDate, ticketInfo.movieId)
15
16
    }, [selectDate])

Kim, Subin's avatar
Kim, Subin committed
17
18
19
20
21
    useEffect(() => {
        getTimeTable(selectDate, ticketInfo.movieId)
    }, [ticketInfo.movieId])

    async function getTimeTable(selectDate, movieId) {
22
23
        try {
            setError("")
Kim, Subin's avatar
Kim, Subin committed
24
            const res = await timetableApi.getAll(selectDate, movieId)
25
26
27
28
29
30
            setTimeList(res)
        } catch (error) {
            catchErrors(error, setError)
        }
    }

31
    async function deleteTime(timeId) {
32
33
        try {
            setError("")
34
            await timetableApi.remove(timeId)
35
36
37
38
39
40
41
            alert('해당 상영시간표 정보를 성공적으로 삭제하였습니다.')
            getTimeTable(selectDate)
        } catch (error) {
            catchErrors(error, setError)
        }
    }

Kim, Subin's avatar
Kim, Subin committed
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
    function handleClick(time) {
        const date = new Date(time.start_time)
        let hours = date.getHours()
        let mins = date.getMinutes()

        if (hours <= 9) hours = '0' + hours
        if (mins <= 9) mins = '0' + mins

        setTicketInfo({
            ...ticketInfo,
            timetableId: time.id,
            time: time.date.split('T')[0] + " " + hours + ":" + mins,
            selectedTheater: time.theater.theaterName
        })
    }

Kim, Subin's avatar
Kim, Subin committed
58
    return (
Kim, Subin's avatar
Kim, Subin committed
59
        <>
60
            <HorizontalCalender selectDate={selectDate} setSelectDate={setSelectDate} />
61
            {timeList.length !== 0 ?
62
                timeList.map(el => <div className="mt-4">
Kim, Subin's avatar
Kim, Subin committed
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
                    <h5 className="mb-0">{el.theaterName}  / <p className="d-inline fs-6 mb-0">{el.theaterTypeName}</p></h5>
                    {el.timetable.map(time => {
                        if (ticketInfo)
                            return <div className="d-inline-flex m-2">
                                <div className={`card text-dark ${styles.cursor}`} onClick={() => handleClick(time)}>
                                    <div className="card-body py-1">{moment(time.start_time).format('HH:mm')} ~ {moment(time.end_time).format('HH:mm')}</div>
                                    <div className="card-footer text-center py-1">{time.theater.rows * time.theater.columns - time.reservations} / {time.theater.rows * time.theater.columns}</div>
                                </div>
                            </div>
                        else return <div className="d-inline-flex flex-column m-2">
                            <div className="d-flex justify-content-end">
                                <button type="button" className={`btn btn-dark btn-sm shadow-none ${styles.customBtn}`} onClick={() => deleteTime(time.id)}>X</button>
                            </div>
                            <div className="card">
                                <div className="card-body py-1">{moment(time.start_time).format('HH:mm')} ~ {moment(time.end_time).format('HH:mm')}</div>
                                <div className="card-footer text-center py-1">{time.title}</div>
                            </div>
80
                        </div>
Kim, Subin's avatar
Kim, Subin committed
81
                    })}
82
83
                </div>)
                : <p className="text-center mt-5 mb-0">서버에 저장되어 있는 상영시간표가 존재하지 않습니다.<br />아래의 양식을 작성해 새로운 상영시간표를 등록해주세요.</p>}
Kim, Subin's avatar
Kim, Subin committed
84
        </>
Kim, Subin's avatar
Kim, Subin committed
85
86
87
88
    )
}

export default TimeTable