diff --git a/src/components/home-sections/events-section.tsx b/src/components/home-sections/events-section.tsx index 993dc16..4ff95c5 100644 --- a/src/components/home-sections/events-section.tsx +++ b/src/components/home-sections/events-section.tsx @@ -1,15 +1,112 @@ import { events, communityLinks } from "@/src/lib/constants"; import { Card } from "@/src/components/ui/card"; import { Button } from "@/src/components/ui/button"; -import { Calendar, MapPin, Users, Clock } from "lucide-react"; +import { Badge } from "@/src/components/ui/badge"; +import { Calendar, MapPin, Users, Clock, ArrowUpRight } from "lucide-react"; import Link from "next/link"; +type CommunityEvent = (typeof events)[number]; + +const upcomingEvents = events.filter((e) => e.status === "upcoming"); +const pastEvents = events.filter((e) => e.status === "past"); + +function EventMeta({ event }: { event: CommunityEvent }) { + const isPast = event.status === "past"; + return ( +
+
+ + {event.date} +
+ {event.time && ( +
+ + {event.time} +
+ )} + {event.location && ( +
+ + {event.location} +
+ )} + {event.attendees > 0 && ( +
+ + + {event.attendees} {isPast ? "attended" : "going"} + +
+ )} +
+ ); +} + +function UpcomingCard({ event }: { event: CommunityEvent }) { + return ( + +
+
+

{event.title}

+

{event.description}

+ +
+ + + +
+
+ ); +} + +function PastCard({ event }: { event: CommunityEvent }) { + return ( + +
+
+
+

+ {event.title} +

+ + Past + +
+

{event.description}

+ +
+ {event.recapUrl ? ( + + + + ) : null} +
+
+ ); +} + export function EventsSection() { return (
{/* Section header */} -
+

Events & Meetups

@@ -19,52 +116,52 @@ export function EventsSection() {

- {/* Events grid */} -
- {events.map((event) => ( - -
- {/* Event info */} -
-

- {event.title} -

-

{event.description}

- - {/* Details */} -
-
- - {event.date} -
-
- - {event.time} -
-
- - {event.location} -
-
- - {event.attendees} attending -
-
-
- - {/* CTA */} - - - -
+ {/* Upcoming */} +
+
+

+ Upcoming Events +

+ {upcomingEvents.length > 0 && ( + + {upcomingEvents.length} + + )} +
+ {upcomingEvents.length > 0 ? ( +
+ {upcomingEvents.map((event) => ( + + ))} +
+ ) : ( + +

+ No upcoming events scheduled right now.{" "} + + Join the community + {" "} + to be the first to know. +

- ))} + )}
+ + {/* Past */} + {pastEvents.length > 0 && ( +
+

Past Events

+
+ {pastEvents.map((event) => ( + + ))} +
+
+ )}
); diff --git a/src/components/home-sections/team-section.tsx b/src/components/home-sections/team-section.tsx index 1d3dd21..28d571c 100644 --- a/src/components/home-sections/team-section.tsx +++ b/src/components/home-sections/team-section.tsx @@ -1,4 +1,4 @@ -import { teamMembers, communityLinks } from "@/src/lib/constants"; +import { teamMembers } from "@/src/lib/constants"; import { Card } from "@/src/components/ui/card"; import Image from "next/image"; import { Github, Linkedin, Twitter } from "lucide-react"; @@ -76,27 +76,6 @@ export function TeamSection() { ))} - - {/* Join the team CTA */} -
-
-

- Want to Join Our Team? -

-

- We're always looking for passionate individuals to help grow - the Django community in Rwanda. -

- - Get Involved - -
-
); diff --git a/src/lib/constants.ts b/src/lib/constants.ts index 5d0df7c..37b3ec5 100644 --- a/src/lib/constants.ts +++ b/src/lib/constants.ts @@ -19,7 +19,7 @@ export const navigationItems = [ export const communityLinks = { // Primary "Join Community" entry point — drives every Join/Register CTA // (header, hero, team, events, footer "Get Involved" + "Join Us"). - whatsapp: "https://chat.whatsapp.com/your-invite-code", // TODO: real WhatsApp invite link + whatsapp: "https://chat.whatsapp.com/GvIF9Mw1E2ZBf2S5wazfOo?mode=gi_t", // Social / code github: "https://github.com/djangorwanda", @@ -87,24 +87,39 @@ export const workshops = [ }, ] +// Events. `status` drives the Upcoming vs Past subsections. +// Optional fields render only when set: `time`, `location`, `attendees` (>0), +// `registerUrl` (upcoming — falls back to the WhatsApp community), and +// `recapUrl` (past — links a recording / photos / writeup). export const events = [ + // ── Upcoming ──────────────────────────────────────────────────────────── { id: 1, - title: "Monthly Meetup - Kigali", - date: "Every 2nd Saturday", + title: "Python/Django July Meetup 2026", + date: "Friday, 24 July 2026", time: "2:00 PM", - location: "Kigali Innovation Hub", - description: "Join fellow Django developers for networking, knowledge sharing, and coffee.", - attendees: 45, + location: "GIZ Digital Transformation Center, Rwanda", + description: + "A community meetup for Python and Django developers — talks, networking, and hands-on sessions.", + status: "upcoming", + attendees: 0, + registerUrl: + "https://docs.google.com/forms/d/e/1FAIpQLSetBc2-fgyo1IRR3_8hQ1mMDc-LCIwD5fWv7FxcsfXUTrf2Ww/viewform", + recapUrl: "", }, + // ── Past ──────────────────────────────────────────────────────────────── { id: 2, - title: "Django Bootcamp - Q1 2026", - date: "January 15 - March 15", - time: "Flexible", - location: "Online + In-person", - description: "Intensive bootcamp to launch your Django journey and build real projects.", - attendees: 200, + title: "Python & Django Rwanda Bootcamp", + date: "February – April 2026", + time: "", + location: "", + description: + "A 3-month intensive bootcamp covering Python and Django through hands-on, real-world projects.", + status: "past", + attendees: 0, + registerUrl: "", + recapUrl: "", // TODO: link recording / photos / writeup }, ]