1
1
import FullCalendar from '@fullcalendar/react' ;
2
+ import { EventClickArg } from '@fullcalendar/core' ;
2
3
import dayGridPlugin from '@fullcalendar/daygrid' ;
3
4
import interactionPlugin from '@fullcalendar/interaction' ;
4
5
import { useRef , useState , useEffect } from 'react' ;
5
6
7
+ type Event = {
8
+ title : string ;
9
+ start : Date | string ;
10
+ }
11
+ interface EventCardsProps {
12
+ events : Event [ ] ;
13
+ date : Date | string | null ;
14
+ }
15
+
6
16
const events = [
7
17
{ title : 'Meeting' , start : new Date ( ) } ,
8
18
{ title : 'Meeting' , start : '2024-05-08' } ,
@@ -13,10 +23,28 @@ const events = [
13
23
export function Calendar ( ) {
14
24
const [ calendarHeight , setCalendarHeight ] = useState < string | number > ( 'auto' ) ;
15
25
const calendarRef = useRef < FullCalendar | null > ( null ) ;
26
+ const [ selectedEvents , setSelectedEvents ] = useState < Event [ ] > ( [ ] ) ;
27
+ const [ selectedDate , setSelectedDate ] = useState < Date | null > ( null ) ;
28
+
29
+ const handleDateClick = ( clickInfo : EventClickArg ) => {
30
+ if ( clickInfo . event . start ) {
31
+ const clickStartDate = new Date ( clickInfo . event . start ) ;
32
+ setSelectedDate ( clickStartDate ) ;
33
+
34
+ const clickedStartDate = new Date ( clickInfo . event . start ) . toDateString ( ) ;
35
+ setSelectedEvents ( events . filter ( event =>
36
+ new Date ( event . start ) . toDateString ( ) === clickedStartDate
37
+ ) ) ;
38
+ } else {
39
+ console . log ( "not available" ) ;
40
+ }
41
+ }
42
+
16
43
const handlePrev = ( ) => {
17
44
const calendarApi = calendarRef ?. current ?. getApi ( ) ;
18
45
if ( calendarApi ) {
19
46
calendarApi . prev ( ) ;
47
+ setSelectedDate ( null ) ;
20
48
} else {
21
49
console . error ( 'Calendar API is not available.' ) ;
22
50
}
@@ -26,6 +54,7 @@ export function Calendar() {
26
54
const calendarApi = calendarRef ?. current ?. getApi ( ) ;
27
55
if ( calendarApi ) {
28
56
calendarApi . next ( ) ;
57
+ setSelectedDate ( null ) ;
29
58
} else {
30
59
console . error ( 'Calendar API is not available.' ) ;
31
60
}
@@ -83,8 +112,9 @@ export function Calendar() {
83
112
plugins = { [ dayGridPlugin , interactionPlugin ] }
84
113
initialView = "dayGridMonth"
85
114
events = { events }
115
+ eventClick = { handleDateClick }
86
116
dayMaxEvents = { 2 } //Max개수까지보이고 나머지는 more
87
- navLinks = { true } // 날짜/주 이름을 클릭하여 뷰를 변경할 수 있습니다.
117
+ // navLinks={true} // 날짜/주 이름을 클릭하여 뷰를 변경할 수 있습니다.
88
118
editable = { true } // 이벤트를 수정할 수 있습니다.
89
119
eventContent = { renderEventContent }
90
120
contentHeight = { calendarHeight }
@@ -106,14 +136,11 @@ export function Calendar() {
106
136
right : 'nextButton' ,
107
137
} }
108
138
customButtons = { {
109
- prevButton : {
110
- click : handlePrev ,
111
- } ,
112
- nextButton : {
113
- click : handleNext ,
114
- } ,
139
+ prevButton : { click : handlePrev } ,
140
+ nextButton : { click : handleNext } ,
115
141
} }
116
142
/>
143
+ { selectedDate && < EventCards events = { selectedEvents } date = { selectedDate } /> }
117
144
</ div >
118
145
) ;
119
146
}
@@ -135,3 +162,33 @@ function renderEventContent(eventInfo: EventInfo) {
135
162
</ >
136
163
) ;
137
164
}
165
+
166
+
167
+ function EventCards ( { events, date } : EventCardsProps ) {
168
+ if ( ! date ) {
169
+ return < div > No date provided</ div > ; // date가 null인 경우 처리
170
+ }
171
+
172
+ const formattedDate = new Date ( date ) . toLocaleDateString ( 'ko-KR' , {
173
+ year : 'numeric' ,
174
+ month : '2-digit' ,
175
+ day : '2-digit'
176
+ } ) . replace ( / \. / g, "." ) . slice ( 0 , - 1 ) ;
177
+ console . log ( formattedDate )
178
+
179
+ return (
180
+ < div >
181
+ < h2 > { formattedDate } </ h2 >
182
+ < div className = "flex overflow-x-auto" >
183
+ { events . map ( ( event , index ) => (
184
+ < div key = { index } className = "min-w-[200px] m-2 p-2 bg-blue-200 text-white" >
185
+ < h3 > { event . title } </ h3 >
186
+ < p > { new Date ( event . start ) . toLocaleTimeString ( ) } </ p >
187
+ </ div >
188
+ ) ) }
189
+ </ div >
190
+
191
+ </ div >
192
+
193
+ ) ;
194
+ }
0 commit comments