diff --git a/client/src/pages/Events.jsx b/client/src/pages/Events.jsx index 577e85e..a676467 100644 --- a/client/src/pages/Events.jsx +++ b/client/src/pages/Events.jsx @@ -6,6 +6,29 @@ const Events = () => { const [filteredEvents, setFilteredEvents] = useState([]); const [selectedClub, setSelectedClub] = useState("All"); const [searchTerm, setSearchTerm] = useState(""); + const [upcomingEvents, setUpcomingEvents] = useState([]); + const [pastEvents, setPastEvents] = useState([]); + + // Helper function to parse date and get latest date for sorting + const getEventDate = (dates) => { + if (!dates || dates.length === 0) return new Date(); + + // Get the latest date from the dates array for sorting + const latestDate = dates[dates.length - 1]; + const [day, month, year] = latestDate.split('-'); + return new Date(year, month - 1, day); + }; + + // Helper function to check if event is past + const isEventPast = (dates) => { + if (!dates || dates.length === 0) return false; + + const eventDate = getEventDate(dates); + const today = new Date(); + today.setHours(0, 0, 0, 0); // Reset time for accurate date comparison + + return eventDate < today; + }; // Fetch events data useEffect(() => { @@ -13,8 +36,16 @@ const Events = () => { try { const response = await fetch('/data/events.json'); const data = await response.json(); - setEvents(data.events); - setFilteredEvents(data.events); + + // Sort events by date (earliest first) + const sortedEvents = data.events.sort((a, b) => { + const dateA = getEventDate(a.dates); + const dateB = getEventDate(b.dates); + return dateA - dateB; + }); + + setEvents(sortedEvents); + setFilteredEvents(sortedEvents); } catch (error) { console.error('Failed to fetch events:', error); } @@ -25,7 +56,7 @@ const Events = () => { // Get unique clubs for filter const clubs = ["All", ...new Set(events.map(event => event.clubName))]; - // Filter events based on club and search term + // Filter events and separate into past and upcoming useEffect(() => { let filtered = events; @@ -41,6 +72,12 @@ const Events = () => { ); } + // Separate into past and upcoming events + const upcoming = filtered.filter(event => !isEventPast(event.dates)); + const past = filtered.filter(event => isEventPast(event.dates)); + + setUpcomingEvents(upcoming); + setPastEvents(past.reverse()); // Show most recent past events first setFilteredEvents(filtered); }, [selectedClub, searchTerm, events]); @@ -145,13 +182,13 @@ const Events = () => { {/* Results Count */}
- {filteredEvents.length} event{filteredEvents.length !== 1 ? 's' : ''} found + {upcomingEvents.length} upcoming • {pastEvents.length} past events
- {/* Events Grid */} + {/* Events Sections */}
{filteredEvents.length === 0 ? (
@@ -160,74 +197,163 @@ const Events = () => {

Try adjusting your search or filter criteria

) : ( -
- {filteredEvents.map((event, index) => ( - -
- {/* Event Header */} -
- - {event.clubName} - -
-
- {event.date} -
-
- {formatDate(event.dates)} -
-
+ <> + {/* Upcoming Events Section */} + {upcomingEvents.length > 0 ? ( +
+
+
+
+

+ Upcoming Events +

+
+ + {upcomingEvents.length} events + +
+ +
+ {upcomingEvents.map((event, index) => ( + + ))} +
+
+ ) : ( +
+
+
+
+

+ Upcoming Events +

+
+
+
+ +
+
🎉
+

No Upcoming Events

+

All events have concluded. Check back soon for new exciting events!

+
+ Stay tuned to our social media for updates on future events +
+
+
+ )} - {/* Event Title */} -

- {event.eventName} -

- - {/* Event Description */} -

- {event.description} -

- - {/* Event Footer */} -
-
-
- 📅 -
- - Don't miss out! - -
- + {/* Past Events Section */} + {pastEvents.length > 0 && ( +
+
+
+
+

+ Past Events +

+
+ + {pastEvents.length} events +
- - ))} -
+ +
+ {pastEvents.map((event, index) => ( + + ))} +
+
+ )} + )}
); }; +// Separate EventCard component for reusability +const EventCard = ({ event, index, getClubColor, formatDate, isPast }) => { + return ( + +
+ {/* Event Header */} +
+
+ + {event.clubName} + + {isPast && ( + + Past + + )} +
+
+
+ {formatDate(event.dates)} +
+
+
+ + {/* Event Title */} +

