@ -274,87 +274,29 @@ export default class QRScannerDialog extends Vue {
}
async onInit ( promise : Promise < void > , attempt = 1 ) : Promise < void > {
if ( this . isNativePlatform ) {
logger . log ( "Skipping web scanner initialization on native platform" ) ;
return ;
}
if ( this . isNativePlatform ) return ;
this . isInitializing = true ;
this . error = null ;
this . initializationStatus = "Checking camera access..." ;
try {
/ / F i r s t c h e c k i f m e d i a D e v i c e s A P I i s a v a i l a b l e
if ( ! navigator . mediaDevices ) {
throw new Error (
"Camera API not available. Please ensure you're using HTTPS." ,
) ;
}
logger . log ( "Starting QR scanner initialization..." , {
mediaDevices : ! ! navigator . mediaDevices ,
getUserMedia : ! ! (
navigator . mediaDevices && navigator . mediaDevices . getUserMedia
) ,
constraints : {
video : true ,
facingMode : this . preferredCamera ,
} ,
} ) ;
/ / E x p l i c i t l y r e q u e s t c a m e r a p e r m i s s i o n f i r s t
this . initializationStatus = "Requesting camera permission..." ;
try {
const stream = await navigator . mediaDevices . getUserMedia ( {
video : {
facingMode : this . preferredCamera ,
} ,
} ) ;
/ / S t o p t h e t e s t s t r e a m i m m e d i a t e l y
stream . getTracks ( ) . forEach ( ( track ) => track . stop ( ) ) ;
this . initializationStatus = "Camera permission granted..." ;
logger . log ( "Camera permission granted" ) ;
} catch ( permissionError ) {
const error = permissionError as Error ;
logger . error ( "Camera permission error:" , {
name : error . name ,
message : error . message ,
} ) ;
if (
error . name === "NotAllowedError" ||
error . name === "PermissionDeniedError"
) {
throw new Error (
"Camera access denied. Please grant camera permission and try again." ,
) ;
} else if (
error . name === "NotFoundError" ||
error . name === "DevicesNotFoundError"
) {
throw new Error (
"No camera found. Please ensure your device has a camera." ,
) ;
} else if (
error . name === "NotReadableError" ||
error . name === "TrackStartError"
) {
throw new Error ( "Camera is in use by another application." ) ;
} else {
throw new Error ( ` Camera error: ${ error . message } ` ) ;
}
}
let timeoutHit = false ;
const timeout = setTimeout ( ( ) => {
timeoutHit = true ;
this . isInitializing = false ;
this . cameraStatus = "Ready (timeout fallback)" ;
this . initializationStatus = "Camera ready (fallback)" ;
/ / O p t i o n a l l y l o g a w a r n i n g o r s h o w a s u b t l e m e s s a g e
} , 4000 ) ; / / 4 s e c o n d s
/ / N o w i n i t i a l i z e t h e Q R s c a n n e r
this . initializationStatus = "Starting QR scanner..." ;
logger . log ( "Initializing QR scanner..." ) ;
try {
await promise ;
this . isInitializing = false ;
this . cameraStatus = "Ready" ;
logger . log ( "QR scanner initialized successfully" ) ;
if ( ! timeoutHit ) {
clearTimeout ( timeout ) ;
this . isInitializing = false ;
this . cameraStatus = "Ready" ;
}
} catch ( error ) {
clearTimeout ( timeout ) ;
if ( attempt < 3 ) {
/ / R e t r y a f t e r a s h o r t d e l a y
setTimeout ( ( ) => this . onInit ( promise , attempt + 1 ) , 1500 ) ;