22
33import { 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+
59const permissionTypes = {
610 location : PermissionsAndroid . PERMISSIONS . ACCESS_FINE_LOCATION ,
711 camera : PermissionsAndroid . PERMISSIONS . CAMERA ,
@@ -23,80 +27,89 @@ const RESULTS = {
2327
2428const 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
3236class 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
0 commit comments