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