// @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(); 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();