fix(checkin): improve camera functionality and fix iOS Live Mode issue

- Add playsinline prop to fix iOS Live Mode photo capture issue
- Change default camera to front camera (facingMode: 'user')
- Improve photo quality: change from PNG to JPEG with quality 0.8
- Fix memory leak: add URL.revokeObjectURL() cleanup
- Add error handling for camera operations (openCamera, capturePhoto, refreshPhoto)
- Add timestamp to photo filename for uniqueness

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
Warunee Tamkoo 2026-05-07 16:47:35 +07:00
parent 9efac056e9
commit cd433af194
2 changed files with 114 additions and 56 deletions

View file

@ -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<boolean>(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(
</div>
<div class="col-12 row items-center">
<!-- แสดงกลองตอนกดถายภาพ -->
<Camera
:resolution="{ width: photoWidth, height: photoHeight }"
ref="camera"
:autoplay="false"
:playsinline="true"
:facingMode="'user'"
:style="!img ? 'display: block' : 'display: none'"
/>
<!-- แสดงรปเมอกด capture -->
@ -998,7 +1030,6 @@ watch(
</div>
<div class="col-12 row items-center">
<!-- แสดงกลองตอนกดถายภาพ -->
<Camera
:resolution="{
width: photoWidth,
@ -1008,7 +1039,6 @@ watch(
:autoplay="false"
:playsinline="true"
:facingMode="'user'"
:style="!img ? 'display: block' : 'display: none'"
/>
<!-- แสดงรปเมอกด capture -->

View file

@ -133,14 +133,19 @@ const photoHeight = ref<number>(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'"
/>
<!-- แสดงรปเมอกด capture -->