import { useState, useEffect } from "react"; import { useNavigate, useSearchParams } from "react-router-dom"; import { AppHeader } from "@/components/AppHeader"; import { DiscoveryHeader } from "@/components/DiscoveryHeader"; import { ProgrammingIdeaCard } from "@/components/ProgrammingIdeaCard"; import { VendorCard } from "@/components/VendorCard"; import { Footer } from "@/components/Footer"; import { WelcomeModal } from "@/components/WelcomeModal"; import { QuickFilters } from "@/components/QuickFilters"; import { QuickWinsDialog } from "@/components/QuickWinsDialog"; import { FirstTimeTooltip } from "@/components/FirstTimeTooltips"; import { useAutoCreateList } from "@/hooks/useAutoCreateList"; import { useToast } from "@/hooks/use-toast"; import { useAuth } from "@/components/AuthProvider"; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/components/ui/select"; import { Card } from "@/components/ui/card"; import { Button } from "@/components/ui/button"; import { Badge } from "@/components/ui/badge"; import { Heart, HelpCircle, Sparkles } from "lucide-react"; import { fetchIdeas, fetchVendors, type Idea, type Vendor } from "@/lib/api"; import { AnimatedBackground } from "@/components/AnimatedBackground"; import { SkeletonCard } from "@/components/ui/skeleton-card"; import { motion } from "framer-motion"; const Index = () => { const navigate = useNavigate(); const [searchParams] = useSearchParams(); const { toast } = useToast(); const { user } = useAuth(); // API data state const [ideas, setIdeas] = useState([]); const [vendors, setVendors] = useState([]); const [loading, setLoading] = useState(true); const [error, setError] = useState(null); // UI state const [searchQuery, setSearchQuery] = useState(""); const [activeTab, setActiveTab] = useState<"all" | "ideas" | "vendors">("all"); const [viewMode] = useState<"grid">("grid"); // Always grid view // New filtering system - Initialize from URL params const [communityFilters, setCommunityFilters] = useState([]); const [industryFilter, setIndustryFilter] = useState("all"); const [goalsFilter, setGoalsFilter] = useState([]); const [savedItems, setSavedItems] = useState([]); const [sortBy, setSortBy] = useState<"dateAsc" | "dateDesc" | "recentlyAdded" | "mostFavorited">("recentlyAdded"); // New states for improved UX const [showWelcomeModal, setShowWelcomeModal] = useState(false); const [quickWinsOpen, setQuickWinsOpen] = useState(false); const [quickFilterCommunity, setQuickFilterCommunity] = useState("all"); const [quickFilterEvent, setQuickFilterEvent] = useState("all"); const [quickFilterBudget, setQuickFilterBudget] = useState("all"); const [showAdvancedFilters, setShowAdvancedFilters] = useState(false); // Auto-create first list for new users useAutoCreateList(); // Initialize filters from URL params and check if first-time visitor useEffect(() => { const communityParam = searchParams.get('community'); if (communityParam) { setCommunityFilters([communityParam]); } // Check if first-time visitor const hasVisited = localStorage.getItem("hasVisitedBefore"); if (!hasVisited) { setShowWelcomeModal(true); localStorage.setItem("hasVisitedBefore", "true"); // Show Quick Wins dialog after a short delay setTimeout(() => { setQuickWinsOpen(true); }, 1000); } // Check if Quick Wins has been shown before (for returning users) const hasSeenQuickWins = localStorage.getItem("hasSeenQuickWins"); if (!hasSeenQuickWins && hasVisited) { setTimeout(() => { setQuickWinsOpen(true); localStorage.setItem("hasSeenQuickWins", "true"); }, 500); } }, [searchParams]); // Fetch data from API useEffect(() => { const fetchData = async () => { try { setLoading(true); // Build API parameters based on current filters const ideasParams = { page: 1, pageSize: 50, ...(goalsFilter.length > 0 && { goals: goalsFilter }), ...(industryFilter !== "all" && { industry: industryFilter }), ...(communityFilters.length > 0 && { communityFocus: communityFilters }) }; const vendorsParams = { page: 1, pageSize: 50, ...(industryFilter !== "all" && { industry: industryFilter }), ...(communityFilters.length > 0 && { communityFocus: communityFilters }) }; const [ideasResponse, vendorsResponse] = await Promise.all([ fetchIdeas(ideasParams), fetchVendors(vendorsParams) ]); setIdeas(ideasResponse.data); setVendors(vendorsResponse.data); setError(null); } catch (err) { setError(err instanceof Error ? err.message : 'Failed to fetch data'); console.error('Error fetching data:', err); } finally { setLoading(false); } }; fetchData(); }, [communityFilters, industryFilter, goalsFilter]); // Refetch when filters change const handleSaveItem = (id: string) => { // Check if user is authenticated if (!user) { toast({ title: "Sign in required", description: (

