diff --git a/web-app/src/pages/Home.jsx b/web-app/src/pages/Home.jsx index 1b8ed1df..935e79d1 100644 --- a/web-app/src/pages/Home.jsx +++ b/web-app/src/pages/Home.jsx @@ -1,6 +1,6 @@ import { useState, useEffect } from 'react'; import { Link } from 'react-router-dom'; -import { Search, Filter, Book, AlertCircle, ArrowRight, Star, RefreshCw } from 'lucide-react'; +import { Search, Filter, Book, AlertCircle, ArrowRight, Star, RefreshCw, ArrowUpDown } from 'lucide-react'; import { motion, AnimatePresence } from 'framer-motion'; import { supabase } from '../lib/supabase'; @@ -11,6 +11,7 @@ export function Home() { const [categoryFilter, setCategoryFilter] = useState('all'); const [loading, setLoading] = useState(true); const [stars, setStars] = useState({}); + const [sortBy, setSortBy] = useState('default'); const [syncing, setSyncing] = useState(false); const [syncMsg, setSyncMsg] = useState(null); @@ -105,8 +106,17 @@ export function Home() { result = result.filter(skill => skill.category === categoryFilter); } + // Apply sorting + if (sortBy === 'stars') { + result = [...result].sort((a, b) => (stars[b.id] || 0) - (stars[a.id] || 0)); + } else if (sortBy === 'newest') { + result = [...result].sort((a, b) => (b.date_added || '').localeCompare(a.date_added || '')); + } else if (sortBy === 'az') { + result = [...result].sort((a, b) => a.name.localeCompare(b.name)); + } + setFilteredSkills(result); - }, [search, categoryFilter, skills]); + }, [search, categoryFilter, sortBy, skills, stars]); // Sort categories by count (most skills first), with 'uncategorized' at the end const categoryStats = {}; @@ -202,6 +212,17 @@ export function Home() { ))} + +