@oxyhq/services 22.13.0 → 22.13.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.
Files changed (78) hide show
  1. package/lib/commonjs/index.js +74 -0
  2. package/lib/commonjs/index.js.map +1 -1
  3. package/lib/commonjs/notifications/deviceNotifications.js +424 -0
  4. package/lib/commonjs/notifications/deviceNotifications.js.map +1 -0
  5. package/lib/commonjs/ui/components/OxyAuthChooser.js +5 -4
  6. package/lib/commonjs/ui/components/OxyAuthChooser.js.map +1 -1
  7. package/lib/commonjs/ui/components/OxySignInRequestSurface.js +147 -0
  8. package/lib/commonjs/ui/components/OxySignInRequestSurface.js.map +1 -0
  9. package/lib/commonjs/ui/components/authChooser/SignInEntryView.js.map +1 -1
  10. package/lib/commonjs/ui/components/authChooser/SignInRequestView.js +65 -103
  11. package/lib/commonjs/ui/components/authChooser/SignInRequestView.js.map +1 -1
  12. package/lib/commonjs/ui/components/authChooser/TroubleDisclosure.js +0 -2
  13. package/lib/commonjs/ui/components/authChooser/TroubleDisclosure.js.map +1 -1
  14. package/lib/commonjs/ui/components/authChooser/requestSurfaces.js +12 -8
  15. package/lib/commonjs/ui/components/authChooser/requestSurfaces.js.map +1 -1
  16. package/lib/commonjs/ui/components/authChooser/types.js +11 -0
  17. package/lib/commonjs/ui/components/authChooser/types.js.map +1 -1
  18. package/lib/module/index.js +18 -0
  19. package/lib/module/index.js.map +1 -1
  20. package/lib/module/notifications/deviceNotifications.js +414 -0
  21. package/lib/module/notifications/deviceNotifications.js.map +1 -0
  22. package/lib/module/ui/components/OxyAuthChooser.js +5 -4
  23. package/lib/module/ui/components/OxyAuthChooser.js.map +1 -1
  24. package/lib/module/ui/components/OxySignInRequestSurface.js +141 -0
  25. package/lib/module/ui/components/OxySignInRequestSurface.js.map +1 -0
  26. package/lib/module/ui/components/authChooser/SignInEntryView.js.map +1 -1
  27. package/lib/module/ui/components/authChooser/SignInRequestView.js +66 -104
  28. package/lib/module/ui/components/authChooser/SignInRequestView.js.map +1 -1
  29. package/lib/module/ui/components/authChooser/TroubleDisclosure.js +0 -2
  30. package/lib/module/ui/components/authChooser/TroubleDisclosure.js.map +1 -1
  31. package/lib/module/ui/components/authChooser/requestSurfaces.js +12 -8
  32. package/lib/module/ui/components/authChooser/requestSurfaces.js.map +1 -1
  33. package/lib/module/ui/components/authChooser/types.js +11 -0
  34. package/lib/module/ui/components/authChooser/types.js.map +1 -1
  35. package/lib/typescript/commonjs/index.d.ts +5 -0
  36. package/lib/typescript/commonjs/index.d.ts.map +1 -1
  37. package/lib/typescript/commonjs/notifications/deviceNotifications.d.ts +173 -0
  38. package/lib/typescript/commonjs/notifications/deviceNotifications.d.ts.map +1 -0
  39. package/lib/typescript/commonjs/ui/components/OxyAuthChooser.d.ts +5 -3
  40. package/lib/typescript/commonjs/ui/components/OxyAuthChooser.d.ts.map +1 -1
  41. package/lib/typescript/commonjs/ui/components/OxySignInRequestSurface.d.ts +108 -0
  42. package/lib/typescript/commonjs/ui/components/OxySignInRequestSurface.d.ts.map +1 -0
  43. package/lib/typescript/commonjs/ui/components/authChooser/SignInEntryView.d.ts.map +1 -1
  44. package/lib/typescript/commonjs/ui/components/authChooser/SignInRequestView.d.ts +18 -18
  45. package/lib/typescript/commonjs/ui/components/authChooser/SignInRequestView.d.ts.map +1 -1
  46. package/lib/typescript/commonjs/ui/components/authChooser/TroubleDisclosure.d.ts +3 -10
  47. package/lib/typescript/commonjs/ui/components/authChooser/TroubleDisclosure.d.ts.map +1 -1
  48. package/lib/typescript/commonjs/ui/components/authChooser/requestSurfaces.d.ts +7 -3
  49. package/lib/typescript/commonjs/ui/components/authChooser/requestSurfaces.d.ts.map +1 -1
  50. package/lib/typescript/commonjs/ui/components/authChooser/types.d.ts +18 -0
  51. package/lib/typescript/commonjs/ui/components/authChooser/types.d.ts.map +1 -1
  52. package/lib/typescript/module/index.d.ts +5 -0
  53. package/lib/typescript/module/index.d.ts.map +1 -1
  54. package/lib/typescript/module/notifications/deviceNotifications.d.ts +173 -0
  55. package/lib/typescript/module/notifications/deviceNotifications.d.ts.map +1 -0
  56. package/lib/typescript/module/ui/components/OxyAuthChooser.d.ts +5 -3
  57. package/lib/typescript/module/ui/components/OxyAuthChooser.d.ts.map +1 -1
  58. package/lib/typescript/module/ui/components/OxySignInRequestSurface.d.ts +108 -0
  59. package/lib/typescript/module/ui/components/OxySignInRequestSurface.d.ts.map +1 -0
  60. package/lib/typescript/module/ui/components/authChooser/SignInEntryView.d.ts.map +1 -1
  61. package/lib/typescript/module/ui/components/authChooser/SignInRequestView.d.ts +18 -18
  62. package/lib/typescript/module/ui/components/authChooser/SignInRequestView.d.ts.map +1 -1
  63. package/lib/typescript/module/ui/components/authChooser/TroubleDisclosure.d.ts +3 -10
  64. package/lib/typescript/module/ui/components/authChooser/TroubleDisclosure.d.ts.map +1 -1
  65. package/lib/typescript/module/ui/components/authChooser/requestSurfaces.d.ts +7 -3
  66. package/lib/typescript/module/ui/components/authChooser/requestSurfaces.d.ts.map +1 -1
  67. package/lib/typescript/module/ui/components/authChooser/types.d.ts +18 -0
  68. package/lib/typescript/module/ui/components/authChooser/types.d.ts.map +1 -1
  69. package/package.json +15 -5
  70. package/src/index.ts +32 -0
  71. package/src/notifications/deviceNotifications.ts +458 -0
  72. package/src/ui/components/OxyAuthChooser.tsx +5 -4
  73. package/src/ui/components/OxySignInRequestSurface.tsx +202 -0
  74. package/src/ui/components/authChooser/SignInEntryView.tsx +9 -3
  75. package/src/ui/components/authChooser/SignInRequestView.tsx +78 -111
  76. package/src/ui/components/authChooser/TroubleDisclosure.tsx +3 -11
  77. package/src/ui/components/authChooser/requestSurfaces.tsx +14 -10
  78. package/src/ui/components/authChooser/types.ts +19 -0
