|
const video = document.getElementById('camera-feed'); |
|
const canvas = document.getElementById('captured-image'); |
|
const captureBtn = document.getElementById('capture-btn'); |
|
const form = document.getElementById('upload-form'); |
|
const scanEffect = document.getElementById('scan-effect'); |
|
const statusDiv = document.getElementById('status'); |
|
|
|
|
|
async function startCamera() { |
|
const constraints = { |
|
video: { |
|
width: { ideal: 640 }, |
|
height: { ideal: 480 }, |
|
facingMode: "user" |
|
} |
|
}; |
|
|
|
try { |
|
const stream = await navigator.mediaDevices.getUserMedia(constraints); |
|
video.srcObject = stream; |
|
} catch (err) { |
|
console.error("Error accessing camera:", err); |
|
statusDiv.textContent = "Camera access denied. Please check permissions."; |
|
} |
|
} |
|
|
|
startCamera(); |
|
|
|
|
|
captureBtn.addEventListener('click', () => { |
|
statusDiv.innerHTML = '<i class="fas fa-spinner fa-spin"></i> Processing...'; |
|
captureBtn.disabled = true; |
|
|
|
|
|
gsap.to(scanEffect, { |
|
duration: 1, |
|
top: "100%", |
|
opacity: 1, |
|
ease: "power1.inOut", |
|
onComplete: processImage |
|
}); |
|
}); |
|
|
|
function processImage() { |
|
canvas.width = video.videoWidth; |
|
canvas.height = video.videoHeight; |
|
canvas.getContext('2d').drawImage(video, 0, 0, canvas.width, canvas.height); |
|
|
|
|
|
canvas.toBlob((blob) => { |
|
const formData = new FormData(); |
|
formData.append('image', blob, 'captured_image.jpg'); |
|
|
|
fetch('/get_image', { |
|
method: 'POST', |
|
body: formData |
|
}).then(response => response.json()) |
|
.then(data => { |
|
console.log('Image saved:', data.filename); |
|
|
|
}).catch(error => { |
|
console.error('Error saving image:', error); |
|
statusDiv.innerHTML = '<i class="fas fa-exclamation-circle text-red-500"></i> Error saving image'; |
|
}); |
|
}, 'image/jpeg'); |
|
|
|
|
|
setTimeout(() => { |
|
statusDiv.innerHTML = '<i class="fas fa-check-circle text-green-500"></i> Welcome, User!'; |
|
captureBtn.disabled = false; |
|
}, 2000); |
|
|
|
|
|
gsap.set(scanEffect, { top: "-100%", opacity: 0 }); |
|
} |
|
|
|
|
|
gsap.to(captureBtn, { duration: 1, scale: 1.05, repeat: -1, yoyo: true, ease: "power1.inOut" }); |
|
|
|
|
|
form.addEventListener('submit', async (e) => { |
|
e.preventDefault(); |
|
|
|
const formData = new FormData(form); |
|
const userIdInput = document.getElementById('user-id'); |
|
const videoInput = document.getElementById('video-upload'); |
|
|
|
if (!userIdInput || !videoInput || !videoInput.files[0]) { |
|
statusDiv.innerHTML = '<i class="fas fa-exclamation-circle text-red-500"></i> Please provide both user ID and video'; |
|
return; |
|
} |
|
|
|
formData.append('user_id', userIdInput.value); |
|
formData.append('video', videoInput.files[0]); |
|
|
|
|
|
for (let [key, value] of formData.entries()) { |
|
console.log(key, value); |
|
} |
|
|
|
statusDiv.innerHTML = '<i class="fas fa-spinner fa-spin"></i> Uploading...'; |
|
|
|
try { |
|
const response = await fetch('/submitAccount', { |
|
method: 'POST', |
|
body: formData |
|
}); |
|
|
|
console.log('Response status:', response.status); |
|
console.log('Response headers:', response.headers); |
|
|
|
if (!response.ok) { |
|
const errorText = await response.text(); |
|
throw new Error(`Server response was not ok: ${response.status} ${response.statusText}\n${errorText}`); |
|
} |
|
|
|
const result = await response.json(); |
|
statusDiv.innerHTML = `<i class="fas fa-check-circle text-green-500"></i> ${result.message}`; |
|
} catch (error) { |
|
console.error('Error:', error); |
|
statusDiv.innerHTML = '<i class="fas fa-exclamation-circle text-red-500"></i> Error submitting form'; |
|
} |
|
}); |