Skip to content
Snippets Groups Projects
CalendarMonth.jsx 5.22 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(props){//주차 데이터를 담을 공간
        const calendarArr = [];
    
        const startDay = new Date(props.nowYear, props.nowMonth - 1, 1);
        const lastDay = new Date(props.nowYear, props.nowMonth, 0);
        const lastMonthDate = new Date(props.nowYear, props.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(props.nowYear, props.nowMonth - 1, 1 - startDay.getDay()) - (0);
        const eDay = new Date(props.nowYear, props.nowMonth - 1, lastDate + 6 - lastDay.getDay()) - (0);
    
        const handleDragStart = (newDate, idx, comp) => {
            setIsDragging(!isDragging);
            // console.log(newDate.toDateString(), idx);
            setDragStartDay(newDate);
            for(let day = fDay; day <= eDay; day+=(60*60*24*1000)){
                const elm = document.getElementById(day);
                elm.classList.remove("dragging")
    
            console.log(comp);
        };
        const handleDragWhile = (newDate, idx, comp) => {
            if(!isDragging)return;
            // setDragging("dragging");
            // dragging = "dragging";
            console.log(newDate.toDateString(), idx, dragging);
     
            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);
                    // if(elm.classList.contains("dragging"))elm.classList.remove("dragging");
                    // else elm.classList.add("dragging")
                    elm.classList.remove("dragging")
                }
            }
            else {
                for(let day = sd; day <= ed; day += (60*60*24*1000)){
                    const elm = document.getElementById(day);
                    // if(elm.classList.contains("dragging"))elm.classList.remove("dragging");
                    // else elm.classList.add("dragging")
                    elm.classList.add("dragging")
                }
            }
    
        };
        const handleDragEnd = (newDate, idx) => {
            setIsDragging(false);
            setDragging("nope");
            // dragging ="";
            // console.log(newDate.toDateString(), idx, dragging);
    
            console.log(dragStartDay);
            console.log(dragEndDay);
            console.log(Math.abs(dragEndDay - dragStartDay)/(60*60*24*1000));
        };
    
    
        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 !== props.nowMonth) cn = "cellb";
    
                tmpArr.push(
    
                    <TableCell k={day} cn={[cn, dragging].join(" ")} 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)
    
        }
    
        
        return(
            <tbody>
                {calendarArr}
            </tbody>
        );
    }
    
    function CalendarMonth(){
        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}></MakeCell>
                </table>
            </div>
        );
    }
    
    export default CalendarMonth;