Skip to content
Snippets Groups Projects
ResultMakeForm.js 13.4 KiB
Newer Older
  • Learn to ignore specific revisions
  • // import React, { useState, useEffect } from "react";
    // import CalendarWeek from "./CalendarWeek";
    // import { useNavigate, useParams } from "react-router-dom";
    // import axios from "axios";
    
    // import "../styles/ResultMake.css";
    // function ResultMakeForm() {
    //   const [meetingData, setMeetingData] = useState(null);
    //   const { meeting_id } = useParams();
    //   const { currentParticipants, maxParticipants } = meetingData || {};
    //   const navigate = useNavigate();
    //   const [timeLeft, setTimeLeft] = useState("");
    //   const [hoveredInfo, setHoveredInfo] = useState(null);
    //   const [isLoading, setIsLoading] = useState(true); // 로딩 상태 관리
    //   const [isModalOpen, setIsModalOpen] = useState(false);
    
    //   useEffect(() => {
    //     // 서버에서 미팅 데이터를 가져오는 함수
    //     const fetchMeetingData = async () => {
    //       setIsLoading(true);
    //       try {
    //         const response = await axios.get(
    //           `http://localhost:3000/meetings/${meeting_id}/details`,
    //           {
    //             withCredentials: true,
    //           }
    //         );
    //         setMeetingData(response.data);
    //         setIsLoading(false);
    //       } catch (error) {
    //         console.error("데이터 로딩 에러:", error);
    //         setIsLoading(false);
    //       }
    //     };
    
    //     fetchMeetingData();
    //   }, [meeting_id]);
    
    //   // 타이머를 시작하고 관리하는 로직
    //   useEffect(() => {
    //     const calculateTimeLeft = () => {
    //       if (!meetingData || !meetingData.voteExpiresAt) {
    //         // meetingData나 voteExpiresAt이 없는 경우 기본값을 반환
    //         return {
    //           days: 0,
    //           hours: 0,
    //           minutes: 0,
    //           seconds: 0,
    //         };
    //       }
    //       const now = new Date();
    //       const voteExpires = new Date(meetingData.voteExpiresAt);
    //       const difference = voteExpires - now;
    
    //       if (difference > 0) {
    //         return {
    //           days: Math.floor(difference / (1000 * 60 * 60 * 24)),
    //           hours: Math.floor((difference / (1000 * 60 * 60)) % 24),
    //           minutes: Math.floor((difference / 1000 / 60) % 60),
    //           seconds: Math.floor((difference / 1000) % 60),
    //         };
    //       } else {
    //         // 시간이 이미 지난 경우 기본값을 반환
    //         return {
    //           days: 0,
    //           hours: 0,
    //           minutes: 0,
    //           seconds: 0,
    //         };
    //       }
    //     };
    
    //     const updateTimer = () => {
    //       const newTimeLeft = calculateTimeLeft() || {}; // newTimeLeft가 undefined인 경우를 대비해 기본 객체 할당
    //       const formattedTime = `${
    //         newTimeLeft.days ? newTimeLeft.days + "일 " : ""
    //       }${newTimeLeft.hours ? newTimeLeft.hours + "시간 " : ""}${
    //         newTimeLeft.minutes ? newTimeLeft.minutes + "분 " : ""
    //       }${newTimeLeft.seconds ? newTimeLeft.seconds + "초" : ""}`;
    //       setTimeLeft(formattedTime);
    //     };
    
    //     updateTimer();
    //     const timerId = setInterval(updateTimer, 1000);
    
    //     return () => clearInterval(timerId);
    //   }, [meetingData]);
    
    //   const handleEdit = async () => {
    //     try {
    //       const response = await axios.get(
    //         `http://localhost:3000/meetings/${meeting_id}/`
    //       );
    //       const {
    //         startDate,
    //         endDate,
    //         availableVotingStartTime,
    //         availableVotingEndTime,
    //       } = response.data;
    
    //       try {
    //         const scheduleResponse = await axios.get(
    //           `http://localhost:3000/meetings/${meeting_id}/my/schedules`
    //         );
    //         navigate("/UserTimeInfo", {
    //           state: {
    //             id: meeting_id,
    //             startTime: availableVotingStartTime,
    //             endTime: availableVotingEndTime,
    //             startDate,
    //             endDate,
    //             schedules: scheduleResponse.data.schedules,
    //           },
    //         });
    //       } catch (error) {
    //         console.error(error);
    //       }
    //     } catch (error) {
    //       console.error(error);
    //     }
    //   };
    
    //   const closeMeeting = async () => {
    //     const adminPassword = prompt("관리자 비밀번호를 입력하세요:");
    
    //     if (adminPassword) {
    //       try {
    //         await axios.post(`http://localhost:3000/meetings/${meeting_id}/close`, {
    //           adminPassword,
    //         });
    
    //         navigate(`/resultend/${meeting_id}`);
    //       } catch (error) {
    //         if (error.response && error.response.status === 401) {
    //           alert("비밀번호가 틀렸습니다.");
    //         } else {
    //           console.error("오류 발생:", error);
    //         }
    //       }
    //     }
    //   };
    
    //   const handleModalClose = () => {
    //     setIsModalOpen(false);
    //   };
    
    //   const handlePasswordConfirm = async (password) => {
    //     setIsModalOpen(false);
    //     try {
    //       await axios.post(`http://localhost:3000/meetings/${meeting_id}/close`, {
    //         adminPassword: password,
    //       });
    //       navigate(`/resultend/${meeting_id}`);
    //     } catch (error) {
    //       if (error.response && error.response.status === 401) {
    //         alert("비밀번호가 틀렸습니다.");
    //       } else {
    //         console.error("오류 발생:", error);
    //       }
    //     }
    //   };
    
    //   return (
    //     <>
    //       {isLoading ? (
    //         <div>Loading...</div>
    //       ) : (
    //         <div className="column-container">
    //           <h1 className="title-box">{meetingData?.title}</h1>
    
    //           <div>
    //             현재 완료한 인원수 {currentParticipants}
    //             {maxParticipants != null && ` / ${maxParticipants}`}
    //           </div>
    
    //           <div>종료까지 남은 시간 {timeLeft}</div>
    //           <button onClick={handleEdit}>수정하기</button>
    //           <button onClick={closeMeeting}>투표 종료하기</button>
    //         </div>
    //       )}
    //       {meetingData && (
    //         <span className="flex-row">
    //           <div className="calander-container">
    //             <CalendarWeek
    //               participants={meetingData.participants}
    //               startDate={meetingData.startDate}
    //               endDate={meetingData.endDate}
    //               currentParticipants={meetingData.currentParticipants}
    //               maxParticipants={meetingData.maxParticipants}
    //               hoveredInfo={hoveredInfo}
    //               setHoveredInfo={setHoveredInfo}
    //               availableVotingStartTime={meetingData.availableVotingStartTime}
    //               availableVotingEndTime={meetingData.availableVotingEndTime}
    //             />
    //           </div>
    
    //           <span className="mostTime">
    //             <div style={{ textAlign: "center" }}>
    //               가장 많은 사람들이 가능한 일정
    //             </div>
    //             <ol>//일정 5개 나열</ol>
    //           </span>
    //           <span className="possible">
    //             {!hoveredInfo && (
    //               <div>
    //                 <strong>가능한 사람들이 표시됩니다.</strong>
    //                 <p>마우스를 달력 위에 올려보세요!</p>
    //               </div>
    //             )}
    
    //             {hoveredInfo && (
    //               <div style={{ textAlign: "center" }}>
    //                 <strong>
    //                   {hoveredInfo.date} {hoveredInfo.time}에 가능한 사람:
    //                 </strong>
    //                 <ul>
    //                   {hoveredInfo.participants.map((name) => (
    //                     <li key={name}>{name}</li>
    //                   ))}
    //                 </ul>
    //               </div>
    //             )}
    //           </span>
    //         </span>
    //       )}
    //     </>
    //   );
    // }
    // export default ResultMakeForm;
    
    import React, { useState, useEffect } from "react";
    
    import CalendarWeek from "./CalendarWeek";
    
    import PasswordModal from "./PasswordModal";
    
    import { useNavigate, useParams } from "react-router-dom";
    import axios from "axios";
    
    import "../styles/ResultMake.css";
    
    function ResultMakeForm() {
    
      const [meetingData, setMeetingData] = useState(null);
      const { meeting_id } = useParams();
    
      const navigate = useNavigate();
    
      const [timeLeft, setTimeLeft] = useState("");
    
      const [hoveredInfo, setHoveredInfo] = useState(null);
    
      const [isLoading, setIsLoading] = useState(true);
      const [isModalOpen, setIsModalOpen] = useState(false);
    
    
      useEffect(() => {
        const fetchMeetingData = async () => {
    
          try {
            const response = await axios.get(
    
              `http://localhost:3000/meetings/${meeting_id}/details`,
    
            );
            setMeetingData(response.data);
    
          } catch (error) {
            console.error("데이터 로딩 에러:", error);
    
          }
        };
    
        fetchMeetingData();
      }, [meeting_id]);
    
    
      useEffect(() => {
        const calculateTimeLeft = () => {
    
          if (!meetingData || !meetingData.voteExpiresAt) {
    
            return { days: 0, hours: 0, minutes: 0, seconds: 0 };
    
          const now = new Date();
          const voteExpires = new Date(meetingData.voteExpiresAt);
          const difference = voteExpires - now;
    
          if (difference > 0) {
    
              days: Math.floor(difference / (1000 * 60 * 60 * 24)),
              hours: Math.floor((difference / (1000 * 60 * 60)) % 24),
              minutes: Math.floor((difference / 1000 / 60) % 60),
              seconds: Math.floor((difference / 1000) % 60),
            };
    
            return { days: 0, hours: 0, minutes: 0, seconds: 0 };
    
          }
        };
    
        const updateTimer = () => {
    
          const newTimeLeft = calculateTimeLeft();
    
          const formattedTime = `${
            newTimeLeft.days ? newTimeLeft.days + "" : ""
          }${newTimeLeft.hours ? newTimeLeft.hours + "시간 " : ""}${
            newTimeLeft.minutes ? newTimeLeft.minutes + "" : ""
          }${newTimeLeft.seconds ? newTimeLeft.seconds + "" : ""}`;
          setTimeLeft(formattedTime);
        };
    
        const timerId = setInterval(updateTimer, 1000);
    
    준현 강's avatar
    준현 강 committed
        return () => clearInterval(timerId);
    
      const handleEdit = async () => {
        try {
          const response = await axios.get(
            `http://localhost:3000/meetings/${meeting_id}/`
          );
          const {
            startDate,
            endDate,
            availableVotingStartTime,
            availableVotingEndTime,
          } = response.data;
    
          try {
            const scheduleResponse = await axios.get(
              `http://localhost:3000/meetings/${meeting_id}/my/schedules`
            );
            navigate("/UserTimeInfo", {
              state: {
                id: meeting_id,
                startTime: availableVotingStartTime,
                endTime: availableVotingEndTime,
                startDate,
                endDate,
                schedules: scheduleResponse.data.schedules,
              },
            });
          } catch (error) {
            console.error(error);
          }
        } catch (error) {
          console.error(error);
        }
      };
    
      const closeMeeting = () => {
        setIsModalOpen(true);
      };
    
      const handleModalClose = () => {
        setIsModalOpen(false);
      };
    
      const handlePasswordSubmit = async (password) => {
        setIsModalOpen(false);
        try {
          await axios.post(`http://localhost:3000/meetings/${meeting_id}/close`, {
            adminPassword: password,
          });
          navigate(`/resultend/${meeting_id}`);
        } catch (error) {
          if (error.response && error.response.status === 401) {
            alert("비밀번호가 틀렸습니다.");
          } else {
            console.error("오류 발생:", error);
          }
        }
    
          {isLoading ? (
            <div>Loading...</div>
          ) : (
            <div className="column-container">
              <h1 className="title-box">{meetingData?.title}</h1>
              <div>
    
                현재 완료한 인원수 {meetingData?.currentParticipants} /{" "}
                {meetingData?.maxParticipants}
    
              </div>
              <div>종료까지 남은 시간 {timeLeft}</div>
              <button onClick={handleEdit}>수정하기</button>
    
              <button onClick={closeMeeting}>투표 종료하기</button>
    
            <div className="flex-row">
              <CalendarWeek
                participants={meetingData.participants}
                startDate={meetingData.startDate}
                endDate={meetingData.endDate}
                currentParticipants={meetingData.currentParticipants}
                maxParticipants={meetingData.maxParticipants}
                hoveredInfo={hoveredInfo}
                setHoveredInfo={setHoveredInfo}
                availableVotingStartTime={meetingData.availableVotingStartTime}
                availableVotingEndTime={meetingData.availableVotingEndTime}
              />
            </div>
          )}
          <PasswordModal
            isOpen={isModalOpen}
            onRequestClose={handleModalClose}
            onSubmit={handlePasswordSubmit}
          />
          <span className="mostTime">
            <div style={{ textAlign: "center" }}>
              가장 많은 사람들이 가능한 일정
            </div>
            <ol>//일정 5개 나열</ol>
          </span>
          <span className="possible">
            {!hoveredInfo && (
              <div>
                <strong>가능한 사람들이 표시됩니다.</strong>
                <p>마우스를 달력 위에 올려보세요!</p>
    
    준현 강's avatar
    준현 강 committed
              </div>
    
    준현 강's avatar
    준현 강 committed
    
    
            {hoveredInfo && (
              <div style={{ textAlign: "center" }}>
                <strong>
                  {hoveredInfo.date} {hoveredInfo.time} 가능한 사람:
                </strong>
                <ul>
                  {hoveredInfo.participants.map((name) => (
                    <li key={name}>{name}</li>
                  ))}
                </ul>
              </div>
            )}
          </span>
    
    export default ResultMakeForm;