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