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