democarta

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Coffee Loyalty Card</title>
    <link href="https://fonts.googleapis.com/css2?family=Poppins:wght@400;600&display=swap" rel="stylesheet">
    <style>
        body {
            font-family: 'Poppins', sans-serif;
            background-color: #f4f4f4;
            display: flex;
            flex-direction: column;
            justify-content: space-between;
            align-items: center;
            height: 100vh;
            margin: 0;
        }
        .card-container,
        .controls-card {
            text-align: center;
            width: 90%;
            max-width: 700px;
            background-color: #faf4e8;
            border-radius: 15px;
            box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1);
            padding: 40px 50px;
            box-sizing: border-box;
            margin-bottom: 20px;
        }
        .card-header {
            font-size: 30px;
            font-weight: 600;
            color: #6a1b9a;
            margin-bottom: 10px;
        }
        .card-subheader {
            font-size: 18px;
            color: #6a1b9a;
            margin-bottom: 20px;
        }
        .stamp-container {
            display: grid;
            grid-template-columns: repeat(5, 1fr);
            gap: 10px;
            justify-content: center;
            align-items: center;
        }
        .stamp {
            width: 60px;
            height: 60px;
            border: 2px solid #ddd;
            border-radius: 50%;
            display: flex;
            justify-content: center;
            align-items: center;
            cursor: pointer;
            background: rgba(255, 255, 255, 0.8);
            font-size: 24px;
            color: #6a1b9a;
        }
        .stamped {
            color: #6a1b9a;
        }
        .controls {
            text-align: center;
            margin-top: 20px;
        }
        .controls button {
            padding: 10px 20px;
            border: none;
            border-radius: 5px;
            cursor: pointer;
            transition: background-color 0.3s ease;
            margin: 0 10px;
        }
        /* dimensioni pulsante "fai approvare" */
        .controls button#approveButton {
            background-color: #6a1b9a;
            color: white;
            font-size: 24px; /* Aumenta la dimensione del testo */
            padding: 15px 30px; /* Aumenta le dimensioni del pulsante */
        }
        /* fine dimensioni pulsante "fai approvare" */
        .controls button#approveButton:hover {
            background-color: #5e1788;
        }
        .controls button#closeButton {
            background-color: #808080;
            color: white;
        }
        .controls button#closeButton:hover {
            background-color: #606060;
        }
        .company-info {
            margin-top: 20px;
            font-size: 14px;
            color: #6a1b9a;
            display: flex;
            justify-content: center;
            gap: 20px;
        }
        .company-info a {
            color: #6a1b9a;
            text-decoration: none;
        }
        .company-info a:hover {
            text-decoration: underline;
        }
        .banana {
            width: 600px;
            height: 60px;
            border-radius: 10px;
            background-color: #b2e596;
            margin: 30px auto 0 auto;
        }
        #qr-reader {
            width: 300px;
            margin: auto;
        }
        #qr-instructions {
            font-size: 30px;
            color: #6a1b9a;
            margin-bottom: 20px;
        }
        /* spazi attorno alla camera */
        #qr-reader {
            margin-bottom: 20px;
        }
        #closeButton {
            margin-top: 20px;
        }
        /* fine spazi attorno alla camera */
        /* informazioni Bottone sotto */
        .controls-card {
            width: 90%; /* Modifica questa larghezza per cambiare la dimensione del container del bottone "Fai approvare" */
            max-width: 700px; /* Puoi anche modificare questa larghezza massima */
        }
        /* fine informazioni Bottone sotto */
    </style>
</head>
<body>

<div class="card-container" id="coffeeCardContainer">
    <div class="card" id="coffeeCard">
        <div class="card-header">Centro Food Garden</div>
        <div class="card-subheader">Gusta 10 caffè, il prossimo è in omaggio!</div>
        <div class="stamp-container">
            <div class="stamp" onclick="toggleStamp(this)">C'</div>
            <div class="stamp" onclick="toggleStamp(this)">C'</div>
            <div class="stamp" onclick="toggleStamp(this)">C'</div>
            <div class="stamp" onclick="toggleStamp(this)">C'</div>
            <div class="stamp" onclick="toggleStamp(this)">C'</div>
            <div class="stamp" onclick="toggleStamp(this)">C'</div>
            <div class="stamp" onclick="toggleStamp(this)">C'</div>
            <div class="stamp" onclick="toggleStamp(this)">C'</div>
            <div class="stamp" onclick="toggleStamp(this)">C'</div>
            <div class="stamp" onclick="toggleStamp(this)">C'</div>
        </div>
        <div class="company-info">
            <a href="https://www.google.com/maps?q=Via+dell'Arcivescovado+2,+10023+TO" target="_blank">Via dell'Arcivescovado 2 - 10023 TO</a>
            <a href="https://www.instagram.com/centro_food_garden/" target="_blank">Seguici su Instagram</a>
        </div>
        <div class="banana"></div>
    </div>
