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