Skip to content
Snippets Groups Projects
UserTimeInfo.js 6.92 KiB
Newer Older
  • Learn to ignore specific revisions
  • Min Dong Hyeun's avatar
    Min Dong Hyeun committed
    import { useState,useEffect } from "react";
    
    import Button from "../components/Button";
    
    import CalendarWeek2 from "../components/CalendarWeek2"
    
    import "../styles/HomeMake.css"
    
    Min Dong Hyeun's avatar
    Min Dong Hyeun committed
    import axios from "axios";
    
    import { useLocation, useNavigate, useParams } from "react-router-dom";
    
    
    function UserTimeInfo() {
    
        const [state, setState] = useState(true);
    
        const [availableSchedules, setAvailableSchedules] = useState(location.state.schedules);
    
    Min Dong Hyeun's avatar
    Min Dong Hyeun committed
    
    
        const at = [];
        for(let key of availableSchedules){
            const date = new Date(key.availableDate) - 0;
            for(let t of key.availableTimes){
                at.push(date+t);
            }
        }
    
        const [availableTimes, setAvailableTimes] = useState(at);
        const {id} = useParams();
    
        let st = 0;
        let et = 48;
    
        if(location.state.startTime){
            st = location.state.startTime;
            const sta = st.split(':');
            st = sta[0]*2+sta[1]/30;
        }
        if(location.state.endTime){
            et = location.state.endTime;
            const eta = et.split(':');
            et = eta[0]*2+eta[1]/30;
        }
        
        const [startTime, setStartTime] = useState(st);
        const [endTime, setEndTime] = useState(et);
    
    
    
        const [today, setToday] = useState(new Date(location.state.startDate));
        const [startDate, setStartDate] = useState(new Date(location.state.startDate));
        const [endDate, setEndDate] = useState(new Date(location.state.endDate));
    
        const handleState1 = () => {
            setState(true);
        }
        const handleState2 = () => {
            setState(false);
    
        }
        const handleCalendar = (value) => {
            console.log('Selected Date:', value);
        };
    
    Min Dong Hyeun's avatar
    Min Dong Hyeun committed
    
    
        const fetchData = async () => {
            try {
                const response = await axios.get(`http://localhost:3000/meetings/${id}/`);
                const nd = response.data.startDate.split("-");
                setStartDate(new Date(nd[0]-0,nd[1]-1,nd[2]-0));
                setToday(startDate);
                const ed = response.data.endDate.split("-");
                setEndDate(new Date(ed[0]-0,ed[1]-1,ed[2]-0));
            } catch (error) {
                console.error(error);
            }
        };
        
    
            const sat = [];
            // state에 따라서 가능한 시간을 선택한 거라면 그냥 넘어가고
            // 불가능한 시간을 선택한 거라면 전부 날짜 범위에 맞춰서 뒤집어줘야 한다.
            // 여기 수정해야함
            if(!state){
                for(let day = startDate - 0; day <= endDate - 0; day+=((60*60*24*1000))){
                    for(let time = startTime; time < endTime; time++){
                        if(!availableTimes.includes(day+time)){
                            sat.push(day+time);
                        }
                    }
                }
            }
            else{
                sat.push(...availableTimes);
            }
            sat.sort();
    
    
            const aa = [];
            let t = [];
            let l = availableTimes[0];
    
            sat.forEach((em) => {
    
                const availableDate = newDate.getFullYear() + '-' + (newDate.getMonth()+1) + '-' + newDate.getDate();
                t.push(em%100);
    
                aa.push({availableDate: availableDate, availableTimes: t})
            });
    
            const groupedData = aa.reduce((acc, item) => {
                if (!acc[item.availableDate]) {
                  acc[item.availableDate] = { availableDate: item.availableDate, availableTimes: new Set(item.availableTimes) };
                } else {
                  item.availableTimes.forEach(time => acc[item.availableDate].availableTimes.add(time));
                }
                return acc;
            }, {});
              
            const compressedData = Object.values(groupedData).map(item => {
            return { availableDate: item.availableDate, availableTimes: [...item.availableTimes] };
            });
            
            setAvailableSchedules(compressedData);
    
            if(location.state.schedules){
                try {
                    const response = await axios.put(`http://localhost:3000/meetings/${id}/my/schedules/bulk`,{
                        schedules: compressedData
                    });
    
                    alert("제출 완료");
    
                }
                catch (error) {
                    if (error.response) {
                        if (error.response.status === 401) {
                            alert('Password를 잘못 입력하였습니다');
                        } else if (error.response.status === 404) {
                            alert('해당하는 이름이 존재하지 않습니다');
                        } 
                        else if(error.response.status === 400){
                            alert("비밀번호를 설정하셨습니다. 비밀번호를 입력해주세요")
                        }
                        else {
                            alert(`Unexpected status code: ${error.response.status}`);
                        }
                    } else {
                        console.error(error);
                    }
    
                    alert("제출 실패");
    
                    
                }
            }
            else{
                try {
                    const response = await axios.post(`http://localhost:3000/meetings/${id}/my/schedules/bulk`,{
                        schedules: compressedData
                    });
                }
                catch (error) {
                    if (error.response) {
                        if (error.response.status === 401) {
                            alert('Password를 잘못 입력하였습니다');
                        } else if (error.response.status === 404) {
                            alert('해당하는 이름이 존재하지 않습니다');
                        } 
                        else if(error.response.status === 400){
                            alert("비밀번호를 설정하셨습니다. 비밀번호를 입력해주세요")
                        }
                        else {
                            alert(`Unexpected status code: ${error.response.status}`);
                        }
                    } else {
                        console.error(error);
                    }
                    
                }
            }
    
        return (
            <div className="center-container">
                <Button
                    type="button"
                    text="가능한 시간"
    
                    onClick={handleState1}
    
                />
                <Button
                    type="button"
                    text="불가능한 시간"
    
                    onClick={handleState2}
    
                <CalendarWeek2 state={state} startDate={startDate} endDate={endDate} startTime={startTime} endTime={endTime} today={today} availableSchedules={availableSchedules} availableTimes={availableTimes} setAvailableTimes={setAvailableTimes} isContain={isContain} />
    
    Min Dong Hyeun's avatar
    Min Dong Hyeun committed
        );
    }
    
    export default UserTimeInfo;