"use client"; import { useEffect, useState, useRef } from "react"; import { Html5QrcodeScanner, Html5QrcodeSupportedFormats } from "html5-qrcode"; import { Scan as ScanIcon, Check, Minus, Plus, AlertTriangle, X } from "lucide-react"; export default function ScanPage() { const [scannedData, setScannedData] = useState(null); const [item, setItem] = useState(null); const [loading, setLoading] = useState(false); const [error, setError] = useState(null); const [quantityAdjust, setQuantityAdjust] = useState(0); const [updating, setUpdating] = useState(false); const scannerRef = useRef(null); useEffect(() => { // Only initialize scanner if not already scanning a specific item if (scannedData) return; const onScanSuccess = (decodedText) => { setScannedData(decodedText); scannerRef.current?.clear(); }; scannerRef.current = new Html5QrcodeScanner( "reader", { fps: 10, qrbox: { width: 250, height: 250 }, formatsToSupport: [ Html5QrcodeSupportedFormats.QR_CODE ] }, /* verbose= */ false ); scannerRef.current.render(onScanSuccess, () => {}); return () => { scannerRef.current?.clear().catch(e => console.error("Failed to clear scanner", e)); }; }, [scannedData]); useEffect(() => { if (!scannedData) return; const lookupItem = async () => { setLoading(true); setError(null); try { // Fetch items and find the matched one const res = await fetch("/api/inventory"); const list = await res.json(); const matchedItem = list.find(i => i.qrCodeId === scannedData || i.id === scannedData); if (matchedItem) { setItem(matchedItem); setQuantityAdjust(0); } else { setError(`No item found in database matching: ${scannedData}`); } } catch (err) { setError(err.message); } finally { setLoading(false); } }; lookupItem(); }, [scannedData]); const handleUpdate = async () => { if (!item) return; setUpdating(true); try { const updatedQuantity = item.quantity + quantityAdjust; const res = await fetch("/api/inventory", { method: "PUT", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ id: item.id, quantity: updatedQuantity }) }); if (!res.ok) throw new Error("Failed to update quantity"); const updated = await res.json(); setItem(updated); setQuantityAdjust(0); alert(`Updated successfully. New quantity: ${updated.quantity}`); // Optionally continue scanning resetScanner(); } catch (err) { alert("Error: " + err.message); } finally { setUpdating(false); } }; const resetScanner = () => { setScannedData(null); setItem(null); setError(null); }; return (
Use your camera scanner to locate and update items.
{error}
ID: {item.qrCodeId}