Skip to content

Commit 06a834d

Browse files
committed
Add background compatibity for type options
1 parent d3b2991 commit 06a834d

File tree

5 files changed

+105
-67
lines changed

5 files changed

+105
-67
lines changed

.flowconfig

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
[ignore]
2+
3+
[include]
4+
5+
[libs]
6+
7+
[lints]
8+
9+
[options]

lib/permissions.android.js

Lines changed: 59 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,10 @@
22

33
import { AsyncStorage, NativeModules, PermissionsAndroid } from 'react-native'
44

5+
type Status = 'authorized' | 'denied' | 'restricted' | 'undetermined'
6+
type Rationale = { title: string, message: string }
7+
type Options = string | { type: string, rationale?: Rationale }
8+
59
const permissionTypes = {
610
location: PermissionsAndroid.PERMISSIONS.ACCESS_FINE_LOCATION,
711
camera: PermissionsAndroid.PERMISSIONS.CAMERA,
@@ -23,80 +27,89 @@ const RESULTS = {
2327

2428
const STORAGE_KEY = '@RNPermissions:didAskPermission:'
2529

26-
const setDidAskOnce = permission =>
30+
const setDidAskOnce = (permission: string) =>
2731
AsyncStorage.setItem(STORAGE_KEY + permission, 'true')
2832

29-
const getDidAskOnce = permission =>
33+
const getDidAskOnce = (permission: string) =>
3034
AsyncStorage.getItem(STORAGE_KEY + permission).then(item => !!item)
3135

3236
class ReactNativePermissions {
33-
canOpenSettings = () => false
34-
openSettings = () => Promise.reject("'openSettings' is deprecated on android")
35-
getTypes = () => Object.keys(permissionTypes)
37+
canOpenSettings: () => Promise<boolean> = () => Promise.resolve(false)
38+
39+
openSettings: () => Promise<*> = () =>
40+
Promise.reject(new Error("'openSettings' is deprecated on android"))
3641

37-
check = permission => {
38-
const androidPermission = permissionTypes[permission]
42+
getTypes: () => Array<string> = () => Object.keys(permissionTypes)
3943

40-
if (!androidPermission) {
41-
return Promise.reject(
44+
check = (permission: string, type?: string): Promise<Status> => {
45+
if (!permissionTypes[permission]) {
46+
const error = new Error(
4247
`ReactNativePermissions: ${
4348
permission
4449
} is not a valid permission type on Android`,
4550
)
46-
}
4751

48-
return PermissionsAndroid.check(androidPermission).then(isAuthorized => {
49-
if (isAuthorized) {
50-
return 'authorized'
51-
}
52+
return Promise.reject(error)
53+
}
5254

53-
return getDidAskOnce(permission).then(didAsk => {
54-
if (didAsk) {
55-
return NativeModules.PermissionsAndroid.shouldShowRequestPermissionRationale(
56-
androidPermission,
57-
).then(shouldShow => (shouldShow ? 'denied' : 'restricted'))
55+
return PermissionsAndroid.check(permissionTypes[permission]).then(
56+
isAuthorized => {
57+
if (isAuthorized) {
58+
return 'authorized'
5859
}
59-
return 'undetermined'
60-
})
61-
})
62-
}
6360

64-
request = (permission, options) => {
65-
const androidPermission = permissionTypes[permission]
61+
return getDidAskOnce(permission).then(didAsk => {
62+
if (didAsk) {
63+
return NativeModules.PermissionsAndroid.shouldShowRequestPermissionRationale(
64+
permissionTypes[permission],
65+
).then(shouldShow => (shouldShow ? 'denied' : 'restricted'))
66+
}
67+
68+
return 'undetermined'
69+
})
70+
},
71+
)
72+
}
6673

67-
if (!androidPermission) {
68-
return Promise.reject(
74+
request = (permission: string, options?: Options): Promise<Status> => {
75+
if (!permissionTypes[permission]) {
76+
const error = new Error(
6977
`ReactNativePermissions: ${
7078
permission
7179
} is not a valid permission type on Android`,
7280
)
81+
82+
return Promise.reject(error)
7383
}
7484

75-
let rationale = null
76-
if (options != null) {
85+
let rationale
86+
87+
if (options && options.rationale) {
7788
rationale = options.rationale
7889
}
7990

80-
return PermissionsAndroid.request(androidPermission, rationale).then(
81-
result => {
82-
// PermissionsAndroid.request() to native module resolves to boolean
83-
// rather than string if running on OS version prior to Android M
84-
if (typeof result === 'boolean') {
85-
return result ? 'authorized' : 'denied'
86-
}
91+
return PermissionsAndroid.request(
92+
permissionTypes[permission],
93+
rationale,
94+
).then(result => {
95+
// PermissionsAndroid.request() to native module resolves to boolean
96+
// rather than string if running on OS version prior to Android M
97+
if (typeof result === 'boolean') {
98+
return result ? 'authorized' : 'denied'
99+
}
87100

88-
return setDidAskOnce(permission).then(() => RESULTS[result])
89-
},
90-
)
101+
return setDidAskOnce(permission).then(() => RESULTS[result])
102+
})
91103
}
92104

93-
checkMultiple = permissions =>
94-
Promise.all(permissions.map(this.check)).then(result =>
95-
result.reduce((acc, value, index) => {
96-
const name = permissions[index]
97-
acc[name] = value
98-
return acc
99-
}, {}),
105+
checkMultiple = (permissions: Array<string>): Promise<{ [string]: string }> =>
106+
Promise.all(permissions.map(permission => this.check(permission))).then(
107+
result =>
108+
result.reduce((acc, value, index) => {
109+
const name = permissions[index]
110+
acc[name] = value
111+
return acc
112+
}, {}),
100113
)
101114
}
102115

lib/permissions.ios.js

Lines changed: 26 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,10 @@
33
import { NativeModules } from 'react-native'
44
const PermissionsIOS = NativeModules.ReactNativePermissions
55

6+
type Status = 'authorized' | 'denied' | 'restricted' | 'undetermined'
7+
type Rationale = { title: string, message: string }
8+
type Options = string | { type: string, rationale?: Rationale }
9+
610
const permissionTypes = [
711
'location',
812
'camera',
@@ -23,17 +27,22 @@ const DEFAULTS = {
2327
}
2428

2529
class ReactNativePermissions {
26-
canOpenSettings = () => PermissionsIOS.canOpenSettings()
27-
openSettings = () => PermissionsIOS.openSettings()
28-
getTypes = () => permissionTypes
30+
canOpenSettings: () => Promise<boolean> = () =>
31+
PermissionsIOS.canOpenSettings()
32+
33+
openSettings: () => Promise<*> = () => PermissionsIOS.openSettings()
2934

30-
check = (permission, type) => {
35+
getTypes: () => Array<string> = () => permissionTypes
36+
37+
check = (permission: string, type?: string): Promise<Status> => {
3138
if (!permissionTypes.includes(permission)) {
32-
return Promise.reject(
39+
const error = new Error(
3340
`ReactNativePermissions: ${
3441
permission
3542
} is not a valid permission type on iOS`,
3643
)
44+
45+
return Promise.reject(error)
3746
}
3847

3948
return PermissionsIOS.getPermissionStatus(
@@ -42,29 +51,31 @@ class ReactNativePermissions {
4251
)
4352
}
4453

45-
request = (permission, options) => {
46-
let type = null
47-
if (typeof options === 'string' || options instanceof Array) {
48-
console.warn(
49-
'[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',
50-
)
54+
request = (permission: string, options?: Options): Promise<Status> => {
55+
let type
56+
57+
if (typeof options === 'string') {
5158
type = options
52-
} else if (options != null) {
59+
} else if (options && options.type) {
5360
type = options.type
5461
}
5562

5663
if (!permissionTypes.includes(permission)) {
57-
return Promise.reject(
64+
const error = new Error(
5865
`ReactNativePermissions: ${
5966
permission
6067
} is not a valid permission type on iOS`,
6168
)
69+
70+
return Promise.reject(error)
6271
}
6372

6473
if (permission == 'backgroundRefresh') {
65-
return Promise.reject(
74+
const error = new Error(
6675
'ReactNativePermissions: You cannot request backgroundRefresh',
6776
)
77+
78+
return Promise.reject(error)
6879
}
6980

7081
return PermissionsIOS.requestPermission(
@@ -73,7 +84,7 @@ class ReactNativePermissions {
7384
)
7485
}
7586

76-
checkMultiple = permissions =>
87+
checkMultiple = (permissions: Array<string>): Promise<{ [string]: string }> =>
7788
Promise.all(permissions.map(permission => this.check(permission))).then(
7889
result =>
7990
result.reduce((acc, value, index) => {

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
"**/*.{js,json,md}": ["prettier --write", "git add"]
2020
},
2121
"devDependencies": {
22+
"flow-bin": "^0.57.3",
2223
"husky": "^0.14.3",
2324
"lint-staged": "^5.0.0",
2425
"prettier": "^1.8.2"

yarn.lock

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -103,8 +103,8 @@ color-name@^1.1.1:
103103
resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25"
104104

105105
commander@^2.11.0, commander@^2.9.0:
106-
version "2.11.0"
107-
resolved "https://registry.yarnpkg.com/commander/-/commander-2.11.0.tgz#157152fd1e7a6c8d98a5b715cf376df928004563"
106+
version "2.12.2"
107+
resolved "https://registry.yarnpkg.com/commander/-/commander-2.12.2.tgz#0f5946c427ed9ec0d91a46bb9def53e54650e555"
108108

109109
110110
version "0.0.1"
@@ -180,6 +180,10 @@ find-parent-dir@^0.3.0:
180180
version "0.3.0"
181181
resolved "https://registry.yarnpkg.com/find-parent-dir/-/find-parent-dir-0.3.0.tgz#33c44b429ab2b2f0646299c5f9f718f376ff8d54"
182182

183+
flow-bin@^0.57.3:
184+
version "0.57.3"
185+
resolved "https://registry.yarnpkg.com/flow-bin/-/flow-bin-0.57.3.tgz#843fb80a821b6d0c5847f7bb3f42365ffe53b27b"
186+
183187
get-own-enumerable-property-symbols@^2.0.1:
184188
version "2.0.1"
185189
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:
514518
onetime "^1.0.0"
515519

516520
rxjs@^5.4.2:
517-
version "5.5.2"
518-
resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-5.5.2.tgz#28d403f0071121967f18ad665563255d54236ac3"
521+
version "5.5.3"
522+
resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-5.5.3.tgz#b62227e74b84f4e77bdf440e50b5ee01a1bc7dcd"
519523
dependencies:
520524
symbol-observable "^1.0.1"
521525

@@ -596,8 +600,8 @@ symbol-observable@^0.2.2:
596600
resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-0.2.4.tgz#95a83db26186d6af7e7a18dbd9760a2f86d08f40"
597601

598602
symbol-observable@^1.0.1:
599-
version "1.0.4"
600-
resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.0.4.tgz#29bf615d4aa7121bdd898b22d4b3f9bc4e2aa03d"
603+
version "1.1.0"
604+
resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.1.0.tgz#5c68fd8d54115d9dfb72a84720549222e8db9b32"
601605

602606
which@^1.2.10, which@^1.2.9:
603607
version "1.3.0"

0 commit comments

Comments
 (0)