import { useState, useMemo } from "react"; import { Navbar } from "@/components/Navbar"; import { PluginCard } from "@/components/PluginCard"; import { Footer } from "@/components/Footer"; import { StatsCard } from "@/components/StatsCard"; import { VisitorChart } from "@/components/VisitorChart"; import { usePlugins, useStats } from "@/client/hooks/usePlugin"; import { Activity, CheckCircle2, XCircle, TrendingUp, Loader2, Search, X } from "lucide-react"; import { Input } from "@/components/ui/input"; import { Badge } from "@/components/ui/badge"; import { Button } from "@/components/ui/button"; export default function Docs() { const { plugins, loading: pluginsLoading } = usePlugins(); const { stats, loading: statsLoading } = useStats(); const [selectedCategory, setSelectedCategory] = useState(null); const [searchQuery, setSearchQuery] = useState(""); const [selectedTags, setSelectedTags] = useState([]); const allTags = useMemo(() => { const tagsSet = new Set(); plugins.forEach(plugin => { plugin.tags?.forEach(tag => tagsSet.add(tag)); }); return Array.from(tagsSet).sort(); }, [plugins]); const filteredPlugins = useMemo(() => { let filtered = plugins; if (selectedCategory) { filtered = filtered.filter((p) => p.category.includes(selectedCategory)); } if (searchQuery.trim()) { const query = searchQuery.toLowerCase(); filtered = filtered.filter((p) => p.name.toLowerCase().includes(query) || p.description.toLowerCase().includes(query) || p.endpoint.toLowerCase().includes(query) || p.tags?.some(tag => tag.toLowerCase().includes(query)) ); } if (selectedTags.length > 0) { filtered = filtered.filter((p) => selectedTags.every(tag => p.tags?.includes(tag)) ); } return filtered; }, [plugins, selectedCategory, searchQuery, selectedTags]); const toggleTag = (tag: string) => { setSelectedTags(prev => prev.includes(tag) ? prev.filter(t => t !== tag) : [...prev, tag] ); }; const clearAllFilters = () => { setSearchQuery(""); setSelectedTags([]); setSelectedCategory(null); }; return (
{/* Navbar with Categories in Hamburger Menu */} {/* Main Content */}
{/* Statistics Cards */}

API Statistics

{statsLoading ? (
) : stats ? ( <>
{/* Visitor Chart */} ) : (
Failed to load statistics
)}
{/* Search and Filter Section */}
{/* Search Bar */}
setSearchQuery(e.target.value)} className="pl-10 bg-white/[0.02] border-white/10 text-white placeholder:text-gray-500 focus:border-purple-500 h-12" /> {searchQuery && ( )}
{/* Tags Filter */} {allTags.length > 0 && (

Filter by Tags

{selectedTags.length > 0 && ( )}
{allTags.map((tag) => ( toggleTag(tag)} className={`cursor-pointer transition-colors ${ selectedTags.includes(tag) ? "bg-purple-500/30 text-purple-300 border-purple-500 hover:bg-purple-500/40" : "bg-white/5 text-gray-400 border-white/10 hover:bg-white/10" } border`} > {tag} ))}
)} {/* Active Filters Summary */} {(selectedCategory || searchQuery || selectedTags.length > 0) && (
Active filters: {selectedCategory && ( Category: {selectedCategory} )} {searchQuery && ( Search: "{searchQuery}" )} {selectedTags.map(tag => ( Tag: {tag} ))}
)}
{/* Results Count */}

{selectedCategory ? `${selectedCategory} Endpoints` : "All Endpoints"}

Showing {filteredPlugins.length} of {plugins.length} endpoint{filteredPlugins.length !== 1 ? 's' : ''}

{/* Plugins List */}
{pluginsLoading ? (
) : filteredPlugins.length > 0 ? ( filteredPlugins.map((plugin) => ( )) ) : (
No endpoints found
{searchQuery || selectedTags.length > 0 ? "Try adjusting your search or filters" : selectedCategory ? "No plugins available in this category" : "No plugins available"}
{(searchQuery || selectedTags.length > 0 || selectedCategory) && ( )}
)}
); }