import Header from "@/components/Header"; import FilterBar from "@/components/FilterBar"; import ConferenceCard from "@/components/ConferenceCard"; import conferencesData from "@/data/conferences.yml"; import { Conference } from "@/types/conference"; import { useState, useMemo, useEffect } from "react"; import { Switch } from "@/components/ui/switch" import { parseISO, isValid, isPast } from "date-fns"; const Index = () => { const [selectedTag, setSelectedTag] = useState("All"); const [searchQuery, setSearchQuery] = useState(""); const [showPastConferences, setShowPastConferences] = useState(false); const filteredConferences = useMemo(() => { if (!Array.isArray(conferencesData)) { console.error("Conferences data is not an array:", conferencesData); return []; } return conferencesData .filter((conf: Conference) => { // Filter by deadline (past/future) const deadlineDate = conf.deadline && conf.deadline !== 'TBD' ? parseISO(conf.deadline) : null; const isUpcoming = !deadlineDate || !isValid(deadlineDate) || !isPast(deadlineDate); if (!showPastConferences && !isUpcoming) return false; // Filter by tag and search query const matchesTag = selectedTag === "All" || (Array.isArray(conf.tags) && conf.tags.includes(selectedTag)); const matchesSearch = searchQuery === "" || conf.title.toLowerCase().includes(searchQuery.toLowerCase()) || (conf.full_name && conf.full_name.toLowerCase().includes(searchQuery.toLowerCase())); return matchesTag && matchesSearch; }) .sort((a: Conference, b: Conference) => { const dateA = a.deadline && a.deadline !== 'TBD' ? parseISO(a.deadline).getTime() : Infinity; const dateB = b.deadline && b.deadline !== 'TBD' ? parseISO(b.deadline).getTime() : Infinity; return dateA - dateB; }); }, [selectedTag, searchQuery, showPastConferences]); if (!Array.isArray(conferencesData)) { return
Loading conferences...
; } return (
{filteredConferences.map((conference: Conference) => ( ))}
); }; export default Index;