@rn-bridge-tools/expo 0.0.7 → 0.0.9

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.
Files changed (66) hide show
  1. package/dist/WebViewBridge.d.ts +22 -0
  2. package/dist/WebViewBridge.d.ts.map +1 -0
  3. package/dist/__tests__/createHandlers.test.d.ts +2 -0
  4. package/dist/__tests__/createHandlers.test.d.ts.map +1 -0
  5. package/dist/createHandlers.d.ts +5 -0
  6. package/dist/createHandlers.d.ts.map +1 -0
  7. package/dist/handlers/auth.d.ts +6 -0
  8. package/dist/handlers/auth.d.ts.map +1 -0
  9. package/dist/handlers/browser.d.ts +6 -0
  10. package/dist/handlers/browser.d.ts.map +1 -0
  11. package/dist/handlers/camera.d.ts +6 -0
  12. package/dist/handlers/camera.d.ts.map +1 -0
  13. package/dist/handlers/clipboard.d.ts +6 -0
  14. package/dist/handlers/clipboard.d.ts.map +1 -0
  15. package/dist/handlers/device.d.ts +7 -0
  16. package/dist/handlers/device.d.ts.map +1 -0
  17. package/dist/handlers/file.d.ts +8 -0
  18. package/dist/handlers/file.d.ts.map +1 -0
  19. package/dist/handlers/haptic.d.ts +7 -0
  20. package/dist/handlers/haptic.d.ts.map +1 -0
  21. package/dist/handlers/iap.d.ts +7 -0
  22. package/dist/handlers/iap.d.ts.map +1 -0
  23. package/dist/handlers/keyboard.d.ts +6 -0
  24. package/dist/handlers/keyboard.d.ts.map +1 -0
  25. package/dist/handlers/location.d.ts +7 -0
  26. package/dist/handlers/location.d.ts.map +1 -0
  27. package/dist/handlers/navigation.d.ts +8 -0
  28. package/dist/handlers/navigation.d.ts.map +1 -0
  29. package/dist/handlers/permission.d.ts +7 -0
  30. package/dist/handlers/permission.d.ts.map +1 -0
  31. package/dist/handlers/preference.d.ts +8 -0
  32. package/dist/handlers/preference.d.ts.map +1 -0
  33. package/dist/handlers/push.d.ts +6 -0
  34. package/dist/handlers/push.d.ts.map +1 -0
  35. package/dist/handlers/scanner.d.ts +5 -0
  36. package/dist/handlers/scanner.d.ts.map +1 -0
  37. package/dist/handlers/share.d.ts +5 -0
  38. package/dist/handlers/share.d.ts.map +1 -0
  39. package/dist/handlers/statusbar.d.ts +7 -0
  40. package/dist/handlers/statusbar.d.ts.map +1 -0
  41. package/dist/index.d.ts +22 -124
  42. package/dist/index.d.ts.map +1 -0
  43. package/package.json +7 -6
  44. package/src/WebViewBridge.tsx +58 -0
  45. package/src/__tests__/createHandlers.test.ts +88 -0
  46. package/src/createHandlers.ts +67 -0
  47. package/src/handlers/auth.ts +69 -0
  48. package/src/handlers/browser.ts +42 -0
  49. package/src/handlers/camera.ts +97 -0
  50. package/src/handlers/clipboard.ts +32 -0
  51. package/src/handlers/device.ts +71 -0
  52. package/src/handlers/file.ts +126 -0
  53. package/src/handlers/haptic.ts +56 -0
  54. package/src/handlers/iap.ts +23 -0
  55. package/src/handlers/keyboard.ts +20 -0
  56. package/src/handlers/location.ts +104 -0
  57. package/src/handlers/navigation.ts +29 -0
  58. package/src/handlers/permission.ts +107 -0
  59. package/src/handlers/preference.ts +58 -0
  60. package/src/handlers/push.ts +47 -0
  61. package/src/handlers/scanner.ts +31 -0
  62. package/src/handlers/share.ts +31 -0
  63. package/src/handlers/statusbar.ts +35 -0
  64. package/src/index.ts +23 -0
  65. package/dist/index.js +0 -846
  66. package/dist/index.js.map +0 -1