</div>

<div class="controls-card">
    <div class="controls">
        <div id="qr-instructions" style="display: none;">Scansiona il QR-Code per la verifica</div>
        <video id="qr-reader" style="display: none;"></video>
        <canvas id="qr-canvas" style="display: none;"></canvas>
        <button id="approveButton">Fai approvare</button>
        <button id="closeButton" style="display: none;">Chiudi camera</button>
    </div>
</div>

<script>
    const correctQRCode = 'c3ntrOC@ffèc@@ard2024!';
    let scannerActive = false;

    document.getElementById('approveButton').addEventListener('click', () => {
        document.getElementById('coffeeCardContainer').style.display = 'none';
        document.getElementById('qr-instructions').style.display = 'block';
        const video = document.getElementById('qr-reader');
        const canvas = document.getElementById('qr-canvas');
        const context = canvas.getContext('2d');
        const constraints = { video: { facingMode: "environment" } };

        navigator.mediaDevices.getUserMedia(constraints).then(function(stream) {
            video.srcObject = stream;
            video.setAttribute("playsinline", true); // required to tell iOS safari we don't want fullscreen
            video.style.display = 'block';
            canvas.style.display = 'none';
            document.getElementById('closeButton').style.display = 'inline-block';
            video.play();
            scannerActive = true;
            requestAnimationFrame(tick);
        });

        function tick() {
            if (video.readyState === video.HAVE_ENOUGH_DATA) {
                canvas.height = video.videoHeight;
                canvas.width = video.videoWidth;
                context.drawImage(video, 0, 0, canvas.width, canvas.height);
                const imageData = context.getImageData(0, 0, canvas.width, canvas.height);
                const code = jsQR(imageData.data, imageData.width, imageData.height, {
                    inversionAttempts: "dontInvert",
                });
                if (code) {
                    if (code.data === correctQRCode) {
                        video.srcObject.getTracks().forEach(track => track.stop());
                        video.style.display = 'none';
                        document.getElementById('closeButton').style.display = 'none';
                        saveStamps();
                        alert('QR code approved and stamps saved successfully!');
                        scannerActive = false;
                    } else {
                        alert('Invalid QR code. Please try again.');
                    }
                }
            }
            if (scannerActive) {
                requestAnimationFrame(tick);
            }
        }
    });

    document.getElementById('closeButton').addEventListener('click', () => {
        const video = document.getElementById('qr-reader');
        video.srcObject.getTracks().forEach(track => track.stop());
        video.style.display = 'none';
        document.getElementById('closeButton').style.display = 'none';
        document.getElementById('qr-instructions').style.display = 'none';
        document.getElementById('coffeeCardContainer').style.display = 'block';
        scannerActive = false;
    });

    // Function to toggle stamp state
    function toggleStamp(element) {
        element.classList.toggle('stamped');
        element.style.color = element.classList.contains('stamped') ? '#6a1b9a' : 'transparent';
    }

    function saveStamps() {
        const stamps = document.querySelectorAll('.stamp');
        const stampsState = [];
        stamps.forEach(stamp => {
            stampsState.push(stamp.classList.contains('stamped'));
        });
        localStorage.setItem('stampsState', JSON.stringify(stampsState));
        checkComplete();
    }

    // Load stamps on page load
    function loadStamps() {
        const stampsState = JSON.parse(localStorage.getItem('stampsState')) || [];
        const stamps = document.querySelectorAll('.stamp');
        stamps.forEach((stamp, index) => {
            if (stampsState[index]) {
                stamp.classList.add('stamped');
                stamp.style.color = '#6a1b9a';
            } else {
                stamp.classList.remove('stamped');
                stamp.style.color = 'transparent';
            }
        });
    }

    // Show alert if complete
    function checkComplete() {
        const stamps = document.querySelectorAll('.stamp');
        let count = 0;
        stamps.forEach(stamp => {
            if (stamp.classList.contains('stamped')) {
                count++;
            }
        });
        if (count === 10) {
            alert('Congratulazioni! Hai guadagnato un caffè omaggio! Il bar C\'entro Food Garden ti aspetta per ritirare il tuo caffè.');
        }
    }

    loadStamps();
</script>

</body>
</html>