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 = 11 // TODO: this method is deprecated, migrate to https://developer.mozilla.org/en-US/docs/Web/API/MediaDevices/getUserMedia 12 navigator.getUserMedia || 13 navigator.webkitGetUserMedia || 14 navigator.mozGetUserMedia || 15 function () { 16 const error = new Error('Permission unimplemented'); 17 error.code = 0; 18 error.name = 'NotAllowedError'; 19 throw error; 20 }; 21 return new Promise((resolve, reject) => { 22 getUserMedia.call(navigator, constraints, resolve, reject); 23 }); 24} 25function handleGetUserMediaError({ message }) { 26 // name: NotAllowedError 27 // code: 0 28 if (message === 'Permission dismissed') { 29 return { 30 status: PermissionStatus.UNDETERMINED, 31 expires: 'never', 32 canAskAgain: true, 33 granted: false, 34 }; 35 } 36 else { 37 return { 38 status: PermissionStatus.DENIED, 39 expires: 'never', 40 canAskAgain: true, 41 granted: false, 42 }; 43 } 44} 45async function handleRequestPermissionsAsync() { 46 try { 47 await getUserMedia({ 48 video: true, 49 }); 50 return { 51 status: PermissionStatus.GRANTED, 52 expires: 'never', 53 canAskAgain: true, 54 granted: true, 55 }; 56 } 57 catch ({ message }) { 58 return handleGetUserMediaError({ message }); 59 } 60} 61async function handlePermissionsQueryAsync() { 62 if (!navigator?.permissions?.query) { 63 throw new UnavailabilityError('expo-barcode-scanner', 'navigator.permissions API is not available'); 64 } 65 const { state } = await navigator.permissions.query({ name: 'camera' }); 66 switch (state) { 67 case 'prompt': 68 return { 69 status: PermissionStatus.UNDETERMINED, 70 expires: 'never', 71 canAskAgain: true, 72 granted: false, 73 }; 74 case 'granted': 75 return { 76 status: PermissionStatus.GRANTED, 77 expires: 'never', 78 canAskAgain: true, 79 granted: true, 80 }; 81 case 'denied': 82 return { 83 status: PermissionStatus.DENIED, 84 expires: 'never', 85 canAskAgain: true, 86 granted: false, 87 }; 88 } 89} 90export default { 91 get name() { 92 return 'ExpoBarCodeScannerModule'; 93 }, 94 get BarCodeType() { 95 return { 96 code39mod43: 'code39mod43', 97 code138: 'code138', 98 interleaved2of5: 'interleaved2of5', 99 aztec: 'aztec', 100 ean13: 'ean13', 101 ean8: 'ean8', 102 qr: 'qr', 103 pdf417: 'pdf417', 104 upc_e: 'upc_e', 105 datamatrix: 'datamatrix', 106 code39: 'code39', 107 code93: 'code93', 108 itf14: 'itf14', 109 codabar: 'codabar', 110 code128: 'code128', 111 upc_a: 'upc_a', 112 }; 113 }, 114 get Type() { 115 return { front: 'front', back: 'back' }; 116 }, 117 async requestPermissionsAsync() { 118 return handleRequestPermissionsAsync(); 119 }, 120 async getPermissionsAsync() { 121 return handlePermissionsQueryAsync(); 122 }, 123}; 124//# sourceMappingURL=ExpoBarCodeScannerModule.web.js.map