@@ -3,7 +3,7 @@ import React, { useState, useEffect } from "react";
33import NavBar from "../NavBar/page" ;
44import Footer from "../Footer/page" ;
55import { motion , AnimatePresence } from "framer-motion" ;
6- import { sanity } from "@/lib/sanity" ; // adjust path as needed
6+ import { sanity } from "@/lib/sanity" ;
77
88interface EventType {
99 _id : string ;
@@ -34,17 +34,27 @@ const query = `*[_type == "event"]{
3434 }
3535}` ;
3636
37- const EventCard = ( { event } : { event : EventType } ) => (
37+ const EventCard = ( {
38+ event,
39+ expanded,
40+ onClick,
41+ } : {
42+ event : EventType ;
43+ expanded : boolean ;
44+ onClick : ( ) => void ;
45+ } ) => (
3846 < motion . div
39- className = "bg-white/20 dark:bg-neutral-900/70 rounded-2xl shadow-xl overflow-hidden backdrop-blur-md border border-white/10 flex flex-col"
47+ className = "bg-white/20 dark:bg-neutral-900/70 rounded-2xl shadow-xl overflow-hidden backdrop-blur-md border border-white/10 flex flex-col cursor-pointer transition-all "
4048 initial = { { opacity : 0 , y : 40 , scale : 0.95 } }
4149 animate = { { opacity : 1 , y : 0 , scale : 1 } }
4250 transition = { { duration : 0.5 , type : "spring" , stiffness : 120 } }
4351 whileHover = { {
4452 scale : 1.03 ,
4553 boxShadow : "0 8px 32px 0 rgba(0,0,0,0.18)" ,
4654 } }
55+ onClick = { onClick }
4756 >
57+ { /* Main event image */ }
4858 { event . images && event . images [ 0 ] ?. asset ?. url && (
4959 < img
5060 src = { event . images [ 0 ] . asset . url }
@@ -60,18 +70,56 @@ const EventCard = ({ event }: { event: EventType }) => (
6070 < span >
6171 { event . date ? new Date ( event . date ) . toLocaleDateString ( ) : "" }
6272 </ span >
63- · < span > { event . location } </ span >
73+ { event . location && (
74+ < >
75+ · < span > { event . location } </ span >
76+ </ >
77+ ) }
6478 </ div >
65- < p className = "text-gray-700 dark:text-gray-200 flex-1" >
79+ < p className = "text-gray-700 dark:text-gray-200 flex-1 mb-2 " >
6680 { event . description }
6781 </ p >
82+ < AnimatePresence >
83+ { expanded && event . images && event . images . length > 1 && (
84+ < motion . div
85+ initial = { { height : 0 , opacity : 0 } }
86+ animate = { { height : "auto" , opacity : 1 } }
87+ exit = { { height : 0 , opacity : 0 } }
88+ className = "mt-4"
89+ >
90+ < div className = "font-semibold text-white mb-2" > Gallery:</ div >
91+ < div className = "grid grid-cols-2 sm:grid-cols-3 gap-2" >
92+ { event . images . slice ( 1 ) . map (
93+ ( img , idx ) =>
94+ img . asset ?. url && (
95+ < img
96+ key = { img . asset . _id || idx }
97+ src = { img . asset . url }
98+ alt = { `Gallery image ${ idx + 1 } ` }
99+ className = "rounded-md border border-white/10 object-cover w-full h-28 sm:h-32"
100+ loading = "lazy"
101+ />
102+ )
103+ ) }
104+ </ div >
105+ </ motion . div >
106+ ) }
107+ </ AnimatePresence >
108+ < div className = "mt-4 text-primary font-semibold text-center" >
109+ { expanded
110+ ? "Click to collapse"
111+ : event . images && event . images . length > 1
112+ ? "Click to view gallery"
113+ : "" }
114+ </ div >
68115 </ div >
69116 </ motion . div >
70117) ;
71118
72119const EventsPage = ( ) => {
73120 const [ search , setSearch ] = useState ( "" ) ;
74121 const [ events , setEvents ] = useState < EventType [ ] > ( [ ] ) ;
122+ const [ expandedId , setExpandedId ] = useState < string | null > ( null ) ;
75123
76124 useEffect ( ( ) => {
77125 sanity . fetch ( query ) . then ( setEvents ) ;
@@ -97,7 +145,7 @@ const EventsPage = () => {
97145 className = "text-center mb-12"
98146 >
99147 < h1 className = "text-4xl md:text-5xl font-extrabold text-white mb-3" >
100- Upcoming < span className = "text-primary" > Events</ span >
148+ Past < span className = "text-primary" > Events</ span >
101149 </ h1 >
102150 < p className = "text-gray-200 max-w-2xl mx-auto" >
103151 Stay updated with our latest events, workshops, and meetups.
@@ -116,7 +164,14 @@ const EventsPage = () => {
116164 < div className = "grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-8" >
117165 { filteredEvents . length > 0 ? (
118166 filteredEvents . map ( ( event ) => (
119- < EventCard key = { event . _id } event = { event } />
167+ < EventCard
168+ key = { event . _id }
169+ event = { event }
170+ expanded = { expandedId === event . _id }
171+ onClick = { ( ) =>
172+ setExpandedId ( expandedId === event . _id ? null : event . _id )
173+ }
174+ />
120175 ) )
121176 ) : (
122177 < motion . div
0 commit comments