Skip to content
Snippets Groups Projects
ResultEndForm.jsx 5.37 KiB
Newer Older
  • Learn to ignore specific revisions
  • import CalendarWeek from "./CalendarWeek";
    
    준현 강's avatar
    준현 강 committed
    import React, { useState, useEffect } from "react";
    import { useParams } from "react-router-dom";
    
    import "../styles/ResultEnd.css";
    import "../styles/CalendarWeek.css";
    
    준현 강's avatar
    준현 강 committed
    import axios from "axios";
    import PasswordModal from "./PasswordModal.jsx";
    
    
    export default function ResultEndForm() {
    
    준현 강's avatar
    준현 강 committed
      const [meetingData, setMeetingData] = useState(null);
      const [selectedDate, setSelectedDate] = useState("");
    
      const possibleDates = ["23.07.01 ~~~", "23.07.02 ~~~", "23.07.03 ~~~"];
    
      const [hoveredInfo, setHoveredInfo] = useState(null);
    
    준현 강's avatar
    준현 강 committed
      const { meeting_id } = useParams();
    
    준현 강's avatar
    준현 강 committed
      const [isModalOpen, setIsModalOpen] = useState(false);
    
    준현 강's avatar
    준현 강 committed
      const purposeText = {
        STUDY: "스터디",
        MEETING: "회의",
        PLAYING: "놀기",
        FOOD: "식사",
        ETC: "기타",
      };
    
      const handleDateChange = (event) => {
        setSelectedDate(event.target.value);
      };
    
    준현 강's avatar
    준현 강 committed
      useEffect(() => {
        const fetchMeetingData = async () => {
          try {
            const response = await fetch(`/meetings/${meeting_id}/details`);
            if (!response.ok) {
              throw new Error("API 호출 오류");
            }
            const data = await response.json();
            setMeetingData(data);
    
            setSelectedDate(
              data.participants[0].availableSchedules[0].availableDate
            );
          } catch (error) {
            console.error("API 호출 중 에러 발생:", error);
          }
        };
    
        if (meeting_id) {
          fetchMeetingData();
        }
      }, [meeting_id]);
    
      if (!meetingData) {
        return <div>로딩 중...</div>;
      }
    
    준현 강's avatar
    준현 강 committed
      const closeMeeting = () => {
        setIsModalOpen(true);
      };
    
      const handleModalClose = () => {
        setIsModalOpen(false);
      };
      const handlePasswordSubmit = async (password) => {
        setIsModalOpen(false);
        try {
    
          const response = await axios.patch(
    
    준현 강's avatar
    준현 강 committed
            `http://localhost:3000/meetings/${meeting_id}/confirm-time`,
            {
              adminPassword: password,
            }
          );
    
    
          if (response.data && response.data.confirmedTime) {
            setMeetingData((prevData) => ({
              ...prevData,
              confirmedTime: response.data.confirmedTime,
            }));
          }
    
    준현 강's avatar
    준현 강 committed
        } catch (error) {
          if (error.response && error.response.status === 401) {
            alert("비밀번호가 틀렸습니다.");
          } else {
            console.error("오류 발생:", error);
          }
        }
      };
    
    준현 강's avatar
    준현 강 committed
          style={{
            textAlign: "center",
            display: "flex",
            flexDirection: "column",
            alignItems: "center",
          }}
    
    준현 강's avatar
    준현 강 committed
          <span className="column-container">
            <h1 className="title-box">{meetingData.title}</h1>
            <p>투표가 종료되었습니다.</p>
    
            {meetingData.confirmedTime && (
    
    준현 강's avatar
    준현 강 committed
                <p style={{ color: "blue" }}>약속 시간은 {selectedDate}입니다.</p>
                <div>
                  <h2 style={{ justifyContent: "center" }}>총 참여한 인원수</h2>
                  <h3>{meetingData.currentParticipants}</h3>
                </div>
    
            )}
            {!meetingData.confirmedTime && (
    
    준현 강's avatar
    준현 강 committed
              <span className="closedFalse">
                <p>
                  {meetingData.purpose && purposeText[meetingData.purpose]}를 하는
                  다른 사람들은 주로 평일 낮 시간대에 많이 만나요
                </p>
    
    준현 강's avatar
    준현 강 committed
    
    
    준현 강's avatar
    준현 강 committed
                <form className="form-container">
                  {possibleDates.map((date, index) => (
                    <label key={index}>
                      <input
                        type="radio"
                        name="date"
                        value={date}
                        checked={selectedDate === date}
                        onChange={handleDateChange}
                      />
                      {date}
                    </label>
                  ))}
                </form>
    
    준현 강's avatar
    준현 강 committed
    
    
    준현 강's avatar
    준현 강 committed
                <button
                  style={{ marginTop: "20px", padding: "10px 20px" }}
                  onClick={closeMeeting}
                >
                  이 시간으로 정했어요
                </button>
                <button style={{ marginTop: "10px", padding: "10px 20px" }}>
                  랜덤으로 약속 시간 확정하기
                </button>
              </span>
            )}
          </span>
          <PasswordModal
            isOpen={isModalOpen}
            onRequestClose={handleModalClose}
            onSubmit={handlePasswordSubmit}
          />
    
          <div className="flex-row">
            <CalendarWeek
              participants={meetingData.participants}
              startDate={meetingData.startDate}
              endDate={meetingData.endDate}
    
    준현 강's avatar
    준현 강 committed
              currentParticipants={meetingData.currentParticipants}
    
              maxParticipants={meetingData.maxParticipants}
              hoveredInfo={hoveredInfo}
              setHoveredInfo={setHoveredInfo}
    
    준현 강's avatar
    준현 강 committed
              availableVotingStartTime={meetingData.availableVotingStartTime}
              availableVotingEndTime={meetingData.availableVotingEndTime}
    
            />
          </div>
          <div 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>
            )}
          </div>