@@ -23,12 +23,39 @@ const formatReleaseDate = (date: string) => {
23
23
} )
24
24
}
25
25
26
+ const findLatestReleaseIndex = ( ) => {
27
+ const today = new Date ( )
28
+ const twoMonthsFromNow = new Date ( )
29
+ twoMonthsFromNow . setMonth ( today . getMonth ( ) + 2 )
30
+
31
+ // First try to find a release within the next 2 months
32
+ const upcomingReleaseIndex = releasesData . findIndex ( ( release ) => {
33
+ const releaseDate = new Date ( release . releaseDate )
34
+ return releaseDate > today && releaseDate <= twoMonthsFromNow
35
+ } )
36
+
37
+ // If no upcoming release found, find the most recent release up to today
38
+ if ( upcomingReleaseIndex === - 1 ) {
39
+ const pastReleases = releasesData . filter (
40
+ ( release ) => new Date ( release . releaseDate ) <= today
41
+ )
42
+ if ( pastReleases . length > 0 ) {
43
+ const mostRecentRelease = pastReleases [ pastReleases . length - 1 ]
44
+ return releasesData . findIndex (
45
+ ( release ) => release . releaseDate === mostRecentRelease . releaseDate
46
+ )
47
+ }
48
+ }
49
+
50
+ return upcomingReleaseIndex
51
+ }
52
+
26
53
const ReleaseCarousel = ( ) => {
27
54
const swiperRef = useRef < SwiperRef > ( null )
28
55
const swiperRef2 = useRef < SwiperRef > ( null )
29
56
const containerRef = useRef < HTMLDivElement > ( null )
30
57
const containerRef2 = useRef < HTMLDivElement > ( null )
31
- const [ activeSlide , setActiveSlide ] = useState ( releasesData . length - 2 )
58
+ const [ activeSlide , setActiveSlide ] = useState ( findLatestReleaseIndex ( ) )
32
59
const pastReleases = releasesData . filter (
33
60
( release ) => release . releaseDate < new Date ( ) . toISOString ( ) . split ( "T" ) [ 0 ]
34
61
)
@@ -81,50 +108,74 @@ const ReleaseCarousel = () => {
81
108
initialSlide = { activeSlide }
82
109
centeredSlides = { true }
83
110
>
84
- { releasesData . map ( ( release , index ) => (
85
- < SwiperSlide
86
- key = { release . releaseName }
87
- className = "!w-1/3 items-center justify-center text-center"
88
- >
89
- < div className = "mb-3 h-6" >
90
- { pastReleases [ pastReleases . length - 1 ] . releaseDate ===
91
- release . releaseDate && (
92
- < div className = "m-auto w-fit rounded-full bg-primary-low-contrast px-2 py-1" >
93
- < p className = "text-sm font-bold" > We are here</ p >
94
- </ div >
95
- ) }
96
- </ div >
97
- < div className = "flex w-full items-center justify-center text-center" >
98
- < div
99
- className = { cn (
100
- "flex flex-1 border-2" ,
101
- index !== 0 ? "border-primary" : "border-transparent"
102
- ) }
103
- />
104
- < div
105
- className = { cn (
106
- "h-7 w-7 rounded-full" ,
107
- release . releaseDate <
108
- new Date ( ) . toISOString ( ) . split ( "T" ) [ 0 ]
109
- ? "bg-primary"
110
- : "bg-primary-low-contrast"
111
+ { releasesData . map ( ( release , index ) => {
112
+ const releaseDate = new Date ( release . releaseDate )
113
+ const today = new Date ( )
114
+ const twoMonthsFromNow = new Date ( )
115
+ twoMonthsFromNow . setMonth ( today . getMonth ( ) + 2 )
116
+ const nextRelease =
117
+ releaseDate > today && releaseDate <= twoMonthsFromNow
118
+
119
+ return (
120
+ < SwiperSlide
121
+ key = { release . releaseName }
122
+ className = "!w-1/3 items-center justify-center text-center"
123
+ >
124
+ < div className = "mb-3 h-6" >
125
+ { pastReleases [ pastReleases . length - 1 ] . releaseDate ===
126
+ release . releaseDate && (
127
+ < div className = "m-auto w-fit rounded-lg bg-primary-low-contrast px-2 py-1" >
128
+ < p className = "text-sm font-bold" > We are here</ p >
129
+ </ div >
111
130
) }
112
- />
113
- < div
114
- className = { cn (
115
- "flex flex-1 border-2" ,
116
- index !== releasesData . length - 1
117
- ? "border-primary"
118
- : "border-transparent"
131
+ { nextRelease && (
132
+ < div className = "m-auto w-fit rounded-lg bg-warning-light px-2 py-1" >
133
+ < p className = "text-sm font-bold" > Coming soon</ p >
134
+ </ div >
119
135
) }
120
- />
121
- </ div >
122
- < p className = "text-md font-bold" > { release . releaseName } </ p >
123
- < p className = "font-mono text-sm text-body-medium" >
124
- { formatReleaseDate ( release . releaseDate ) }
125
- </ p >
126
- </ SwiperSlide >
127
- ) ) }
136
+ </ div >
137
+ < div className = "flex w-full items-center justify-center text-center" >
138
+ < div
139
+ className = { cn (
140
+ "flex h-1 flex-1" ,
141
+ index !== 0
142
+ ? nextRelease
143
+ ? "bg-gradient-to-r from-primary to-primary-low-contrast"
144
+ : release . releaseDate <
145
+ new Date ( ) . toISOString ( ) . split ( "T" ) [ 0 ]
146
+ ? "bg-primary"
147
+ : "bg-primary-low-contrast"
148
+ : "bg-transparent"
149
+ ) }
150
+ />
151
+ < div
152
+ className = { cn (
153
+ "h-7 w-7 rounded-full" ,
154
+ release . releaseDate <
155
+ new Date ( ) . toISOString ( ) . split ( "T" ) [ 0 ]
156
+ ? "bg-primary"
157
+ : "bg-primary-low-contrast" ,
158
+ nextRelease && "border-2 border-primary bg-background"
159
+ ) }
160
+ />
161
+ < div
162
+ className = { cn (
163
+ "flex h-1 flex-1" ,
164
+ index !== releasesData . length - 1
165
+ ? index < findLatestReleaseIndex ( )
166
+ ? "bg-primary"
167
+ : "bg-primary-low-contrast"
168
+ : "bg-transparent"
169
+ ) }
170
+ />
171
+ </ div >
172
+ < p className = "text-md font-bold" > { release . releaseName } </ p >
173
+ < p className = "font-mono text-sm text-body-medium" >
174
+ { formatReleaseDate ( release . releaseDate ) }
175
+ </ p >
176
+ </ SwiperSlide >
177
+ )
178
+ } ) }
128
179
</ Swiper >
129
180
</ SwiperContainer >
130
181
< div className = "flex lg:hidden" >
0 commit comments