react-native-permission-handler 0.2.1 → 0.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,8 +1,8 @@
1
- import { P as PermissionEngine } from '../types-QXyq8VnD.js';
1
+ import { P as PermissionEngine } from '../types-DwqbbLGD.js';
2
2
 
3
3
  /**
4
- * Cross-platform permission constants for use with the RNP engine.
5
- * Each resolves to the correct platform-specific string at runtime.
4
+ * Cross-platform permission constants that resolve to the correct
5
+ * platform-specific string at runtime via Platform.select.
6
6
  */
7
7
  declare const Permissions: {
8
8
  readonly CAMERA: string;
@@ -14,8 +14,51 @@ declare const Permissions: {
14
14
  readonly LOCATION_ALWAYS: string;
15
15
  readonly PHOTO_LIBRARY: string;
16
16
  readonly PHOTO_LIBRARY_ADD_ONLY: string;
17
+ readonly MEDIA_LIBRARY: string;
17
18
  readonly BLUETOOTH: string;
19
+ readonly SPEECH_RECOGNITION: string;
20
+ readonly MOTION: string;
18
21
  readonly NOTIFICATIONS: "notifications";
22
+ readonly IOS: {
23
+ readonly APP_TRACKING_TRANSPARENCY: "ios.permission.APP_TRACKING_TRANSPARENCY";
24
+ readonly FACE_ID: "ios.permission.FACE_ID";
25
+ readonly REMINDERS: "ios.permission.REMINDERS";
26
+ readonly SIRI: "ios.permission.SIRI";
27
+ readonly STOREKIT: "ios.permission.STOREKIT";
28
+ };
29
+ readonly ANDROID: {
30
+ readonly ACCEPT_HANDOVER: "android.permission.ACCEPT_HANDOVER";
31
+ readonly ACCESS_COARSE_LOCATION: "android.permission.ACCESS_COARSE_LOCATION";
32
+ readonly ACCESS_MEDIA_LOCATION: "android.permission.ACCESS_MEDIA_LOCATION";
33
+ readonly ADD_VOICEMAIL: "com.android.voicemail.permission.ADD_VOICEMAIL";
34
+ readonly ANSWER_PHONE_CALLS: "android.permission.ANSWER_PHONE_CALLS";
35
+ readonly BLUETOOTH_ADVERTISE: "android.permission.BLUETOOTH_ADVERTISE";
36
+ readonly BLUETOOTH_SCAN: "android.permission.BLUETOOTH_SCAN";
37
+ readonly BODY_SENSORS: "android.permission.BODY_SENSORS";
38
+ readonly BODY_SENSORS_BACKGROUND: "android.permission.BODY_SENSORS_BACKGROUND";
39
+ readonly CALL_PHONE: "android.permission.CALL_PHONE";
40
+ readonly GET_ACCOUNTS: "android.permission.GET_ACCOUNTS";
41
+ readonly NEARBY_WIFI_DEVICES: "android.permission.NEARBY_WIFI_DEVICES";
42
+ readonly PROCESS_OUTGOING_CALLS: "android.permission.PROCESS_OUTGOING_CALLS";
43
+ readonly READ_CALL_LOG: "android.permission.READ_CALL_LOG";
44
+ readonly READ_EXTERNAL_STORAGE: "android.permission.READ_EXTERNAL_STORAGE";
45
+ readonly READ_MEDIA_AUDIO: "android.permission.READ_MEDIA_AUDIO";
46
+ readonly READ_MEDIA_IMAGES: "android.permission.READ_MEDIA_IMAGES";
47
+ readonly READ_MEDIA_VIDEO: "android.permission.READ_MEDIA_VIDEO";
48
+ readonly READ_MEDIA_VISUAL_USER_SELECTED: "android.permission.READ_MEDIA_VISUAL_USER_SELECTED";
49
+ readonly READ_PHONE_NUMBERS: "android.permission.READ_PHONE_NUMBERS";
50
+ readonly READ_PHONE_STATE: "android.permission.READ_PHONE_STATE";
51
+ readonly READ_SMS: "android.permission.READ_SMS";
52
+ readonly RECEIVE_MMS: "android.permission.RECEIVE_MMS";
53
+ readonly RECEIVE_SMS: "android.permission.RECEIVE_SMS";
54
+ readonly RECEIVE_WAP_PUSH: "android.permission.RECEIVE_WAP_PUSH";
55
+ readonly SEND_SMS: "android.permission.SEND_SMS";
56
+ readonly USE_SIP: "android.permission.USE_SIP";
57
+ readonly UWB_RANGING: "android.permission.UWB_RANGING";
58
+ readonly WRITE_CALL_LOG: "android.permission.WRITE_CALL_LOG";
59
+ readonly WRITE_CONTACTS: "android.permission.WRITE_CONTACTS";
60
+ readonly WRITE_EXTERNAL_STORAGE: "android.permission.WRITE_EXTERNAL_STORAGE";
61
+ };
19
62
  };
20
63
  declare function createRNPEngine(): PermissionEngine;
21
64
 
@@ -30,6 +30,7 @@ function p(ios, android) {
30
30
  return import_react_native.Platform.select({ ios, android, default: ios }) ?? ios;
31
31
  }
32
32
  var Permissions = {
33
+ // Cross-platform
33
34
  CAMERA: p("ios.permission.CAMERA", "android.permission.CAMERA"),
34
35
  MICROPHONE: p("ios.permission.MICROPHONE", "android.permission.RECORD_AUDIO"),
35
36
  CONTACTS: p("ios.permission.CONTACTS", "android.permission.READ_CONTACTS"),
@@ -51,8 +52,53 @@ var Permissions = {
51
52
  "ios.permission.PHOTO_LIBRARY_ADD_ONLY",
52
53
  "android.permission.WRITE_EXTERNAL_STORAGE"
53
54
  ),
55
+ MEDIA_LIBRARY: p("ios.permission.MEDIA_LIBRARY", "android.permission.READ_MEDIA_AUDIO"),
54
56
  BLUETOOTH: p("ios.permission.BLUETOOTH", "android.permission.BLUETOOTH_CONNECT"),
55
- NOTIFICATIONS: "notifications"
57
+ SPEECH_RECOGNITION: p("ios.permission.SPEECH_RECOGNITION", "android.permission.RECORD_AUDIO"),
58
+ MOTION: p("ios.permission.MOTION", "android.permission.ACTIVITY_RECOGNITION"),
59
+ NOTIFICATIONS: "notifications",
60
+ // iOS-only
61
+ IOS: {
62
+ APP_TRACKING_TRANSPARENCY: "ios.permission.APP_TRACKING_TRANSPARENCY",
63
+ FACE_ID: "ios.permission.FACE_ID",
64
+ REMINDERS: "ios.permission.REMINDERS",
65
+ SIRI: "ios.permission.SIRI",
66
+ STOREKIT: "ios.permission.STOREKIT"
67
+ },
68
+ // Android-only
69
+ ANDROID: {
70
+ ACCEPT_HANDOVER: "android.permission.ACCEPT_HANDOVER",
71
+ ACCESS_COARSE_LOCATION: "android.permission.ACCESS_COARSE_LOCATION",
72
+ ACCESS_MEDIA_LOCATION: "android.permission.ACCESS_MEDIA_LOCATION",
73
+ ADD_VOICEMAIL: "com.android.voicemail.permission.ADD_VOICEMAIL",
74
+ ANSWER_PHONE_CALLS: "android.permission.ANSWER_PHONE_CALLS",
75
+ BLUETOOTH_ADVERTISE: "android.permission.BLUETOOTH_ADVERTISE",
76
+ BLUETOOTH_SCAN: "android.permission.BLUETOOTH_SCAN",
77
+ BODY_SENSORS: "android.permission.BODY_SENSORS",
78
+ BODY_SENSORS_BACKGROUND: "android.permission.BODY_SENSORS_BACKGROUND",
79
+ CALL_PHONE: "android.permission.CALL_PHONE",
80
+ GET_ACCOUNTS: "android.permission.GET_ACCOUNTS",
81
+ NEARBY_WIFI_DEVICES: "android.permission.NEARBY_WIFI_DEVICES",
82
+ PROCESS_OUTGOING_CALLS: "android.permission.PROCESS_OUTGOING_CALLS",
83
+ READ_CALL_LOG: "android.permission.READ_CALL_LOG",
84
+ READ_EXTERNAL_STORAGE: "android.permission.READ_EXTERNAL_STORAGE",
85
+ READ_MEDIA_AUDIO: "android.permission.READ_MEDIA_AUDIO",
86
+ READ_MEDIA_IMAGES: "android.permission.READ_MEDIA_IMAGES",
87
+ READ_MEDIA_VIDEO: "android.permission.READ_MEDIA_VIDEO",
88
+ READ_MEDIA_VISUAL_USER_SELECTED: "android.permission.READ_MEDIA_VISUAL_USER_SELECTED",
89
+ READ_PHONE_NUMBERS: "android.permission.READ_PHONE_NUMBERS",
90
+ READ_PHONE_STATE: "android.permission.READ_PHONE_STATE",
91
+ READ_SMS: "android.permission.READ_SMS",
92
+ RECEIVE_MMS: "android.permission.RECEIVE_MMS",
93
+ RECEIVE_SMS: "android.permission.RECEIVE_SMS",
94
+ RECEIVE_WAP_PUSH: "android.permission.RECEIVE_WAP_PUSH",
95
+ SEND_SMS: "android.permission.SEND_SMS",
96
+ USE_SIP: "android.permission.USE_SIP",
97
+ UWB_RANGING: "android.permission.UWB_RANGING",
98
+ WRITE_CALL_LOG: "android.permission.WRITE_CALL_LOG",
99
+ WRITE_CONTACTS: "android.permission.WRITE_CONTACTS",
100
+ WRITE_EXTERNAL_STORAGE: "android.permission.WRITE_EXTERNAL_STORAGE"
101
+ }
56
102
  };
57
103
  function createRNPEngine() {
58
104
  return {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/engines/rnp.ts"],"sourcesContent":["import { Platform } from \"react-native\";\nimport {\n type Permission,\n check,\n checkNotifications,\n openSettings,\n request,\n requestNotifications,\n} from \"react-native-permissions\";\nimport type { PermissionEngine, PermissionStatus } from \"../types\";\n\nfunction p(ios: string, android: string): string {\n return Platform.select({ ios, android, default: ios }) ?? ios;\n}\n\n/**\n * Cross-platform permission constants for use with the RNP engine.\n * Each resolves to the correct platform-specific string at runtime.\n */\nexport const Permissions = {\n CAMERA: p(\"ios.permission.CAMERA\", \"android.permission.CAMERA\"),\n MICROPHONE: p(\"ios.permission.MICROPHONE\", \"android.permission.RECORD_AUDIO\"),\n CONTACTS: p(\"ios.permission.CONTACTS\", \"android.permission.READ_CONTACTS\"),\n CALENDARS: p(\"ios.permission.CALENDARS\", \"android.permission.READ_CALENDAR\"),\n CALENDARS_WRITE_ONLY: p(\n \"ios.permission.CALENDARS_WRITE_ONLY\",\n \"android.permission.WRITE_CALENDAR\",\n ),\n LOCATION_WHEN_IN_USE: p(\n \"ios.permission.LOCATION_WHEN_IN_USE\",\n \"android.permission.ACCESS_FINE_LOCATION\",\n ),\n LOCATION_ALWAYS: p(\n \"ios.permission.LOCATION_ALWAYS\",\n \"android.permission.ACCESS_BACKGROUND_LOCATION\",\n ),\n PHOTO_LIBRARY: p(\"ios.permission.PHOTO_LIBRARY\", \"android.permission.READ_MEDIA_IMAGES\"),\n PHOTO_LIBRARY_ADD_ONLY: p(\n \"ios.permission.PHOTO_LIBRARY_ADD_ONLY\",\n \"android.permission.WRITE_EXTERNAL_STORAGE\",\n ),\n BLUETOOTH: p(\"ios.permission.BLUETOOTH\", \"android.permission.BLUETOOTH_CONNECT\"),\n NOTIFICATIONS: \"notifications\",\n} as const;\n\nexport function createRNPEngine(): PermissionEngine {\n return {\n async check(permission: string): Promise<PermissionStatus> {\n if (permission === \"notifications\") {\n const result = await checkNotifications();\n return result.status as PermissionStatus;\n }\n return (await check(permission as Permission)) as PermissionStatus;\n },\n\n async request(permission: string): Promise<PermissionStatus> {\n if (permission === \"notifications\") {\n const result = await requestNotifications([\"alert\", \"badge\", \"sound\"]);\n return result.status as PermissionStatus;\n }\n return (await request(permission as Permission)) as PermissionStatus;\n },\n\n async openSettings(): Promise<void> {\n await openSettings();\n },\n };\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,0BAAyB;AACzB,sCAOO;AAGP,SAAS,EAAE,KAAa,SAAyB;AAC/C,SAAO,6BAAS,OAAO,EAAE,KAAK,SAAS,SAAS,IAAI,CAAC,KAAK;AAC5D;AAMO,IAAM,cAAc;AAAA,EACzB,QAAQ,EAAE,yBAAyB,2BAA2B;AAAA,EAC9D,YAAY,EAAE,6BAA6B,iCAAiC;AAAA,EAC5E,UAAU,EAAE,2BAA2B,kCAAkC;AAAA,EACzE,WAAW,EAAE,4BAA4B,kCAAkC;AAAA,EAC3E,sBAAsB;AAAA,IACpB;AAAA,IACA;AAAA,EACF;AAAA,EACA,sBAAsB;AAAA,IACpB;AAAA,IACA;AAAA,EACF;AAAA,EACA,iBAAiB;AAAA,IACf;AAAA,IACA;AAAA,EACF;AAAA,EACA,eAAe,EAAE,gCAAgC,sCAAsC;AAAA,EACvF,wBAAwB;AAAA,IACtB;AAAA,IACA;AAAA,EACF;AAAA,EACA,WAAW,EAAE,4BAA4B,sCAAsC;AAAA,EAC/E,eAAe;AACjB;AAEO,SAAS,kBAAoC;AAClD,SAAO;AAAA,IACL,MAAM,MAAM,YAA+C;AACzD,UAAI,eAAe,iBAAiB;AAClC,cAAM,SAAS,UAAM,oDAAmB;AACxC,eAAO,OAAO;AAAA,MAChB;AACA,aAAQ,UAAM,uCAAM,UAAwB;AAAA,IAC9C;AAAA,IAEA,MAAM,QAAQ,YAA+C;AAC3D,UAAI,eAAe,iBAAiB;AAClC,cAAM,SAAS,UAAM,sDAAqB,CAAC,SAAS,SAAS,OAAO,CAAC;AACrE,eAAO,OAAO;AAAA,MAChB;AACA,aAAQ,UAAM,yCAAQ,UAAwB;AAAA,IAChD;AAAA,IAEA,MAAM,eAA8B;AAClC,gBAAM,8CAAa;AAAA,IACrB;AAAA,EACF;AACF;","names":[]}
1
+ {"version":3,"sources":["../../src/engines/rnp.ts"],"sourcesContent":["import { Platform } from \"react-native\";\nimport {\n type Permission,\n check,\n checkNotifications,\n openSettings,\n request,\n requestNotifications,\n} from \"react-native-permissions\";\nimport type { PermissionEngine, PermissionStatus } from \"../types\";\n\nfunction p(ios: string, android: string): string {\n return Platform.select({ ios, android, default: ios }) ?? ios;\n}\n\n/**\n * Cross-platform permission constants that resolve to the correct\n * platform-specific string at runtime via Platform.select.\n */\nexport const Permissions = {\n // Cross-platform\n CAMERA: p(\"ios.permission.CAMERA\", \"android.permission.CAMERA\"),\n MICROPHONE: p(\"ios.permission.MICROPHONE\", \"android.permission.RECORD_AUDIO\"),\n CONTACTS: p(\"ios.permission.CONTACTS\", \"android.permission.READ_CONTACTS\"),\n CALENDARS: p(\"ios.permission.CALENDARS\", \"android.permission.READ_CALENDAR\"),\n CALENDARS_WRITE_ONLY: p(\n \"ios.permission.CALENDARS_WRITE_ONLY\",\n \"android.permission.WRITE_CALENDAR\",\n ),\n LOCATION_WHEN_IN_USE: p(\n \"ios.permission.LOCATION_WHEN_IN_USE\",\n \"android.permission.ACCESS_FINE_LOCATION\",\n ),\n LOCATION_ALWAYS: p(\n \"ios.permission.LOCATION_ALWAYS\",\n \"android.permission.ACCESS_BACKGROUND_LOCATION\",\n ),\n PHOTO_LIBRARY: p(\"ios.permission.PHOTO_LIBRARY\", \"android.permission.READ_MEDIA_IMAGES\"),\n PHOTO_LIBRARY_ADD_ONLY: p(\n \"ios.permission.PHOTO_LIBRARY_ADD_ONLY\",\n \"android.permission.WRITE_EXTERNAL_STORAGE\",\n ),\n MEDIA_LIBRARY: p(\"ios.permission.MEDIA_LIBRARY\", \"android.permission.READ_MEDIA_AUDIO\"),\n BLUETOOTH: p(\"ios.permission.BLUETOOTH\", \"android.permission.BLUETOOTH_CONNECT\"),\n SPEECH_RECOGNITION: p(\"ios.permission.SPEECH_RECOGNITION\", \"android.permission.RECORD_AUDIO\"),\n MOTION: p(\"ios.permission.MOTION\", \"android.permission.ACTIVITY_RECOGNITION\"),\n NOTIFICATIONS: \"notifications\",\n\n // iOS-only\n IOS: {\n APP_TRACKING_TRANSPARENCY: \"ios.permission.APP_TRACKING_TRANSPARENCY\",\n FACE_ID: \"ios.permission.FACE_ID\",\n REMINDERS: \"ios.permission.REMINDERS\",\n SIRI: \"ios.permission.SIRI\",\n STOREKIT: \"ios.permission.STOREKIT\",\n },\n\n // Android-only\n ANDROID: {\n ACCEPT_HANDOVER: \"android.permission.ACCEPT_HANDOVER\",\n ACCESS_COARSE_LOCATION: \"android.permission.ACCESS_COARSE_LOCATION\",\n ACCESS_MEDIA_LOCATION: \"android.permission.ACCESS_MEDIA_LOCATION\",\n ADD_VOICEMAIL: \"com.android.voicemail.permission.ADD_VOICEMAIL\",\n ANSWER_PHONE_CALLS: \"android.permission.ANSWER_PHONE_CALLS\",\n BLUETOOTH_ADVERTISE: \"android.permission.BLUETOOTH_ADVERTISE\",\n BLUETOOTH_SCAN: \"android.permission.BLUETOOTH_SCAN\",\n BODY_SENSORS: \"android.permission.BODY_SENSORS\",\n BODY_SENSORS_BACKGROUND: \"android.permission.BODY_SENSORS_BACKGROUND\",\n CALL_PHONE: \"android.permission.CALL_PHONE\",\n GET_ACCOUNTS: \"android.permission.GET_ACCOUNTS\",\n NEARBY_WIFI_DEVICES: \"android.permission.NEARBY_WIFI_DEVICES\",\n PROCESS_OUTGOING_CALLS: \"android.permission.PROCESS_OUTGOING_CALLS\",\n READ_CALL_LOG: \"android.permission.READ_CALL_LOG\",\n READ_EXTERNAL_STORAGE: \"android.permission.READ_EXTERNAL_STORAGE\",\n READ_MEDIA_AUDIO: \"android.permission.READ_MEDIA_AUDIO\",\n READ_MEDIA_IMAGES: \"android.permission.READ_MEDIA_IMAGES\",\n READ_MEDIA_VIDEO: \"android.permission.READ_MEDIA_VIDEO\",\n READ_MEDIA_VISUAL_USER_SELECTED: \"android.permission.READ_MEDIA_VISUAL_USER_SELECTED\",\n READ_PHONE_NUMBERS: \"android.permission.READ_PHONE_NUMBERS\",\n READ_PHONE_STATE: \"android.permission.READ_PHONE_STATE\",\n READ_SMS: \"android.permission.READ_SMS\",\n RECEIVE_MMS: \"android.permission.RECEIVE_MMS\",\n RECEIVE_SMS: \"android.permission.RECEIVE_SMS\",\n RECEIVE_WAP_PUSH: \"android.permission.RECEIVE_WAP_PUSH\",\n SEND_SMS: \"android.permission.SEND_SMS\",\n USE_SIP: \"android.permission.USE_SIP\",\n UWB_RANGING: \"android.permission.UWB_RANGING\",\n WRITE_CALL_LOG: \"android.permission.WRITE_CALL_LOG\",\n WRITE_CONTACTS: \"android.permission.WRITE_CONTACTS\",\n WRITE_EXTERNAL_STORAGE: \"android.permission.WRITE_EXTERNAL_STORAGE\",\n },\n} as const;\n\nexport function createRNPEngine(): PermissionEngine {\n return {\n async check(permission: string): Promise<PermissionStatus> {\n if (permission === \"notifications\") {\n const result = await checkNotifications();\n return result.status as PermissionStatus;\n }\n return (await check(permission as Permission)) as PermissionStatus;\n },\n\n async request(permission: string): Promise<PermissionStatus> {\n if (permission === \"notifications\") {\n const result = await requestNotifications([\"alert\", \"badge\", \"sound\"]);\n return result.status as PermissionStatus;\n }\n return (await request(permission as Permission)) as PermissionStatus;\n },\n\n async openSettings(): Promise<void> {\n await openSettings();\n },\n };\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,0BAAyB;AACzB,sCAOO;AAGP,SAAS,EAAE,KAAa,SAAyB;AAC/C,SAAO,6BAAS,OAAO,EAAE,KAAK,SAAS,SAAS,IAAI,CAAC,KAAK;AAC5D;AAMO,IAAM,cAAc;AAAA;AAAA,EAEzB,QAAQ,EAAE,yBAAyB,2BAA2B;AAAA,EAC9D,YAAY,EAAE,6BAA6B,iCAAiC;AAAA,EAC5E,UAAU,EAAE,2BAA2B,kCAAkC;AAAA,EACzE,WAAW,EAAE,4BAA4B,kCAAkC;AAAA,EAC3E,sBAAsB;AAAA,IACpB;AAAA,IACA;AAAA,EACF;AAAA,EACA,sBAAsB;AAAA,IACpB;AAAA,IACA;AAAA,EACF;AAAA,EACA,iBAAiB;AAAA,IACf;AAAA,IACA;AAAA,EACF;AAAA,EACA,eAAe,EAAE,gCAAgC,sCAAsC;AAAA,EACvF,wBAAwB;AAAA,IACtB;AAAA,IACA;AAAA,EACF;AAAA,EACA,eAAe,EAAE,gCAAgC,qCAAqC;AAAA,EACtF,WAAW,EAAE,4BAA4B,sCAAsC;AAAA,EAC/E,oBAAoB,EAAE,qCAAqC,iCAAiC;AAAA,EAC5F,QAAQ,EAAE,yBAAyB,yCAAyC;AAAA,EAC5E,eAAe;AAAA;AAAA,EAGf,KAAK;AAAA,IACH,2BAA2B;AAAA,IAC3B,SAAS;AAAA,IACT,WAAW;AAAA,IACX,MAAM;AAAA,IACN,UAAU;AAAA,EACZ;AAAA;AAAA,EAGA,SAAS;AAAA,IACP,iBAAiB;AAAA,IACjB,wBAAwB;AAAA,IACxB,uBAAuB;AAAA,IACvB,eAAe;AAAA,IACf,oBAAoB;AAAA,IACpB,qBAAqB;AAAA,IACrB,gBAAgB;AAAA,IAChB,cAAc;AAAA,IACd,yBAAyB;AAAA,IACzB,YAAY;AAAA,IACZ,cAAc;AAAA,IACd,qBAAqB;AAAA,IACrB,wBAAwB;AAAA,IACxB,eAAe;AAAA,IACf,uBAAuB;AAAA,IACvB,kBAAkB;AAAA,IAClB,mBAAmB;AAAA,IACnB,kBAAkB;AAAA,IAClB,iCAAiC;AAAA,IACjC,oBAAoB;AAAA,IACpB,kBAAkB;AAAA,IAClB,UAAU;AAAA,IACV,aAAa;AAAA,IACb,aAAa;AAAA,IACb,kBAAkB;AAAA,IAClB,UAAU;AAAA,IACV,SAAS;AAAA,IACT,aAAa;AAAA,IACb,gBAAgB;AAAA,IAChB,gBAAgB;AAAA,IAChB,wBAAwB;AAAA,EAC1B;AACF;AAEO,SAAS,kBAAoC;AAClD,SAAO;AAAA,IACL,MAAM,MAAM,YAA+C;AACzD,UAAI,eAAe,iBAAiB;AAClC,cAAM,SAAS,UAAM,oDAAmB;AACxC,eAAO,OAAO;AAAA,MAChB;AACA,aAAQ,UAAM,uCAAM,UAAwB;AAAA,IAC9C;AAAA,IAEA,MAAM,QAAQ,YAA+C;AAC3D,UAAI,eAAe,iBAAiB;AAClC,cAAM,SAAS,UAAM,sDAAqB,CAAC,SAAS,SAAS,OAAO,CAAC;AACrE,eAAO,OAAO;AAAA,MAChB;AACA,aAAQ,UAAM,yCAAQ,UAAwB;AAAA,IAChD;AAAA,IAEA,MAAM,eAA8B;AAClC,gBAAM,8CAAa;AAAA,IACrB;AAAA,EACF;AACF;","names":[]}
@@ -2,7 +2,7 @@ import {
2
2
  Permissions,
3
3
  createRNPEngine,
4
4
  init_rnp
5
- } from "../chunk-EU3KPRTI.mjs";
5
+ } from "../chunk-FJ23EV7L.mjs";
6
6
  import "../chunk-NFEGQTCC.mjs";
7
7
  init_rnp();
8
8
  export {
package/dist/index.d.mts CHANGED
@@ -1,5 +1,5 @@
1
- import { P as PermissionEngine, a as PermissionFlowState, b as PermissionFlowEvent, c as PermissionHandlerConfig, d as PermissionHandlerResult, M as MultiplePermissionsConfig, e as MultiplePermissionsResult, f as PermissionCallbacks, g as PrePromptConfig, B as BlockedPromptConfig } from './types-QXyq8VnD.mjs';
2
- export { h as MultiPermissionEntry, i as PermissionStatus } from './types-QXyq8VnD.mjs';
1
+ import { P as PermissionEngine, a as PermissionFlowState, b as PermissionFlowEvent, c as PermissionHandlerConfig, d as PermissionHandlerResult, M as MultiplePermissionsConfig, e as MultiplePermissionsResult, f as PermissionCallbacks, g as PrePromptConfig, B as BlockedPromptConfig } from './types-DwqbbLGD.mjs';
2
+ export { h as MultiPermissionEntry, i as PermissionStatus } from './types-DwqbbLGD.mjs';
3
3
  import * as react_jsx_runtime from 'react/jsx-runtime';
4
4
  import { ReactNode } from 'react';
5
5
 
package/dist/index.d.ts CHANGED
@@ -1,5 +1,5 @@
1
- import { P as PermissionEngine, a as PermissionFlowState, b as PermissionFlowEvent, c as PermissionHandlerConfig, d as PermissionHandlerResult, M as MultiplePermissionsConfig, e as MultiplePermissionsResult, f as PermissionCallbacks, g as PrePromptConfig, B as BlockedPromptConfig } from './types-QXyq8VnD.js';
2
- export { h as MultiPermissionEntry, i as PermissionStatus } from './types-QXyq8VnD.js';
1
+ import { P as PermissionEngine, a as PermissionFlowState, b as PermissionFlowEvent, c as PermissionHandlerConfig, d as PermissionHandlerResult, M as MultiplePermissionsConfig, e as MultiplePermissionsResult, f as PermissionCallbacks, g as PrePromptConfig, B as BlockedPromptConfig } from './types-DwqbbLGD.js';
2
+ export { h as MultiPermissionEntry, i as PermissionStatus } from './types-DwqbbLGD.js';
3
3
  import * as react_jsx_runtime from 'react/jsx-runtime';
4
4
  import { ReactNode } from 'react';
5
5
 
package/dist/index.js CHANGED
@@ -57,6 +57,7 @@ var init_rnp = __esm({
57
57
  import_react_native = require("react-native");
58
58
  import_react_native_permissions = require("react-native-permissions");
59
59
  Permissions = {
60
+ // Cross-platform
60
61
  CAMERA: p("ios.permission.CAMERA", "android.permission.CAMERA"),
61
62
  MICROPHONE: p("ios.permission.MICROPHONE", "android.permission.RECORD_AUDIO"),
62
63
  CONTACTS: p("ios.permission.CONTACTS", "android.permission.READ_CONTACTS"),
@@ -78,8 +79,53 @@ var init_rnp = __esm({
78
79
  "ios.permission.PHOTO_LIBRARY_ADD_ONLY",
79
80
  "android.permission.WRITE_EXTERNAL_STORAGE"
80
81
  ),
82
+ MEDIA_LIBRARY: p("ios.permission.MEDIA_LIBRARY", "android.permission.READ_MEDIA_AUDIO"),
81
83
  BLUETOOTH: p("ios.permission.BLUETOOTH", "android.permission.BLUETOOTH_CONNECT"),
82
- NOTIFICATIONS: "notifications"
84
+ SPEECH_RECOGNITION: p("ios.permission.SPEECH_RECOGNITION", "android.permission.RECORD_AUDIO"),
85
+ MOTION: p("ios.permission.MOTION", "android.permission.ACTIVITY_RECOGNITION"),
86
+ NOTIFICATIONS: "notifications",
87
+ // iOS-only
88
+ IOS: {
89
+ APP_TRACKING_TRANSPARENCY: "ios.permission.APP_TRACKING_TRANSPARENCY",
90
+ FACE_ID: "ios.permission.FACE_ID",
91
+ REMINDERS: "ios.permission.REMINDERS",
92
+ SIRI: "ios.permission.SIRI",
93
+ STOREKIT: "ios.permission.STOREKIT"
94
+ },
95
+ // Android-only
96
+ ANDROID: {
97
+ ACCEPT_HANDOVER: "android.permission.ACCEPT_HANDOVER",
98
+ ACCESS_COARSE_LOCATION: "android.permission.ACCESS_COARSE_LOCATION",
99
+ ACCESS_MEDIA_LOCATION: "android.permission.ACCESS_MEDIA_LOCATION",
100
+ ADD_VOICEMAIL: "com.android.voicemail.permission.ADD_VOICEMAIL",
101
+ ANSWER_PHONE_CALLS: "android.permission.ANSWER_PHONE_CALLS",
102
+ BLUETOOTH_ADVERTISE: "android.permission.BLUETOOTH_ADVERTISE",
103
+ BLUETOOTH_SCAN: "android.permission.BLUETOOTH_SCAN",
104
+ BODY_SENSORS: "android.permission.BODY_SENSORS",
105
+ BODY_SENSORS_BACKGROUND: "android.permission.BODY_SENSORS_BACKGROUND",
106
+ CALL_PHONE: "android.permission.CALL_PHONE",
107
+ GET_ACCOUNTS: "android.permission.GET_ACCOUNTS",
108
+ NEARBY_WIFI_DEVICES: "android.permission.NEARBY_WIFI_DEVICES",
109
+ PROCESS_OUTGOING_CALLS: "android.permission.PROCESS_OUTGOING_CALLS",
110
+ READ_CALL_LOG: "android.permission.READ_CALL_LOG",
111
+ READ_EXTERNAL_STORAGE: "android.permission.READ_EXTERNAL_STORAGE",
112
+ READ_MEDIA_AUDIO: "android.permission.READ_MEDIA_AUDIO",
113
+ READ_MEDIA_IMAGES: "android.permission.READ_MEDIA_IMAGES",
114
+ READ_MEDIA_VIDEO: "android.permission.READ_MEDIA_VIDEO",
115
+ READ_MEDIA_VISUAL_USER_SELECTED: "android.permission.READ_MEDIA_VISUAL_USER_SELECTED",
116
+ READ_PHONE_NUMBERS: "android.permission.READ_PHONE_NUMBERS",
117
+ READ_PHONE_STATE: "android.permission.READ_PHONE_STATE",
118
+ READ_SMS: "android.permission.READ_SMS",
119
+ RECEIVE_MMS: "android.permission.RECEIVE_MMS",
120
+ RECEIVE_SMS: "android.permission.RECEIVE_SMS",
121
+ RECEIVE_WAP_PUSH: "android.permission.RECEIVE_WAP_PUSH",
122
+ SEND_SMS: "android.permission.SEND_SMS",
123
+ USE_SIP: "android.permission.USE_SIP",
124
+ UWB_RANGING: "android.permission.UWB_RANGING",
125
+ WRITE_CALL_LOG: "android.permission.WRITE_CALL_LOG",
126
+ WRITE_CONTACTS: "android.permission.WRITE_CONTACTS",
127
+ WRITE_EXTERNAL_STORAGE: "android.permission.WRITE_EXTERNAL_STORAGE"
128
+ }
83
129
  };
84
130
  }
85
131
  });
@@ -185,6 +231,55 @@ function transition(state, event) {
185
231
  var import_react = require("react");
186
232
  var import_react_native2 = require("react-native");
187
233
 
234
+ // src/core/debug-logger.ts
235
+ var PREFIX = "[permission-handler]";
236
+ var NOOP_LOGGER = {
237
+ transition: () => {
238
+ },
239
+ info: () => {
240
+ }
241
+ };
242
+ function createDebugLogger(debug, permission) {
243
+ if (!debug) return NOOP_LOGGER;
244
+ const log = typeof debug === "function" ? debug : (msg) => console.log(msg);
245
+ return {
246
+ transition(from, to, event) {
247
+ log(`${PREFIX} ${permission}: ${from} \u2192 ${to}${event ? ` (${event})` : ""}`);
248
+ },
249
+ info(msg) {
250
+ log(`${PREFIX} ${permission}: ${msg}`);
251
+ }
252
+ };
253
+ }
254
+
255
+ // src/core/with-timeout.ts
256
+ var PermissionTimeoutError = class extends Error {
257
+ constructor(permission, timeoutMs) {
258
+ super(`Permission request for "${permission}" timed out after ${timeoutMs}ms`);
259
+ this.name = "PermissionTimeoutError";
260
+ this.permission = permission;
261
+ this.timeoutMs = timeoutMs;
262
+ }
263
+ };
264
+ function withTimeout(promise, timeoutMs, permission) {
265
+ return new Promise((resolve, reject) => {
266
+ const timer = setTimeout(
267
+ () => reject(new PermissionTimeoutError(permission, timeoutMs)),
268
+ timeoutMs
269
+ );
270
+ promise.then(
271
+ (val) => {
272
+ clearTimeout(timer);
273
+ resolve(val);
274
+ },
275
+ (err) => {
276
+ clearTimeout(timer);
277
+ reject(err);
278
+ }
279
+ );
280
+ });
281
+ }
282
+
188
283
  // src/engines/rnp-fallback.ts
189
284
  var cachedFallback = null;
190
285
  function getRNPFallbackEngine() {
@@ -217,47 +312,83 @@ function usePermissionHandler(config) {
217
312
  const isRequesting = (0, import_react.useRef)(false);
218
313
  const waitingForSettings = (0, import_react.useRef)(false);
219
314
  const appStateRef = (0, import_react.useRef)(import_react_native2.AppState.currentState);
220
- const { permission, autoCheck = true, onGrant, onDeny, onBlock, onSettingsReturn } = config;
315
+ const {
316
+ permission,
317
+ autoCheck = true,
318
+ requestTimeout,
319
+ onTimeout,
320
+ debug,
321
+ onGrant,
322
+ onDeny,
323
+ onBlock,
324
+ onSettingsReturn
325
+ } = config;
326
+ const logger = createDebugLogger(debug, permission);
221
327
  const checkPermission = (0, import_react.useCallback)(async () => {
222
- setFlowState((s) => transition(s, { type: "CHECK" }));
328
+ setFlowState((s) => {
329
+ const next = transition(s, { type: "CHECK" });
330
+ logger.transition(s, next, "CHECK");
331
+ return next;
332
+ });
223
333
  try {
224
334
  const status = await engine.check(permission);
225
335
  setNativeStatus(status);
226
336
  setFlowState((s) => {
227
337
  const next = transition(s, { type: "CHECK_RESULT", status });
338
+ logger.transition(s, next, `CHECK_RESULT:${status}`);
228
339
  if (next === "granted" && s !== "granted") onGrant?.();
229
340
  return next;
230
341
  });
231
342
  } catch {
232
343
  setFlowState("idle");
233
344
  }
234
- }, [engine, permission, onGrant]);
345
+ }, [engine, permission, logger, onGrant]);
235
346
  const requestPermission = (0, import_react.useCallback)(async () => {
236
347
  if (isRequesting.current) return;
237
348
  isRequesting.current = true;
238
- setFlowState((s) => transition(s, { type: "PRE_PROMPT_CONFIRM" }));
349
+ setFlowState((s) => {
350
+ const next = transition(s, { type: "PRE_PROMPT_CONFIRM" });
351
+ logger.transition(s, next, "PRE_PROMPT_CONFIRM");
352
+ return next;
353
+ });
239
354
  try {
240
- const status = await engine.request(permission);
355
+ const requestPromise = engine.request(permission);
356
+ const status = requestTimeout ? await withTimeout(requestPromise, requestTimeout, permission) : await requestPromise;
241
357
  setNativeStatus(status);
242
358
  setFlowState((s) => {
243
359
  const next = transition(s, { type: "REQUEST_RESULT", status });
360
+ logger.transition(s, next, `REQUEST_RESULT:${status}`);
244
361
  if (next === "granted") onGrant?.();
245
362
  if (next === "denied") onDeny?.();
246
363
  if (next === "blockedPrompt") onBlock?.();
247
364
  return next;
248
365
  });
249
- } catch {
250
- setFlowState("denied");
366
+ } catch (err) {
367
+ if (err instanceof PermissionTimeoutError) {
368
+ logger.info(`request timed out after ${requestTimeout}ms`);
369
+ onTimeout?.();
370
+ setFlowState("blockedPrompt");
371
+ } else {
372
+ setFlowState("denied");
373
+ }
251
374
  } finally {
252
375
  isRequesting.current = false;
253
376
  }
254
- }, [engine, permission, onGrant, onDeny, onBlock]);
377
+ }, [engine, permission, requestTimeout, onTimeout, logger, onGrant, onDeny, onBlock]);
255
378
  const dismiss = (0, import_react.useCallback)(() => {
256
- setFlowState((s) => transition(s, { type: "PRE_PROMPT_DISMISS" }));
379
+ setFlowState((s) => {
380
+ const next = transition(s, { type: "PRE_PROMPT_DISMISS" });
381
+ logger.transition(s, next, "PRE_PROMPT_DISMISS");
382
+ return next;
383
+ });
257
384
  onDeny?.();
258
- }, [onDeny]);
385
+ }, [logger, onDeny]);
259
386
  const goToSettings = (0, import_react.useCallback)(async () => {
260
- setFlowState((s) => transition(s, { type: "OPEN_SETTINGS" }));
387
+ setFlowState((s) => {
388
+ const next = transition(s, { type: "OPEN_SETTINGS" });
389
+ logger.transition(s, next, "OPEN_SETTINGS");
390
+ return next;
391
+ });
261
392
  waitingForSettings.current = true;
262
393
  try {
263
394
  await engine.openSettings();
@@ -265,14 +396,19 @@ function usePermissionHandler(config) {
265
396
  waitingForSettings.current = false;
266
397
  setFlowState("blockedPrompt");
267
398
  }
268
- }, [engine]);
399
+ }, [engine, logger]);
269
400
  const recheckAfterSettings = (0, import_react.useCallback)(async () => {
270
- setFlowState((s) => transition(s, { type: "SETTINGS_RETURN" }));
401
+ setFlowState((s) => {
402
+ const next = transition(s, { type: "SETTINGS_RETURN" });
403
+ logger.transition(s, next, "SETTINGS_RETURN");
404
+ return next;
405
+ });
271
406
  try {
272
407
  const status = await engine.check(permission);
273
408
  setNativeStatus(status);
274
409
  setFlowState((s) => {
275
410
  const next = transition(s, { type: "RECHECK_RESULT", status });
411
+ logger.transition(s, next, `RECHECK_RESULT:${status}`);
276
412
  if (next === "granted") onGrant?.();
277
413
  onSettingsReturn?.(next === "granted");
278
414
  return next;
@@ -280,7 +416,7 @@ function usePermissionHandler(config) {
280
416
  } catch {
281
417
  setFlowState("blockedPrompt");
282
418
  }
283
- }, [engine, permission, onGrant, onSettingsReturn]);
419
+ }, [engine, permission, logger, onGrant, onSettingsReturn]);
284
420
  (0, import_react.useEffect)(() => {
285
421
  if (autoCheck) {
286
422
  checkPermission();
@@ -336,7 +472,16 @@ function statusToFlowState(status) {
336
472
  }
337
473
  function useMultiplePermissions(config) {
338
474
  const engine = resolveEngine(config.engine);
339
- const { permissions, strategy, autoCheck = true, onAllGranted } = config;
475
+ const {
476
+ permissions,
477
+ strategy,
478
+ autoCheck = true,
479
+ requestTimeout,
480
+ onTimeout,
481
+ debug,
482
+ onAllGranted
483
+ } = config;
484
+ const logger = createDebugLogger(debug, "multi");
340
485
  const [statuses, setStatuses] = (0, import_react2.useState)(() => {
341
486
  const initial = {};
342
487
  for (const entry of permissions) {
@@ -350,13 +495,16 @@ function useMultiplePermissions(config) {
350
495
  if (isRunning.current) return;
351
496
  isRunning.current = true;
352
497
  const update = (key, state) => {
353
- setStatuses((prev) => ({ ...prev, [key]: state }));
498
+ setStatuses((prev) => {
499
+ logger.transition(prev[key] ?? "idle", state, key);
500
+ return { ...prev, [key]: state };
501
+ });
354
502
  };
355
503
  try {
356
504
  if (strategy === "sequential") {
357
- await runSequential(permissions, engine, update);
505
+ await runSequential(permissions, engine, update, requestTimeout, onTimeout);
358
506
  } else {
359
- await runParallel(permissions, engine, update);
507
+ await runParallel(permissions, engine, update, requestTimeout, onTimeout);
360
508
  }
361
509
  let allDone = true;
362
510
  for (const entry of permissions) {
@@ -372,7 +520,7 @@ function useMultiplePermissions(config) {
372
520
  } finally {
373
521
  isRunning.current = false;
374
522
  }
375
- }, [permissions, strategy, engine, onAllGranted]);
523
+ }, [permissions, strategy, engine, requestTimeout, onTimeout, logger, onAllGranted]);
376
524
  (0, import_react2.useEffect)(() => {
377
525
  if (!autoCheck) return;
378
526
  let cancelled = false;
@@ -395,7 +543,7 @@ function useMultiplePermissions(config) {
395
543
  request: requestAll
396
544
  };
397
545
  }
398
- async function runSequential(permissions, engine, updateStatus) {
546
+ async function runSequential(permissions, engine, updateStatus, requestTimeout, onTimeout) {
399
547
  for (const entry of permissions) {
400
548
  const key = permissionKey(entry);
401
549
  updateStatus(key, "checking");
@@ -415,22 +563,32 @@ async function runSequential(permissions, engine, updateStatus) {
415
563
  break;
416
564
  }
417
565
  updateStatus(key, "requesting");
418
- const requestStatus = await engine.request(entry.permission);
419
- if (isGrantedStatus(requestStatus)) {
420
- updateStatus(key, "granted");
421
- entry.onGrant?.();
422
- } else if (requestStatus === "blocked") {
423
- updateStatus(key, "blockedPrompt");
424
- entry.onBlock?.();
425
- break;
426
- } else {
427
- updateStatus(key, "denied");
428
- entry.onDeny?.();
429
- break;
566
+ try {
567
+ const requestPromise = engine.request(entry.permission);
568
+ const requestStatus = requestTimeout ? await withTimeout(requestPromise, requestTimeout, entry.permission) : await requestPromise;
569
+ if (isGrantedStatus(requestStatus)) {
570
+ updateStatus(key, "granted");
571
+ entry.onGrant?.();
572
+ } else if (requestStatus === "blocked") {
573
+ updateStatus(key, "blockedPrompt");
574
+ entry.onBlock?.();
575
+ break;
576
+ } else {
577
+ updateStatus(key, "denied");
578
+ entry.onDeny?.();
579
+ break;
580
+ }
581
+ } catch (err) {
582
+ if (err instanceof PermissionTimeoutError) {
583
+ onTimeout?.();
584
+ updateStatus(key, "blockedPrompt");
585
+ break;
586
+ }
587
+ throw err;
430
588
  }
431
589
  }
432
590
  }
433
- async function runParallel(permissions, engine, updateStatus) {
591
+ async function runParallel(permissions, engine, updateStatus, requestTimeout, onTimeout) {
434
592
  const checkResults = await Promise.all(
435
593
  permissions.map(async (entry) => {
436
594
  const key = permissionKey(entry);
@@ -457,16 +615,26 @@ async function runParallel(permissions, engine, updateStatus) {
457
615
  continue;
458
616
  }
459
617
  updateStatus(key, "requesting");
460
- const requestStatus = await engine.request(entry.permission);
461
- if (isGrantedStatus(requestStatus)) {
462
- updateStatus(key, "granted");
463
- entry.onGrant?.();
464
- } else if (requestStatus === "blocked") {
465
- updateStatus(key, "blockedPrompt");
466
- entry.onBlock?.();
467
- } else {
468
- updateStatus(key, "denied");
469
- entry.onDeny?.();
618
+ try {
619
+ const requestPromise = engine.request(entry.permission);
620
+ const requestStatus = requestTimeout ? await withTimeout(requestPromise, requestTimeout, entry.permission) : await requestPromise;
621
+ if (isGrantedStatus(requestStatus)) {
622
+ updateStatus(key, "granted");
623
+ entry.onGrant?.();
624
+ } else if (requestStatus === "blocked") {
625
+ updateStatus(key, "blockedPrompt");
626
+ entry.onBlock?.();
627
+ } else {
628
+ updateStatus(key, "denied");
629
+ entry.onDeny?.();
630
+ }
631
+ } catch (err) {
632
+ if (err instanceof PermissionTimeoutError) {
633
+ onTimeout?.();
634
+ updateStatus(key, "blockedPrompt");
635
+ } else {
636
+ throw err;
637
+ }
470
638
  }
471
639
  }
472
640
  }