"use client"; import { useState, useEffect } from "react"; import QrScanner from "@yudiel/react-qr-scanner"; // Correct import export default function QRScanner({ onScan, width = 300, height = 300 }) { const [error, setError] = useState(null); const [isSecureContext, setIsSecureContext] = useState(true); const [initialized, setInitialized] = useState(false); // Check if we're in a secure context useEffect(() => { // Check if we're in a secure context (https or localhost) const secure = window.isSecureContext; setIsSecureContext(secure); // Check if camera can be accessed async function checkCameraAccess() { try { const devices = await navigator.mediaDevices.enumerateDevices(); const videoDevices = devices.filter( (device) => device.kind === "videoinput" ); if (videoDevices.length === 0) { setError( "No camera detected. Please make sure your device has a camera." ); } setInitialized(true); } catch (err) { console.error("Error checking camera devices:", err); setError(`Camera initialization error: ${err.message}`); setInitialized(true); } } checkCameraAccess(); }, []); const handleDecode = (result) => { console.log("QR scan result:", result); if (!onScan || !result) return; try { // Handle different result formats if (result && typeof result === "object") { if (result.text) { onScan(result.text); return; } if (result.data) { onScan(result.data); return; } if (result.toString && typeof result.toString === "function") { const stringValue = result.toString(); if (stringValue !== "[object Object]") { onScan(stringValue); return; } } } else if (typeof result === "string") { onScan(result); return; } // Last resort onScan(String(result)); } catch (err) { console.error("Error processing QR scan result:", err); } }; const handleError = (error) => { console.error("QR Scanner error:", error); // More descriptive error messages let errorMessage = "Camera access error. "; if (!isSecureContext) { errorMessage += "Your browser requires HTTPS for camera access. When running locally, use http://localhost instead of your IP address."; } else if ( error.name === "NotAllowedError" || error.name === "PermissionDeniedError" ) { errorMessage += "Camera permission denied. Please allow camera access in your browser settings."; } else if ( error.name === "NotFoundError" || error.name === "DevicesNotFoundError" ) { errorMessage += "No camera found. Please ensure your device has a working camera."; } else if ( error.name === "NotReadableError" || error.name === "TrackStartError" ) { errorMessage += "Camera is already in use by another application or encountered a hardware error."; } else { errorMessage += `${ error.message || "Please check your camera permissions and refresh the page." }`; } setError(errorMessage); }; if (!isSecureContext) { return (

Camera access requires a secure context (HTTPS or localhost).

When running locally, use http://localhost:3000 instead of your network IP.

); } if (!initialized) { return (
Initializing camera...
); } return (
{error && (

{error}

)}
); }