UNPKG

3.9 kBJavaScriptView Raw
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
\No newline at end of file