diff --git a/resources/views/fields/camera-capture.blade.php b/resources/views/fields/camera-capture.blade.php index b8271d9..5207213 100644 --- a/resources/views/fields/camera-capture.blade.php +++ b/resources/views/fields/camera-capture.blade.php @@ -283,6 +283,7 @@ document.addEventListener('DOMContentLoaded', () => { Retake Switch Camera Verify + OK ✔ Upload Cropped @@ -322,55 +323,55 @@ function cameraCapture() { await this.initCamera(); }, - async capturePhoto() { - const video = this.$refs.video; - const canvas = this.$refs.canvas; - const context = canvas.getContext('2d'); + // async capturePhoto() { + // const video = this.$refs.video; + // const canvas = this.$refs.canvas; + // const context = canvas.getContext('2d'); - canvas.width = video.videoWidth; - canvas.height = video.videoHeight; - context.drawImage(video, 0, 0, canvas.width, canvas.height); + // canvas.width = video.videoWidth; + // canvas.height = video.videoHeight; + // context.drawImage(video, 0, 0, canvas.width, canvas.height); - // Show snapshot - const snapshot = this.$refs.snapshot; - snapshot.src = canvas.toDataURL('image/png'); - snapshot.classList.remove('hidden'); - video.classList.add('hidden'); + // // Show snapshot + // const snapshot = this.$refs.snapshot; + // snapshot.src = canvas.toDataURL('image/png'); + // snapshot.classList.remove('hidden'); + // video.classList.add('hidden'); - // Convert canvas to file - canvas.toBlob(async blob => { - const file = new File([blob], 'capture.png', { type: 'image/png' }); - console.log("File ready for upload:", file); + // // Convert canvas to file + // canvas.toBlob(async blob => { + // const file = new File([blob], 'capture.png', { type: 'image/png' }); + // console.log("File ready for upload:", file); - // Upload to temp folder - const formData = new FormData(); - formData.append('photo', file); + // // Upload to temp folder + // const formData = new FormData(); + // formData.append('photo', file); - const response = await fetch('/temp-upload', { - method: 'POST', - headers: { 'X-CSRF-TOKEN': '{{ csrf_token() }}' }, - body: formData - }); + // const response = await fetch('/temp-upload', { + // method: 'POST', + // headers: { 'X-CSRF-TOKEN': '{{ csrf_token() }}' }, + // body: formData + // }); - const data = await response.json(); - if (data.success) { - this.$refs.hiddenInput.value = data.path; // Filament form hidden input - console.log("Saved to temp:", data.path); - } else { - alert('Failed to save image.'); - } - }, 'image/png', 1.0); // 1.0 = highest quality + // const data = await response.json(); + // if (data.success) { + // this.$refs.hiddenInput.value = data.path; // Filament form hidden input + // console.log("Saved to temp:", data.path); + // } else { + // alert('Failed to save image.'); + // } + // }, 'image/png', 1.0); // 1.0 = highest quality - this.photoTaken = true; + // this.photoTaken = true; - // Create cropper on image - this.cropper = new Cropper(snapshot, { - aspectRatio: NaN, // User free crop area - viewMode: 1 - }); + // // Create cropper on image + // // this.cropper = new Cropper(snapshot, { + // // aspectRatio: NaN, // User free crop area + // // viewMode: 1 + // // }); - if (this.stream) this.stream.getTracks().forEach(track => track.stop()); - }, + // if (this.stream) this.stream.getTracks().forEach(track => track.stop()); + // }, // async verifyOCR(dataUrl) { @@ -396,6 +397,64 @@ function cameraCapture() { // await this.verifyOCR(dataUrl); // }, + + async capturePhoto() { + const video = this.$refs.video; + const canvas = this.$refs.canvas; + const ctx = canvas.getContext('2d'); + + canvas.width = video.videoWidth; + canvas.height = video.videoHeight; + ctx.drawImage(video, 0, 0); + + const snapshot = this.$refs.snapshot; + snapshot.src = canvas.toDataURL('image/png'); + snapshot.classList.remove('hidden'); + video.classList.add('hidden'); + + this.photoTaken = true; + this.stopCamera(); + + // ✅ Enable Cropper now + this.cropper = new Cropper(snapshot, { + aspectRatio: NaN, + viewMode: 1, + dragMode: 'crop' + }); + }, + + // + async uploadCroppedImage() { + + if (!this.cropper) { + alert("Crop the image before upload!"); + return; + } + + const croppedCanvas = this.cropper.getCroppedCanvas(); + + croppedCanvas.toBlob(async blob => { + + const formData = new FormData(); + formData.append('photo', blob, 'cropped.png'); + + const response = await fetch('/temp-upload', { + method: 'POST', + headers: { 'X-CSRF-TOKEN': '{{ csrf_token() }}' }, + body: formData + }); + + const data = await response.json(); + + if (data.success) { + this.$refs.hiddenInput.value = data.path; + alert("✅ Cropped image uploaded!"); + } else { + alert("Upload failed!"); + } + }, "image/png"); + }, + async verify() { const filePath = this.$refs.hiddenInput.value; // e.g., "temp/capture_1760764396.jpeg" @@ -441,6 +500,7 @@ function cameraCapture() { this.photoTaken = false; this.$refs.snapshot.classList.add('hidden'); this.$refs.video.classList.remove('hidden'); + this.cropper?.destroy(); await this.initCamera(); } }