diff --git a/src/components/calendar/calendar.js b/src/components/calendar/calendar.js index cbbfd12988a778f502f14e59a9e531c564a67a92..7fabe2528dcab0fbf08eebd8411451f707432654 100644 --- a/src/components/calendar/calendar.js +++ b/src/components/calendar/calendar.js @@ -3,7 +3,7 @@ import "@progress/kendo-theme-default/dist/all.css"; import React, {useEffect, useState, useContext} from 'react'; import '@progress/kendo-react-intl'; import '@progress/kendo-react-scheduler'; -//import { AppContext } from '../../pages/main'; +import { AppContext } from '../../pages/main'; import { Scheduler, WeekView, DayView, MonthView, SchedulerEditItem} from '@progress/kendo-react-scheduler'; import calendar_styles from './calendar.module.css' @@ -58,7 +58,7 @@ const MySchedulerApp = () => { const[scheduleListModalOpen, setScheduleListModalOpen]=useState(false); //const [isContent, setIsContent]=useState(' 상세 내용이 없습니다. '); const [date, setDate]=useState(defaultDate); - //const { setCount } = useContext(AppContext); + const { setCount } = useContext(AppContext); const openInModal=()=>{ @@ -115,7 +115,7 @@ const MySchedulerApp = () => { if(response.status===200){ alert('중복된 일정이 존재합니다.'); } - //setCount( prevNum=> (prevNum+1)) + setCount( prevNum => (prevNum+1)) }) .then(data => { diff --git a/src/components/recruit/createRecruit.js b/src/components/recruit/createRecruit.js index 1d5e6aca6f1751c80d1b36a5b6f523ef6aaa5efd..295e89c62bd804cf3c6b900cef82eae403783464 100644 --- a/src/components/recruit/createRecruit.js +++ b/src/components/recruit/createRecruit.js @@ -53,14 +53,15 @@ function CreateRecruit({ isOpen, onClose }){ })); }; - const handleSave = () => { + const handleSave = (e) => { + e.preventDefault() if(formData.data.timeCategory === "D"){ handleSubmit({ ...formData, data: { ...formData.data, - startTime: `${timeData.startHour}:${timeData.startMinute}`, - endTime: `${timeData.endHour}:${timeData.endMinute}`, + startTime: `${timeData.startHour || '00'}:${timeData.startMinute || '00'}`, + endTime: `${timeData.endHour || '00'}:${timeData.endMinute || '00'}`, } }); }else{ @@ -105,7 +106,12 @@ function CreateRecruit({ isOpen, onClose }){ return; } } - + + if (formData.data.endTime < formData.data.startTime) { + alert('종료 시간은 시작 시간보다 늦어야 합니다.'); + return; + } + try { const jsonDataString = JSON.stringify(formData.data); const formDataToSend = new FormData(); diff --git a/src/components/recruit/modifyRecruit.js b/src/components/recruit/modifyRecruit.js index ffdcc1f74ef4dc19a8de249037708ad5f7c8e842..a29b2bf5ac8db10e61cbac4cdbf96c3064e94d00 100644 --- a/src/components/recruit/modifyRecruit.js +++ b/src/components/recruit/modifyRecruit.js @@ -51,14 +51,15 @@ const ModifyRecruit=({isOpen, onClose, data})=>{ })); }; - const handleSave = () => { + const handleSave = (e) => { + e.preventDefault() if(formData.info.timeCategory === "D"){ modifyInfo({ ...formData, info: { ...formData.info, - startTime: `${timeData.startHour|| '00'}:${timeData.startMinute || '00'}`, - endTime: `${timeData.endHour|| '00'}:${timeData.endMinute || '00'}`, + startTime: `${timeData.startHour || '00'}:${timeData.startMinute || '00'}`, + endTime: `${timeData.endHour || '00'}:${timeData.endMinute || '00'}`, } }); }else{ @@ -67,6 +68,44 @@ const ModifyRecruit=({isOpen, onClose, data})=>{ }; const modifyInfo = async (formData)=>{ + if(formData.info.title === ''){ + alert('제목을 입력해주세요.'); + return; + } else if(formData.info.timeCategory === ''){ + alert('시간 지정 여부를 선택해주세요.'); + return; + } else if(formData.info.content === ''){ + alert('내용을 입력해주세요.'); + return; + } else if(formData.info.peopleNum === ''){ + alert('모집 인원을 입력해주세요.'); + return; + } else if(formData.info.startDate === ''){ + alert('시작 날짜를 입력해주세요.'); + return; + } else if(formData.info.endDate === ''){ + alert('종료 날짜를 입력해주세요.'); + return; + } + + if(formData.info.timeCategory === "D"){ + if(timeData.startHour === null || timeData.endHour === null || timeData.startMinute === null || timeData.endMinute === null){ + alert('시간을 선택해주세요.'); + return; + } + } + + if (formData.info.endTime < formData.info.startTime) { + alert('종료 시간은 시작 시간보다 늦어야 합니다.'); + return; + } + + if (data.state === "Closed"){ + if(formData.info.peopleNum < data.peopleNum){ + alert('모집 완료시 이전 인원보다 적은 인원으로 변경할 수 없습니다.'); + return; + } + } try{ const jsonDataString = JSON.stringify(formData.info); const formDataToSend = new FormData(); diff --git a/src/components/recruit/recruitDetail.js b/src/components/recruit/recruitDetail.js index 3cbc64d472d7a3180ad5afa9e42cd8df3b769242..f6f168c4f6c8de9cf1dd02d67dbeb8d3d135deae 100644 --- a/src/components/recruit/recruitDetail.js +++ b/src/components/recruit/recruitDetail.js @@ -154,7 +154,11 @@ const RecruitDetail = ({ isOpen, onClose, data }) => { </div> </div> )} + {data.state === "Recruiting" ? ( <button type="button" className={recruitDetailStyles.apply} onClick={applyInfo}>신청</button> + ):( + <button type="button" className={recruitDetailStyles.endApply} onClick={applyInfo} disabled>신청</button> + )} </div> </div> </div> diff --git a/src/components/recruit/recruitDetail.module.css b/src/components/recruit/recruitDetail.module.css index be8def3e55f61cba74557ae93617eaefe2c73d0e..254ed0764048ff63636d28270dab562f992b4a97 100644 --- a/src/components/recruit/recruitDetail.module.css +++ b/src/components/recruit/recruitDetail.module.css @@ -308,4 +308,21 @@ background-color: #808DC2; color: #FFFFFF; -} \ No newline at end of file +} + +.endApply{ + display: flex; /* Flexbox를 사용하여 자식 요소들을 가로로 배열합니다. */ + align-items: center; /* 세로 방향에서 가운데 정렬. */ + justify-content: center; + + width: 81px; + height: 40px; + margin-left: 10px; + border: none; + + font-size: 22px; + font-weight: bolder; + + background-color: #b5b9c5; + color: #FFFFFF; +} \ No newline at end of file diff --git a/src/components/recruit/stateRecruit.js b/src/components/recruit/stateRecruit.js index 6f5c1b7c3854490a7f3ea84af87d8b9c9b7f9a0a..e2c12e7085105df871adfbd98406fada2ffa0a49 100644 --- a/src/components/recruit/stateRecruit.js +++ b/src/components/recruit/stateRecruit.js @@ -10,7 +10,7 @@ const StateRecruit=({isOpen, onClose, data})=>{ const stateChangeInfo = async ()=>{ try{ - const response = await fetch(`/api/recruits/${data.id}?state=${selectedStatus}`,{ + const response = await fetch(`/api/recruits/${data.id}/state?state=${selectedStatus}`,{ method: 'PUT', headers: { 'Content-Type': 'application/json', diff --git a/src/components/search.js b/src/components/search.js index 76d82f7c048a81bbff40e2c692afb23063acdd5b..128eae730674f2a0162f93bc719ffbd7b6839501 100644 --- a/src/components/search.js +++ b/src/components/search.js @@ -4,8 +4,6 @@ import searchStyles from './search.module.css'; import CreateRecruit from './recruit/createRecruit'; import MyChannelModal from './channel/myChannelModal'; import ExistingChannel from './channel/existingChannel'; - - function Search({ currentPage, onUrlGenerated, onFirstQueryString, onSecondQueryString }){ const [isModalOpen, setIsModalOpen] = useState(false); @@ -54,8 +52,6 @@ function Search({ currentPage, onUrlGenerated, onFirstQueryString, onSecondQuery } }; - - const handleSearch = () => { let searchURL = `${currentPage}/search`; let firstQueryString = '?'; diff --git a/src/components/subscribe/createSubscribe.js b/src/components/subscribe/createSubscribe.js deleted file mode 100644 index a5fb89e8d6e1594ee3e371c85d2a12f14d5d831c..0000000000000000000000000000000000000000 --- a/src/components/subscribe/createSubscribe.js +++ /dev/null @@ -1,103 +0,0 @@ -import React, { useState } from "react"; -//import createSubscribeStyles from './createSubscribe.module.css'; - -function CreateSubscribe({ isOpen, onClose }){ - const [formData, setFormData] = useState({ - data: { - }, - image: null - }); - - const handleInputChange = (e) => { - const { name, value } = e.target; - setFormData((prevData) => ({ - ...prevData, - data: { - ...prevData.data, - [name]: value, - }, - })); - }; - - const handleImageChange = (e) => { - const imageFile = e.target.files[0]; - setFormData((prevDate) => ({ - ...prevDate, - image: imageFile - })); - }; - - const handleSubmit = async (e) => { - e.preventDefault(); - - if(formData.data.title === ''){ - alert('제목을 입력해주세요.'); - return; - } else if(formData.data.content === ''){ - alert('내용을 입력해주세요.'); - return; - } - - const jsonDataString = JSON.stringify(formData.data); - try { - const formDataToSend = new FormData(); - formDataToSend.append('data', jsonDataString); - formDataToSend.append('image', formData.image); - - const response = await fetch('/api/subscribes', { - method: 'POST', - body: formDataToSend, - }); - - if (response.ok) { - alert('채널이 성공적으로 생성되었습니다.'); - window.location.reload(); - } else { - alert('채널 생성에 실패하였습니다.'); - } - - } catch (error) { - console.error('Error:', error); - } - }; - - return( - <div> - {isOpen && ( - <div className={createRecruitStyles.overlay}> - <div className={createRecruitStyles.modal}> - <button type="button" className={createRecruitStyles.x} onClick={onClose}>X</button> - - <div className={createRecruitStyles.top}> - <div>채널 생성</div> - </div> - - <form onSubmit={handleSubmit}> - <div className={createRecruitStyles.title}> - <label>제목*</label> - <input type="text" name="title" value={formData.data.title} onChange={handleInputChange} placeholder="제목을 입력하세요.(50자 이내)"/> - </div> - - <div className={createRecruitStyles.content}> - <label>내용*</label> - <textarea name="content" value={formData.data.content} onChange={handleInputChange} placeholder="내용을 입력하세요."/> - </div> - - <div className={createRecruitStyles.image}> - <label>이미지 첨부</label> - <input type="file" name="image" value={formData.data.image} onChange={handleImageChange} /> - </div> - - <div className={createRecruitStyles.button}> - <button type="submit" className={createRecruitStyles.save}>저장</button> - <button type="button" className={createRecruitStyles.cancel} onClick={onClose}>취소</button> - </div> - </form> - </div> - </div> - )} - </div> - ) -} - -export default CreateSubscribe; \ No newline at end of file diff --git a/src/components/subscribe/subscribeList.js b/src/components/subscribe/subscribeList.js deleted file mode 100644 index 2cfae697462fded82ee30e9564a2a33092e99fc0..0000000000000000000000000000000000000000 --- a/src/components/subscribe/subscribeList.js +++ /dev/null @@ -1,31 +0,0 @@ -import React, { useState } from 'react'; -//import subscribeListStyles from '.subscribeList.module.css'; -import InfiniteScroll from '../infiniteScroll'; - -function PageItem(props){ - const [isModalOpen, setIsModalOpen] = useState(false); - - const openModal = () => { - setIsModalOpen(true); - }; - - const closeModal = () => { - setIsModalOpen(false); - }; - - return ( - <div className='{subscribeListStyles.subscribe}'> - - </div> - ) -} - -function SubscribeList(){ - return( - <div className='{subscribeListStyles.SubscribeList}'> - <InfiniteScroll pagename='subscribes' /> - </div> - ) -} - -export {SubscribeList, PageItem}; \ No newline at end of file