浏览代码

Add background compatibity for type options

Mathieu Acthernoene 8 年之前
父节点
当前提交
06a834dd0e
共有 5 个文件被更改,包括 105 次插入67 次删除
  1. 9 0
      .flowconfig
  2. 59 46
      lib/permissions.android.js
  3. 26 15
      lib/permissions.ios.js
  4. 1 0
      package.json
  5. 10 6
      yarn.lock

+ 9 - 0
.flowconfig

@@ -0,0 +1,9 @@
+[ignore]
+
+[include]
+
+[libs]
+
+[lints]
+
+[options]

+ 59 - 46
lib/permissions.android.js

@@ -2,6 +2,10 @@
 
 import { AsyncStorage, NativeModules, PermissionsAndroid } from 'react-native'
 
+type Status = 'authorized' | 'denied' | 'restricted' | 'undetermined'
+type Rationale = { title: string, message: string }
+type Options = string | { type: string, rationale?: Rationale }
+
 const permissionTypes = {
   location: PermissionsAndroid.PERMISSIONS.ACCESS_FINE_LOCATION,
   camera: PermissionsAndroid.PERMISSIONS.CAMERA,
@@ -23,80 +27,89 @@ const RESULTS = {
 
 const STORAGE_KEY = '@RNPermissions:didAskPermission:'
 
-const setDidAskOnce = permission =>
+const setDidAskOnce = (permission: string) =>
   AsyncStorage.setItem(STORAGE_KEY + permission, 'true')
 
-const getDidAskOnce = permission =>
+const getDidAskOnce = (permission: string) =>
   AsyncStorage.getItem(STORAGE_KEY + permission).then(item => !!item)
 
 class ReactNativePermissions {
-  canOpenSettings = () => false
-  openSettings = () => Promise.reject("'openSettings' is deprecated on android")
-  getTypes = () => Object.keys(permissionTypes)
+  canOpenSettings: () => Promise<boolean> = () => Promise.resolve(false)
+
+  openSettings: () => Promise<*> = () =>
+    Promise.reject(new Error("'openSettings' is deprecated on android"))
 
-  check = permission => {
-    const androidPermission = permissionTypes[permission]
+  getTypes: () => Array<string> = () => Object.keys(permissionTypes)
 
-    if (!androidPermission) {
-      return Promise.reject(
+  check = (permission: string, type?: string): Promise<Status> => {
+    if (!permissionTypes[permission]) {
+      const error = new Error(
         `ReactNativePermissions: ${
           permission
         } is not a valid permission type on Android`,
       )
-    }
 
-    return PermissionsAndroid.check(androidPermission).then(isAuthorized => {
-      if (isAuthorized) {
-        return 'authorized'
-      }
+      return Promise.reject(error)
+    }
 
-      return getDidAskOnce(permission).then(didAsk => {
-        if (didAsk) {
-          return NativeModules.PermissionsAndroid.shouldShowRequestPermissionRationale(
-            androidPermission,
-          ).then(shouldShow => (shouldShow ? 'denied' : 'restricted'))
+    return PermissionsAndroid.check(permissionTypes[permission]).then(
+      isAuthorized => {
+        if (isAuthorized) {
+          return 'authorized'
         }
-        return 'undetermined'
-      })
-    })
-  }
 
-  request = (permission, options) => {
-    const androidPermission = permissionTypes[permission]
+        return getDidAskOnce(permission).then(didAsk => {
+          if (didAsk) {
+            return NativeModules.PermissionsAndroid.shouldShowRequestPermissionRationale(
+              permissionTypes[permission],
+            ).then(shouldShow => (shouldShow ? 'denied' : 'restricted'))
+          }
+
+          return 'undetermined'
+        })
+      },
+    )
+  }
 
-    if (!androidPermission) {
-      return Promise.reject(
+  request = (permission: string, options?: Options): Promise<Status> => {
+    if (!permissionTypes[permission]) {
+      const error = new Error(
         `ReactNativePermissions: ${
           permission
         } is not a valid permission type on Android`,
       )
+
+      return Promise.reject(error)
     }
 
-    let rationale = null
-    if (options != null) {
+    let rationale
+
+    if (options && options.rationale) {
       rationale = options.rationale
     }
 
-    return PermissionsAndroid.request(androidPermission, rationale).then(
-      result => {
-        // PermissionsAndroid.request() to native module resolves to boolean
-        // rather than string if running on OS version prior to Android M
-        if (typeof result === 'boolean') {
-          return result ? 'authorized' : 'denied'
-        }
+    return PermissionsAndroid.request(
+      permissionTypes[permission],
+      rationale,
+    ).then(result => {
+      // PermissionsAndroid.request() to native module resolves to boolean
+      // rather than string if running on OS version prior to Android M
+      if (typeof result === 'boolean') {
+        return result ? 'authorized' : 'denied'
+      }
 
-        return setDidAskOnce(permission).then(() => RESULTS[result])
-      },
-    )
+      return setDidAskOnce(permission).then(() => RESULTS[result])
+    })
   }
 
-  checkMultiple = permissions =>
-    Promise.all(permissions.map(this.check)).then(result =>
-      result.reduce((acc, value, index) => {
-        const name = permissions[index]
-        acc[name] = value
-        return acc
-      }, {}),
+  checkMultiple = (permissions: Array<string>): 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
+        }, {}),
     )
 }
 

+ 26 - 15
lib/permissions.ios.js

@@ -3,6 +3,10 @@
 import { NativeModules } from 'react-native'
 const PermissionsIOS = NativeModules.ReactNativePermissions
 
+type Status = 'authorized' | 'denied' | 'restricted' | 'undetermined'
+type Rationale = { title: string, message: string }
+type Options = string | { type: string, rationale?: Rationale }
+
 const permissionTypes = [
   'location',
   'camera',
@@ -23,17 +27,22 @@ const DEFAULTS = {
 }
 
 class ReactNativePermissions {
-  canOpenSettings = () => PermissionsIOS.canOpenSettings()
-  openSettings = () => PermissionsIOS.openSettings()
-  getTypes = () => permissionTypes
+  canOpenSettings: () => Promise<boolean> = () =>
+    PermissionsIOS.canOpenSettings()
+
+  openSettings: () => Promise<*> = () => PermissionsIOS.openSettings()
 
-  check = (permission, type) => {
+  getTypes: () => Array<string> = () => permissionTypes
+
+  check = (permission: string, type?: string): Promise<Status> => {
     if (!permissionTypes.includes(permission)) {
-      return Promise.reject(
+      const error = new Error(
         `ReactNativePermissions: ${
           permission
         } is not a valid permission type on iOS`,
       )
+
+      return Promise.reject(error)
     }
 
     return PermissionsIOS.getPermissionStatus(
@@ -42,29 +51,31 @@ class ReactNativePermissions {
     )
   }
 
-  request = (permission, options) => {
-    let type = null
-    if (typeof options === 'string' || options instanceof Array) {
-      console.warn(
-        '[react-native-permissions] : You are using a deprecated version of request(). You should use an object as second parameter. Please check the documentation for more information : https://github.com/yonahforst/react-native-permissions',
-      )
+  request = (permission: string, options?: Options): Promise<Status> => {
+    let type
+
+    if (typeof options === 'string') {
       type = options
-    } else if (options != null) {
+    } else if (options && options.type) {
       type = options.type
     }
 
     if (!permissionTypes.includes(permission)) {
-      return Promise.reject(
+      const error = new Error(
         `ReactNativePermissions: ${
           permission
         } is not a valid permission type on iOS`,
       )
+
+      return Promise.reject(error)
     }
 
     if (permission == 'backgroundRefresh') {
-      return Promise.reject(
+      const error = new Error(
         'ReactNativePermissions: You cannot request backgroundRefresh',
       )
+
+      return Promise.reject(error)
     }
 
     return PermissionsIOS.requestPermission(
@@ -73,7 +84,7 @@ class ReactNativePermissions {
     )
   }
 
-  checkMultiple = permissions =>
+  checkMultiple = (permissions: Array<string>): Promise<{ [string]: string }> =>
     Promise.all(permissions.map(permission => this.check(permission))).then(
       result =>
         result.reduce((acc, value, index) => {

+ 1 - 0
package.json

@@ -19,6 +19,7 @@
     "**/*.{js,json,md}": ["prettier --write", "git add"]
   },
   "devDependencies": {
+    "flow-bin": "^0.57.3",
     "husky": "^0.14.3",
     "lint-staged": "^5.0.0",
     "prettier": "^1.8.2"

+ 10 - 6
yarn.lock

@@ -103,8 +103,8 @@ color-name@^1.1.1:
   resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25"
 
 commander@^2.11.0, commander@^2.9.0:
-  version "2.11.0"
-  resolved "https://registry.yarnpkg.com/commander/-/commander-2.11.0.tgz#157152fd1e7a6c8d98a5b715cf376df928004563"
+  version "2.12.2"
+  resolved "https://registry.yarnpkg.com/commander/-/commander-2.12.2.tgz#0f5946c427ed9ec0d91a46bb9def53e54650e555"
 
 concat-map@0.0.1:
   version "0.0.1"
@@ -180,6 +180,10 @@ find-parent-dir@^0.3.0:
   version "0.3.0"
   resolved "https://registry.yarnpkg.com/find-parent-dir/-/find-parent-dir-0.3.0.tgz#33c44b429ab2b2f0646299c5f9f718f376ff8d54"
 
+flow-bin@^0.57.3:
+  version "0.57.3"
+  resolved "https://registry.yarnpkg.com/flow-bin/-/flow-bin-0.57.3.tgz#843fb80a821b6d0c5847f7bb3f42365ffe53b27b"
+
 get-own-enumerable-property-symbols@^2.0.1:
   version "2.0.1"
   resolved "https://registry.yarnpkg.com/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-2.0.1.tgz#5c4ad87f2834c4b9b4e84549dc1e0650fb38c24b"
@@ -514,8 +518,8 @@ restore-cursor@^1.0.1:
     onetime "^1.0.0"
 
 rxjs@^5.4.2:
-  version "5.5.2"
-  resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-5.5.2.tgz#28d403f0071121967f18ad665563255d54236ac3"
+  version "5.5.3"
+  resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-5.5.3.tgz#b62227e74b84f4e77bdf440e50b5ee01a1bc7dcd"
   dependencies:
     symbol-observable "^1.0.1"
 
@@ -596,8 +600,8 @@ symbol-observable@^0.2.2:
   resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-0.2.4.tgz#95a83db26186d6af7e7a18dbd9760a2f86d08f40"
 
 symbol-observable@^1.0.1:
-  version "1.0.4"
-  resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.0.4.tgz#29bf615d4aa7121bdd898b22d4b3f9bc4e2aa03d"
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.1.0.tgz#5c68fd8d54115d9dfb72a84720549222e8db9b32"
 
 which@^1.2.10, which@^1.2.9:
   version "1.3.0"