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