// @flow import {NativeModules} from 'react-native'; const PermissionsIOS = NativeModules.ReactNativePermissions; type Status = 'authorized' | 'denied' | 'restricted' | 'undetermined'; type Rationale = {title: string, message: string}; type CheckOptions = string | {type: string}; type RequestOptions = string | {type: string, rationale?: Rationale}; const permissionTypes = [ 'location', 'camera', 'microphone', 'photo', 'contacts', 'event', 'reminder', 'bluetooth', 'notification', 'backgroundRefresh', 'speechRecognition', 'mediaLibrary', 'motion', ]; const DEFAULTS = { location: 'whenInUse', notification: ['alert', 'badge', 'sound'], }; class ReactNativePermissions { canOpenSettings: () => Promise = () => PermissionsIOS.canOpenSettings().then(result => !!result); openSettings: () => Promise<*> = () => PermissionsIOS.openSettings(); getTypes: () => Array = () => permissionTypes; check = (permission: string, options?: CheckOptions): Promise => { if (!permissionTypes.includes(permission)) { const error = new Error( `ReactNativePermissions: ${permission} is not a valid permission type on iOS`, ); return Promise.reject(error); } let type; if (typeof options === 'string') { type = options; } else if (options && options.type) { type = options.type; } return PermissionsIOS.getPermissionStatus( permission, type || DEFAULTS[permission], ); }; request = (permission: string, options?: RequestOptions): Promise => { if (!permissionTypes.includes(permission)) { const error = new Error( `ReactNativePermissions: ${permission} is not a valid permission type on iOS`, ); return Promise.reject(error); } if (permission == 'backgroundRefresh') { const error = new Error( 'ReactNativePermissions: You cannot request backgroundRefresh', ); return Promise.reject(error); } let type; if (typeof options === 'string') { type = options; } else if (options && options.type) { type = options.type; } return PermissionsIOS.requestPermission( permission, type || DEFAULTS[permission], ); }; checkMultiple = (permissions: Array): Promise<{[string]: string}> => Promise.all(permissions.map(permission => this.check(permission))).then( result => result.reduce((acc, value, index) => { const name = permissions[index]; acc[name] = value; return acc; }, {}), ); } export default new ReactNativePermissions();