package/dist/index.js DELETED
@@ -1,846 +0,0 @@
1
- "use strict";
2
- var __defProp = Object.defineProperty;
3
- var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
- var __getOwnPropNames = Object.getOwnPropertyNames;
5
- var __hasOwnProp = Object.prototype.hasOwnProperty;
6
- var __export = (target, all) => {
7
- for (var name in all)
8
- __defProp(target, name, { get: all[name], enumerable: true });
9
- };
10
- var __copyProps = (to, from, except, desc) => {
11
- if (from && typeof from === "object" || typeof from === "function") {
12
- for (let key of __getOwnPropNames(from))
13
- if (!__hasOwnProp.call(to, key) && key !== except)
14
- __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
- }
16
- return to;
17
- };
18
- var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
-
20
- // src/index.ts
21
- var index_exports = {};
22
- __export(index_exports, {
23
- WebViewBridge: () => WebViewBridge,
24
- authHandlers: () => authHandlers,
25
- browserHandlers: () => browserHandlers,
26
- cameraHandlers: () => cameraHandlers,
27
- clipboardHandlers: () => clipboardHandlers,
28
- createBridgeWebView: () => createBridgeWebView,
29
- createDefaultHandlers: () => createDefaultHandlers,
30
- deviceHandlers: () => deviceHandlers,
31
- fileHandlers: () => fileHandlers,
32
- hapticHandlers: () => hapticHandlers,
33
- iapHandlers: () => iapHandlers,
34
- keyboardHandlers: () => keyboardHandlers,
35
- locationHandlers: () => locationHandlers,
36
- navigationHandlers: () => navigationHandlers,
37
- permissionHandlers: () => permissionHandlers,
38
- preferenceHandlers: () => preferenceHandlers,
39
- pushHandlers: () => pushHandlers,
40
- scannerHandlers: () => scannerHandlers,
41
- shareHandlers: () => shareHandlers,
42
- statusbarHandlers: () => statusbarHandlers
43
- });
44
- module.exports = __toCommonJS(index_exports);
45
-
46
- // src/WebViewBridge.tsx
47
- var import_react = require("react");
48
- var import_react_native = require("@webview-bridge/react-native");
49
- var import_jsx_runtime = require("react/jsx-runtime");
50
- function createBridgeWebView(handlers, customHandlers) {
51
- const allHandlers = {};
52
- const merged = { ...handlers, ...customHandlers };
53
- for (const [key, handler] of Object.entries(merged)) {
54
- if (handler) {
55
- allHandlers[key] = async (...args) => {
56
- const payload = args[0] ?? {};
57
- return handler(payload);
58
- };
59
- }
60
- }
61
- const appBridge = (0, import_react_native.bridge)(allHandlers);
62
- return (0, import_react_native.createWebView)({ bridge: appBridge });
63
- }
64
- var WebViewBridge = (0, import_react.forwardRef)(
65
- function WebViewBridge2({ handlers, customHandlers, ...webViewProps }, ref) {
66
- const setupRef = (0, import_react.useRef)(null);
67
- if (!setupRef.current) {
68
- setupRef.current = createBridgeWebView(handlers, customHandlers);
69
- }
70
- const { WebView: InternalWebView, postMessage } = setupRef.current;
71
- (0, import_react.useImperativeHandle)(
72
- ref,
73
- () => ({
74
- emit: (event, data) => {
75
- postMessage(event, data);
76
- }
77
- }),
78
- [postMessage]
79
- );
80
- return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(InternalWebView, { ...webViewProps });
81
- }
82
- );
83
-
84
- // src/handlers/camera.ts
85
- var cameraHandlers = {
86
- "camera.take": async (payload) => {
87
- let ImagePicker = null;
88
- try {
89
- ImagePicker = require("expo-image-picker");
90
- } catch {
91
- }
92
- if (!ImagePicker) return { success: false, error: "MODULE_NOT_INSTALLED: expo-image-picker" };
93
- const result = await ImagePicker.launchCameraAsync({
94
- quality: payload.quality ?? 0.8,
95
- cameraType: payload.facing === "front" ? ImagePicker.CameraType.front : ImagePicker.CameraType.back,
96
- allowsEditing: payload.allowsEditing ?? false
97
- });
98
- if (result.canceled) {
99
- return { success: false, assets: [] };
100
- }
101
- const asset = result.assets[0];
102
- return {
103
- success: true,
104
- uri: asset.uri,
105
- width: asset.width,
106
- height: asset.height,
107
- fileSize: asset.fileSize,
108
- mimeType: asset.mimeType ?? void 0
109
- };
110
- },
111
- "camera.pickImage": async (payload) => {
112
- let ImagePicker = null;
113
- try {
114
- ImagePicker = require("expo-image-picker");
115
- } catch {
116
- }
117
- if (!ImagePicker) return { success: false, error: "MODULE_NOT_INSTALLED: expo-image-picker" };
118
- const result = await ImagePicker.launchImageLibraryAsync({
119
- allowsMultipleSelection: payload.allowsMultipleSelection ?? false,
120
- quality: payload.quality ?? 0.8,
121
- selectionLimit: payload.maxCount ?? 0
122
- });
123
- if (result.canceled) {
124
- return { success: false, assets: [] };
125
- }
126
- return {
127
- success: true,
128
- assets: result.assets.map((a) => ({
129
- uri: a.uri,
130
- width: a.width,
131
- height: a.height,
132
- fileSize: a.fileSize,
133
- mimeType: a.mimeType ?? void 0
134
- }))
135
- };
136
- }
137
- };
138
-
139
- // src/handlers/location.ts
140
- var watchSubscriptions = /* @__PURE__ */ new Map();
141
- var watchCounter = 0;
142
- var locationHandlers = {
143
- "location.getCurrent": async (payload) => {
144
- let Location = null;
145
- try {
146
- Location = require("expo-location");
147
- } catch {
148
- }
149
- if (!Location) return { success: false, error: "MODULE_NOT_INSTALLED: expo-location" };
150
- const accuracyMap = {
151
- lowest: Location.Accuracy.Lowest,
152
- low: Location.Accuracy.Low,
153
- balanced: Location.Accuracy.Balanced,
154
- high: Location.Accuracy.High,
155
- highest: Location.Accuracy.Highest
156
- };
157
- const result = await Location.getCurrentPositionAsync({
158
- accuracy: accuracyMap[payload.accuracy ?? "balanced"] ?? Location.Accuracy.Balanced
159
- });
160
- return {
161
- lat: result.coords.latitude,
162
- lng: result.coords.longitude,
163
- altitude: result.coords.altitude ?? void 0,
164
- accuracy: result.coords.accuracy ?? void 0,
165
- timestamp: result.timestamp
166
- };
167
- },
168
- "location.watchStart": async (payload) => {
169
- let Location = null;
170
- try {
171
- Location = require("expo-location");
172
- } catch {
173
- }
174
- if (!Location) return { success: false, error: "MODULE_NOT_INSTALLED: expo-location" };
175
- watchCounter += 1;
176
- const watchId = `watch_${watchCounter}`;
177
- const accuracyMap = {
178
- low: Location.Accuracy.Low,
179
- balanced: Location.Accuracy.Balanced,
180
- high: Location.Accuracy.High
181
- };
182
- const subscription = await Location.watchPositionAsync(
183
- {
184
- accuracy: accuracyMap[payload.accuracy ?? "balanced"] ?? Location.Accuracy.Balanced,
185
- distanceInterval: payload.distanceInterval,
186
- timeInterval: payload.timeInterval
187
- },
188
- (_location) => {
189
- }
190
- );
191
- watchSubscriptions.set(watchId, subscription);
192
- return { watchId };
193
- },
194
- "location.watchStop": async (payload) => {
195
- const subscription = watchSubscriptions.get(payload.watchId);
196
- if (subscription) {
197
- subscription.remove();
198
- watchSubscriptions.delete(payload.watchId);
199
- return { success: true };
200
- }
201
- return { success: false };
202
- }
203
- };
204
-
205
- // src/handlers/file.ts
206
- var fileHandlers = {
207
- "file.download": async (payload) => {
208
- let FS = null;
209
- try {
210
- FS = require("expo-file-system");
211
- } catch {
212
- }
213
- if (!FS) return { success: false, error: "MODULE_NOT_INSTALLED: expo-file-system" };
214
- try {
215
- const response = await fetch(payload.url);
216
- const text = await response.text();
217
- const file = new FS.File(FS.Paths.document, payload.filename);
218
- file.write(text);
219
- return { success: true, localUri: file.uri };
220
- } catch (err) {
221
- return { success: false, error: String(err) };
222
- }
223
- },
224
- "file.read": async (payload) => {
225
- let FS = null;
226
- try {
227
- FS = require("expo-file-system");
228
- } catch {
229
- }
230
- if (!FS) return { success: false, error: "MODULE_NOT_INSTALLED: expo-file-system" };
231
- try {
232
- const file = new FS.File(payload.uri);
233
- const content = await file.text();
234
- return { success: true, content };
235
- } catch (err) {
236
- return { success: false, error: String(err) };
237
- }
238
- },
239
- "file.write": async (payload) => {
240
- let FS = null;
241
- try {
242
- FS = require("expo-file-system");
243
- } catch {
244
- }
245
- if (!FS) return { success: false, error: "MODULE_NOT_INSTALLED: expo-file-system" };
246
- try {
247
- const dirMap = {
248
- document: FS.Paths.document,
249
- cache: FS.Paths.cache,
250
- temp: FS.Paths.cache
251
- };
252
- const baseDir = dirMap[payload.directory ?? "document"];
253
- const file = new FS.File(baseDir, payload.filename);
254
- file.write(payload.content);
255
- return { success: true, uri: file.uri };
256
- } catch (err) {
257
- return { success: false, error: String(err) };
258
- }
259
- },
260
- "file.pick": async (payload) => {
261
- let DocumentPicker = null;
262
- try {
263
- DocumentPicker = require("expo-document-picker");
264
- } catch {
265
- }
266
- if (!DocumentPicker) return { success: false, error: "MODULE_NOT_INSTALLED: expo-document-picker" };
267
- try {
268
- const result = await DocumentPicker.getDocumentAsync({
269
- type: payload.type ?? ["*/*"],
270
- multiple: payload.multiple ?? false
271
- });
272
- if (result.canceled) {
273
- return { success: false, files: [] };
274
- }
275
- return {
276
- success: true,
277
- files: result.assets.map((a) => ({
278
- uri: a.uri,
279
- name: a.name,
280
- size: a.size ?? 0,
281
- mimeType: a.mimeType ?? "application/octet-stream"
282
- }))
283
- };
284
- } catch {
285
- return { success: false, files: [] };
286
- }
287
- }
288
- };
289
-
290
- // src/handlers/share.ts
291
- var shareHandlers = {
292
- "share.open": async (payload) => {
293
- let Sharing = null;
294
- try {
295
- Sharing = require("expo-sharing");
296
- } catch {
297
- }
298
- if (!Sharing) return { success: false, error: "MODULE_NOT_INSTALLED: expo-sharing" };
299
- try {
300
- const isAvailable = await Sharing.isAvailableAsync();
301
- if (!isAvailable) {
302
- return { success: false };
303
- }
304
- await Sharing.shareAsync(payload.url ?? "", {
305
- dialogTitle: payload.title
306
- });
307
- return { success: true };
308
- } catch {
309
- return { success: false };
310
- }
311
- }
312
- };
313
-
314
- // src/handlers/device.ts
315
- var import_react_native2 = require("react-native");
316
- var deviceHandlers = {
317
- "device.getInfo": async (_payload) => {
318
- let Device = null;
319
- try {
320
- Device = require("expo-device");
321
- } catch {
322
- }
323
- if (!Device) return { success: false, error: "MODULE_NOT_INSTALLED: expo-device" };
324
- return {
325
- os: import_react_native2.Platform.OS,
326
- osVersion: import_react_native2.Platform.Version?.toString() ?? "",
327
- model: Device.modelName ?? "",
328
- brand: Device.brand ?? "",
329
- isTablet: Device.deviceType === Device.DeviceType.TABLET,
330
- appVersion: "1.0.0",
331
- buildNumber: "1",
332
- bundleId: ""
333
- };
334
- },
335
- "device.getBattery": async (_payload) => {
336
- try {
337
- let Battery = null;
338
- try {
339
- Battery = require("expo-battery");
340
- } catch {
341
- }
342
- if (!Battery) {
343
- return { level: -1, isCharging: false };
344
- }
345
- const level = await Battery.getBatteryLevelAsync();
346
- const state = await Battery.getBatteryStateAsync();
347
- return {
348
- level,
349
- isCharging: state === Battery.BatteryState.CHARGING
350
- };
351
- } catch {
352
- return { level: -1, isCharging: false };
353
- }
354
- },
355
- "device.getNetwork": async (_payload) => {
356
- try {
357
- let NetInfo = null;
358
- try {
359
- NetInfo = require("@react-native-community/netinfo");
360
- } catch {
361
- }
362
- if (!NetInfo) {
363
- return { type: "unknown", isConnected: true };
364
- }
365
- const state = await NetInfo.fetch();
366
- return {
367
- type: state.type ?? "unknown",
368
- isConnected: state.isConnected ?? false
369
- };
370
- } catch {
371
- return { type: "unknown", isConnected: true };
372
- }
373
- }
374
- };
375
-
376
- // src/handlers/statusbar.ts
377
- var import_react_native3 = require("react-native");
378
- var statusbarHandlers = {
379
- "statusbar.setStyle": async (payload) => {
380
- const styleMap = {
381
- light: "light-content",
382
- dark: "dark-content",
383
- auto: "default"
384
- };
385
- import_react_native3.StatusBar.setBarStyle(styleMap[payload.style] ?? "default");
386
- return { success: true };
387
- },
388
- "statusbar.setBackgroundColor": async (payload) => {
389
- import_react_native3.StatusBar.setBackgroundColor(payload.color, payload.animated ?? false);
390
- return { success: true };
391
- },
392
- "statusbar.setHidden": async (payload) => {
393
- const animationMap = {
394
- fade: "fade",
395
- slide: "slide",
396
- none: "none"
397
- };
398
- import_react_native3.StatusBar.setHidden(payload.hidden, animationMap[payload.animation ?? "none"]);
399
- return { success: true };
400
- }
401
- };
402
-
403
- // src/handlers/keyboard.ts
404
- var import_react_native4 = require("react-native");
405
- var keyboardHandlers = {
406
- "keyboard.dismiss": async (_payload) => {
407
- import_react_native4.Keyboard.dismiss();
408
- return { success: true };
409
- },
410
- "keyboard.getState": async (_payload) => {
411
- return {
412
- visible: false,
413
- height: 0
414
- };
415
- }
416
- };
417
-
418
- // src/handlers/haptic.ts
419
- var hapticHandlers = {
420
- "haptic.impact": async (payload) => {
421
- let Haptics = null;
422
- try {
423
- Haptics = require("expo-haptics");
424
- } catch {
425
- }
426
- if (!Haptics) {
427
- return;
428
- }
429
- const styleMap = {
430
- light: Haptics.ImpactFeedbackStyle.Light,
431
- medium: Haptics.ImpactFeedbackStyle.Medium,
432
- heavy: Haptics.ImpactFeedbackStyle.Heavy
433
- };
434
- await Haptics.impactAsync(styleMap[payload.style]);
435
- },
436
- "haptic.notification": async (payload) => {
437
- let Haptics = null;
438
- try {
439
- Haptics = require("expo-haptics");
440
- } catch {
441
- }
442
- if (!Haptics) {
443
- return;
444
- }
445
- const typeMap = {
446
- success: Haptics.NotificationFeedbackType.Success,
447
- warning: Haptics.NotificationFeedbackType.Warning,
448
- error: Haptics.NotificationFeedbackType.Error
449
- };
450
- await Haptics.notificationAsync(typeMap[payload.type]);
451
- },
452
- "haptic.selection": async () => {
453
- let Haptics = null;
454
- try {
455
- Haptics = require("expo-haptics");
456
- } catch {
457
- }
458
- if (!Haptics) {
459
- return;
460
- }
461
- await Haptics.selectionAsync();
462
- }
463
- };
464
-
465
- // src/handlers/clipboard.ts
466
- var clipboardHandlers = {
467
- "clipboard.copy": async (payload) => {
468
- let Clipboard = null;
469
- try {
470
- Clipboard = require("expo-clipboard");
471
- } catch {
472
- }
473
- if (!Clipboard) return { success: false, error: "MODULE_NOT_INSTALLED: expo-clipboard" };
474
- await Clipboard.setStringAsync(payload.text);
475
- return { success: true };
476
- },
477
- "clipboard.paste": async (_payload) => {
478
- let Clipboard = null;
479
- try {
480
- Clipboard = require("expo-clipboard");
481
- } catch {
482
- }
483
- if (!Clipboard) return { success: false, error: "MODULE_NOT_INSTALLED: expo-clipboard" };
484
- const text = await Clipboard.getStringAsync();
485
- return { text, hasContent: text.length > 0 };
486
- }
487
- };
488
-
489
- // src/handlers/scanner.ts
490
- var scannerHandlers = {
491
- "scanner.scanQR": async (_payload) => {
492
- let Camera = null;
493
- try {
494
- Camera = require("expo-camera");
495
- } catch {
496
- }
497
- if (!Camera) return { success: false, error: "MODULE_NOT_INSTALLED: expo-camera" };
498
- try {
499
- const { status } = await Camera.Camera.requestCameraPermissionsAsync();
500
- if (status !== "granted") {
501
- return { success: false, cancelled: true };
502
- }
503
- return { success: false, error: "Use Camera component for QR scanning" };
504
- } catch {
505
- return { success: false };
506
- }
507
- }
508
- };
509
-
510
- // src/handlers/auth.ts
511
- var authHandlers = {
512
- "auth.biometric": async (payload) => {
513
- let LocalAuth = null;
514
- try {
515
- LocalAuth = require("expo-local-authentication");
516
- } catch {
517
- }
518
- if (!LocalAuth) return { success: false, error: "MODULE_NOT_INSTALLED: expo-local-authentication" };
519
- try {
520
- const result = await LocalAuth.authenticateAsync({
521
- promptMessage: payload.promptMessage ?? "Authenticate",
522
- cancelLabel: payload.cancelLabel,
523
- fallbackLabel: payload.fallbackLabel
524
- });
525
- if (result.success) {
526
- return { success: true };
527
- }
528
- return { success: false, error: result.error };
529
- } catch (err) {
530
- return { success: false, error: String(err) };
531
- }
532
- },
533
- "auth.isBiometricAvailable": async (_payload) => {
534
- let LocalAuth = null;
535
- try {
536
- LocalAuth = require("expo-local-authentication");
537
- } catch {
538
- }
539
- if (!LocalAuth) return { success: false, error: "MODULE_NOT_INSTALLED: expo-local-authentication" };
540
- try {
541
- const available = await LocalAuth.hasHardwareAsync();
542
- const types = await LocalAuth.supportedAuthenticationTypesAsync();
543
- let biometryType;
544
- if (types.includes(LocalAuth.AuthenticationType.FACIAL_RECOGNITION)) {
545
- biometryType = "facial";
546
- } else if (types.includes(LocalAuth.AuthenticationType.FINGERPRINT)) {
547
- biometryType = "fingerprint";
548
- } else if (types.includes(LocalAuth.AuthenticationType.IRIS)) {
549
- biometryType = "iris";
550
- }
551
- return { available, biometryType };
552
- } catch {
553
- return { available: false };
554
- }
555
- }
556
- };
557
-
558
- // src/handlers/iap.ts
559
- var iapHandlers = {
560
- "iap.getProducts": async (_payload) => {
561
- return { products: [] };
562
- },
563
- "iap.purchase": async (_payload) => {
564
- return { success: false, error: "IAP not configured" };
565
- },
566
- "iap.restore": async (_payload) => {
567
- return { purchases: [] };
568
- }
569
- };
570
-
571
- // src/handlers/push.ts
572
- var import_react_native5 = require("react-native");
573
- var pushHandlers = {
574
- "push.getToken": async (_payload) => {
575
- let Notifications = null;
576
- try {
577
- Notifications = require("expo-notifications");
578
- } catch {
579
- }
580
- if (!Notifications) return { success: false, error: "MODULE_NOT_INSTALLED: expo-notifications" };
581
- try {
582
- const token = await Notifications.getExpoPushTokenAsync();
583
- return {
584
- token: token.data,
585
- platform: import_react_native5.Platform.OS === "ios" ? "apns" : "fcm"
586
- };
587
- } catch {
588
- return { token: "", platform: import_react_native5.Platform.OS === "ios" ? "apns" : "fcm" };
589
- }
590
- },
591
- "push.requestPermission": async (_payload) => {
592
- let Notifications = null;
593
- try {
594
- Notifications = require("expo-notifications");
595
- } catch {
596
- }
597
- if (!Notifications) return { success: false, error: "MODULE_NOT_INSTALLED: expo-notifications" };
598
- try {
599
- const { status } = await Notifications.requestPermissionsAsync();
600
- return {
601
- granted: status === "granted",
602
- status
603
- };
604
- } catch {
605
- return { granted: false, status: "denied" };
606
- }
607
- }
608
- };
609
-
610
- // src/handlers/permission.ts
611
- var import_react_native6 = require("react-native");
612
- function getPermissionModule(permission) {
613
- switch (permission) {
614
- case "camera": {
615
- let mod = null;
616
- try {
617
- mod = require("expo-camera");
618
- } catch {
619
- }
620
- return mod ? {
621
- check: () => mod.Camera.getCameraPermissionsAsync(),
622
- request: () => mod.Camera.requestCameraPermissionsAsync()
623
- } : null;
624
- }
625
- case "location": {
626
- let mod = null;
627
- try {
628
- mod = require("expo-location");
629
- } catch {
630
- }
631
- return mod ? {
632
- check: () => mod.getForegroundPermissionsAsync(),
633
- request: () => mod.requestForegroundPermissionsAsync()
634
- } : null;
635
- }
636
- case "notifications": {
637
- let mod = null;
638
- try {
639
- mod = require("expo-notifications");
640
- } catch {
641
- }
642
- return mod ? {
643
- check: () => mod.getPermissionsAsync(),
644
- request: () => mod.requestPermissionsAsync()
645
- } : null;
646
- }
647
- default:
648
- return null;
649
- }
650
- }
651
- var permissionHandlers = {
652
- "permission.check": async (payload) => {
653
- const mod = getPermissionModule(payload.permission);
654
- if (!mod) {
655
- return { status: "undetermined", canAskAgain: true };
656
- }
657
- try {
658
- const result = await mod.check();
659
- return {
660
- status: result.status,
661
- canAskAgain: result.canAskAgain ?? true
662
- };
663
- } catch {
664
- return { status: "undetermined", canAskAgain: true };
665
- }
666
- },
667
- "permission.request": async (payload) => {
668
- const mod = getPermissionModule(payload.permission);
669
- if (!mod) {
670
- return { status: "undetermined", canAskAgain: true };
671
- }
672
- try {
673
- const result = await mod.request();
674
- return {
675
- status: result.status,
676
- canAskAgain: result.canAskAgain ?? true
677
- };
678
- } catch {
679
- return { status: "undetermined", canAskAgain: true };
680
- }
681
- },
682
- "permission.openSettings": async (_payload) => {
683
- try {
684
- await import_react_native6.Linking.openSettings();
685
- return { success: true };
686
- } catch {
687
- return { success: false };
688
- }
689
- }
690
- };
691
-
692
- // src/handlers/preference.ts
693
- var preferenceHandlers = {
694
- "preference.get": async (payload) => {
695
- let mod = null;
696
- try {
697
- mod = require("@react-native-async-storage/async-storage");
698
- } catch {
699
- }
700
- if (!mod) return { value: null };
701
- const value = await mod.default.getItem(payload.key);
702
- return { value };
703
- },
704
- "preference.set": async (payload) => {
705
- let mod = null;
706
- try {
707
- mod = require("@react-native-async-storage/async-storage");
708
- } catch {
709
- }
710
- if (!mod) return { success: false };
711
- await mod.default.setItem(payload.key, payload.value);
712
- return { success: true };
713
- },
714
- "preference.remove": async (payload) => {
715
- let mod = null;
716
- try {
717
- mod = require("@react-native-async-storage/async-storage");
718
- } catch {
719
- }
720
- if (!mod) return { success: false };
721
- await mod.default.removeItem(payload.key);
722
- return { success: true };
723
- },
724
- "preference.clear": async (_payload) => {
725
- let mod = null;
726
- try {
727
- mod = require("@react-native-async-storage/async-storage");
728
- } catch {
729
- }
730
- if (!mod) return { success: false };
731
- await mod.default.clear();
732
- return { success: true };
733
- }
734
- };
735
-
736
- // src/handlers/navigation.ts
737
- var navigationHandlers = {
738
- "navigation.goBack": async (_payload) => {
739
- return { success: true };
740
- },
741
- "navigation.push": async (_payload) => {
742
- return { success: true };
743
- },
744
- "navigation.close": async (_payload) => {
745
- return { success: true };
746
- },
747
- "navigation.setSwipeBack": async (_payload) => {
748
- return { success: true };
749
- }
750
- };
751
-
752
- // src/handlers/browser.ts
753
- var import_react_native7 = require("react-native");
754
- var browserHandlers = {
755
- "browser.openExternal": async (payload) => {
756
- try {
757
- await import_react_native7.Linking.openURL(payload.url);
758
- return { success: true };
759
- } catch {
760
- return { success: false };
761
- }
762
- },
763
- "browser.openInternal": async (payload) => {
764
- let WebBrowser = null;
765
- try {
766
- WebBrowser = require("expo-web-browser");
767
- } catch {
768
- }
769
- if (!WebBrowser) return { success: false, error: "MODULE_NOT_INSTALLED: expo-web-browser" };
770
- try {
771
- await WebBrowser.openBrowserAsync(payload.url, {
772
- showTitle: payload.showTitle,
773
- toolbarColor: payload.toolbarColor
774
- });
775
- return { success: true };
776
- } catch {
777
- return { success: false };
778
- }
779
- }
780
- };
781
-
782
- // src/createHandlers.ts
783
- var handlerRegistry = {
784
- camera: cameraHandlers,
785
- location: locationHandlers,
786
- file: fileHandlers,
787
- share: shareHandlers,
788
- device: deviceHandlers,
789
- statusbar: statusbarHandlers,
790
- keyboard: keyboardHandlers,
791
- haptic: hapticHandlers,
792
- clipboard: clipboardHandlers,
793
- scanner: scannerHandlers,
794
- auth: authHandlers,
795
- iap: iapHandlers,
796
- push: pushHandlers,
797
- permission: permissionHandlers,
798
- preference: preferenceHandlers,
799
- navigation: navigationHandlers,
800
- browser: browserHandlers
801
- };
802
- function createDisabledHandler(_namespace, _action) {
803
- return async () => ({
804
- success: false,
805
- error: `not_enabled: ${_namespace}.${_action}`
806
- });
807
- }
808
- function createDefaultHandlers(options = {}) {
809
- const result = {};
810
- for (const [namespace, handlers] of Object.entries(handlerRegistry)) {
811
- const enabled = options[namespace] ?? false;
812
- for (const [action, handler] of Object.entries(handlers)) {
813
- if (enabled) {
814
- result[action] = handler;
815
- } else {
816
- const actionName = action.split(".")[1] ?? action;
817
- result[action] = createDisabledHandler(namespace, actionName);
818
- }
819
- }
820
- }
821
- return result;
822
- }
823
- // Annotate the CommonJS export names for ESM import in node:
824
- 0 && (module.exports = {
825
- WebViewBridge,
826
- authHandlers,
827
- browserHandlers,
828
- cameraHandlers,
829
- clipboardHandlers,
830
- createBridgeWebView,
831
- createDefaultHandlers,
832
- deviceHandlers,
833
- fileHandlers,
834
- hapticHandlers,
835
- iapHandlers,
836
- keyboardHandlers,
837
- locationHandlers,
838
- navigationHandlers,
839
- permissionHandlers,
840
- preferenceHandlers,
841
- pushHandlers,
842
- scannerHandlers,
843
- shareHandlers,
844
- statusbarHandlers
845
- });
846
- //# sourceMappingURL=index.js.map