|
1 | 1 | --- |
2 | 2 | import BaseLayout from '../layouts/BaseLayout.astro' |
3 | | -import { Container } from '../components/Container' |
| 3 | +import Container from '../components/Container.astro' |
4 | 4 | import { Card } from '../components/Card' |
5 | 5 | import { GitHubIcon, LinkedInIcon, DiscordIcon } from '../components/SocialIcons' |
6 | | -import { fetchUpcomingEvents, fetchPastEvents, fetchTeamMembers, calculateOrganizationStats } from '../lib/events' |
| 6 | +import { fetchUpcomingEvents, fetchPastEvents, getSpeakers, fetchTeamMembers, fetchOrganization } from '../lib/events' |
7 | 7 | import clsx from 'clsx' |
8 | 8 |
|
9 | | -// Fetch all data - initialize with safe defaults |
10 | | -let upcomingEvents = [] |
| 9 | +// Server-side data fetching using gitevents-fetch |
| 10 | +let events = [] |
11 | 11 | let pastEvents = [] |
12 | | -let teamMembers = [] |
13 | | -let stats = { |
14 | | - totalEvents: 0, |
15 | | - upcomingEvents: 0, |
16 | | - members: null, |
17 | | - discordUsers: '300+' |
18 | | -} |
| 12 | +let speakers = [] |
| 13 | +let advocates = [] |
| 14 | +let orgData = null |
19 | 15 |
|
20 | 16 | try { |
21 | | - const results = await Promise.all([ |
22 | | - fetchUpcomingEvents().catch(() => []), |
23 | | - fetchPastEvents().catch(() => []), |
24 | | - fetchTeamMembers('advocates').catch(() => []) |
25 | | - ]) |
26 | | -
|
27 | | - upcomingEvents = results[0] || [] |
28 | | - pastEvents = results[1] || [] |
29 | | - teamMembers = results[2] || [] |
30 | | -
|
31 | | - // Calculate stats from already-fetched events (no duplicate API calls) |
32 | | - stats = calculateOrganizationStats(upcomingEvents, pastEvents) |
| 17 | + // Fetch from GitHub using gitevents-fetch package |
| 18 | + events = await fetchUpcomingEvents() |
| 19 | + pastEvents = await fetchPastEvents() |
| 20 | + speakers = getSpeakers(events) |
| 21 | + advocates = await fetchTeamMembers('cyprus-developer-community', 'advocates') |
| 22 | + orgData = await fetchOrganization('cyprus-developer-community') |
| 23 | + console.log(`Fetched ${events.length} upcoming events, ${pastEvents.length} past events, ${speakers.length} speakers, ${advocates.length} advocates, and org data`) |
33 | 24 | } catch (error) { |
34 | | - console.error('Error fetching data:', error?.message || error) |
35 | | - // Safe defaults already set above |
| 25 | + console.error('Failed to fetch events:', error) |
36 | 26 | } |
37 | 27 |
|
38 | 28 | const photoRotations = ['rotate-2', '-rotate-2', 'rotate-2', 'rotate-2', '-rotate-2'] |
@@ -126,7 +116,7 @@ const photoRotations = ['rotate-2', '-rotate-2', 'rotate-2', 'rotate-2', '-rotat |
126 | 116 | Upcoming Events |
127 | 117 | </dt> |
128 | 118 | <dd class="order-first text-3xl font-semibold tracking-tight text-gray-900 dark:text-zinc-100"> |
129 | | - {stats?.upcomingEvents || 0} |
| 119 | + {events.length} |
130 | 120 | </dd> |
131 | 121 | </div> |
132 | 122 | <div class="flex flex-col bg-gray-400/5 dark:bg-zinc-800/50 p-8"> |
@@ -157,27 +147,18 @@ const photoRotations = ['rotate-2', '-rotate-2', 'rotate-2', 'rotate-2', '-rotat |
157 | 147 | <h2 class="text-3xl font-bold tracking-tight text-gray-900 dark:text-zinc-100 sm:text-4xl mb-4"> |
158 | 148 | Upcoming Events |
159 | 149 | </h2> |
160 | | - {upcomingEvents.length > 0 ? ( |
| 150 | + {events.length > 0 ? ( |
161 | 151 | <div class="mt-16 grid max-w-2xl mx-auto grid-cols-1 gap-x-8 gap-y-20 lg:mx-0 lg:max-w-none lg:grid-cols-3"> |
162 | | - {upcomingEvents.map((event) => ( |
| 152 | + {events.map((event) => ( |
163 | 153 | <article class="flex flex-col items-start justify-between"> |
164 | 154 | <a href={event.url} target="_blank" rel="noopener noreferrer"> |
165 | 155 | <div class="relative w-full"> |
166 | | - {event.featuredImageSrc ? ( |
167 | | - <img |
168 | | - src={event.featuredImageSrc} |
169 | | - alt={event.featuredImageAlt || event.title} |
170 | | - class="aspect-[16/9] w-full rounded-2xl bg-gray-100 object-cover sm:aspect-[2/1] lg:aspect-[3/2]" |
171 | | - loading="lazy" |
172 | | - /> |
173 | | - ) : ( |
174 | | - <img |
175 | | - src="/assets/cdc-logo.svg" |
176 | | - alt="Cyprus Developer Community Logo" |
177 | | - class="aspect-[16/9] w-full rounded-2xl bg-gray-100 object-contain p-8 sm:aspect-[2/1] lg:aspect-[3/2]" |
178 | | - loading="lazy" |
179 | | - /> |
180 | | - )} |
| 156 | + <img |
| 157 | + src="/assets/cdc-logo.svg" |
| 158 | + alt="Cyprus Developer Community Logo" |
| 159 | + class="aspect-[16/9] w-full rounded-2xl bg-gray-100 object-contain p-8 sm:aspect-[2/1] lg:aspect-[3/2]" |
| 160 | + loading="lazy" |
| 161 | + /> |
181 | 162 | <div class="absolute inset-0 rounded-2xl ring-1 ring-inset ring-gray-900/10" /> |
182 | 163 | </div> |
183 | 164 | </a> |
@@ -271,13 +252,13 @@ const photoRotations = ['rotate-2', '-rotate-2', 'rotate-2', 'rotate-2', '-rotat |
271 | 252 | </div> |
272 | 253 | </div> |
273 | 254 |
|
274 | | - {teamMembers.length > 0 && ( |
| 255 | + {advocates.length > 0 && ( |
275 | 256 | <> |
276 | 257 | <h3 class="text-xl font-bold tracking-tight text-gray-900 dark:text-zinc-100 mt-12 mb-6"> |
277 | 258 | Advocates |
278 | 259 | </h3> |
279 | 260 | <div class="grid grid-cols-2 gap-6 sm:grid-cols-3 lg:grid-cols-4"> |
280 | | - {teamMembers.map((member) => ( |
| 261 | + {advocates.map((member) => ( |
281 | 262 | <a |
282 | 263 | href={`https://github.com/${member.login}`} |
283 | 264 | target="_blank" |
|
0 commit comments