@@ -117,6 +117,12 @@ Object.defineProperty(exports, "OxySignInButton", {
117
117
  return _OxySignInButton.default;
118
118
  }
119
119
  });
120
+ Object.defineProperty(exports, "OxySignInRequestSurface", {
121
+ enumerable: true,
122
+ get: function () {
123
+ return _OxySignInRequestSurface.OxySignInRequestSurface;
124
+ }
125
+ });
120
126
  Object.defineProperty(exports, "PreferencesScreen", {
121
127
  enumerable: true,
122
128
  get: function () {
@@ -171,18 +177,42 @@ Object.defineProperty(exports, "createProfileMutation", {
171
177
  return _mutationFactory.createProfileMutation;
172
178
  }
173
179
  });
180
+ Object.defineProperty(exports, "ensureNotificationChannel", {
181
+ enumerable: true,
182
+ get: function () {
183
+ return _deviceNotifications.ensureNotificationChannel;
184
+ }
185
+ });
174
186
  Object.defineProperty(exports, "extractErrorMessage", {
175
187
  enumerable: true,
176
188
  get: function () {
177
189
  return _errorHandlers.extractErrorMessage;
178
190
  }
179
191
  });
192
+ Object.defineProperty(exports, "getExpoPushToken", {
193
+ enumerable: true,
194
+ get: function () {
195
+ return _deviceNotifications.getExpoPushToken;
196
+ }
197
+ });
180
198
  Object.defineProperty(exports, "handleAuthError", {
181
199
  enumerable: true,
182
200
  get: function () {
183
201
  return _errorHandlers.handleAuthError;
184
202
  }
185
203
  });
204
+ Object.defineProperty(exports, "hasNotificationPermission", {
205
+ enumerable: true,
206
+ get: function () {
207
+ return _deviceNotifications.hasNotificationPermission;
208
+ }
209
+ });
210
+ Object.defineProperty(exports, "installForegroundNotificationHandler", {
211
+ enumerable: true,
212
+ get: function () {
213
+ return _deviceNotifications.installForegroundNotificationHandler;
214
+ }
215
+ });
186
216
  Object.defineProperty(exports, "invalidateAccountQueries", {
187
217
  enumerable: true,
188
218
  get: function () {
@@ -273,12 +303,24 @@ Object.defineProperty(exports, "openOAuthPopup", {
273
303
  return _oauthPopup.openOAuthPopup;
274
304
  }
275
305
  });
306
+ Object.defineProperty(exports, "pushTokenPlatform", {
307
+ enumerable: true,
308
+ get: function () {
309
+ return _deviceNotifications.pushTokenPlatform;
310
+ }
311
+ });
276
312
  Object.defineProperty(exports, "queryKeys", {
277
313
  enumerable: true,
278
314
  get: function () {
279
315
  return _queryKeys.queryKeys;
280
316
  }
281
317
  });
318
+ Object.defineProperty(exports, "requestNotificationPermission", {
319
+ enumerable: true,
320
+ get: function () {
321
+ return _deviceNotifications.requestNotificationPermission;
322
+ }
323
+ });
282
324
  Object.defineProperty(exports, "setOxyAssetInstance", {
283
325
  enumerable: true,
284
326
  get: function () {
@@ -297,6 +339,18 @@ Object.defineProperty(exports, "subscribeToAccountDialog", {
297
339
  return _accountDialogManager.subscribeToAccountDialog;
298
340
  }
299
341
  });
342
+ Object.defineProperty(exports, "subscribeToNotificationResponses", {
343
+ enumerable: true,
344
+ get: function () {
345
+ return _deviceNotifications.subscribeToNotificationResponses;
346
+ }
347
+ });
348
+ Object.defineProperty(exports, "takeLaunchNotificationData", {
349
+ enumerable: true,
350
+ get: function () {
351
+ return _deviceNotifications.takeLaunchNotificationData;
352
+ }
353
+ });
300
354
  Object.defineProperty(exports, "upsertCachedUser", {
301
355
  enumerable: true,
302
356
  get: function () {
@@ -704,6 +758,7 @@ var _useOnlineStatus = require("./ui/hooks/useOnlineStatus.js");
704
758
  var _useOxyEvent = require("./ui/hooks/useOxyEvent.js");
705
759
  var _errorHandlers = require("./ui/utils/errorHandlers.js");
706
760
  var _useFileFiltering = require("./ui/hooks/useFileFiltering.js");
761
+ var _deviceNotifications = require("./notifications/deviceNotifications.js");
707
762
  var _OxySignInButton = _interopRequireDefault(require("./ui/components/OxySignInButton.js"));
708
763
  var _oauthPopup = require("./ui/oauth/oauthPopup.js");
709
764
  var _OxyAuthPrompt = require("./ui/components/OxyAuthPrompt.js");
@@ -716,6 +771,7 @@ var _LogoIcon = require("./ui/components/logo/LogoIcon.js");
716
771
  var _LogoText = require("./ui/components/logo/LogoText.js");
717
772
  var _ProfileButton = _interopRequireDefault(require("./ui/components/ProfileButton.js"));
718
773
  var _OxyAuthChooser = _interopRequireDefault(require("./ui/components/OxyAuthChooser.js"));
774
+ var _OxySignInRequestSurface = require("./ui/components/OxySignInRequestSurface.js");
719
775
  var _useSwitchableAccounts = require("./ui/hooks/useSwitchableAccounts.js");
720
776
  var _ProfileScreen = _interopRequireDefault(require("./ui/screens/ProfileScreen.js"));
721
777
  var _ManageAccountScreen = _interopRequireDefault(require("./ui/screens/ManageAccountScreen.js"));
@@ -809,6 +865,15 @@ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e
809
865
  // File filtering
810
866
  // ---------------------------------------------------------------------------
811
867
 
868
+ // ---------------------------------------------------------------------------
869
+ // Device notifications (the ONE `expo-notifications` adapter)
870
+ // ---------------------------------------------------------------------------
871
+ // The Expo-side half of push: permission, platform tag, and the EXPO push token
872
+ // `@oxyhq/core`'s `registerPushToken` accepts (never a raw APNs/FCM token).
873
+ // Native-only by construction — every entry point resolves its null/no-op result
874
+ // from `Platform.OS` before `expo-notifications` is ever imported, and both
875
+ // `expo-notifications` and `expo-constants` are OPTIONAL peers.
876
+
812
877
  // ---------------------------------------------------------------------------
813
878
  // UI components
814
879
  // ---------------------------------------------------------------------------
@@ -834,6 +899,15 @@ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e
834
899
  // host (e.g. a future auth.oxy.so hub page) can mount the exact same chooser
835
900
  // with its own completion strategy.
836
901
 
902
+ // The in-flight "Sign in with Oxy" REQUEST surface — the route's primary visual,
903
+ // the progress line, and the "Having trouble?" alternatives — as a purely
904
+ // presentational component driven by plain facts. `OxyAuthChooser` renders it
905
+ // from `AccountDialogController`'s device flow; a host with a request of its own
906
+ // (the auth.oxy.so IdP's OAuth-bound lane) renders the SAME component from its
907
+ // own facts, so there is one implementation of this surface, not two. It needs
908
+ // no controller: `route` + `progress` + `qrPayload` + the failure flags are the
909
+ // whole contract, and none of them is a secret credential.
910
+
837
911
  // Unified switchable-accounts hook — the single source of everything the user
838
912
  // can switch into: device sign-ins AND linked graph accounts (owned orgs +
839
913
  // shared-with-you), deduped by account id and hydrated with real
@@ -1 +1 @@
1
- {"version":3,"names":["_core","require","_reactNative","_OxyProvider","_interopRequireDefault","_OxyContext","_useAuth","_identityBinding","_authStore","_accountStore","_assetStore","_useAssets","_useFileDownloadUrl","_useFollow","_useStorage","_useAccountQueries","_useServicesQueries","_useSecurityQueries","_useAuthMethods","_usePaymentQueries","_useAccountMutations","_useServicesMutations","_mutationFactory","_mutationKeys","_queryKeys","_userCache","_useMutationStatus","_useOnlineStatus","_useOxyEvent","_errorHandlers","_useFileFiltering","_OxySignInButton","_oauthPopup","_OxyAuthPrompt","_OxyOAuthCallback","_OxyConsentScreen","_RequireOxyAuth","_FollowButton","_OxyPayButton","_LogoIcon","_LogoText","_ProfileButton","_OxyAuthChooser","_useSwitchableAccounts","_ProfileScreen","_ManageAccountScreen","_NotificationsScreen","_PreferencesScreen","_ConnectedAppsScreen","_CreateAccountScreen","_AccountMembersScreen","_AccountSettingsScreen","_bottomSheetManager","_useSurfaceHeader","_SurfaceHeaderAction","_accountDialogManager","e","__esModule","default","setPlatformOS","Platform","OS"],"sourceRoot":"../../src","sources":["index.ts"],"mappings":"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GAAAtD,OAAA;AAI8C,SAAAG,uBAAAoD,CAAA,WAAAA,CAAA,IAAAA,CAAA,CAAAC,UAAA,GAAAD,CAAA,KAAAE,OAAA,EAAAF,CAAA;AAlT9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAIA,IAAAG,mBAAa,EAACC,qBAAQ,CAACC,EAAgB,CAAC;;AAExC;AACA;AACA;;AAMA;AACA;AACA;;AAGA;AACA;AACA;;AAgBA;AACA;AACA;;AAOA;AACA;AACA;;AAgCA;;AAeA;AACA;AACA;;AA2BA;;AAGA;AACA;AACA;AACA;AACA;AACA;;AAeA;AACA;AACA;AACA;AACA;;AAIA;;AAMA;AACA;AACA;;AASA;AACA;AACA;;AAIA;AACA;AACA;;AAQA;AACA;AACA;AACA;;AAsBA;AACA;AACA;AACA;AACA;;AAUA;AACA;AACA;;AAIA;AACA;AACA;AACA;AACA;;AAIA;AACA;AACA;AACA;AACA;AACA;;AAIA;;AAOA;;AAKA;AACA;AACA;;AAIA;AACA;AACA;;AAIA;AACA;AACA;AACA","ignoreList":[]}
1
+ {"version":3,"names":["_core","require","_reactNative","_OxyProvider","_interopRequireDefault","_OxyContext","_useAuth","_identityBinding","_authStore","_accountStore","_assetStore","_useAssets","_useFileDownloadUrl","_useFollow","_useStorage","_useAccountQueries","_useServicesQueries","_useSecurityQueries","_useAuthMethods","_usePaymentQueries","_useAccountMutations","_useServicesMutations","_mutationFactory","_mutationKeys","_queryKeys","_userCache","_useMutationStatus","_useOnlineStatus","_useOxyEvent","_errorHandlers","_useFileFiltering","_deviceNotifications","_OxySignInButton","_oauthPopup","_OxyAuthPrompt","_OxyOAuthCallback","_OxyConsentScreen","_RequireOxyAuth","_FollowButton","_OxyPayButton","_LogoIcon","_LogoText","_ProfileButton","_OxyAuthChooser","_OxySignInRequestSurface","_useSwitchableAccounts","_ProfileScreen","_ManageAccountScreen","_NotificationsScreen","_PreferencesScreen","_ConnectedAppsScreen","_CreateAccountScreen","_AccountMembersScreen","_AccountSettingsScreen","_bottomSheetManager","_useSurfaceHeader","_SurfaceHeaderAction","_accountDialogManager","e","__esModule","default","setPlatformOS","Platform","OS"],"sourceRoot":"../../src","sources":["index.ts"],"mappings":"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H,OAAA;AAKA,IAAAqD,mBAAA,GAAArD,OAAA;AAMA,IAAAsD,iBAAA,GAAAtD,OAAA;AACA,IAAAuD,oBAAA,GAAAvD,OAAA;AAMA,IAAAwD,qBAAA,GAAAxD,OAAA;AAI8C,SAAAG,uBAAAsD,CAAA,WAAAA,CAAA,IAAAA,CAAA,CAAAC,UAAA,GAAAD,CAAA,KAAAE,OAAA,EAAAF,CAAA;AAlV9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAIA,IAAAG,mBAAa,EAACC,qBAAQ,CAACC,EAAgB,CAAC;;AAExC;AACA;AACA;;AAMA;AACA;AACA;;AAGA;AACA;AACA;;AAgBA;AACA;AACA;;AAOA;AACA;AACA;;AAgCA;;AAeA;AACA;AACA;;AA2BA;;AAGA;AACA;AACA;AACA;AACA;AACA;;AAeA;AACA;AACA;AACA;AACA;;AAIA;;AAMA;AACA;AACA;;AASA;AACA;AACA;;AAIA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAaA;AACA;AACA;;AAQA;AACA;AACA;AACA;;AAsBA;AACA;AACA;AACA;AACA;;AAUA;AACA;AACA;;AAIA;AACA;AACA;AACA;AACA;;AAIA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAKA;AACA;AACA;AACA;AACA;AACA;;AAIA;;AAOA;;AAKA;AACA;AACA;;AAIA;AACA;AACA;;AAIA;AACA;AACA;AACA","ignoreList":[]}
@@ -0,0 +1,424 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.ensureNotificationChannel = ensureNotificationChannel;
7
+ exports.getExpoPushToken = getExpoPushToken;
8
+ exports.hasNotificationPermission = hasNotificationPermission;
9
+ exports.installForegroundNotificationHandler = installForegroundNotificationHandler;
10
+ exports.pushTokenPlatform = pushTokenPlatform;
11
+ exports.requestNotificationPermission = requestNotificationPermission;
12
+ exports.subscribeToNotificationResponses = subscribeToNotificationResponses;
13
+ exports.takeLaunchNotificationData = takeLaunchNotificationData;
14
+ var _core = require("@oxyhq/core");
15
+ var _reactNative = require("react-native");
16
+ function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); } /**
17
+ * The ONE place `@oxyhq/services` touches `expo-notifications`.
18
+ *
19
+ * Every Oxy app that receives push needs the identical adapter — native-only,
20
+ * dynamically imported, reading the OS permission and minting an EXPO push
21
+ * token — so it lives here instead of being copied into each app. The
22
+ * bearer-authenticated transport (`registerPushToken` / `unregisterPushToken`)
23
+ * already lives in `@oxyhq/core`; core may never import an `expo-*` module, and
24
+ * this adapter is the Expo-side half that closes that gap.
25
+ *
26
+ * ## Native-only by construction
27
+ *
28
+ * Every entry point resolves its null/no-op result from `Platform.OS` BEFORE the
29
+ * dynamic `import()`, so a web bundle never requests `expo-notifications` at all.
30
+ * `expo-notifications` and `expo-constants` are OPTIONAL peer dependencies: an
31
+ * app that does not use push never installs them, and a build without them
32
+ * degrades to "notifications unavailable" rather than throwing at
33
+ * module-evaluation time.
34
+ *
35
+ * ## The token is an EXPO push token — never a raw device token
36
+ *
37
+ * {@link getExpoPushToken} calls `getExpoPushTokenAsync()`, which returns the
38
+ * `ExponentPushToken[…]` handle Expo's push service delivers through — the only
39
+ * form it accepts. `getDevicePushTokenAsync()` — the raw APNs/FCM token — is
40
+ * deliberately NOT used anywhere: registering one of those looks entirely
41
+ * successful (the row is stored, the endpoint returns 200) and then every push
42
+ * silently fails at delivery time. `@oxyhq/core`'s `registerPushToken` rejects a
43
+ * raw device token before sending, and this module is the reason it never has to.
44
+ *
45
+ * ## The payload is untrusted
46
+ *
47
+ * Nothing here surfaces a notification's `title` / `body` / `subtitle`. The only
48
+ * payload that leaves this module is the raw `content.data` — the routing keys —
49
+ * typed `unknown`, so a caller has to validate it before acting on it and there
50
+ * is no exported shape that invites rendering push-delivered text. The
51
+ * foreground handler likewise answers with a visibility verdict and nothing else.
52
+ */
53
+ const log = (0, _core.createLogger)('deviceNotifications');
54
+ function isRecord(value) {
55
+ return typeof value === 'object' && value !== null;
56
+ }
57
+
58
+ /**
59
+ * Load `expo-notifications`, or `null` when it cannot serve this platform/build.
60
+ *
61
+ * The web guard runs before the `import()`, so a web bundle never reaches for the
62
+ * native module. The dynamic import is intentional: the module registry caches
63
+ * it, so repeated calls are cheap and no module-level mutable cache is
64
+ * introduced here.
65
+ */
66
+ async function loadNotifications() {
67
+ if (_reactNative.Platform.OS === 'web') {
68
+ return null;
69
+ }
70
+ try {
71
+ return await Promise.resolve().then(() => _interopRequireWildcard(require('expo-notifications')));
72
+ } catch (error) {
73
+ log.warn('expo-notifications is unavailable in this build — push is disabled', {
74
+ method: 'loadNotifications'
75
+ }, error);
76
+ return null;
77
+ }
78
+ }
79
+
80
+ /**
81
+ * The EAS project id an Expo push token is minted against, or `null` when the
82
+ * app config carries none.
83
+ *
84
+ * Resolved exactly the way `expo-notifications` resolves it internally
85
+ * (`easConfig.projectId`, then `expoConfig.extra.eas.projectId`) and then handed
86
+ * BACK to `getExpoPushTokenAsync` explicitly, so the two can never disagree.
87
+ * Reading it here is what turns "no project id" from an opaque
88
+ * `ERR_NOTIFICATIONS_NO_EXPERIENCE_ID` rejection into a named, actionable state
89
+ * instead of one more entry in the indistinguishable "permission denied /
90
+ * offline" bucket.
91
+ *
92
+ * A missing `expo-constants` lands on the same `null` outcome — the single
93
+ * actionable warning is emitted once by the caller, so this path only records
94
+ * the extra detail at debug level rather than warning twice for one condition.
95
+ */
96
+ async function easProjectId() {
97
+ let constants;
98
+ try {
99
+ constants = (await Promise.resolve().then(() => _interopRequireWildcard(require('expo-constants')))).default;
100
+ } catch (error) {
101
+ log.debug('expo-constants is unavailable in this build — no EAS project id can be resolved', {
102
+ method: 'easProjectId'
103
+ }, error);
104
+ return null;
105
+ }
106
+ const fromEasConfig = constants.easConfig?.projectId;
107
+ if (typeof fromEasConfig === 'string' && fromEasConfig.length > 0) {
108
+ return fromEasConfig;
109
+ }
110
+ const extra = constants.expoConfig?.extra;
111
+ const eas = isRecord(extra) ? extra.eas : undefined;
112
+ const projectId = isRecord(eas) ? eas.projectId : undefined;
113
+ return typeof projectId === 'string' && projectId.length > 0 ? projectId : null;
114
+ }
115
+
116
+ /**
117
+ * The platform tag the push-token registry stores this installation under, or
118
+ * `null` on a platform Oxy does not deliver push to.
119
+ *
120
+ * Synchronous and import-free — the answer is a property of the bundle, not of
121
+ * any native module.
122
+ *
123
+ * Web is `null` on purpose: the registry accepts a `web` platform, but browser
124
+ * push needs a VAPID key + service-worker subscription no Oxy app has wired, so
125
+ * there is no token to register and claiming otherwise would store a row nothing
126
+ * can ever deliver to.
127
+ */
128
+ function pushTokenPlatform() {
129
+ return _reactNative.Platform.OS === 'ios' || _reactNative.Platform.OS === 'android' ? _reactNative.Platform.OS : null;
130
+ }
131
+
132
+ /**
133
+ * Whether the OS notification permission is ALREADY granted.
134
+ *
135
+ * Never prompts, so an app can re-check on every cold boot without ever asking
136
+ * the user twice. Use {@link requestNotificationPermission} for the one place
137
+ * that is allowed to show the system dialog.
138
+ */
139
+ async function hasNotificationPermission() {
140
+ const notifications = await loadNotifications();
141
+ if (!notifications) {
142
+ return false;
143
+ }
144
+ try {
145
+ const permissions = await notifications.getPermissionsAsync();
146
+ return permissions.granted === true;
147
+ } catch (error) {
148
+ log.warn('could not read the notification permission', {
149
+ method: 'hasNotificationPermission'
150
+ }, error);
151
+ return false;
152
+ }
153
+ }
154
+
155
+ /**
156
+ * Ensure the OS notification permission, prompting at most once.
157
+ *
158
+ * An installation that already answered the system dialog is never asked again:
159
+ * an already-granted permission resolves `true` without a second dialog, and a
160
+ * denial with `canAskAgain: false` resolves `false` without issuing a request
161
+ * the OS would silently ignore.
162
+ *
163
+ * @returns Whether notifications are granted once this call is done.
164
+ */
165
+ async function requestNotificationPermission() {
166
+ const notifications = await loadNotifications();
167
+ if (!notifications) {
168
+ return false;
169
+ }
170
+ try {
171
+ const existing = await notifications.getPermissionsAsync();
172
+ if (existing.granted === true) {
173
+ return true;
174
+ }
175
+ if (existing.canAskAgain === false) {
176
+ return false;
177
+ }
178
+ const requested = await notifications.requestPermissionsAsync();
179
+ return requested.granted === true;
180
+ } catch (error) {
181
+ log.warn('the notification permission could not be resolved', {
182
+ method: 'requestNotificationPermission'
183
+ }, error);
184
+ return false;
185
+ }
186
+ }
187
+
188
+ /**
189
+ * This installation's Expo push token (`ExponentPushToken[…]`), or `null` when
190
+ * one cannot be minted.
191
+ *
192
+ * Deliberately `getExpoPushTokenAsync` — see the module header for why the raw
193
+ * device-token variant is never used.
194
+ *
195
+ * Every `null` is logged with the reason it happened. A missing EAS project id
196
+ * in particular is a BUILD MISCONFIGURATION, not a user state: no token can ever
197
+ * be minted, so push is off for every install of that build until the config is
198
+ * fixed. It is reported as such rather than blending into the
199
+ * indistinguishable "permission denied / offline" bucket.
200
+ */
201
+ async function getExpoPushToken() {
202
+ const notifications = await loadNotifications();
203
+ if (!notifications) {
204
+ return null;
205
+ }
206
+ const projectId = await easProjectId();
207
+ if (!projectId) {
208
+ log.warn('no EAS project id in the app config (expo.extra.eas.projectId) — an Expo push token cannot be minted, so push is disabled for this build', {
209
+ method: 'getExpoPushToken'
210
+ });
211
+ return null;
212
+ }
213
+ try {
214
+ const token = await notifications.getExpoPushTokenAsync({
215
+ projectId
216
+ });
217
+ if (token.data.length === 0) {
218
+ log.warn('the Expo push service returned an empty token', {
219
+ method: 'getExpoPushToken'
220
+ });
221
+ return null;
222
+ }
223
+ return token.data;
224
+ } catch (error) {
225
+ log.warn('could not mint an Expo push token', {
226
+ method: 'getExpoPushToken'
227
+ }, error);
228
+ return null;
229
+ }
230
+ }
231
+
232
+ /**
233
+ * Take the payload of the notification that COLD-LAUNCHED the app, if any.
234
+ *
235
+ * "Take" is literal: the response is cleared from `expo-notifications` once
236
+ * read, so a listener attached later in the same launch is not handed the same
237
+ * tap again. Clearing is best-effort across OS/module versions, so a caller that
238
+ * must not act twice still needs its own idempotency ledger.
239
+ *
240
+ * @returns The raw, untrusted `content.data` of the launching notification, or
241
+ * `null`. Parsing/validation is the caller's job.
242
+ */
243
+ async function takeLaunchNotificationData() {
244
+ const notifications = await loadNotifications();
245
+ if (!notifications) {
246
+ return null;
247
+ }
248
+ try {
249
+ const response = notifications.getLastNotificationResponse();
250
+ if (!response) {
251
+ return null;
252
+ }
253
+ const data = response.notification.request.content.data;
254
+ try {
255
+ notifications.clearLastNotificationResponse();
256
+ } catch (clearError) {
257
+ log.warn('could not clear the launching notification response', {
258
+ method: 'takeLaunchNotificationData'
259
+ }, clearError);
260
+ }
261
+ return data;
262
+ } catch (error) {
263
+ log.warn('could not read the launching notification', {
264
+ method: 'takeLaunchNotificationData'
265
+ }, error);
266
+ return null;
267
+ }
268
+ }
269
+
270
+ /**
271
+ * What the OS should do with a notification that arrives while the app is
272
+ * FOREGROUNDED.
273
+ *
274
+ * `'suppress'` is `expo-notifications`' own default for a foregrounded app, so a
275
+ * decision function that only ever returns `'show'` for the payloads it
276
+ * recognises leaves every other notification exactly as it behaves today.
277
+ */
278
+
279
+ /**
280
+ * Whether the process-wide foreground handler has already been ATTEMPTED.
281
+ *
282
+ * `setNotificationHandler` is global, last-writer-wins process state, so this is
283
+ * a one-shot install rather than something a mount/unmount cycle owns. A failed
284
+ * attempt is deliberately not retried: the only failure modes are permanent for
285
+ * the life of the process (web, a build without the native module, a native
286
+ * module that threw on registration).
287
+ *
288
+ * Module-scoped and only ever touched from an async install call — never read
289
+ * during render, so the React Compiler has no memoizable position to freeze it
290
+ * into.
291
+ */
292
+ let foregroundHandlerAttempted = false;
293
+
294
+ /** How prominently Android surfaces a channel's notifications. */
295
+
296
+ /** An Android notification channel this app delivers on. */
297
+
298
+ /**
299
+ * Create (or update) an Android notification channel.
300
+ *
301
+ * A no-op everywhere but Android: iOS has no channels, and web never loads the
302
+ * native module. Call it BEFORE registering a push token, so the very first
303
+ * notification the server sends already has a channel to land on.
304
+ *
305
+ * Failure is non-fatal and logged: a missing channel costs visibility, and
306
+ * refusing to register a token over it would cost the feature entirely.
307
+ *
308
+ * @returns Whether the channel was actually created (`false` off Android, or
309
+ * when the native module is unavailable, or when creation failed).
310
+ */
311
+ async function ensureNotificationChannel(spec) {
312
+ if (_reactNative.Platform.OS !== 'android') {
313
+ return false;
314
+ }
315
+ const notifications = await loadNotifications();
316
+ if (!notifications) {
317
+ return false;
318
+ }
319
+ try {
320
+ await notifications.setNotificationChannelAsync(spec.id, {
321
+ name: spec.name,
322
+ importance: spec.importance === 'high' ? notifications.AndroidImportance.HIGH : notifications.AndroidImportance.DEFAULT,
323
+ ...(spec.description ? {
324
+ description: spec.description
325
+ } : {})
326
+ });
327
+ return true;
328
+ } catch (error) {
329
+ log.warn('could not create the notification channel', {
330
+ method: 'ensureNotificationChannel',
331
+ channelId: spec.id
332
+ }, error);
333
+ return false;
334
+ }
335
+ }
336
+
337
+ /**
338
+ * Install the ONE process-wide handler that decides whether an incoming
339
+ * notification is shown while the app is in the FOREGROUND.
340
+ *
341
+ * Without a handler, `expo-notifications` shows nothing at all while the app is
342
+ * open — which is exactly when a time-critical notification (a "Sign in with
343
+ * Oxy" approval request, say) matters most, because the user is already holding
344
+ * the phone.
345
+ *
346
+ * The handler ONLY decides visibility. It never navigates, never acts on the
347
+ * notification, and never reads the payload for display — `decide` is handed the
348
+ * raw, untrusted `content.data` and may answer nothing but `'show'` /
349
+ * `'suppress'`. Acting on a notification stays with a TAP, routed by
350
+ * {@link subscribeToNotificationResponses}. No notification actions/categories
351
+ * are registered here, so the banner cannot carry an action button.
352
+ *
353
+ * The one-shot latch is set BEFORE the first `await`, so concurrent callers
354
+ * cannot both reach `setNotificationHandler`.
355
+ *
356
+ * @param decide - Maps the raw, untrusted payload to a presentation verdict.
357
+ * Must not throw; a throw is reported by the OS as a handling error and the
358
+ * notification is dropped.
359
+ * @returns Whether a handler was installed by THIS call (`false` on a repeat
360
+ * call, on web, or when the native module is unavailable).
361
+ */
362
+ async function installForegroundNotificationHandler(decide) {
363
+ if (foregroundHandlerAttempted) {
364
+ return false;
365
+ }
366
+ foregroundHandlerAttempted = true;
367
+ const notifications = await loadNotifications();
368
+ if (!notifications) {
369
+ return false;
370
+ }
371
+ try {
372
+ notifications.setNotificationHandler({
373
+ handleNotification: async notification => {
374
+ const data = notification.request.content.data;
375
+ const show = decide(data) === 'show';
376
+ return {
377
+ // Banner: the whole point — make the notification visible on screen.
378
+ shouldShowBanner: show,
379
+ // Notification centre: so the user can still review it after
380
+ // dismissing the banner.
381
+ shouldShowList: show,
382
+ // No sound: the app is foregrounded, so the user is already looking at
383
+ // the screen the banner appears on.
384
+ shouldPlaySound: false,
385
+ // Badging is an app-level unread concept this adapter has no view of.
386
+ shouldSetBadge: false
387
+ };
388
+ }
389
+ });
390
+ return true;
391
+ } catch (error) {
392
+ log.warn('could not install the foreground notification handler', {
393
+ method: 'installForegroundNotificationHandler'
394
+ }, error);
395
+ return false;
396
+ }
397
+ }
398
+
399
+ /**
400
+ * Subscribe to notification TAPS (responses) while the app is running.
401
+ *
402
+ * @param listener - Receives the raw, untrusted `content.data` of the tapped
403
+ * notification. Parsing/validation is the caller's job.
404
+ * @returns An unsubscribe function. Safe to call even if the subscription could
405
+ * not be established.
406
+ */
407
+ async function subscribeToNotificationResponses(listener) {
408
+ const notifications = await loadNotifications();
409
+ if (!notifications) {
410
+ return () => undefined;
411
+ }
412
+ try {
413
+ const subscription = notifications.addNotificationResponseReceivedListener(response => {
414
+ listener(response.notification.request.content.data);
415
+ });
416
+ return () => subscription.remove();
417
+ } catch (error) {
418
+ log.warn('could not subscribe to notification taps', {
419
+ method: 'subscribeToNotificationResponses'
420
+ }, error);
421
+ return () => undefined;
422
+ }
423
+ }
424
+ //# sourceMappingURL=deviceNotifications.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["_core","require","_reactNative","_interopRequireWildcard","e","t","WeakMap","r","n","__esModule","o","i","f","__proto__","default","has","get","set","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","log","createLogger","isRecord","value","loadNotifications","Platform","OS","Promise","resolve","then","error","warn","method","easProjectId","constants","debug","fromEasConfig","easConfig","projectId","length","extra","expoConfig","eas","undefined","pushTokenPlatform","hasNotificationPermission","notifications","permissions","getPermissionsAsync","granted","requestNotificationPermission","existing","canAskAgain","requested","requestPermissionsAsync","getExpoPushToken","token","getExpoPushTokenAsync","data","takeLaunchNotificationData","response","getLastNotificationResponse","notification","request","content","clearLastNotificationResponse","clearError","foregroundHandlerAttempted","ensureNotificationChannel","spec","setNotificationChannelAsync","id","name","importance","AndroidImportance","HIGH","DEFAULT","description","channelId","installForegroundNotificationHandler","decide","setNotificationHandler","handleNotification","show","shouldShowBanner","shouldShowList","shouldPlaySound","shouldSetBadge","subscribeToNotificationResponses","listener","subscription","addNotificationResponseReceivedListener","remove"],"sourceRoot":"../../../src","sources":["notifications/deviceNotifications.ts"],"mappings":"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","ignoreList":[]}
@@ -44,9 +44,11 @@ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e
44
44
  * auto-starts the instant the view is reached, because the request surface
45
45
  * (a QR on an unknown desktop, "Check Commons on your phone" where Oxy could
46
46
  * deliver) IS the primary route there, never something behind a second tap.
47
- * - `qr` → `SignInRequestView` — the ACTIVE REQUEST: the route Oxy chose plus
48
- * honest progress derived only from `snapshot.signIn`. Alternatives stay
49
- * behind "Having trouble?" until the chosen route reports `routeFailed`.
47
+ * - `qr` → `SignInRequestView` — the ACTIVE REQUEST: the controller-bound
48
+ * wiring over the shared, presentational `OxySignInRequestSurface` (the same
49
+ * component the auth.oxy.so IdP mounts from its OAuth-bound request). It maps
50
+ * `snapshot.signIn` onto that surface's props; alternatives stay behind
51
+ * "Having trouble?" until the chosen route reports `routeFailed`.
50
52
  * - `signup` → `SignUpView` — account creation, Commons-first.
51
53
  *
52
54
  * Per-account color re-theming uses Bloom's `APP_COLOR_PRESETS` + `BloomColorScope`
@@ -337,7 +339,6 @@ const OxyAuthChooser = ({
337
339
  if (view === 'qr') {
338
340
  return /*#__PURE__*/(0, _jsxRuntime.jsx)(_SignInRequestView.default, {
339
341
  snapshot: snapshot,
340
- theme: theme,
341
342
  t: t,
342
343
  onRetry: () => void controller.showQr(),
343
344
  alternatives: alternatives