feat: add qr scanner and reader
هذا الالتزام موجود في:
1
html5-qrcode.min.js
مباع
Normal file
1
html5-qrcode.min.js
مباع
Normal file
تم حذف اختلاف الملف لأن أحد الأسطر أو أكثر طويلة جداً
22
index.html
22
index.html
@@ -16,6 +16,7 @@
|
|||||||
<meta property="og:image" content="https://qr-generator.muathye.com/icon-512x512.png">
|
<meta property="og:image" content="https://qr-generator.muathye.com/icon-512x512.png">
|
||||||
<title>QR Code Generator - Free QR Code Generator Online</title>
|
<title>QR Code Generator - Free QR Code Generator Online</title>
|
||||||
<link href="tailwind.min.css" rel="stylesheet">
|
<link href="tailwind.min.css" rel="stylesheet">
|
||||||
|
<script src="html5-qrcode.min.js"></script>
|
||||||
<link rel="manifest" href="manifest.json">
|
<link rel="manifest" href="manifest.json">
|
||||||
<script type="application/ld+json">
|
<script type="application/ld+json">
|
||||||
{
|
{
|
||||||
@@ -43,22 +44,35 @@
|
|||||||
Powered by <a href="https://muathye.com" target="_blank"
|
Powered by <a href="https://muathye.com" target="_blank"
|
||||||
class="text-blue-500 hover:underline">muathye.com</a>
|
class="text-blue-500 hover:underline">muathye.com</a>
|
||||||
</p>
|
</p>
|
||||||
<textarea id="text-input" class="w-full p-2 mb-4 border border-gray-300 rounded focus:outline-none focus:ring-2 focus:ring-blue-500" placeholder="Enter text to generate QR code"></textarea>
|
<textarea id="text-input"
|
||||||
|
class="w-full p-2 mb-4 border border-gray-300 rounded focus:outline-none focus:ring-2 focus:ring-blue-500"
|
||||||
|
placeholder="Enter text to generate QR code"></textarea>
|
||||||
|
|
||||||
<!-- Color Pickers -->
|
<!-- Color Pickers -->
|
||||||
<div class="mb-4 flex items-center space-x-4">
|
<div class="mb-4 flex items-center space-x-4">
|
||||||
<div class="flex">
|
<div class="flex">
|
||||||
<label for="foreground-color" class="inilne mr-1 text-gray-700">Foreground Color:</label>
|
<label for="foreground-color" class="inilne mr-1 text-gray-700">Foreground Color:</label>
|
||||||
<input type="color" id="foreground-color" value="#000000" class="inline p-1 border border-gray-300 rounded">
|
<input type="color" id="foreground-color" value="#000000"
|
||||||
|
class="inline p-1 border border-gray-300 rounded">
|
||||||
</div>
|
</div>
|
||||||
<div class="flex">
|
<div class="flex">
|
||||||
<label for="background-color" class="inilne mr-1 text-gray-700">Background Color:</label>
|
<label for="background-color" class="inilne mr-1 text-gray-700">Background Color:</label>
|
||||||
<input type="color" id="background-color" value="#FFFFFF" class="inline p-1 border border-gray-300 rounded">
|
<input type="color" id="background-color" value="#FFFFFF"
|
||||||
|
class="inline p-1 border border-gray-300 rounded">
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<button id="generate-btn"
|
<button id="generate-btn"
|
||||||
class="text-gray-900 bg-gradient-to-r from-red-200 via-red-300 to-yellow-200 hover:bg-gradient-to-bl focus:ring-4 focus:outline-none focus:ring-red-100 dark:focus:ring-red-400 font-medium rounded-lg text-sm px-5 py-2.5 text-center me-2 mb-2 w-full mb-4">Generate
|
class="text-gray-900 bg-gradient-to-r from-red-200 via-red-300 to-yellow-200 hover:bg-gradient-to-bl focus:ring-4 focus:outline-none focus:ring-red-100 dark:focus:ring-red-400 font-medium rounded-lg text-sm px-5 py-2.5 text-center me-2 mb-2 w-full mb-4">Generate
|
||||||
QR Code</button>
|
QR Code</button>
|
||||||
|
<button id="scan-qr-btn"
|
||||||
|
class="text-white bg-blue-500 hover:bg-blue-700 font-medium rounded-lg text-sm px-5 py-2.5 text-center w-full mb-4">
|
||||||
|
Scan QR Code
|
||||||
|
</button>
|
||||||
|
<input type="file" id="qr-file" accept="image/*" class="w-full mb-4" value="Or upload QR to scan">
|
||||||
|
|
||||||
|
<div id="qr-reader" style="width: 100%; display: none;"></div>
|
||||||
|
<p id="qr-result" class="text-center text-sm text-gray-700 mt-2"></p>
|
||||||
|
|
||||||
<div id="qr-container" class="flex justify-center mb-4">
|
<div id="qr-container" class="flex justify-center mb-4">
|
||||||
<canvas id="qr-code" class="mt-4"></canvas>
|
<canvas id="qr-code" class="mt-4"></canvas>
|
||||||
</div>
|
</div>
|
||||||
@@ -96,7 +110,7 @@
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
</body>
|
</body>
|
||||||
|
|
||||||
</html>
|
</html>
|
||||||
70
script.js
70
script.js
@@ -70,3 +70,73 @@ document.getElementById('download-png').addEventListener('click', () => {
|
|||||||
URL.revokeObjectURL(url);
|
URL.revokeObjectURL(url);
|
||||||
}, 'image/png');
|
}, 'image/png');
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// scan qr
|
||||||
|
document.addEventListener("DOMContentLoaded", function () {
|
||||||
|
const scanBtn = document.getElementById("scan-qr-btn");
|
||||||
|
const qrReader = document.getElementById("qr-reader");
|
||||||
|
const resultDisplay = document.getElementById("qr-result");
|
||||||
|
|
||||||
|
let scannerActive = false;
|
||||||
|
|
||||||
|
scanBtn.addEventListener("click", function () {
|
||||||
|
if (!scannerActive) {
|
||||||
|
qrReader.style.display = "block"; // Show QR Scanner
|
||||||
|
startScanner();
|
||||||
|
scanBtn.textContent = "Stop Scanner";
|
||||||
|
} else {
|
||||||
|
stopScanner();
|
||||||
|
scanBtn.textContent = "Scan QR Code";
|
||||||
|
}
|
||||||
|
scannerActive = !scannerActive;
|
||||||
|
});
|
||||||
|
|
||||||
|
function startScanner() {
|
||||||
|
const html5QrCode = new Html5Qrcode("qr-reader");
|
||||||
|
|
||||||
|
html5QrCode.start(
|
||||||
|
{ facingMode: "environment" }, // Use back camera
|
||||||
|
{
|
||||||
|
fps: 10, // Frames per second
|
||||||
|
qrbox: 250, // Scanner size
|
||||||
|
},
|
||||||
|
(decodedText) => {
|
||||||
|
resultDisplay.innerHTML = `<strong>Scanned Result:</strong> ${decodedText}`;
|
||||||
|
html5QrCode.stop(); // Stop scanning
|
||||||
|
scannerActive = false;
|
||||||
|
scanBtn.textContent = "Scan QR Code";
|
||||||
|
qrReader.style.display = "none";
|
||||||
|
},
|
||||||
|
(errorMessage) => {
|
||||||
|
console.warn(errorMessage); // Log errors if needed
|
||||||
|
}
|
||||||
|
).catch((err) => {
|
||||||
|
console.error("Error starting scanner:", err);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function stopScanner() {
|
||||||
|
Html5Qrcode.getCameras().then((cameras) => {
|
||||||
|
if (cameras.length > 0) {
|
||||||
|
const html5QrCode = new Html5Qrcode("qr-reader");
|
||||||
|
html5QrCode.stop();
|
||||||
|
qrReader.style.display = "none";
|
||||||
|
}
|
||||||
|
}).catch((err) => {
|
||||||
|
console.error("Error stopping scanner:", err);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// upload qr to scan it
|
||||||
|
document.getElementById("qr-file").addEventListener("change", function (event) {
|
||||||
|
const file = event.target.files[0];
|
||||||
|
if (!file) return;
|
||||||
|
|
||||||
|
const html5QrCode = new Html5Qrcode("qr-reader");
|
||||||
|
html5QrCode.scanFile(file, true)
|
||||||
|
.then(decodedText => {
|
||||||
|
document.getElementById("qr-result").innerHTML = `<strong>Scanned Result:</strong> ${decodedText}`;
|
||||||
|
})
|
||||||
|
.catch(err => console.error("QR Code not found", err));
|
||||||
|
});
|
||||||
|
|||||||
المرجع في مشكلة جديدة
حظر مستخدم