@@ -9,7 +9,7 @@ import { Input } from "@/components/ui/input"
99import { Search , Clock , ArrowRight , Calendar , Star , Users , MapPin , DollarSign , Filter , Link as LinkIcon , Sparkles } from "lucide-react"
1010import Link from "next/link"
1111import { motion } from "framer-motion"
12- import { mockEvents , Event } from "@/components/data/events"
12+ import { Event } from "@/components/data/events"
1313import Header from "@/components/header" ;
1414import Footer from "@/components/footer" ;
1515import Image from "next/image" ;
@@ -18,6 +18,7 @@ import { Checkbox } from "@/components/ui/checkbox"
1818import "keen-slider/keen-slider.min.css"
1919import { useKeenSlider } from "keen-slider/react"
2020import { cn } from "@/lib/utils" ;
21+ import { useEvents , useFeaturedEvents } from "@/hooks/useEvents"
2122
2223// Event categories for dropdown
2324const eventCategories = [
@@ -35,8 +36,6 @@ const eventCategories = [
3536
3637export default function EventsPage ( ) {
3738 const [ searchTerm , setSearchTerm ] = useState ( "" )
38- const [ isLoading , setIsLoading ] = useState ( true )
39- const [ events , setEvents ] = useState < Event [ ] > ( [ ] )
4039 const [ dateFilter ] = useState ( "Upcoming" )
4140 const [ filterOpen , setFilterOpen ] = useState ( false )
4241 const [ selectedStatuses , setSelectedStatuses ] = useState < string [ ] > ( [ ] )
@@ -49,6 +48,19 @@ export default function EventsPage() {
4948 const [ selectedCategory , setSelectedCategory ] = useState < string > ( "All" )
5049 const [ copiedEventId , setCopiedEventId ] = useState < string | null > ( null )
5150
51+ // Use custom hooks for data fetching
52+ const { data : eventsData , loading : eventsLoading } = useEvents ( {
53+ search : searchTerm ,
54+ category : selectedCategory ,
55+ dateFilter : dateFilter === "Upcoming" ? "upcoming" : "all"
56+ } )
57+
58+ const { loading : featuredLoading } = useFeaturedEvents ( 5 )
59+
60+ // Extract events from the response
61+ const events = eventsData ?. events || [ ]
62+ const isLoading = eventsLoading || featuredLoading
63+
5264 // Unique values for filters
5365 const allStatuses = [ "Live" , "Expired" , "Closed" , "Recent" ]
5466 const allLocations = Array . from ( new Set ( events . flatMap ( e => e . locations ) ) ) . sort ( )
@@ -85,7 +97,7 @@ export default function EventsPage() {
8597 return matchesSearch && matchesStatus && matchesLocation && matchesEventType && matchesTeamSize && matchesPayment && matchesUserType && matchesCategory && matchesDate && matchesDropdownCategory
8698 } )
8799
88- const featuredEvents = filteredEvents . filter ( ( event ) => event . featured )
100+ const filteredFeaturedEvents = filteredEvents . filter ( ( event ) => event . featured )
89101 const regularEvents = filteredEvents . filter ( ( event ) => ! event . featured )
90102
91103 // Add keen-slider hook for featured events with autoplay and navigation
@@ -97,13 +109,13 @@ export default function EventsPage() {
97109 "(min-width: 640px)" : { slides : { perView : 1.5 , spacing : 24 } } ,
98110 "(min-width: 1024px)" : { slides : { perView : 2.2 , spacing : 32 } } ,
99111 } ,
100- loop : featuredEvents . length > 1 ,
112+ loop : filteredFeaturedEvents . length > 1 ,
101113 } )
102114
103115 // Autoplay effect
104116 useEffect ( ( ) => {
105117 if ( ! slider ) return
106- if ( featuredEvents . length > 1 ) {
118+ if ( filteredFeaturedEvents . length > 1 ) {
107119 const autoplay = ( ) => {
108120 slider . current ?. next ( )
109121 }
@@ -127,25 +139,9 @@ export default function EventsPage() {
127139 // If less than 2, clear any existing interval
128140 if ( sliderTimer . current ) clearInterval ( sliderTimer . current )
129141 }
130- } , [ slider , featuredEvents . length ] )
142+ } , [ slider , filteredFeaturedEvents . length ] )
143+
131144
132- useEffect ( ( ) => {
133- const fetchEvents = async ( ) => {
134- setIsLoading ( true )
135-
136- // For now, using mock data since events table doesn't exist yet
137- // In a real app, this would fetch from Supabase
138- try {
139- // Simulate API delay
140- await new Promise ( resolve => setTimeout ( resolve , 1000 ) )
141- setEvents ( mockEvents )
142- } catch {
143- setEvents ( [ ] )
144- }
145- setIsLoading ( false )
146- }
147- fetchEvents ( )
148- } , [ ] )
149145
150146 // Date filter logic
151147 function isDateMatch ( event : Event ) {
@@ -525,7 +521,7 @@ export default function EventsPage() {
525521 </ section >
526522
527523 { /* Featured Events - Redesigned */ }
528- { featuredEvents . length > 0 && (
524+ { filteredFeaturedEvents . length > 0 && (
529525 < section className = "py-16 relative" >
530526 < div className = "container px-4 mx-auto relative" >
531527 < motion . div
@@ -593,7 +589,7 @@ export default function EventsPage() {
593589 } }
594590 className = "keen-slider"
595591 >
596- { ( featuredEvents . length > 2 ? [ ...featuredEvents , ...featuredEvents ] : featuredEvents ) . map ( ( event , index ) => (
592+ { ( filteredFeaturedEvents . length > 2 ? [ ...filteredFeaturedEvents , ...filteredFeaturedEvents ] : filteredFeaturedEvents ) . map ( ( event , index ) => (
597593 < motion . div
598594 key = { event . id + '-' + index }
599595 className = "keen-slider__slide"
0 commit comments