diff --git a/src/components/Events.tsx b/src/components/Events.tsx index 6e1fb99..914fef8 100644 --- a/src/components/Events.tsx +++ b/src/components/Events.tsx @@ -1,3 +1,4 @@ +import { useState, useMemo } from "react"; import { useCollection } from "@/hooks/useCollection"; import {Carousel, Card} from "./ui/apple-cards-carousel"; import collections from "@/firebase/collections"; @@ -5,20 +6,57 @@ import Event from "@/features/events/interfaces/Event"; import BouncingText from "./ui/BouncingText"; export default function Events() { + const [showUpcoming, setShowUpcoming] = useState(true); const { documents: events } = useCollection(collections.eventsCollection,null, ["date", "asc"],false, true); - const cards = (events ?? []).map((event) => ( - + + const filteredEvents = useMemo(() => { + if (!events) return []; + const now = new Date(); + return events.filter(event => { + const eventDate = event.date.toDate(); + return showUpcoming ? eventDate >= now : eventDate < now; + }); + }, [events, showUpcoming]); + + const cards = filteredEvents.map((event) => ( + )); return (
-

- -

+
+

+ +

+ +
+ + Past Events + + + + Upcoming Events + +
+
+ {(cards.length === 0) && ( -
- Something went wrong, please reload. +
+ {events ? `No ${showUpcoming ? 'upcoming' : 'past'} events found.` : 'Something went wrong, please reload.'}
)} diff --git a/src/components/ui/apple-cards-carousel.tsx b/src/components/ui/apple-cards-carousel.tsx index 72929fb..26589b7 100644 --- a/src/components/ui/apple-cards-carousel.tsx +++ b/src/components/ui/apple-cards-carousel.tsx @@ -11,7 +11,6 @@ import { cn } from "@/lib/utils"; import { AnimatePresence, motion } from "motion/react"; import { useOutsideClick } from "@/hooks/useOutsideClick"; -import { EventCategoryEnum } from "@/features/events/enums/EventCategoryEnum"; import Event from "@/features/events/interfaces/Event"; interface CarouselProps { @@ -95,9 +94,11 @@ export const Carousel = ({ items }: CarouselProps) => { export const Card = ({ card, layout = false, + upcoming = true, }: { card: Event; layout?: boolean; + upcoming?: boolean; }) => { const [open, setOpen] = useState(false); const containerRef = useRef(null); @@ -121,8 +122,8 @@ export const Card = ({ useOutsideClick(containerRef, () => handleClose()); - const handleOpen = (category: string) => { - if (category !== EventCategoryEnum.Past) { + const handleOpen = () => { + if (upcoming) { setOpen(true); } }; @@ -156,18 +157,18 @@ export const Card = ({ > - - {card.category} - {card.title} + {card.special && + {card.special} + } {card.location && handleOpen(card.category)} + onClick={() => handleOpen()} className="relative z-10 flex h-[60vh] w-[70vw] flex-col items-start justify-start overflow-hidden rounded-3xl bg-gray-100 md:h-[40rem] md:w-96 dark:bg-neutral-900 hover:cursor-pointer" >
- - {card.category} - {card.title} + {card.special && + {card.special} + } diff --git a/src/features/events/interfaces/Event.ts b/src/features/events/interfaces/Event.ts index 67342f5..a768b53 100644 --- a/src/features/events/interfaces/Event.ts +++ b/src/features/events/interfaces/Event.ts @@ -16,4 +16,5 @@ export default interface Event { description?: string; link?: Link; additionalLinks?: Link[]; + special?: string; } \ No newline at end of file