1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192 |
- 'use strict';
-
- const ReactNative = require('react-native')
- const RNPermissions = ReactNative.PermissionsAndroid;
- const AsyncStorage = ReactNative.AsyncStorage
-
- const RNPTypes = {
- location: RNPermissions.PERMISSIONS.ACCESS_FINE_LOCATION,
- camera: RNPermissions.PERMISSIONS.CAMERA,
- microphone: RNPermissions.PERMISSIONS.RECORD_AUDIO,
- contacts: RNPermissions.PERMISSIONS.READ_CONTACTS,
- event: RNPermissions.PERMISSIONS.READ_CALENDAR,
- storage: RNPermissions.PERMISSIONS.READ_EXTERNAL_STORAGE,
- photo: RNPermissions.PERMISSIONS.READ_EXTERNAL_STORAGE,
- callPhone: RNPermissions.PERMISSIONS.CALL_PHONE,
- readSms: RNPermissions.PERMISSIONS.READ_SMS,
- receiveSms: RNPermissions.PERMISSIONS.RECEIVE_SMS,
- }
-
- const RESULTS = {
- [ RNPermissions.RESULTS.GRANTED ]: 'authorized',
- [ RNPermissions.RESULTS.DENIED ]: 'denied',
- [ RNPermissions.RESULTS.NEVER_ASK_AGAIN ]: 'restricted',
- }
-
- const STORAGE_KEY = '@RNPermissions:didAskPermission:'
-
- const setDidAskOnce = p => AsyncStorage.setItem(STORAGE_KEY + p, 'true')
- const getDidAskOnce = p => AsyncStorage.getItem(STORAGE_KEY + p).then(res => !!res)
-
- class ReactNativePermissions {
- canOpenSettings() {
- return false
- }
-
- openSettings() {
- return Promise.reject('\'openSettings\' is Depricated on android')
- }
-
- getTypes() {
- return Object.keys(RNPTypes);
- }
-
- check(permission) {
- const androidPermission = RNPTypes[permission]
- if (!androidPermission) return Promise.reject(`ReactNativePermissions: ${permission} is not a valid permission type on Android`);
-
- const shouldShowRationale = ReactNative.NativeModules.PermissionsAndroid.shouldShowRequestPermissionRationale;
-
- return RNPermissions.check(androidPermission)
- .then(isAuthorized => {
- if (isAuthorized) return 'authorized'
-
- return getDidAskOnce(permission)
- .then(didAsk => {
- if (didAsk) {
- return shouldShowRationale(androidPermission)
- .then(shouldShow => shouldShow ? 'denied' : 'restricted')
- }
- return 'undetermined'
- })
- })
- }
-
-
- request(permission) {
- const androidPermission = RNPTypes[permission]
- if (!androidPermission) return Promise.reject(`ReactNativePermissions: ${permission} is not a valid permission type on Android`);
-
-
- return RNPermissions.request(androidPermission)
- .then(res => {
- // RNPermissions.request() to native module resolves to boolean
- // rather than string if running on OS version prior to Android M
- if (typeof res === 'boolean') return res ? 'authorized' : 'denied';
- return setDidAskOnce(permission)
- .then(() => RESULTS[res])
- });
- }
-
- checkMultiple(permissions) {
- return Promise.all(permissions.map(this.check.bind(this)))
- .then(res => res.reduce((pre, cur, i) => {
- var name = permissions[i]
- pre[name] = cur
- return pre
- }, {}))
- }
- }
-
- module.exports = new ReactNativePermissions()
|