import { useState, useEffect } from 'react'; import api from '../api/client'; import PackageGrid from '../components/PackageGrid'; import { RefreshCw, Search, LayoutGrid, List } from 'lucide-react'; export default function Installed() { const [packages, setPackages] = useState([]); const [filtered, setFiltered] = useState([]); const [loading, setLoading] = useState(true); const [filter, setFilter] = useState(''); const [error, setError] = useState(null); const [viewMode, setViewMode] = useState('grid'); useEffect(() => { load(); }, []); useEffect(() => { if (!filter.trim()) { setFiltered(packages); return; } const q = filter.toLowerCase(); setFiltered(packages.filter(p => p.name.toLowerCase().includes(q) || (p.description && p.description.toLowerCase().includes(q)) )); }, [filter, packages]); async function load() { setLoading(true); setError(null); try { const data = await api.listInstalled(); setPackages(data.results || []); } catch (err) { setError(err.message); } finally { setLoading(false); } } return (
{/* Header */}

Installed Packages

{packages.length > 0 ? `${packages.length} packages on your system` : 'Loading...'}

{/* View toggle */}
{error && (
{error}
)} {/* Filter */} {!loading && packages.length > 0 && (
setFilter(e.target.value)} />
)} {/* Package List */} {viewMode === 'grid' ? ( ) : ( /* List view */ loading ? (
{Array.from({ length: 8 }).map((_, i) => (
))}
) : filtered.length === 0 ? (

No packages found

) : (
{filtered.map((pkg, i) => (
window.location.href = `/package/${pkg.name}`}> {pkg.name} {pkg.version} {pkg.description || '—'} {pkg.source === 'aur' ? 'AUR' : 'pacman'}
))}
) )}
); }