From 1449c0a810f5064fe72a45691f3ee3622a8b65e2 Mon Sep 17 00:00:00 2001 From: mindongmindong <dcmin123@ajou.ac.kr> Date: Sun, 26 Nov 2023 21:52:25 +0900 Subject: [PATCH] [ADD] API --- react-whenMeet/package-lock.json | 29 ++++ react-whenMeet/package.json | 1 + react-whenMeet/src/App.js | 4 +- react-whenMeet/src/components/HomeMakeForm.js | 2 +- .../src/components/HomeParticipateForm.js | 127 ++++++++++++++---- react-whenMeet/src/components/LinkPageForm.js | 16 ++- .../src/components/MeetingInfoForm.js | 37 +++-- react-whenMeet/src/routes/UserTimeInfo.js | 20 ++- 8 files changed, 189 insertions(+), 47 deletions(-) diff --git a/react-whenMeet/package-lock.json b/react-whenMeet/package-lock.json index 11a4fcd..e6355a5 100644 --- a/react-whenMeet/package-lock.json +++ b/react-whenMeet/package-lock.json @@ -11,6 +11,7 @@ "@testing-library/jest-dom": "^5.17.0", "@testing-library/react": "^13.4.0", "@testing-library/user-event": "^13.5.0", + "axios": "^1.6.2", "gh-pages": "^6.0.0", "prop-types": "^15.8.1", "react": "^18.2.0", @@ -5362,6 +5363,29 @@ "node": ">=4" } }, + "node_modules/axios": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.2.tgz", + "integrity": "sha512-7i24Ri4pmDRfJTR7LDBhsOTtcm+9kjX5WiY1X3wIisx6G9So3pfMkEiU7emUBe46oceVImccTEM3k6C5dbVW8A==", + "dependencies": { + "follow-redirects": "^1.15.0", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, + "node_modules/axios/node_modules/form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/axobject-query": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-3.2.1.tgz", @@ -14606,6 +14630,11 @@ "node": ">= 0.10" } }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" + }, "node_modules/psl": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", diff --git a/react-whenMeet/package.json b/react-whenMeet/package.json index 7ed2481..1341b78 100644 --- a/react-whenMeet/package.json +++ b/react-whenMeet/package.json @@ -6,6 +6,7 @@ "@testing-library/jest-dom": "^5.17.0", "@testing-library/react": "^13.4.0", "@testing-library/user-event": "^13.5.0", + "axios": "^1.6.2", "gh-pages": "^6.0.0", "prop-types": "^15.8.1", "react": "^18.2.0", diff --git a/react-whenMeet/src/App.js b/react-whenMeet/src/App.js index 6468946..15b0c4d 100644 --- a/react-whenMeet/src/App.js +++ b/react-whenMeet/src/App.js @@ -12,8 +12,8 @@ function App() { <Router> <Routes> <Route path="/meetinginfo/linkpage" element={<LinkPage />}></Route> - <Route path="/homeparticipate/usertimeinfo" element={<UserTimeInfo />}></Route> - <Route path="/homeparticipate" element={<HomeParticipate />}></Route> + <Route path="/homeparticipate/:id/usertimeinfo" element={<UserTimeInfo />}></Route> + <Route path="/homeparticipate/:id" element={<HomeParticipate />}></Route> <Route path="/meetinginfo" element={<MeetingInfo />}></Route> <Route path="/result" element={<ResultMake />}></Route>//결과확인페이지 <Route path="/resultend" element={<ResultEnd />}></Route>// 투표 종료 diff --git a/react-whenMeet/src/components/HomeMakeForm.js b/react-whenMeet/src/components/HomeMakeForm.js index 7e7c8f4..315b9fd 100644 --- a/react-whenMeet/src/components/HomeMakeForm.js +++ b/react-whenMeet/src/components/HomeMakeForm.js @@ -23,7 +23,7 @@ function HomeMakeForm() { } else if (password === "") { return alert("Password를 입력하세요"); } else { - navigate("/MeetingInfo"); + navigate("/MeetingInfo", {state : {title, password}}); } }; diff --git a/react-whenMeet/src/components/HomeParticipateForm.js b/react-whenMeet/src/components/HomeParticipateForm.js index 860dd7c..8353487 100644 --- a/react-whenMeet/src/components/HomeParticipateForm.js +++ b/react-whenMeet/src/components/HomeParticipateForm.js @@ -1,55 +1,124 @@ -import { useState } from "react"; +import { useState, useEffect } from "react"; import Input from "./Input"; import Button from "./Button"; -import { useNavigate } from "react-router-dom"; +import { useNavigate, useLocation } from "react-router-dom"; +import axios from "axios"; function HomeParticipateForm() { - const [name,setName] = useState(""); - const [password,setPassword] = useState(""); - const [email,setEmail] = useState(""); + const [name, setName] = useState(""); + const [password, setPassword] = useState(""); + const [email, setEmail] = useState(""); const navigate = useNavigate(); + const location = useLocation(); + const { id } = location.state; - const handleName = (event)=>{ + const handleName = (event) => { setName(event.target.value); } - const handlePassword = (event)=>{ + const handlePassword = (event) => { setPassword(event.target.value); } - const handleEmail = (event)=>{ + const handleEmail = (event) => { setEmail(event.target.value); } + const checkParticipantExistence = async()=>{ + const response = await axios.get(`http://43.200.79.42:3000/meetings/${id}/participants/?name=${name}`); + if(response.data){ + alert('이미 존재하는 이름입니다.') + } + return response.data.name; + } - const handleSubmit = (event) => { + const newHandleSubmit = async (event) => { + event.preventDefault(); + if (name === "") { + alert('이름을 입력하세요') + } + else { + try { + const response = await axios.post(`http://43.200.79.42:3000/meetings/${id}/participants`, { + name: name, + password: password, + email: email + }); + navigate('UserTimeInfo', { state: { id } }); + } + catch (error) { + console.error(error); + } + } + }; + const oldHandleSubmit = async (event) => { event.preventDefault(); - name === "" ? alert('이름을 입력하세요') : navigate('UserTimeInfo'); + if (name === "") { + alert('이름을 입력하세요') + } + else { + try { + const response = await axios.post(`http://43.200.79.42:3000/meetings/${id}/entry`,{ + name : name, + password : password + }); + if(response.status === 401 ){ + alert('이름 또는 Password를 잘못 입력하였습니다'); + return; + } + else if(response.status === 404){ + alert('일치하는 참가자가 존재하지 않습니다'); + return; + } + //navigate('UserTimeInfo', { state: { id } }); + } + catch (error) { + if (error.response) { + if (error.response.status === 401) { + alert('이름 또는 Password를 잘못 입력하였습니다'); + } else if (error.response.status === 404) { + alert('일치하는 참가자가 존재하지 않습니다'); + } else { + alert(`Unexpected status code: ${error.response.status}`); + } + } else { + // Handle other types of errors + console.error(error); + } + + } + } }; return ( <form> <div> - <h1>약속 Title</h1> - <Input - type="text" - value={name} - onChange={handleName} - placeholder="이름" + <h1>투표에 참여하기</h1> + {console.log({id})} + <Input + type="text" + value={name} + onChange={handleName} + placeholder="이름" /> - <Input - type="password" - value={password} - onChange={handlePassword} - placeholder="Password(선택)" + <Input + type="password" + value={password} + onChange={handlePassword} + placeholder="Password" /> - <Input - type="text" - value={email} - onChange={handleEmail} - placeholder="이메일(선택)" + <Input + type="text" + value={email} + onChange={handleEmail} + placeholder="이메일(선택)" + /> + <Button + type='submit' + text='신규참여' + onClick={newHandleSubmit} /> <Button - type='submit' - text='다음' - onClick={handleSubmit} + type='submit' + text='재참여' + onClick={oldHandleSubmit} /> </div> </form> diff --git a/react-whenMeet/src/components/LinkPageForm.js b/react-whenMeet/src/components/LinkPageForm.js index 45edc9a..c676b0c 100644 --- a/react-whenMeet/src/components/LinkPageForm.js +++ b/react-whenMeet/src/components/LinkPageForm.js @@ -1,15 +1,19 @@ import { useState } from "react"; import Input from "../components/Input"; import Button from "../components/Button"; -import { useNavigate } from "react-router-dom"; +import { useNavigate,useLocation } from "react-router-dom"; +import axios from "axios"; function LinkPageForm() { const [link, setLink] = useState(""); + const location = useLocation(); const navigate = useNavigate(); + const {id} = location.state; + const copyToClipboard = async (link) => { try { - const textToCopy = `localhost:3000/HomeParticipate`; + const textToCopy = `localhost:3000/HomeParticipate/${id}`; await navigator.clipboard.writeText(textToCopy); alert('클립보드에 복사되었습니다'); } catch (err) { @@ -17,17 +21,17 @@ function LinkPageForm() { } }; - const handleSubmit = (event) => { + const handleSubmit = async(event) => { event.preventDefault(); - setLink(`/HomeParticipate`) - navigate(link); + console.log({id}); + navigate(`/HomeParticipate/${id}`,{state : {id}}); } return ( <form onSubmit={handleSubmit}> <div> <Input - value={`localhost:3000/HomeParticipate/`} + value={`localhost:3000/HomeParticipate/${id}`} /> <Button type="button" diff --git a/react-whenMeet/src/components/MeetingInfoForm.js b/react-whenMeet/src/components/MeetingInfoForm.js index 38fcec8..a9cee24 100644 --- a/react-whenMeet/src/components/MeetingInfoForm.js +++ b/react-whenMeet/src/components/MeetingInfoForm.js @@ -2,7 +2,8 @@ import { useState } from "react"; import Input from "../components/Input"; import Button from "../components/Button"; import Calendar from "../components/Calendar"; -import { useNavigate } from "react-router-dom"; +import { useNavigate, useLocation } from "react-router-dom"; +import axios from "axios"; function MeetingInfoForm() { const [meetingPurpose, setMeetingPurpose] = useState(""); @@ -18,6 +19,8 @@ function MeetingInfoForm() { '기타' ]; const navigate = useNavigate(); + const location = useLocation(); + const { title, password } = location.state; const [usingDate, setUsingDate] = useState([]); @@ -45,11 +48,29 @@ function MeetingInfoForm() { setEnd(event.target.value); } - const handleSubmit = (event) => { + const handleSubmit = async (event) => { event.preventDefault(); - console.log(usingDate); - (meetingPurpose === "" || meetingPurpose === "선택") ? alert("목적을 선택하세요") : navigate("LinkPage"); - } + + if (meetingPurpose === "" || meetingPurpose === "선택") { + alert("목적을 선택하세요"); + } else { + try { + const response = await axios.post("http://43.200.79.42:3000/meetings", { + title: title, + adminPassword: password, + purpose: meetingPurpose, + startDate: start, + endDate: end, + maxParticipants: number, + voteExpiresAt: endVote + }); + const id = response.data.id; + navigate("LinkPage",{state : {id}}); + } catch (error) { + console.error("Error sending data to the backEnd", error); + } + } + }; return ( <form onSubmit={handleSubmit}> @@ -66,18 +87,18 @@ function MeetingInfoForm() { </label> </div> - <Calendar onChange={handleCalendar} usingDate={usingDate} setUsingDate={setUsingDate}/> + <Calendar onChange={handleCalendar} usingDate={usingDate} setUsingDate={setUsingDate} /> <div className="timeStartEnd"> 시작: <Input - type="time" + type="date" value={start} onChange={handleStart} placeholder="시작" /> 종료: <Input - type="time" + type="date" value={end} onChange={handleEnd} placeholder="종료" diff --git a/react-whenMeet/src/routes/UserTimeInfo.js b/react-whenMeet/src/routes/UserTimeInfo.js index 610bc18..6eeb7ea 100644 --- a/react-whenMeet/src/routes/UserTimeInfo.js +++ b/react-whenMeet/src/routes/UserTimeInfo.js @@ -1,17 +1,35 @@ -import { useState } from "react"; +import { useState,useEffect } from "react"; import Button from "../components/Button"; import Calendar from "../components/Calendar" import "../styles/HomeMake.css" +import axios from "axios"; +import { useNavigate, useLocation } from "react-router-dom"; function UserTimeInfo() { const [state, setState] = useState(true); + + const location = useLocation(); + const {id} = location.state; + const handleState = () => { setState((state) => !state); } const handleCalendar = (value) => { console.log('Selected Date:', value); }; + + useEffect(() => { + const fetchData = async () => { + try { + const response = await axios.get(`http://43.200.79.42:3000/meetings/${id}/`); + console.log(response.data.title); + } catch (error) { + console.error(error); + } + }; + fetchData(); + }, [id]); return ( <div className="center-container"> <Button -- GitLab