+ {event.eventName} +

+ + {/* Event Description */} +

+ {event.description} +

+ + {/* Event Footer */} +
+
+
+ 📅 +
+ + {isPast ? 'Event completed' : "Don't miss out!"} + +
+ +
+
+
+ ); +}; + export default Events; \ No newline at end of file diff --git a/client/src/pages/Home.jsx b/client/src/pages/Home.jsx index ea9f9df..42d5c49 100644 --- a/client/src/pages/Home.jsx +++ b/client/src/pages/Home.jsx @@ -77,7 +77,33 @@ export default function Home() { try { const response = await fetch('/data/events.json'); const data = await response.json(); - setEvents(data.events.slice(0, 6)); // Show only first 6 events + + // Helper function to check if event is upcoming + const isEventUpcoming = (dates) => { + if (!dates || dates.length === 0) return true; + + const latestDate = dates[dates.length - 1]; + const [day, month, year] = latestDate.split('-'); + const eventDate = new Date(year, month - 1, day); + const today = new Date(); + today.setHours(0, 0, 0, 0); + + return eventDate >= today; + }; + + // Filter for upcoming events and sort by date + const upcomingEvents = data.events + .filter(event => isEventUpcoming(event.dates)) + .sort((a, b) => { + const getDate = (dates) => { + const [day, month, year] = dates[0].split('-'); + return new Date(year, month - 1, day); + }; + return getDate(a.dates) - getDate(b.dates); + }) + .slice(0, 6); // Show only first 6 upcoming events + + setEvents(upcomingEvents); } catch (error) { console.error('Failed to fetch events:', error); } @@ -85,32 +111,6 @@ export default function Home() { fetchEvents(); }, []); - // Format dates for display - const formatEventDate = (dates) => { - if (!dates || dates.length === 0) return 'Date TBD'; - - if (dates.length === 1) { - const [day, month, year] = dates[0].split('-'); - const date = new Date(year, month - 1, day); - return date.toLocaleDateString('en-US', { - month: 'short', - day: 'numeric' - }); - } else { - const [startDay, startMonth, startYear] = dates[0].split('-'); - const [endDay, endMonth, endYear] = dates[dates.length - 1].split('-'); - const startDate = new Date(startYear, startMonth - 1, startDay); - const endDate = new Date(endYear, endMonth - 1, endDay); - return `${startDate.toLocaleDateString('en-US', { - month: 'short', - day: 'numeric' - })} - ${endDate.toLocaleDateString('en-US', { - month: 'short', - day: 'numeric' - })}`; - } - }; - // Hero text sliding animation useEffect(() => { const interval = setInterval(() => { @@ -411,63 +411,83 @@ export default function Home() {

-
- {events.map((event, index) => ( -
-
-
-
- - {event.clubName} - - - {formatEventDate(event.dates)} - -
- -

- {event.eventName} -

- -

- {event.description.length > 120 - ? `${event.description.substring(0, 120)}...` - : event.description - } -

- -
-
- 📅 + {events.length > 0 ? ( +
+ {events.map((event, index) => ( +
+
+
+
+ + {event.clubName} + + + {formatEventDate(event.dates)} + +
+ +

+ {event.eventName} +

+ +

+ {event.description.length > 120 + ? `${event.description.substring(0, 120)}...` + : event.description + } +

+ +
+
+ 📅 +
+ + Mark your calendar +
- - Mark your calendar -
+ ))} +
+ ) : ( +
+
+
🎉
+

+ No Upcoming Events Right Now +

+

+ All current events have concluded. Check back soon for exciting new events and activities! +

+
+
+ 📅 +
+ + Stay tuned for updates + +
- ))} -
- - {events.length > 0 && ( -
-
)} + +
+ +