Weekly.js 4.69 KB
Newer Older
Kim, Subin's avatar
Kim, Subin committed
1
2
import { useState, useEffect, useRef } from "react";
import { useHistory, useParams } from "react-router-dom";
Kim, Subin's avatar
Kim, Subin committed
3
import Date from "./DateSet";
Kim, Subin's avatar
Todo    
Kim, Subin committed
4
5
6
import todoApi from "../../apis/todo.api";
import { useAuth } from "../../utils/context";
import catchErrors from "../../utils/catchErrors";
Kim, Subin's avatar
Kim, Subin committed
7
import moment from 'moment';
Kim, Subin's avatar
Kim, Subin committed
8
import FullCalendar, { createPlugin } from '@fullcalendar/react';
Kim, Subin's avatar
Kim, Subin committed
9
10
import interactionPlugin from "@fullcalendar/interaction";
import bootstrapPlugin from '@fullcalendar/bootstrap';
Kim, Subin's avatar
Monthly    
Kim, Subin committed
11
12

const Weekly = () => {
Kim, Subin's avatar
Todo    
Kim, Subin committed
13
    const { user } = useAuth()
Kim, Subin's avatar
Kim, Subin committed
14
15
    const history = useHistory()
    const { date } = useParams()
Kim, Subin's avatar
Todo    
Kim, Subin committed
16
    const [initialDate, setInitialDate] = useState(moment().format("YYYY-MM-DD"))
Kim, Subin's avatar
Kim, Subin committed
17
18
19
20
21
22
23
24
25
26
    const [chooseDate, setChooseDate] = useState(moment(date).format("YYYY-MM-DD"))
    const [week, setWeek] = useState([
        { date: moment(date).day(0).format("YYYY-MM-DD"), rate: "75" },
        { date: moment(date).day(1).format("YYYY-MM-DD"), rate: "85" },
        { date: moment(date).day(2).format("YYYY-MM-DD"), rate: "40" },
        { date: moment(date).day(3).format("YYYY-MM-DD"), rate: "100" },
        { date: moment(date).day(4).format("YYYY-MM-DD"), rate: "" },
        { date: moment(date).day(5).format("YYYY-MM-DD"), rate: "0" },
        { date: moment(date).day(6).format("YYYY-MM-DD"), rate: "" }
    ])
Kim, Subin's avatar
Todo    
Kim, Subin committed
27
    const [error, setError] = useState("")
Kim, Subin's avatar
Kim, Subin committed
28
29
30
31
32
33
34
35
36
37
38
    const calendarRef = useRef(null)
    let calendar = null

    useEffect(() => {
        if (calendarRef && calendarRef.current) {
            calendar = calendarRef.current.getApi()
        }
    })

    useEffect(() => {
        setChooseDate(moment(date).format("YYYY-MM-DD"))
Kim, Subin's avatar
Todo    
Kim, Subin committed
39
        getTodoList()
Kim, Subin's avatar
Kim, Subin committed
40
41
42
43
44
45
46
47
48
49
50
        setWeek([
            { date: moment(date).day(0).format("YYYY-MM-DD"), rate: "7" },
            { date: moment(date).day(1).format("YYYY-MM-DD"), rate: "8" },
            { date: moment(date).day(2).format("YYYY-MM-DD"), rate: "4" },
            { date: moment(date).day(3).format("YYYY-MM-DD"), rate: "100" },
            { date: moment(date).day(4).format("YYYY-MM-DD"), rate: "" },
            { date: moment(date).day(5).format("YYYY-MM-DD"), rate: "0" },
            { date: moment(date).day(6).format("YYYY-MM-DD"), rate: "" }
        ])
    }, [date])

Kim, Subin's avatar
Todo    
Kim, Subin committed
51
52
53
54
55
56
57
58
59
60
    async function getTodoList() {
        try {
            setError("")
            const result = await todoApi.getTodopercent(user.id, moment(date).day(0).format("YYYY-MM-DD"), moment(date).day(6).format("YYYY-MM-DD"))
            console.log("result==", result)
        } catch (error) {
            catchErrors(error, setError)
        }
    }

Kim, Subin's avatar
Kim, Subin committed
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
    function prev() {
        calendar.prev()
        let date = moment(calendar.getDate()).format('YYYY-MM-DD')
        history.push(`/todo/${date}`)
    }

    function next() {
        calendar.next()
        let date = moment(calendar.getDate()).format('YYYY-MM-DD')
        history.push(`/todo/${date}`)
    }

    function gotoDate(date) {
        calendar.gotoDate(date)
        history.push(`/todo/${date}`)
    }

    const CustomeWeeklyView = ({ dateProfile }) => {
        let current = moment(dateProfile.currentRange.start).format("YYYY-MM-DD")
Kim, Subin's avatar
Todo    
Kim, Subin committed
80

Kim, Subin's avatar
Kim, Subin committed
81
        return (
Kim, Subin's avatar
Kim, Subin committed
82
            <div className="fc-custom-view weekly-view d-flex row-cols-9" style={{ cursor: "pointer" }}>
Kim, Subin's avatar
Kim, Subin committed
83
84
85
86
87
88
89
90
91
92
93
94
95
                <i className="col bi bi-chevron-left align-self-center" onClick={prev} style={{ fontSize: "2em" }} />
                {week.map((info, idx) => <Date index={idx} info={info} today={moment(info.date).isSame(current) ? true : false} handleClick={gotoDate} />)}
                <i className="col bi bi-chevron-right align-self-center" onClick={next} style={{ fontSize: "2em" }} />
            </div>
        )
    }

    const customViewPlugin = createPlugin({
        views: {
            week: CustomeWeeklyView
        }
    })

Kim, Subin's avatar
Monthly    
Kim, Subin committed
96
97
    return (
        <FullCalendar
Kim, Subin's avatar
Kim, Subin committed
98
99
100
101
            ref={calendarRef}
            plugins={[customViewPlugin, interactionPlugin, bootstrapPlugin]}
            initialView="week"
            initialDate={chooseDate}
Kim, Subin's avatar
Monthly    
Kim, Subin committed
102
            headerToolbar={{
Kim, Subin's avatar
Kim, Subin committed
103
104
105
106
                start: 'title',
                center: '',
                end: ''
            }}
Kim, Subin's avatar
Kim, Subin committed
107
108
109
110
            titleFormat={() => moment(chooseDate).format("YYYY[년 ]MM[월]")}
            views={{
                week: {
                    validRange: {
Kim, Subin's avatar
Todo    
Kim, Subin committed
111
112
                        start: moment(initialDate).subtract(3, 'years').format('YYYY-MM[-01]'),
                        end: moment(initialDate).add(3, 'years').add(1, 'months').format('YYYY-MM[-01]')
Kim, Subin's avatar
Kim, Subin committed
113
114
115
116
117
                    },
                    dateIncrement: {
                        days: 7
                    }
                }
Kim, Subin's avatar
Monthly    
Kim, Subin committed
118
            }}
Kim, Subin's avatar
Kim, Subin committed
119
120
121
            timeZone="local"
            themeSystem='bootstrap'
            height="fit-content"
Kim, Subin's avatar
Monthly    
Kim, Subin committed
122
123
124
125
126
        />
    )
}

export default Weekly