Skip to content
Snippets Groups Projects
CalendarMonth.jsx 5.67 KiB
Newer Older
  • Learn to ignore specific revisions
  • import React, { useState } from "react"
    import MakeDay from "./MakeDay";
    import MakeHeader from "./MakeHeader";
    
    import TableCell from "./TableCell";
    
    function MakeCell({ nowYear, nowMonth, usingDate, setUsingDate }){//주차 데이터를 담을 공간
    
        const calendarArr = [];
    
    
        const startDay = new Date(nowYear, nowMonth - 1, 1);
        const lastDay = new Date(nowYear, nowMonth, 0);
        const lastMonthDate = new Date(nowYear, nowMonth - 1, 0).getDate();
    
    
        let nowDate = startDay.getDate();
        const lastDate = lastDay.getDate();
    
    
        const [dragging, setDragging] = useState("nope");
        const [selectedDays, setSelectedDays] = useState([]); //선택된 날짜
        const [isDragging, setIsDragging] = useState(false); //드래그 여부
        const [dragStartDay, setDragStartDay] = useState(null); //드래그 시작 날짜
        const [dragEndDay, setDragEndDay] = useState();
        
        // 여기 달력 날짜 수정해야함
    
        const fDay = new Date(nowYear, nowMonth - 1, 1 - startDay.getDay()) - (0);
        const eDay = new Date(nowYear, nowMonth - 1, lastDate + 6 - lastDay.getDay()) - (0);
    
        let startDate="";
        let endDate="";
    
    
        const handleDragStart = (newDate, idx, comp) => {
            setIsDragging(!isDragging);
            setDragStartDay(newDate);
            for(let day = fDay; day <= eDay; day+=(60*60*24*1000)){
                const elm = document.getElementById(day);
                elm.classList.remove("dragging")
    
        const handleDragWhile = (newDate, idx, comp) => {
            if(!isDragging)return;
            setDragEndDay(newDate);
    
            let sd = dragStartDay - 0;
            let ed = newDate - 0;
            if(sd > ed){
                let tmp = sd;
                sd = ed;
                ed = tmp;
            }
            for(let day = fDay; day <= eDay; day+=(60*60*24*1000)){
                const elm = document.getElementById(day);
                elm.classList.remove("dragging")
            }
            const elm2 = document.getElementById(comp);
            if(elm2.classList.contains("dragging")){
                for(let day = ed; day >= comp; day -= (60*60*24*1000)){
                    const elm = document.getElementById(day);
                    elm.classList.remove("dragging")
                }
            }
            else {
                for(let day = sd; day <= ed; day += (60*60*24*1000)){
                    const elm = document.getElementById(day);
                    elm.classList.add("dragging")
                }
            }
    
        };
    
        const handleDragEnd = (newDate, idx) => {
            setIsDragging(false);
            setDragging("nope");
    
            if(dragStartDay - 0 < dragEndDay - 0){
                startDate = dragStartDay.getFullYear() + '-' + (dragStartDay.getMonth()+1) + '-' + dragStartDay.getDate();
                endDate = dragEndDay.getFullYear() + '-' + (dragEndDay.getMonth()+1) + '-' + dragEndDay.getDate();
            }
            else{
                endDate = dragStartDay.getFullYear() + '-' + (dragStartDay.getMonth()+1) + '-' + dragStartDay.getDate();
                startDate = dragEndDay.getFullYear() + '-' + (dragEndDay.getMonth()+1) + '-' + dragEndDay.getDate();
            }
            // console.log(startDate);
            // console.log(endDate);
    
    Min Dong Hyeun's avatar
    Min Dong Hyeun committed
            setUsingDate({startDate:startDate, endDate:endDate})
    
        const handleClick = (newDate) => {
            for(let day = fDay; day <= eDay; day+=(60*60*24*1000)){
                const elm = document.getElementById(day);
                elm.classList.remove("dragging")
            }
            const elm = document.getElementById(newDate - 0);
            elm.classList.add("dragging")
            console.log(`${newDate.getFullYear()}-${newDate.getMonth()+1}-${newDate.getDate()}`)
        }
    
    
    
        for(let day = fDay; day <= eDay; day += (60*60*24*1000)){
    
            const tmpArr = [];
            for(let i = 0; i < 7; i++){
                let cn = "cella";
    
                const newDate = new Date(day);
    
                if(newDate.getMonth() + 1 !== nowMonth) cn = "cellb";
    
                tmpArr.push(
    
                    <TableCell k={day} cn={[cn, dragging].join(" ")} handleClick={handleClick} newDate={newDate} hds={handleDragStart} hdw={handleDragWhile} hde={handleDragEnd} i={i} value={newDate.getDate()}/>
    
                );
                day+=(60*60*24*1000)
    
            }
            calendarArr.push(
                <tr>{tmpArr}</tr>
            );
    
    
            day-=(60*60*24*1000)
    
    function CalendarMonth({ usingDate, setUsingDate }){
    
        const [currentDay, setCurrentDay] = useState(new Date());
        
        // 일요일 0 시작
        const nowDay = currentDay.getDay();
        const [nowDate, setNowDate] = useState(currentDay.getDate());
        const [nowMonth, setNowMonth] = useState(currentDay.getMonth() + 1); // zero-base
        const [nowYear, setNowYear] = useState(currentDay.getFullYear());
    
        const prevMonth = () => {
            let newMonth = nowMonth - 1;
            if(newMonth < 1){
                newMonth = nowMonth + 11;
                setNowYear(nowYear - 1);
            }
            setNowMonth(newMonth);
            setCurrentDay(new Date(nowYear, nowMonth, nowDate));
        }
        const nextMonth = () => {
            let newMonth = nowMonth + 1;
            if(newMonth > 12){
                newMonth = nowMonth - 11;
                setNowYear(nowYear + 1);
            }
            setNowMonth(newMonth);
            setCurrentDay(new Date(nowYear, nowMonth, nowDate));
        }
    
        return(
            <div className="calendar">
    
                <h1>달력</h1>
    
                <MakeHeader nowMonth={nowMonth} prevMonth={prevMonth} nextMonth={nextMonth}></MakeHeader>
                <h1>{nowYear}</h1>
                <table className="calendarTable">
                    <MakeDay/> 
    
                    <MakeCell nowYear={nowYear} nowMonth={nowMonth} usingDate={usingDate} setUsingDate={setUsingDate}></MakeCell>
    
                </table>
            </div>
        );
    }
    
    export default CalendarMonth;