1import { Platform } from '@unimodules/core';
2import { PermissionStatus } from 'expo-modules-core';
3function convertPermissionStatus(status) {
4    switch (status) {
5        case 'granted':
6            return {
7                status: PermissionStatus.GRANTED,
8                expires: 'never',
9                canAskAgain: false,
10                granted: true,
11            };
12        case 'denied':
13            return {
14                status: PermissionStatus.DENIED,
15                expires: 'never',
16                canAskAgain: false,
17                granted: false,
18            };
19        default:
20            return {
21                status: PermissionStatus.UNDETERMINED,
22                expires: 'never',
23                canAskAgain: true,
24                granted: false,
25            };
26    }
27}
28async function resolvePermissionAsync({ shouldAsk, }) {
29    if (!Platform.isDOMAvailable) {
30        return convertPermissionStatus('denied');
31    }
32    const { Notification = {} } = window;
33    if (typeof Notification.requestPermission !== 'undefined') {
34        let status = Notification.permission;
35        if (shouldAsk) {
36            status = await new Promise((resolve, reject) => {
37                let resolved = false;
38                function resolveOnce(status) {
39                    if (!resolved) {
40                        resolved = true;
41                        resolve(status);
42                    }
43                }
44                // Some browsers require a callback argument and some return a Promise
45                Notification.requestPermission(resolveOnce)
46                    ?.then(resolveOnce)
47                    ?.catch(reject);
48            });
49        }
50        return convertPermissionStatus(status);
51    }
52    else if (typeof navigator !== 'undefined' && navigator?.permissions?.query) {
53        // TODO(Bacon): Support `push` in the future when it's stable.
54        const query = await navigator.permissions.query({ name: 'notifications' });
55        return convertPermissionStatus(query.state);
56    }
57    // Platforms like iOS Safari don't support Notifications so return denied.
58    return convertPermissionStatus('denied');
59}
60export default {
61    addListener: () => { },
62    removeListeners: () => { },
63    async getPermissionsAsync() {
64        return resolvePermissionAsync({ shouldAsk: false });
65    },
66    async requestPermissionsAsync(request) {
67        return resolvePermissionAsync({ shouldAsk: true });
68    },
69};
70//# sourceMappingURL=NotificationPermissionsModule.js.map