const btnScanQR = document.getElementById('btn-scan-qr'); const qrCanvas = document.getElementById('qr-canvas'); // Canvas for QR code processing const qrResult = document.getElementById('qr-result'); const outputData = document.getElementById('outputData'); const video = document.getElementById('video'); // Video element for camera feed const scanAgainButton = document.createElement('button'); // Button to scan another ticket scanAgainButton.textContent = 'Scan Nog Een Ticket'; scanAgainButton.className = 'btn btn-primary mt-3'; scanAgainButton.style.display = 'none'; // Initially hidden scanAgainButton.addEventListener('click', () => { location.reload(); // Reload the page to reset the scanner }); document.body.appendChild(scanAgainButton); // Add the button to the page btnScanQR.addEventListener('click', () => { btnScanQR.hidden = true; // Hide the QR code icon video.style.display = 'block'; // Show the video element qrCanvas.hidden = true; // Ensure canvas remains hidden qrResult.hidden = true; const context = qrCanvas.getContext('2d'); navigator.mediaDevices.getUserMedia({ video: { facingMode: 'environment' } }) .then((stream) => { video.srcObject = stream; video.setAttribute('playsinline', true); // Required to work on iOS video.play(); const scan = () => { if (video.readyState === video.HAVE_ENOUGH_DATA) { qrCanvas.height = video.videoHeight; qrCanvas.width = video.videoWidth; context.drawImage(video, 0, 0, qrCanvas.width, qrCanvas.height); try { const qrCodeData = qrcode.decode(); fetch(`../php/get_ticket_details.php?ticket_id=${encodeURIComponent(qrCodeData)}`) .then(response => response.json()) .then(data => { if (data.success) { document.body.style.backgroundColor = 'green'; // Change background to green outputData.innerHTML = `
Ticket ID: ${data.ticket_id}
Dag: ${data.day === 'friday' ? 'Vrijdag' : 'Zaterdag'}
Categorie: ${data.category === 'volwassen' ? 'Volwassene' : 'Kind'}
Ticket succesvol gescand en opgeslagen!
`; } else { document.body.style.backgroundColor = 'red'; // Change background to red outputData.innerHTML = `${data.message}
`; } setTimeout(() => { document.body.style.backgroundColor = ''; // Reset background color }, 2000); // Reset after 2 seconds qrResult.hidden = false; qrCanvas.hidden = true; // Ensure canvas remains hidden video.hidden = true; // Hide the video element after scanning scanAgainButton.style.display = 'block'; // Show the "Scan Again" button stream.getTracks().forEach(track => track.stop()); }) .catch(err => { console.error('Error fetching ticket details:', err); document.body.style.backgroundColor = 'red'; outputData.innerHTML = `Fout bij het ophalen van ticketgegevens.
`; setTimeout(() => { document.body.style.backgroundColor = ''; // Reset background color }, 2000); // Reset after 2 seconds qrResult.hidden = false; qrCanvas.hidden = true; // Ensure canvas remains hidden video.hidden = true; scanAgainButton.style.display = 'block'; // Show the "Scan Again" button stream.getTracks().forEach(track => track.stop()); }); } catch (e) { requestAnimationFrame(scan); } } else { requestAnimationFrame(scan); } }; scan(); }) .catch((err) => { console.error('Error accessing camera:', err); }); });