diff --git a/src/views/HomeView.vue b/src/views/HomeView.vue index 8067899..dc4e8da 100644 --- a/src/views/HomeView.vue +++ b/src/views/HomeView.vue @@ -347,18 +347,23 @@ async function openCamera() { } if (!isPermissionCameraDenied.value) { - // change camera device - if (cameraIsOn.value) { - camera.value?.stop() - } else { - await camera.value?.start() - const devices: any = await camera.value?.devices(['videoinput']) - if (devices) { - availableCameras.value = devices - await changeCamera() + try { + // change camera device + if (cameraIsOn.value) { + camera.value?.stop() + } else { + await camera.value?.start() + const devices: any = await camera.value?.devices(['videoinput']) + if (devices) { + availableCameras.value = devices + await changeCamera() + } } + cameraIsOn.value = !cameraIsOn.value + } catch (error) { + console.error('Error opening camera:', error) + messageError($q, error, 'ไม่สามารถเปิดกล้องได้ กรุณาลองใหม่อีกครั้ง') } - cameraIsOn.value = !cameraIsOn.value } else { messageError( $q, @@ -428,26 +433,49 @@ async function switchCamera() { /** function ถ่ายรูป*/ async function capturePhoto() { - const imageBlob: any = await camera.value?.snapshot( - { width: photoWidth.value, height: photoHeight.value }, - 'image/png', - 0.5 - ) - if (!imageBlob) return - const fileName = 'photo.jpg' - //ไฟล์รูป - const file = new File([imageBlob], fileName, { type: 'image/png' }) - fileImg.value = file - //แสดงรูป - camera.value?.stop() - const url = URL.createObjectURL(imageBlob) - img.value = url + try { + const imageBlob: any = await camera.value?.snapshot( + { width: photoWidth.value, height: photoHeight.value }, + 'image/jpeg', + 0.8 + ) + if (!imageBlob) { + messageError($q, '', 'ไม่สามารถถ่ายรูปได้ กรุณาลองใหม่อีกครั้ง') + return + } + const fileName = `photo_${Date.now()}.jpg` + //ไฟล์รูป + const file = new File([imageBlob], fileName, { type: 'image/jpeg' }) + fileImg.value = file + + // ยกเลิก URL เก่าก่อนสร้างใหม่ (ป้องกัน memory leak) + if (img.value) { + URL.revokeObjectURL(img.value) + } + + //แสดงรูป + camera.value?.stop() + const url = URL.createObjectURL(imageBlob) + img.value = url + } catch (error) { + console.error('Error capturing photo:', error) + messageError($q, error, 'ไม่สามารถถ่ายรูปได้ กรุณาลองใหม่อีกครั้ง') + } } /** function เปลี่ยนรูปภาพ*/ -function refreshPhoto() { - img.value = undefined - camera.value?.start() +async function refreshPhoto() { + try { + // ยกเลิก URL เก่า (ป้องกัน memory leak) + if (img.value) { + URL.revokeObjectURL(img.value) + img.value = undefined + } + await camera.value?.start() + } catch (error) { + console.error('Error refreshing photo:', error) + messageError($q, error, 'ไม่สามารถเปิดกล้องได้ กรุณาลองใหม่อีกครั้ง') + } } /** ref validate*/ @@ -627,7 +655,11 @@ async function onClickConfirm() { try { showLoader() cameraIsOn.value = false - img.value = undefined + // ยกเลิก URL เก่า (ป้องกัน memory leak) + if (img.value) { + URL.revokeObjectURL(img.value) + img.value = undefined + } modalTime.value = false if (!statusCheckin.value) { statusCheckin.value = true @@ -665,7 +697,9 @@ const inQueue = ref(false) // ฟังก์ชันสำหรับรีเซ็ตรูปและหยุดกล้อง function resetCameraAndImage() { + // ยกเลิก URL เก่า (ป้องกัน memory leak) if (img.value) { + URL.revokeObjectURL(img.value) img.value = undefined } if (cameraIsOn.value && camera.value) { @@ -885,14 +919,12 @@ watch(
- @@ -998,7 +1030,6 @@ watch(
- diff --git a/src/views/MapView.vue b/src/views/MapView.vue index 1b4c40f..5f7edc9 100644 --- a/src/views/MapView.vue +++ b/src/views/MapView.vue @@ -133,14 +133,19 @@ const photoHeight = ref(350) /** function เปิดกล้อง */ async function openCamera() { - // change camera device - if (cameraIsOn.value) { - camera.value?.stop() - } else { - await camera.value?.start() - changeCamera() + try { + // change camera device + if (cameraIsOn.value) { + camera.value?.stop() + } else { + await camera.value?.start() + changeCamera() + } + cameraIsOn.value = !cameraIsOn.value + } catch (error) { + console.error('Error opening camera:', error) + messageError($q, error, 'ไม่สามารถเปิดกล้องได้ กรุณาลองใหม่อีกครั้ง') } - cameraIsOn.value = !cameraIsOn.value } /** change camera device */ @@ -152,25 +157,49 @@ async function changeCamera() { /** function ถ่ายรูป*/ async function capturePhoto() { - const imageBlob: any = await camera.value?.snapshot( - { width: photoWidth.value, height: photoHeight.value }, - 'image/png', - 0.5 - ) - const fileName = 'photo.png' - //ไฟล์รูป - const file = new File([imageBlob], fileName, { type: 'image/png' }) - fileImg.value = file - //แสดงรูป - camera.value?.stop() - const url = URL.createObjectURL(imageBlob) - img.value = url + try { + const imageBlob: any = await camera.value?.snapshot( + { width: photoWidth.value, height: photoHeight.value }, + 'image/jpeg', + 0.8 + ) + if (!imageBlob) { + messageError($q, '', 'ไม่สามารถถ่ายรูปได้ กรุณาลองใหม่อีกครั้ง') + return + } + const fileName = `photo_${Date.now()}.jpg` + //ไฟล์รูป + const file = new File([imageBlob], fileName, { type: 'image/jpeg' }) + fileImg.value = file + + // ยกเลิก URL เก่าก่อนสร้างใหม่ (ป้องกัน memory leak) + if (img.value) { + URL.revokeObjectURL(img.value) + } + + //แสดงรูป + camera.value?.stop() + const url = URL.createObjectURL(imageBlob) + img.value = url + } catch (error) { + console.error('Error capturing photo:', error) + messageError($q, error, 'ไม่สามารถถ่ายรูปได้ กรุณาลองใหม่อีกครั้ง') + } } /** function เปลี่ยนรูปภาพ*/ -function refreshPhoto() { - img.value = undefined - camera.value?.start() +async function refreshPhoto() { + try { + // ยกเลิก URL เก่า (ป้องกัน memory leak) + if (img.value) { + URL.revokeObjectURL(img.value) + img.value = undefined + } + await camera.value?.start() + } catch (error) { + console.error('Error refreshing photo:', error) + messageError($q, error, 'ไม่สามารถเปิดกล้องได้ กรุณาลองใหม่อีกครั้ง') + } } /** ref validate*/ @@ -337,7 +366,6 @@ onMounted(async () => { :autoplay="false" :playsinline="true" :facingMode="'user'" - :style="!img ? 'display: block' : 'display: none'" />