1import { PermissionStatus, UnavailabilityError } from 'expo-modules-core'; 2function getUserMedia(constraints) { 3 if (navigator.mediaDevices && navigator.mediaDevices.getUserMedia) { 4 return navigator.mediaDevices.getUserMedia(constraints); 5 } 6 // Some browsers partially implement mediaDevices. We can't just assign an object 7 // with getUserMedia as it would overwrite existing properties. 8 // Here, we will just add the getUserMedia property if it's missing. 9 // First get ahold of the legacy getUserMedia, if present 10 const getUserMedia = navigator.getUserMedia || 11 navigator.webkitGetUserMedia || 12 navigator.mozGetUserMedia || 13 function () { 14 const error = new Error('Permission unimplemented'); 15 error.code = 0; 16 error.name = 'NotAllowedError'; 17 throw error; 18 }; 19 return new Promise((resolve, reject) => { 20 getUserMedia.call(navigator, constraints, resolve, reject); 21 }); 22} 23function handleGetUserMediaError({ message }) { 24 // name: NotAllowedError 25 // code: 0 26 if (message === 'Permission dismissed') { 27 return { 28 status: PermissionStatus.UNDETERMINED, 29 expires: 'never', 30 canAskAgain: true, 31 granted: false, 32 }; 33 } 34 else { 35 return { 36 status: PermissionStatus.DENIED, 37 expires: 'never', 38 canAskAgain: true, 39 granted: false, 40 }; 41 } 42} 43async function handleRequestPermissionsAsync() { 44 try { 45 await getUserMedia({ 46 video: true, 47 }); 48 return { 49 status: PermissionStatus.GRANTED, 50 expires: 'never', 51 canAskAgain: true, 52 granted: true, 53 }; 54 } 55 catch ({ message }) { 56 return handleGetUserMediaError({ message }); 57 } 58} 59async function handlePermissionsQueryAsync() { 60 if (!navigator?.permissions?.query) { 61 throw new UnavailabilityError('expo-barcode-scanner', 'navigator.permissions API is not available'); 62 } 63 const { state } = await navigator.permissions.query({ name: 'camera' }); 64 switch (state) { 65 case 'prompt': 66 return { 67 status: PermissionStatus.UNDETERMINED, 68 expires: 'never', 69 canAskAgain: true, 70 granted: false, 71 }; 72 case 'granted': 73 return { 74 status: PermissionStatus.GRANTED, 75 expires: 'never', 76 canAskAgain: true, 77 granted: true, 78 }; 79 case 'denied': 80 return { 81 status: PermissionStatus.DENIED, 82 expires: 'never', 83 canAskAgain: true, 84 granted: false, 85 }; 86 } 87} 88export default { 89 get name() { 90 return 'ExpoBarCodeScannerModule'; 91 }, 92 get BarCodeType() { 93 return { 94 code39mod43: 'code39mod43', 95 code138: 'code138', 96 interleaved2of5: 'interleaved2of5', 97 aztec: 'aztec', 98 ean13: 'ean13', 99 ean8: 'ean8', 100 qr: 'qr', 101 pdf417: 'pdf417', 102 upc_e: 'upc_e', 103 datamatrix: 'datamatrix', 104 code39: 'code39', 105 code93: 'code93', 106 itf14: 'itf14', 107 codabar: 'codabar', 108 code128: 'code128', 109 upc_a: 'upc_a', 110 }; 111 }, 112 get Type() { 113 return { front: 'front', back: 'back' }; 114 }, 115 async requestPermissionsAsync() { 116 return handleRequestPermissionsAsync(); 117 }, 118 async getPermissionsAsync() { 119 return handlePermissionsQueryAsync(); 120 }, 121}; 122//# sourceMappingURL=ExpoBarCodeScannerModule.web.js.map