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