Skip to content

Commit ca225f6

Browse files
authored
Merge pull request #162 from imaginer-dev/34-update-personal-schedule-ui
๊ฐœ์ธ ์ผ์ • ์ˆ˜์ • ์‚ญ์ œ ๊ตฌํ˜„..
2 parents d4058fe + b013dc2 commit ca225f6

File tree

5 files changed

+97
-71
lines changed

5 files changed

+97
-71
lines changed

โ€Žsrc/components/MyCalendar/CreateEventButton.tsxโ€Ž

Lines changed: 39 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,41 @@
11
import DialogButton from '@/components/common/DialogButton';
22
import { InputRef } from '../common/InputForm.tsx';
3-
import { useState, useRef } from 'react';
3+
import { useState, useRef, useEffect } from 'react';
44
import { Events } from '@/utils/index.ts';
5-
import { addPersonalSchedule } from '@/apis/personalScheduleApi.ts';
5+
import { addPersonalSchedule, updatePersonalSchedule } from '@/apis/personalScheduleApi.ts';
66

7-
const CreateEventButton = () => {
7+
export interface eventProps {
8+
id?: number;
9+
title?: string;
10+
start_date?: string;
11+
end_date?: string;
12+
}
13+
14+
const CreateEventButton = (props: eventProps) => {
815
const [eventTitle, setTitle] = useState('');
916
const [startDate, setStartDate] = useState('');
1017
const [endDate, setEndDate] = useState('');
1118
const titleRef = useRef<HTMLInputElement>(null);
1219
const startRef = useRef<HTMLInputElement>(null);
1320
const endRef = useRef<HTMLInputElement>(null);
1421

22+
useEffect(() => {
23+
console.log(props);
24+
25+
if (props.start_date) {
26+
setStartDate(props.start_date);
27+
startRef!.current!.value = props.start_date;
28+
}
29+
if (props.end_date) {
30+
setEndDate(props.end_date);
31+
endRef!.current!.value = props.end_date;
32+
}
33+
if (props.title) {
34+
setTitle(props.title);
35+
titleRef!.current!.value = props.title;
36+
}
37+
}, [props]);
38+
1539
const onTitleChanged = (event: React.ChangeEvent<HTMLInputElement>) => {
1640
setTitle(event.target.value);
1741
};
@@ -31,7 +55,15 @@ const CreateEventButton = () => {
3155
start: startDate,
3256
end: endDate === '' ? startDate : endDate,
3357
};
34-
addPersonalSchedule(newEvent);
58+
if (props.id) {
59+
updatePersonalSchedule(props.id, newEvent).catch((err) => {
60+
console.log(err);
61+
});
62+
} else {
63+
addPersonalSchedule(newEvent).catch((err) => {
64+
console.log(err);
65+
});
66+
}
3567
}
3668

3769
setTitle('');
@@ -56,16 +88,16 @@ const CreateEventButton = () => {
5688
<InputRef type="date" title="๋ ๋‚ ์งœ" placeholder="YYYY-MM-DD" onChange={onEndDateChanged} ref={endRef} />
5789
<hr className="mb-2 mt-2" />
5890
<button className="btn w-full bg-primary text-base-100" onClick={onCreateClicked}>
59-
์ถ”๊ฐ€ํ•˜๊ธฐ
91+
{props.id ? '์ˆ˜์ •ํ•˜๊ธฐ' : '์ถ”๊ฐ€ํ•˜๊ธฐ'}
6092
</button>
6193
</div>
6294
);
6395
return (
6496
<div className="p-8">
6597
<DialogButton
6698
classname="btn bg-primary text-base-100 w-full"
67-
name={'์ƒˆ ์ผ์ • ์ถ”๊ฐ€ํ•˜๊ธฐ'}
68-
title={'์ผ์ • ์ถ”๊ฐ€'}
99+
name={props.id ? '์ˆ˜์ •' : '์ƒˆ ์ผ์ • ์ถ”๊ฐ€ํ•˜๊ธฐ'}
100+
title={props.id ? '์ผ์ • ์ˆ˜์ •' : '์ผ์ • ์ถ”๊ฐ€'}
69101
desc={''}
70102
children={eventForm}
71103
/>

โ€Žsrc/components/common/Calendar.tsxโ€Ž

Lines changed: 39 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -5,19 +5,10 @@ import dayGridPlugin from '@fullcalendar/daygrid';
55
import interactionPlugin from '@fullcalendar/interaction';
66
import { useRef, useState, useEffect, useCallback } from 'react';
77
import { useEventState } from '@/stores/myEventsStore';
8-
import { getPersonalSchedule } from '@/apis/personalScheduleApi';
9-
import { Events } from '../../utils/index.ts';
8+
import { getPersonalSchedule, deletePersonalSchedule } from '@/apis/personalScheduleApi';
9+
import { DB_Events } from '../../utils/index.ts';
1010
import { formatDateRange, formatTime } from '../../utils/dateUtils';
11-
/*
12-
type Event = {
13-
title: string;
14-
start: string;
15-
end: string;
16-
backgroundColor?: string;
17-
borderColor?: string;
18-
textColor?: string;
19-
};
20-
*/
11+
import CreateEventButton from '@/components/MyCalendar/CreateEventButton.tsx';
2112

2213
interface EventInfo {
2314
timeText: string;
@@ -27,15 +18,16 @@ interface EventInfo {
2718
}
2819

2920
interface EventCardsProps {
30-
events: Events[];
21+
events: DB_Events[];
3122
date: string | null;
3223
}
3324

3425
export default function Calendar() {
3526
const [calendarHeight, setCalendarHeight] = useState<string | number>('auto');
3627
const calendarRef = useRef<FullCalendar | null>(null);
37-
const [selectedEvents, setSelectedEvents] = useState<Events[]>([]);
28+
const [selectedEvents, setSelectedEvents] = useState<DB_Events[]>([]);
3829
const [selectedDate, setSelectedDate] = useState<string | null>(null);
30+
const { events, addEvents, db_events, addDBEvents } = useEventState();
3931
// ! : ์™ธ๋ถ€์—์„œ ์ด๋ฒคํŠธ ๋ฆฌ์ŠคํŠธ๋ฅผ ๋ฐ›์•„์˜ค๊ฒŒ ๋œ๋‹ค๋ฉด zustand ์Šคํ† ์–ด๋„ ํ•„์š” ์—†์„๊ฑฐ ๊ฐ™์Šต๋‹ˆ๋‹ค!
4032
const { events, addEvents } = useEventState();
4133

@@ -58,10 +50,10 @@ export default function Calendar() {
5850
const clickedDateStr = dateClickInfo.dateStr;
5951
setSelectedDate(clickedDateStr);
6052
setSelectedEvents(
61-
events.filter(
53+
db_events.filter(
6254
(event) =>
63-
clickedDateStr >= event.start.split('T')[0] &&
64-
clickedDateStr <= (event.end ? event.end.split('T')[0] : event.start.split('T')[0]),
55+
clickedDateStr >= event.start_date.split('T')[0] &&
56+
clickedDateStr <= (event.end_date ? event.end_date.split('T')[0] : event.start_date.split('T')[0]),
6557
),
6658
);
6759
};
@@ -90,26 +82,6 @@ export default function Calendar() {
9082
setCalendarHeight(window.innerWidth < 768 ? 500 : 'auto');
9183
}, []);
9284

93-
function convertEvents(
94-
events: {
95-
title: string;
96-
start_date: string;
97-
end_date: string;
98-
backgroundColor?: string;
99-
borderColor?: string;
100-
textColor?: string;
101-
}[],
102-
): Events[] {
103-
return events.map((event) => ({
104-
title: event.title,
105-
start: event.start_date,
106-
end: event.end_date,
107-
backgroundColor: event.backgroundColor || '#3788d8',
108-
borderColor: event.borderColor || '#296c98',
109-
textColor: event.textColor || '#ffffff',
110-
}));
111-
}
112-
11385
/*
11486
const updateTitle = () => {
11587
const calendarApi = calendarRef?.current?.getApi();
@@ -158,22 +130,13 @@ export default function Calendar() {
158130

159131
// !: ์ด๋ฒ ํŠธ๋ฅผ ๋ฐ›์•„์˜จ๋‹ค๋ฉด ํ•„์š”์—†๋Š” ์ฝ”๋“œ๊ฐ€ ๋  ์ˆ˜ ์žˆ์„๊ฑฐ ๊ฐ™์•„์š”.
160132
useEffect(() => {
161-
if (!isLoaded) {
162-
getPersonalSchedule().then((schedule) => {
163-
const uniqueEvents = schedule.filter(
164-
(newEvent) =>
165-
!events.some(
166-
(existingEvent) => existingEvent.start === newEvent.start_date && existingEvent.title === newEvent.title,
167-
),
168-
);
169-
if (uniqueEvents.length > 0) {
170-
const eventsToAdd = convertEvents(uniqueEvents);
171-
eventsToAdd.forEach((eventToAdd) => addEvents(eventToAdd));
172-
setIsLoaded(true);
173-
}
133+
getPersonalSchedule().then((schedule) => {
134+
schedule.map((x) => {
135+
addDBEvents({ ...x });
136+
addEvents({ ...x, start: x.start_date, end: x.end_date });
174137
});
175-
}
176-
}, [events, addEvents]);
138+
});
139+
}, []);
177140

178141
return (
179142
<div>
@@ -242,13 +205,24 @@ function EventCards({ events, date }: EventCardsProps) {
242205
);
243206
}
244207

208+
const onDeleteClicked = (id: number) => {
209+
console.log('delete : ', id);
210+
deletePersonalSchedule(id)
211+
.then((val) => {
212+
console.log('delete done!', val);
213+
})
214+
.catch((err) => {
215+
console.log(err);
216+
});
217+
};
218+
245219
return (
246220
<div>
247221
<h2 className="ml-2">{date}</h2>
248222
<div className="flex gap-5 overflow-x-auto">
249223
{events.map((event, index) => {
250-
const eventDateRange = formatDateRange(event.start, event.end);
251-
const eventTime = formatTime(event.start);
224+
const eventDateRange = formatDateRange(event.start_date, event.end_date);
225+
const eventTime = formatTime(event.start_date);
252226
return (
253227
<div key={index} className="relative min-h-[150px] min-w-[240px] bg-white p-4 text-black">
254228
<h3>{event.title}</h3>
@@ -267,8 +241,17 @@ function EventCards({ events, date }: EventCardsProps) {
267241
{menuOpen === index && (
268242
<div className="absolute right-0 top-10 z-10 rounded-lg bg-white shadow-md">
269243
<ul>
270-
<li className="cursor-pointer p-2 hover:bg-gray-100">ํŽธ์ง‘</li>
271-
<li className="cursor-pointer p-2 hover:bg-gray-100">์‚ญ์ œ</li>
244+
<li className="cursor-pointer p-2 hover:bg-gray-100">
245+
<CreateEventButton
246+
id={event.id}
247+
title={event.title}
248+
start_date={event.start_date}
249+
end_date={event.end_date}
250+
/>
251+
</li>
252+
<li className="cursor-pointer p-2 hover:bg-gray-100" onClick={() => onDeleteClicked(event.id)}>
253+
์‚ญ์ œ
254+
</li>
272255
</ul>
273256
</div>
274257
)}

โ€Žsrc/main.tsxโ€Ž

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
import React from 'react';
21
import ReactDOM from 'react-dom/client';
32
import { QueryClient, QueryClientProvider } from '@tanstack/react-query';
43
import './styles/index.css';
@@ -84,9 +83,7 @@ const router = createBrowserRouter([
8483
const queryClient = new QueryClient();
8584

8685
ReactDOM.createRoot(document.getElementById('root')!).render(
87-
<React.StrictMode>
88-
<QueryClientProvider client={queryClient}>
89-
<RouterProvider router={router} />
90-
</QueryClientProvider>
91-
</React.StrictMode>,
86+
<QueryClientProvider client={queryClient}>
87+
<RouterProvider router={router} />
88+
</QueryClientProvider>,
9289
);
Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,19 @@
11
import { create } from 'zustand';
2-
import { Events } from '../utils/index.ts';
2+
import { Events, DB_Events } from '../utils/index.ts';
33

44
interface EventsState {
55
events: Events[];
66
addEvents: (event: Events) => void;
77
initEvents: () => void;
8+
9+
db_events: DB_Events[];
10+
addDBEvents: (db_event: DB_Events) => void;
811
}
912

1013
export const useEventState = create<EventsState>()((set) => ({
1114
events: [],
12-
15+
db_events: [],
1316
addEvents: (newEvent: Events) => set((state) => ({ events: [...state.events, newEvent] })),
1417
initEvents: () => set(() => ({ events: [] })),
18+
addDBEvents: (newEvent: DB_Events) => set((state) => ({ db_events: [...state.db_events, newEvent] })),
1519
}));

โ€Žsrc/utils/index.tsโ€Ž

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,3 +6,13 @@ export interface Events {
66
borderColor?: string;
77
textColor?: string;
88
}
9+
10+
export interface DB_Events {
11+
id: number;
12+
title: string;
13+
start_date: string;
14+
end_date: string;
15+
backgroundColor?: string;
16+
borderColor?: string;
17+
textColor?: string;
18+
}

0 commit comments

Comments
ย (0)