diff --git a/server.js b/server.js index ec83fbad..8b191b13 100644 --- a/server.js +++ b/server.js @@ -38,7 +38,7 @@ app.post('/api/events', async (req, res) => { app.put('/api/events/:id', async (req, res) => { const events = await getEvents(); - const { id } = req.params; + const id = req.params.id; const eventIndex = events.events.findIndex((event) => event.id === id); if (eventIndex > -1) { const newEvents = [...events.events]; @@ -59,7 +59,7 @@ app.put('/api/events/:id', async (req, res) => { app.delete('/api/events/:id', async (req, res) => { const events = await getEvents(); - const { id } = req.params; + const id = req.params.id; fs.writeFileSync( `${__dirname}/src/__mocks__/response/realEvents.json`, @@ -71,6 +71,72 @@ app.delete('/api/events/:id', async (req, res) => { res.status(204).send(); }); +app.post('/api/events-list', async (req, res) => { + const events = await getEvents(); + const repeatId = randomUUID(); + const newEvents = req.body.events.map((event) => { + const isRepeatEvent = event.repeat.type !== 'none'; + return { + id: randomUUID(), + ...event, + repeat: { + ...event.repeat, + id: isRepeatEvent ? repeatId : undefined, + }, + }; + }); + + fs.writeFileSync( + `${__dirname}/src/__mocks__/response/realEvents.json`, + JSON.stringify({ + events: [...events.events, ...newEvents], + }) + ); + + res.status(201).json(newEvents); +}); + +app.put('/api/events-list', async (req, res) => { + const events = await getEvents(); + let isUpdated = false; + + const newEvents = [...events.events]; + req.body.events.forEach((event) => { + const eventIndex = events.events.findIndex((target) => target.id === event.id); + if (eventIndex > -1) { + isUpdated = true; + newEvents[eventIndex] = { ...events.events[eventIndex], ...event }; + } + }); + + if (isUpdated) { + fs.writeFileSync( + `${__dirname}/src/__mocks__/response/realEvents.json`, + JSON.stringify({ + events: newEvents, + }) + ); + + res.json(events.events); + } else { + res.status(404).send('Event not found'); + } +}); + +app.delete('/api/events-list', async (req, res) => { + const events = await getEvents(); + const newEvents = events.events.filter((event) => !req.body.eventIds.includes(event.id)); // ? ids를 전달하면 해당 아이디를 기준으로 events에서 제거 + + fs.writeFileSync( + `${__dirname}/src/__mocks__/response/realEvents.json`, + JSON.stringify({ + events: newEvents, + }) + ); + + res.status(204).send(); +}); + app.listen(port, () => { console.log(`Server running at http://localhost:${port}`); }); diff --git a/src/App.tsx b/src/App.tsx index 195c5b05..a9ec8294 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -30,13 +30,13 @@ import { import { useSnackbar } from 'notistack'; import { useState } from 'react'; +import { RepeatEventIcon } from './components/RepeatEventIcon'; import { useCalendarView } from './hooks/useCalendarView.ts'; import { useEventForm } from './hooks/useEventForm.ts'; import { useEventOperations } from './hooks/useEventOperations.ts'; import { useNotifications } from './hooks/useNotifications.ts'; import { useSearch } from './hooks/useSearch.ts'; -// import { Event, EventForm, RepeatType } from './types'; -import { Event, EventForm } from './types'; +import { Event, EventForm, RepeatType } from './types'; import { formatDate, formatMonth, @@ -46,6 +46,7 @@ import { getWeeksAtMonth, } from './utils/dateUtils'; import { findOverlappingEvents } from './utils/eventOverlap'; +import { getRepeatDisplayInfo } from './utils/eventStateUtils'; import { getTimeErrorMessage } from './utils/timeValidation'; const categories = ['업무', '개인', '가족', '기타']; @@ -77,11 +78,11 @@ function App() { isRepeating, setIsRepeating, repeatType, - // setRepeatType, + setRepeatType, repeatInterval, - // setRepeatInterval, + setRepeatInterval, repeatEndDate, - // setRepeatEndDate, + setRepeatEndDate, notificationTime, setNotificationTime, startTimeError, @@ -201,6 +202,11 @@ function App() { > {isNotified && } + {isNotified && } + - {/* ! 반복은 8주차 과제에 포함됩니다. 구현하고 싶어도 참아주세요~ */} - {/* {isRepeating && ( + {isRepeating && ( - 반복 유형 + 반복 유형