187d87595STomasz Sapetaimport { PermissionStatus, UnavailabilityError } from 'expo-modules-core'; 2ac43a3f3SŁukasz Kosmatyfunction getUserMedia(constraints) { 3ac43a3f3SŁukasz Kosmaty if (navigator.mediaDevices && navigator.mediaDevices.getUserMedia) { 4ac43a3f3SŁukasz Kosmaty return navigator.mediaDevices.getUserMedia(constraints); 5ac43a3f3SŁukasz Kosmaty } 6ac43a3f3SŁukasz Kosmaty // Some browsers partially implement mediaDevices. We can't just assign an object 7ac43a3f3SŁukasz Kosmaty // with getUserMedia as it would overwrite existing properties. 8ac43a3f3SŁukasz Kosmaty // Here, we will just add the getUserMedia property if it's missing. 9ac43a3f3SŁukasz Kosmaty // First get ahold of the legacy getUserMedia, if present 10*ab22f034SBartłomiej Bukowski const getUserMedia = 11*ab22f034SBartłomiej Bukowski // TODO: this method is deprecated, migrate to https://developer.mozilla.org/en-US/docs/Web/API/MediaDevices/getUserMedia 12*ab22f034SBartłomiej Bukowski navigator.getUserMedia || 13ac43a3f3SŁukasz Kosmaty navigator.webkitGetUserMedia || 14ac43a3f3SŁukasz Kosmaty navigator.mozGetUserMedia || 15ac43a3f3SŁukasz Kosmaty function () { 16ac43a3f3SŁukasz Kosmaty const error = new Error('Permission unimplemented'); 17ac43a3f3SŁukasz Kosmaty error.code = 0; 18ac43a3f3SŁukasz Kosmaty error.name = 'NotAllowedError'; 19ac43a3f3SŁukasz Kosmaty throw error; 20ac43a3f3SŁukasz Kosmaty }; 21ac43a3f3SŁukasz Kosmaty return new Promise((resolve, reject) => { 22ac43a3f3SŁukasz Kosmaty getUserMedia.call(navigator, constraints, resolve, reject); 23ac43a3f3SŁukasz Kosmaty }); 24ac43a3f3SŁukasz Kosmaty} 25ac43a3f3SŁukasz Kosmatyfunction handleGetUserMediaError({ message }) { 26ac43a3f3SŁukasz Kosmaty // name: NotAllowedError 27ac43a3f3SŁukasz Kosmaty // code: 0 28ac43a3f3SŁukasz Kosmaty if (message === 'Permission dismissed') { 29ac43a3f3SŁukasz Kosmaty return { 30ac43a3f3SŁukasz Kosmaty status: PermissionStatus.UNDETERMINED, 31ac43a3f3SŁukasz Kosmaty expires: 'never', 32ac43a3f3SŁukasz Kosmaty canAskAgain: true, 33ac43a3f3SŁukasz Kosmaty granted: false, 34ac43a3f3SŁukasz Kosmaty }; 35ac43a3f3SŁukasz Kosmaty } 36ac43a3f3SŁukasz Kosmaty else { 37ac43a3f3SŁukasz Kosmaty return { 38ac43a3f3SŁukasz Kosmaty status: PermissionStatus.DENIED, 39ac43a3f3SŁukasz Kosmaty expires: 'never', 40ac43a3f3SŁukasz Kosmaty canAskAgain: true, 41ac43a3f3SŁukasz Kosmaty granted: false, 42ac43a3f3SŁukasz Kosmaty }; 43ac43a3f3SŁukasz Kosmaty } 44ac43a3f3SŁukasz Kosmaty} 45ac43a3f3SŁukasz Kosmatyasync function handleRequestPermissionsAsync() { 46ac43a3f3SŁukasz Kosmaty try { 47ac43a3f3SŁukasz Kosmaty await getUserMedia({ 48ac43a3f3SŁukasz Kosmaty video: true, 49ac43a3f3SŁukasz Kosmaty }); 50ac43a3f3SŁukasz Kosmaty return { 51ac43a3f3SŁukasz Kosmaty status: PermissionStatus.GRANTED, 52ac43a3f3SŁukasz Kosmaty expires: 'never', 53ac43a3f3SŁukasz Kosmaty canAskAgain: true, 54ac43a3f3SŁukasz Kosmaty granted: true, 55ac43a3f3SŁukasz Kosmaty }; 56ac43a3f3SŁukasz Kosmaty } 57ac43a3f3SŁukasz Kosmaty catch ({ message }) { 58ac43a3f3SŁukasz Kosmaty return handleGetUserMediaError({ message }); 59ac43a3f3SŁukasz Kosmaty } 60ac43a3f3SŁukasz Kosmaty} 61ac43a3f3SŁukasz Kosmatyasync function handlePermissionsQueryAsync() { 62ac43a3f3SŁukasz Kosmaty if (!navigator?.permissions?.query) { 63ac43a3f3SŁukasz Kosmaty throw new UnavailabilityError('expo-barcode-scanner', 'navigator.permissions API is not available'); 64ac43a3f3SŁukasz Kosmaty } 65ac43a3f3SŁukasz Kosmaty const { state } = await navigator.permissions.query({ name: 'camera' }); 66ac43a3f3SŁukasz Kosmaty switch (state) { 67ac43a3f3SŁukasz Kosmaty case 'prompt': 68ac43a3f3SŁukasz Kosmaty return { 69ac43a3f3SŁukasz Kosmaty status: PermissionStatus.UNDETERMINED, 70ac43a3f3SŁukasz Kosmaty expires: 'never', 71ac43a3f3SŁukasz Kosmaty canAskAgain: true, 72ac43a3f3SŁukasz Kosmaty granted: false, 73ac43a3f3SŁukasz Kosmaty }; 74ac43a3f3SŁukasz Kosmaty case 'granted': 75ac43a3f3SŁukasz Kosmaty return { 76ac43a3f3SŁukasz Kosmaty status: PermissionStatus.GRANTED, 77ac43a3f3SŁukasz Kosmaty expires: 'never', 78ac43a3f3SŁukasz Kosmaty canAskAgain: true, 79ac43a3f3SŁukasz Kosmaty granted: true, 80ac43a3f3SŁukasz Kosmaty }; 81ac43a3f3SŁukasz Kosmaty case 'denied': 82ac43a3f3SŁukasz Kosmaty return { 83ac43a3f3SŁukasz Kosmaty status: PermissionStatus.DENIED, 84ac43a3f3SŁukasz Kosmaty expires: 'never', 85ac43a3f3SŁukasz Kosmaty canAskAgain: true, 86ac43a3f3SŁukasz Kosmaty granted: false, 87ac43a3f3SŁukasz Kosmaty }; 88ac43a3f3SŁukasz Kosmaty } 89ac43a3f3SŁukasz Kosmaty} 909ab5f539SEvan Baconexport default { 919ab5f539SEvan Bacon get name() { 929ab5f539SEvan Bacon return 'ExpoBarCodeScannerModule'; 939ab5f539SEvan Bacon }, 949ab5f539SEvan Bacon get BarCodeType() { 95567432c8SEvan Bacon return { 96567432c8SEvan Bacon code39mod43: 'code39mod43', 97567432c8SEvan Bacon code138: 'code138', 98567432c8SEvan Bacon interleaved2of5: 'interleaved2of5', 99567432c8SEvan Bacon aztec: 'aztec', 100567432c8SEvan Bacon ean13: 'ean13', 101567432c8SEvan Bacon ean8: 'ean8', 102567432c8SEvan Bacon qr: 'qr', 103567432c8SEvan Bacon pdf417: 'pdf417', 104567432c8SEvan Bacon upc_e: 'upc_e', 105567432c8SEvan Bacon datamatrix: 'datamatrix', 106567432c8SEvan Bacon code39: 'code39', 107567432c8SEvan Bacon code93: 'code93', 108567432c8SEvan Bacon itf14: 'itf14', 109567432c8SEvan Bacon codabar: 'codabar', 110567432c8SEvan Bacon code128: 'code128', 111567432c8SEvan Bacon upc_a: 'upc_a', 112567432c8SEvan Bacon }; 1139ab5f539SEvan Bacon }, 1149ab5f539SEvan Bacon get Type() { 1159ab5f539SEvan Bacon return { front: 'front', back: 'back' }; 1169ab5f539SEvan Bacon }, 117ac43a3f3SŁukasz Kosmaty async requestPermissionsAsync() { 118ac43a3f3SŁukasz Kosmaty return handleRequestPermissionsAsync(); 119ac43a3f3SŁukasz Kosmaty }, 120ac43a3f3SŁukasz Kosmaty async getPermissionsAsync() { 121ac43a3f3SŁukasz Kosmaty return handlePermissionsQueryAsync(); 122ac43a3f3SŁukasz Kosmaty }, 1239ab5f539SEvan Bacon}; 1249ab5f539SEvan Bacon//# sourceMappingURL=ExpoBarCodeScannerModule.web.js.map