import { useState,useEffect } from "react"; import Button from "../components/Button"; import CalendarWeek2 from "../components/CalendarWeek2" import "../styles/HomeMake.css" import axios from "axios"; import { useLocation, useNavigate, useParams } from "react-router-dom"; function UserTimeInfo() { const location = useLocation(); const [state, setState] = useState(true); const [availableSchedules, setAvailableSchedules] = useState(location.state.schedules); 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); }; 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 handleAlert = async () => { 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) => { if(parseInt(l/100)!==parseInt(em/100)){ t=[]; } const newDate = new Date(parseInt(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); } } } } const isContain = (value) => { return availableTimes.includes(value); } 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} /> <Button type="submit" text="시작하기" onClick={handleAlert} /> </div> ); } export default UserTimeInfo;