import { useState, useMemo } from 'react' import { AppShell } from '@/components/layout/AppShell' import { FilterBar } from '@/components/inventory/FilterBar' import { ItemCard } from '@/components/inventory/ItemCard' import { ItemRow } from '@/components/inventory/ItemRow' import { useInventory } from '@/hooks/useInventory' import { useUIStore } from '@/store/ui' import { Loader2, AlertCircle } from 'lucide-react' export function DashboardPage() { const { data: items, isLoading, error } = useInventory() const { viewMode } = useUIStore() const [search, setSearch] = useState('') const [statusFilter, setStatusFilter] = useState('') const filtered = useMemo(() => { if (!items) return [] return items.filter((item) => { const matchSearch = !search || item.name.toLowerCase().includes(search.toLowerCase()) || (item.hw_id?.toLowerCase() ?? '').includes(search.toLowerCase()) || (item.asset_tag?.toLowerCase() ?? '').includes(search.toLowerCase()) const matchStatus = !statusFilter || item.catalog_status === statusFilter return matchSearch && matchStatus }) }, [items, search, statusFilter]) return ( {/* Page header */}

Inventory

All cataloged hardware in your homelab

{/* Loading */} {isLoading && (
Loading inventory…
)} {/* Error */} {error && (
{(error as Error).message}
)} {/* Empty state */} {!isLoading && !error && filtered.length === 0 && (

0

{items && items.length > 0 ? 'No items match your filters' : 'No items cataloged yet — add your first item'}

)} {/* Grid view */} {!isLoading && !error && filtered.length > 0 && viewMode === 'grid' && (
{filtered.map((item) => ( ))}
)} {/* List view */} {!isLoading && !error && filtered.length > 0 && viewMode === 'list' && (
{filtered.map((item) => ( ))}
)}
) }