1
- import React , { useState } from 'react' ;
1
+ import React , { useState , useEffect } from 'react' ;
2
2
import { eventInfo } from '../../../public/data/data' ;
3
3
4
4
interface CarouselProps {
@@ -7,23 +7,39 @@ interface CarouselProps {
7
7
8
8
const Carousel : React . FC < CarouselProps > = ( { events } ) => {
9
9
const [ currentIndex , setCurrentIndex ] = useState ( 0 ) ;
10
+ const [ isFading , setIsFading ] = useState ( false ) ;
11
+
12
+ useEffect ( ( ) => {
13
+ const intervalId = setInterval ( ( ) => {
14
+ fadeToNextSlide ( ) ;
15
+ } , 3000 ) ;
16
+
17
+ return ( ) => clearInterval ( intervalId ) ;
18
+ } , [ events . length ] ) ;
19
+
20
+ const fadeToNextSlide = ( ) => {
21
+ setIsFading ( true ) ;
22
+
23
+ setTimeout ( ( ) => {
24
+ setCurrentIndex ( ( prevIndex ) => ( prevIndex === events . length - 1 ? 0 : prevIndex + 1 ) ) ;
25
+ setIsFading ( false ) ;
26
+ } , 300 ) ;
27
+ } ;
10
28
11
29
const prevSlide = ( ) => {
12
- setCurrentIndex ( ( prevIndex ) =>
13
- prevIndex === 0 ? events . length - 1 : prevIndex - 1
14
- ) ;
30
+ setCurrentIndex ( ( prevIndex ) => ( prevIndex === 0 ? events . length - 1 : prevIndex - 1 ) ) ;
15
31
} ;
16
32
17
33
const nextSlide = ( ) => {
18
- setCurrentIndex ( ( prevIndex ) =>
19
- prevIndex === events . length - 1 ? 0 : prevIndex + 1
20
- ) ;
34
+ fadeToNextSlide ( ) ;
21
35
} ;
22
36
23
37
return (
24
38
< div className = "relative max-w-4xl mx-auto" >
25
39
< div className = "w-full text-center" >
26
- < a href = { events [ currentIndex ] . link } target = "_blank" rel = "noopener noreferrer" className = "relative block w-full h-64 group" >
40
+ < a href = { events [ currentIndex ] . link } target = "_blank" rel = "noopener noreferrer" className = { `relative block w-full h-64 group transition-opacity duration-3000 ${
41
+ isFading ? 'opacity-0' : 'opacity-100'
42
+ } `} >
27
43
< img
28
44
src = { events [ currentIndex ] . image }
29
45
alt = { events [ currentIndex ] . title }
@@ -34,34 +50,13 @@ const Carousel: React.FC<CarouselProps> = ({ events }) => {
34
50
< h2 className = "font-extrabold text-xl mb-2" > { events [ currentIndex ] . title } </ h2 >
35
51
< h3 className = "font-bold text-lg" > { events [ currentIndex ] . location } </ h3 >
36
52
< p className = "mt-2" >
37
- { new Date ( events [ currentIndex ] . startTime ) . toLocaleDateString ( ) } -{ " " }
38
- { new Date ( events [ currentIndex ] . endTime ) . toLocaleDateString ( ) }
53
+ { formatEventDate ( events [ currentIndex ] . startTime , events [ currentIndex ] . endTime ) }
39
54
</ p >
40
55
</ div >
41
56
</ div >
42
57
</ a >
43
- { /* <div className="p-5">
44
- <h2 className="text-3xl font-bold">{events[currentIndex].title}</h2>
45
- <p className="text-lg">{events[currentIndex].description}</p>
46
- <p className="text-sm">Location: {events[currentIndex].location}</p>
47
- <p className="text-sm">
48
- Start Time: {new Date(events[currentIndex].startTime).toLocaleString()}
49
- </p>
50
- <p className="text-sm">
51
- End Time: {new Date(events[currentIndex].endTime).toLocaleString()}
52
- </p>
53
- <a
54
- href={events[currentIndex].link}
55
- target="_blank"
56
- rel="noopener noreferrer"
57
- className="text-blue-500 underline mt-2 block"
58
- >
59
- Event Link
60
- </a>
61
- </div> */ }
62
58
</ div >
63
59
64
- { /* Left and right buttons */ }
65
60
< button
66
61
onClick = { prevSlide }
67
62
className = "absolute left-0 top-1/2 transform -translate-y-1/2 bg-black bg-opacity-50 text-white p-2 rounded-full hover:bg-opacity-75"
@@ -75,7 +70,6 @@ const Carousel: React.FC<CarouselProps> = ({ events }) => {
75
70
❯
76
71
</ button >
77
72
78
- { /* Dots indicator */ }
79
73
< div className = "flex justify-center mt-4" >
80
74
{ events . map ( ( _ , index ) => (
81
75
< span
@@ -91,4 +85,18 @@ const Carousel: React.FC<CarouselProps> = ({ events }) => {
91
85
) ;
92
86
} ;
93
87
88
+ const formatEventDate = ( startTime : string , endTime : string ) : string => {
89
+ const startDate = new Date ( startTime ) ;
90
+ const endDate = new Date ( endTime ) ;
91
+
92
+ const sameDay = startDate . toDateString ( ) === endDate . toDateString ( ) ;
93
+
94
+ if ( sameDay ) {
95
+ return startDate . toLocaleDateString ( ) ;
96
+ } else {
97
+ return `${ startDate . toLocaleDateString ( ) } - ${ endDate . toLocaleDateString ( ) } ` ;
98
+ }
99
+ } ;
100
+
101
+
94
102
export default Carousel ;
0 commit comments