"use client"; import { useEffect, useState } from "react"; import QRCode from "react-qr-code"; import { Printer, AlertCircle } from "lucide-react"; export default function PrintPage() { const [items, setItems] = useState([]); const [selectedIds, setSelectedIds] = useState(new Set()); const [loading, setLoading] = useState(true); const [error, setError] = useState(null); useEffect(() => { const fetchItems = async () => { try { const res = await fetch("/api/inventory"); if (!res.ok) throw new Error("Failed to fetch inventory from database"); const data = await res.json(); setItems(data); setSelectedIds(new Set(data.map(i => i.id))); } catch (err) { setError(err.message); } finally { setLoading(false); } }; fetchItems(); }, []); const handlePrint = () => { if (selectedIds.size === 0) return alert("Please select at least one label to print."); window.print(); }; const toggleSelection = (id) => { const next = new Set(selectedIds); if (next.has(id)) next.delete(id); else next.add(id); setSelectedIds(next); }; const toggleAll = () => { if (selectedIds.size === items.length) setSelectedIds(new Set()); else setSelectedIds(new Set(items.map(i => i.id))); }; const itemsToPrint = items.filter(i => selectedIds.has(i.id)); if (loading) return
Designed for Avery 5160 standard labels (1" x 2-5/8", 30 per sheet).
| 0} onChange={toggleAll} /> | Name | QR ID | Category |
|---|---|---|---|
| {}} /* Handled by row click */ /> | {item.name} | {item.qrCodeId} |
{item.category || "-"} |