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.
- package/README.md +107 -15
- package/dist/chunk-FJ23EV7L.mjs +127 -0
- package/dist/chunk-FJ23EV7L.mjs.map +1 -0
- package/dist/engines/expo.d.mts +24 -11
- package/dist/engines/expo.d.ts +24 -11
- package/dist/engines/expo.js +17 -8
- package/dist/engines/expo.js.map +1 -1
- package/dist/engines/expo.mjs +17 -8
- package/dist/engines/expo.mjs.map +1 -1
- package/dist/engines/rnp.d.mts +46 -3
- package/dist/engines/rnp.d.ts +46 -3
- package/dist/engines/rnp.js +47 -1
- package/dist/engines/rnp.js.map +1 -1
- package/dist/engines/rnp.mjs +1 -1
- package/dist/index.d.mts +2 -2
- package/dist/index.d.ts +2 -2
- package/dist/index.js +212 -44
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +166 -44
- package/dist/index.mjs.map +1 -1
- package/dist/{types-QXyq8VnD.d.mts → types-DwqbbLGD.d.mts} +6 -0
- package/dist/{types-QXyq8VnD.d.ts → types-DwqbbLGD.d.ts} +6 -0
- package/package.json +1 -1
- package/src/core/debug-logger.test.ts +67 -0
- package/src/core/debug-logger.ts +29 -0
- package/src/core/with-timeout.test.ts +82 -0
- package/src/core/with-timeout.ts +34 -0
- package/src/engines/expo.test.ts +76 -0
- package/src/engines/expo.ts +44 -15
- package/src/engines/rnp.test.ts +41 -11
- package/src/engines/rnp.ts +50 -2
- package/src/hooks/use-multiple-permissions.ts +71 -29
- package/src/hooks/use-permission-handler.ts +60 -14
- package/src/types.ts +6 -0
- package/dist/chunk-EU3KPRTI.mjs +0 -81
- package/dist/chunk-EU3KPRTI.mjs.map +0 -1
package/dist/engines/rnp.d.ts
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import { P as PermissionEngine } from '../types-
|
|
1
|
+
import { P as PermissionEngine } from '../types-DwqbbLGD.js';
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
|
-
* Cross-platform permission constants
|
|
5
|
-
*
|
|
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
|
|
package/dist/engines/rnp.js
CHANGED
|
@@ -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
|
-
|
|
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 {
|
package/dist/engines/rnp.js.map
CHANGED
|
@@ -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
|
|
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":[]}
|
package/dist/engines/rnp.mjs
CHANGED
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-
|
|
2
|
-
export { h as MultiPermissionEntry, i as PermissionStatus } from './types-
|
|
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-
|
|
2
|
-
export { h as MultiPermissionEntry, i as PermissionStatus } from './types-
|
|
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
|
-
|
|
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 {
|
|
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) =>
|
|
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) =>
|
|
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
|
|
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
|
-
|
|
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) =>
|
|
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) =>
|
|
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) =>
|
|
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 {
|
|
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) =>
|
|
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
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
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
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
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
|
}
|