Please sign in to save items to your favorites.

), duration: 5000, }); return; } const isCurrentlySaved = savedItems.includes(id); setSavedItems(prev => isCurrentlySaved ? prev.filter(item => item !== id) : [...prev, id] ); if (!isCurrentlySaved) { toast({ title: "Saved to your list", description: (

This item has been added to your favorites.

), duration: 4000, }); } else { toast({ title: "Removed from list", description: "This item has been removed from your favorites.", duration: 3000, }); } }; const handleViewMore = (id: string, type?: string) => { if (type === "vendor" || vendors.find(v => v.id === id)) { navigate(`/vendor/${id}`); } else { navigate(`/idea/${id}`); } }; // Client-side filtering for search query only (since other filters are handled by API) const filteredIdeas = ideas.filter(idea => { const matchesSearch = searchQuery === "" || idea.title.toLowerCase().includes(searchQuery.toLowerCase()) || idea.description.toLowerCase().includes(searchQuery.toLowerCase()); return matchesSearch; }); const filteredVendors = vendors.filter(vendor => { const matchesSearch = searchQuery === "" || vendor.name.toLowerCase().includes(searchQuery.toLowerCase()) || vendor.bio.toLowerCase().includes(searchQuery.toLowerCase()); return matchesSearch; }); const sortItems = (items: any[]) => { switch (sortBy) { case "dateAsc": return [...items].sort((a, b) => new Date(a.eventDate || a.dateAdded).getTime() - new Date(b.eventDate || b.dateAdded).getTime()); case "dateDesc": return [...items].sort((a, b) => new Date(b.eventDate || b.dateAdded).getTime() - new Date(a.eventDate || a.dateAdded).getTime()); case "recentlyAdded": return [...items].sort((a, b) => new Date(b.dateAdded).getTime() - new Date(a.dateAdded).getTime()); case "mostFavorited": return [...items].sort((a, b) => b.favoriteCount - a.favoriteCount); default: return items; } }; const getDisplayItems = () => { let displayIdeas = []; let displayVendors = []; switch (activeTab) { case "ideas": displayIdeas = sortItems(filteredIdeas); break; case "vendors": displayVendors = sortItems(filteredVendors); break; default: displayIdeas = sortItems(filteredIdeas); displayVendors = sortItems(filteredVendors); } return { ideas: displayIdeas, vendors: displayVendors }; }; const { ideas: displayIdeas, vendors: displayVendors } = getDisplayItems(); const handleWelcomeGetStarted = (type?: string) => { setShowWelcomeModal(false); if (type === "ideas") { // Show all programming ideas setActiveTab("ideas"); } else if (type === "vendors") { // Show vendors setActiveTab("vendors"); } else if (type === "activities") { setQuickFilterEvent("social"); } }; return ( setShowWelcomeModal(false)} onGetStarted={handleWelcomeGetStarted} /> setQuickWinsOpen(false)} onUpgrade={() => { // Handle upgrade to Pro logic here toast({ title: "Pro Features Coming Soon", description: "Advanced filtering and 100+ formats will be available soon!", }); }} />
{/* Filters */}
{/* Quick Wins Button - Right above search bar */}
{/* Quick Filters */}
setShowAdvancedFilters(!showAdvancedFilters)} />
{/* Help button for new users */}
{error && (

Error: {error}

)} {loading ? (
{[...Array(14)].map((_, i) => ( ))}
) : ( <>

{activeTab === "ideas" ? "Programming Ideas" : activeTab === "vendors" ? "Vendors" : "Discover"}

Sort by:
{displayIdeas.map((idea, index) => ( ))} {displayVendors.map((vendor, index) => ( {}} // Removed contact functionality isSaved={savedItems.includes(vendor.id)} /> ))}
{displayIdeas.length === 0 && displayVendors.length === 0 && !loading && (

No results found. Try adjusting your search or filters.

)} )}