resolve camara scan stream failure
Release Inventarsystem / release-docker (push) Successful in 2m15s

This commit is contained in:
2026-08-16 15:57:12 +02:00
parent 0ef928efd8
commit fe075938d7
+71 -53
View File
@@ -805,74 +805,92 @@
deleteLibraryItem(itemId); deleteLibraryItem(itemId);
} }
// ========================================================================= async function startScanner(callback = null) {
// 3. CORE SCANNER ROUTING ENGINE (QUAGGA2) if (scannerRunning) {
// ========================================================================= console.warn("Scanner is already running. Stopping it first...");
function startScanner(targetCallback) { await stopScanner();
const readerWrap = document.getElementById('scanReaderWrap'); }
activeScannerCallback = callback;
const scannerWrap = document.querySelector('.library-scan-reader-wrap');
const toggleBtn = document.getElementById('toggleScannerBtn'); const toggleBtn = document.getElementById('toggleScannerBtn');
activeScannerCallback = targetCallback; // 1. CRITICAL FIX: Make the container visible BEFORE Quagga initializes
// Quagga cannot calculate video dimensions if display is 'none'
if (scannerWrap) {
scannerWrap.style.display = 'block';
}
if (readerWrap) readerWrap.style.display = 'block'; setScanStatus('Starte Kamera...', 'warn');
setScanStatus('Initializing camera...', 'warn');
const scannerContainer = document.querySelector('.library-scan-reader-wrap'); // 2. Initialize Quagga with a slight delay to allow the DOM to render the block
scannerContainer.style.display = 'block'; setTimeout(() => {
Quagga.init({
Quagga.init({ inputStream: {
inputStream: { name: "Live",
name: "Live", type: "LiveStream",
type: "LiveStream", // This MUST match the inner div where the video should appear
target: document.querySelector('.library-scan-reader'), target: document.querySelector('.library-scan-reader'),
constraints: { constraints: {
width: 640, width: 640,
height: 480, height: 480,
facingMode: "environment" facingMode: "environment" // Prefer back camera on mobile
}
}, },
}, locator: {
decoder: { patchSize: "medium",
readers: [ halfSample: true
"code_128_reader", },
"ean_reader", decoder: {
"code_39_reader", // Keep only the barcode types you actually use to improve performance
"upc_reader", readers: ["code_128_reader", "ean_reader", "code_39_reader"]
"codabar_reader", },
"i2of5_reader" locate: true
] }, function(err) {
} if (err) {
}, function(err) { // This will finally log the actual error (e.g., NotAllowedError) if permissions fail
if (err) { console.error("Quagga initialization failed:", err);
console.error('Scanner start failed:', err); setScanStatus('Kamera-Fehler: ' + (err.name || err), 'error');
if (readerWrap) readerWrap.style.display = 'none';
const detail = (err && (err.message || err.name)) ? ` (${err.message || err.name})` : '';
setScanStatus(`Scanner konnte nicht gestartet werden${detail}`, 'error');
return;
}
Quagga.start(); if (scannerWrap) scannerWrap.style.display = 'none';
scannerRunning = true; scannerRunning = false;
return;
}
if (!targetCallback && toggleBtn) { Quagga.start();
toggleBtn.textContent = 'Scanner stoppen'; scannerRunning = true;
} setScanStatus('Scanner bereit.', 'ok');
setScanStatus('Scanner aktiv. Jetzt Code scannen.', 'warn');
}); if (toggleBtn) {
toggleBtn.textContent = 'Scanner stoppen';
}
});
}, 50);
} }
function stopScanner() { async function stopScanner() {
if (!scannerRunning) return; if (!scannerRunning) return;
const readerWrap = document.getElementById('scanReaderWrap'); try {
const toggleBtn = document.getElementById('toggleScannerBtn'); Quagga.stop();
} catch (e) {
console.warn("Error stopping Quagga (it may not have been running):", e);
}
Quagga.stop();
scannerRunning = false; scannerRunning = false;
activeScannerCallback = null; activeScannerCallback = null;
if (readerWrap) readerWrap.style.display = 'none'; // Hide the container to free up UI space
if (toggleBtn) toggleBtn.textContent = 'Scanner starten'; const scannerWrap = document.querySelector('.library-scan-reader-wrap');
setScanStatus('Scanner gestoppt.', 'warn'); if (scannerWrap) {
scannerWrap.style.display = 'none';
}
const toggleBtn = document.getElementById('toggleScannerBtn');
if (toggleBtn) {
toggleBtn.textContent = 'Kamera Scanner'; // Reset button text
}
} }
async function isStudentCardBarcode(code) { async function isStudentCardBarcode(code) {