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 ? (
+
+
+
+
+
+ {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 && (
+
+
+
+
+
+ {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 && (
-
-
)}
+
+
+
+