@oxy.so/services 13.7.0 → 13.9.0

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 (76) hide show
  1. package/android/build.gradle +1 -0
  2. package/android/src/main/java/so/oxy/assets/OxyAssetFilesModule.kt +49 -0
  3. package/android/src/main/java/so/oxy/assets/StreamSha256.kt +23 -0
  4. package/android/src/test/java/so/oxy/assets/StreamSha256Test.kt +45 -0
  5. package/expo-module.config.json +3 -2
  6. package/ios/OxyAssetFilesModule.swift +72 -0
  7. package/lib/commonjs/index.js +10 -0
  8. package/lib/commonjs/index.js.map +1 -1
  9. package/lib/commonjs/ui/components/OxyDeviceSignIn.js +192 -0
  10. package/lib/commonjs/ui/components/OxyDeviceSignIn.js.map +1 -0
  11. package/lib/commonjs/ui/context/OxyContext.js +4 -0
  12. package/lib/commonjs/ui/context/OxyContext.js.map +1 -1
  13. package/lib/commonjs/ui/hooks/accountDialogSnapshot.js +1 -0
  14. package/lib/commonjs/ui/hooks/accountDialogSnapshot.js.map +1 -1
  15. package/lib/commonjs/ui/index.js +7 -0
  16. package/lib/commonjs/ui/index.js.map +1 -1
  17. package/lib/commonjs/ui/utils/nativeAssetFiles.js +11 -0
  18. package/lib/commonjs/ui/utils/nativeAssetFiles.js.map +1 -0
  19. package/lib/commonjs/ui/utils/nativeAssetFiles.macos.js +11 -0
  20. package/lib/commonjs/ui/utils/nativeAssetFiles.macos.js.map +1 -0
  21. package/lib/commonjs/ui/utils/nativeAssetFiles.native.js +202 -0
  22. package/lib/commonjs/ui/utils/nativeAssetFiles.native.js.map +1 -0
  23. package/lib/module/index.js +3 -0
  24. package/lib/module/index.js.map +1 -1
  25. package/lib/module/ui/components/OxyDeviceSignIn.js +188 -0
  26. package/lib/module/ui/components/OxyDeviceSignIn.js.map +1 -0
  27. package/lib/module/ui/context/OxyContext.js +5 -1
  28. package/lib/module/ui/context/OxyContext.js.map +1 -1
  29. package/lib/module/ui/hooks/accountDialogSnapshot.js +1 -0
  30. package/lib/module/ui/hooks/accountDialogSnapshot.js.map +1 -1
  31. package/lib/module/ui/index.js +1 -0
  32. package/lib/module/ui/index.js.map +1 -1
  33. package/lib/module/ui/utils/nativeAssetFiles.js +7 -0
  34. package/lib/module/ui/utils/nativeAssetFiles.js.map +1 -0
  35. package/lib/module/ui/utils/nativeAssetFiles.macos.js +7 -0
  36. package/lib/module/ui/utils/nativeAssetFiles.macos.js.map +1 -0
  37. package/lib/module/ui/utils/nativeAssetFiles.native.js +197 -0
  38. package/lib/module/ui/utils/nativeAssetFiles.native.js.map +1 -0
  39. package/lib/typescript/commonjs/index.d.ts +2 -0
  40. package/lib/typescript/commonjs/index.d.ts.map +1 -1
  41. package/lib/typescript/commonjs/ui/components/OxyDeviceSignIn.d.ts +29 -0
  42. package/lib/typescript/commonjs/ui/components/OxyDeviceSignIn.d.ts.map +1 -0
  43. package/lib/typescript/commonjs/ui/context/OxyContext.d.ts.map +1 -1
  44. package/lib/typescript/commonjs/ui/hooks/accountDialogSnapshot.d.ts.map +1 -1
  45. package/lib/typescript/commonjs/ui/index.d.ts +2 -0
  46. package/lib/typescript/commonjs/ui/index.d.ts.map +1 -1
  47. package/lib/typescript/commonjs/ui/utils/nativeAssetFiles.d.ts +4 -0
  48. package/lib/typescript/commonjs/ui/utils/nativeAssetFiles.d.ts.map +1 -0
  49. package/lib/typescript/commonjs/ui/utils/nativeAssetFiles.macos.d.ts +4 -0
  50. package/lib/typescript/commonjs/ui/utils/nativeAssetFiles.macos.d.ts.map +1 -0
  51. package/lib/typescript/commonjs/ui/utils/nativeAssetFiles.native.d.ts +4 -0
  52. package/lib/typescript/commonjs/ui/utils/nativeAssetFiles.native.d.ts.map +1 -0
  53. package/lib/typescript/module/index.d.ts +2 -0
  54. package/lib/typescript/module/index.d.ts.map +1 -1
  55. package/lib/typescript/module/ui/components/OxyDeviceSignIn.d.ts +29 -0
  56. package/lib/typescript/module/ui/components/OxyDeviceSignIn.d.ts.map +1 -0
  57. package/lib/typescript/module/ui/context/OxyContext.d.ts.map +1 -1
  58. package/lib/typescript/module/ui/hooks/accountDialogSnapshot.d.ts.map +1 -1
  59. package/lib/typescript/module/ui/index.d.ts +2 -0
  60. package/lib/typescript/module/ui/index.d.ts.map +1 -1
  61. package/lib/typescript/module/ui/utils/nativeAssetFiles.d.ts +4 -0
  62. package/lib/typescript/module/ui/utils/nativeAssetFiles.d.ts.map +1 -0
  63. package/lib/typescript/module/ui/utils/nativeAssetFiles.macos.d.ts +4 -0
  64. package/lib/typescript/module/ui/utils/nativeAssetFiles.macos.d.ts.map +1 -0
  65. package/lib/typescript/module/ui/utils/nativeAssetFiles.native.d.ts +4 -0
  66. package/lib/typescript/module/ui/utils/nativeAssetFiles.native.d.ts.map +1 -0
  67. package/package.json +5 -4
  68. package/src/index.ts +4 -0
  69. package/src/ui/components/OxyDeviceSignIn.tsx +172 -0
  70. package/src/ui/context/OxyContext.tsx +13 -1
  71. package/src/ui/hooks/accountDialogSnapshot.ts +1 -0
  72. package/src/ui/index.ts +2 -0
  73. package/src/ui/utils/__tests__/nativeAssetFiles.test.ts +270 -0
  74. package/src/ui/utils/nativeAssetFiles.macos.ts +6 -0
  75. package/src/ui/utils/nativeAssetFiles.native.ts +212 -0
  76. package/src/ui/utils/nativeAssetFiles.ts +6 -0
@@ -15,6 +15,7 @@ android {
15
15
  }
16
16
 
17
17
  dependencies {
18
+ testImplementation "junit:junit:4.13.2"
18
19
  // Hardware-backed EncryptedSharedPreferences (MasterKey AES256_GCM) for the
19
20
  // device-session and background-session credentials.
20
21
  implementation "androidx.security:security-crypto:1.1.0-alpha06"
@@ -0,0 +1,49 @@
1
+ package so.oxy.assets
2
+
3
+ import android.net.Uri
4
+ import android.os.SystemClock
5
+ import expo.modules.kotlin.exception.Exceptions
6
+ import expo.modules.kotlin.modules.Module
7
+ import expo.modules.kotlin.modules.ModuleDefinition
8
+ import java.util.concurrent.ConcurrentHashMap
9
+ import java.util.concurrent.atomic.AtomicBoolean
10
+
11
+ class OxyAssetFilesModule : Module() {
12
+ private val jobs = ConcurrentHashMap<String, AtomicBoolean>()
13
+
14
+ override fun definition() = ModuleDefinition {
15
+ Name("OxyAssetFiles")
16
+ Events("hashProgress")
17
+ // Register synchronously so cancellation cannot race an enqueued worker.
18
+ Function("createHash") { id: String ->
19
+ check(jobs.putIfAbsent(id, AtomicBoolean(false)) == null) { "Duplicate hash operation" }
20
+ }
21
+ Function("cancelHash") { id: String -> jobs[id]?.set(true) }
22
+ AsyncFunction("hashAsync") { id: String, uriString: String, expectedSize: Double ->
23
+ val cancelled = jobs[id] ?: error("Unknown hash operation")
24
+ try {
25
+ val uri = Uri.parse(uriString)
26
+ require(uri.scheme == "file" || uri.scheme == "content") { "Expected a local file" }
27
+ val context = appContext.reactContext ?: throw Exceptions.ReactContextLost()
28
+ var lastProgress = 0L
29
+ val result = context.contentResolver.openInputStream(uri)?.use { input ->
30
+ streamSha256(input, { cancelled.get() }) { loaded ->
31
+ val now = SystemClock.elapsedRealtime()
32
+ if (now - lastProgress >= 100 || loaded.toDouble() == expectedSize) {
33
+ lastProgress = now
34
+ sendEvent("hashProgress", mapOf("id" to id, "loaded" to loaded.toDouble()))
35
+ }
36
+ }
37
+ } ?: error("Cannot open upload file")
38
+ check(result.second.toDouble() == expectedSize) { "File changed while hashing" }
39
+ result.first
40
+ } finally {
41
+ jobs.remove(id)
42
+ }
43
+ }
44
+ OnDestroy {
45
+ jobs.values.forEach { it.set(true) }
46
+ jobs.clear()
47
+ }
48
+ }
49
+ }
@@ -0,0 +1,23 @@
1
+ package so.oxy.assets
2
+
3
+ import java.io.InputStream
4
+ import java.io.InterruptedIOException
5
+ import java.security.MessageDigest
6
+
7
+ /** Reads on the native worker, without crossing the JS bridge or buffering the file. */
8
+ internal fun streamSha256(input: InputStream, cancelled: () -> Boolean, progress: (Long) -> Unit): Pair<String, Long> {
9
+ val digest = MessageDigest.getInstance("SHA-256")
10
+ val buffer = ByteArray(1024 * 1024)
11
+ var loaded = 0L
12
+ while (true) {
13
+ if (cancelled()) throw InterruptedIOException("Upload hash cancelled")
14
+ val count = input.read(buffer)
15
+ if (count < 0) break
16
+ if (count == 0) continue
17
+ digest.update(buffer, 0, count)
18
+ loaded += count
19
+ progress(loaded)
20
+ }
21
+ if (cancelled()) throw InterruptedIOException("Upload hash cancelled")
22
+ return digest.digest().joinToString("") { "%02x".format(it) } to loaded
23
+ }
@@ -0,0 +1,45 @@
1
+ package so.oxy.assets
2
+
3
+ import java.io.ByteArrayInputStream
4
+ import java.io.InputStream
5
+ import java.io.InterruptedIOException
6
+ import java.security.MessageDigest
7
+ import org.junit.Assert.*
8
+ import org.junit.Test
9
+
10
+ class StreamSha256Test {
11
+ @Test fun knownDigestAndProgress() {
12
+ val progress = mutableListOf<Long>()
13
+ val (digest, size) = streamSha256(ByteArrayInputStream("abc".toByteArray()), { false }, { progress.add(it) })
14
+ assertEquals("ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad", digest)
15
+ assertEquals(3L, size)
16
+ assertEquals(listOf(3L), progress)
17
+ }
18
+ @Test fun largerThanHeapStreamUsesBoundedReads() {
19
+ val size = 370L * 1024 * 1024
20
+ var remaining = size
21
+ val expected = MessageDigest.getInstance("SHA-256")
22
+ val input = object : InputStream() {
23
+ override fun read(): Int = error("Must use bounded blocks")
24
+ override fun read(bytes: ByteArray, offset: Int, count: Int): Int {
25
+ assertTrue(count <= 1024 * 1024)
26
+ if (remaining == 0L) return -1
27
+ val length = minOf(count.toLong(), remaining).toInt()
28
+ bytes.fill(7, offset, offset + length)
29
+ expected.update(bytes, offset, length)
30
+ remaining -= length
31
+ return length
32
+ }
33
+ }
34
+ val result = streamSha256(input, { false }, {})
35
+ assertEquals(size, result.second)
36
+ assertEquals(expected.digest().joinToString("") { "%02x".format(it) }, result.first)
37
+ }
38
+ @Test fun cancellationStopsBeforeReadingAnotherBlock() {
39
+ var cancelled = false
40
+ try {
41
+ streamSha256(ByteArrayInputStream(ByteArray(2 * 1024 * 1024)), { cancelled }, { cancelled = true })
42
+ fail("Expected cancellation")
43
+ } catch (_: InterruptedIOException) { }
44
+ }
45
+ }
@@ -1,13 +1,14 @@
1
1
  {
2
2
  "platforms": ["apple", "android"],
3
3
  "apple": {
4
- "modules": ["OxyIdentityModule"]
4
+ "modules": ["OxyIdentityModule", "OxyAssetFilesModule"]
5
5
  },
6
6
  "android": {
7
7
  "modules": [
8
8
  "so.oxy.identity.OxyIdentityModule",
9
9
  "so.oxy.devicesession.OxyDeviceSessionModule",
10
- "so.oxy.session.OxyBackgroundSessionModule"
10
+ "so.oxy.session.OxyBackgroundSessionModule",
11
+ "so.oxy.assets.OxyAssetFilesModule"
11
12
  ]
12
13
  }
13
14
  }
@@ -0,0 +1,72 @@
1
+ import CryptoKit
2
+ import ExpoModulesCore
3
+ import Foundation
4
+
5
+ public class OxyAssetFilesModule: Module {
6
+ private let lock = NSLock()
7
+ private var jobs: [String: Bool] = [:]
8
+
9
+ private func cancelled(_ id: String) -> Bool {
10
+ lock.lock()
11
+ defer { lock.unlock() }
12
+ return jobs[id] != false
13
+ }
14
+
15
+ public func definition() -> ModuleDefinition {
16
+ Name("OxyAssetFiles")
17
+ Events("hashProgress")
18
+ Function("createHash") { (id: String) in
19
+ self.lock.lock()
20
+ defer { self.lock.unlock() }
21
+ self.jobs[id] = false
22
+ }
23
+ Function("cancelHash") { (id: String) in
24
+ self.lock.lock()
25
+ defer { self.lock.unlock() }
26
+ if self.jobs[id] != nil { self.jobs[id] = true }
27
+ }
28
+ AsyncFunction("hashAsync") { (id: String, uri: String, expectedSize: Double) -> String in
29
+ defer {
30
+ self.lock.lock()
31
+ self.jobs.removeValue(forKey: id)
32
+ self.lock.unlock()
33
+ }
34
+ guard let url = URL(string: uri), url.isFileURL else {
35
+ throw NSError(domain: "OxyAssetFiles", code: 1, userInfo: [NSLocalizedDescriptionKey: "Expected a local file"])
36
+ }
37
+ let input = try FileHandle(forReadingFrom: url)
38
+ defer { try? input.close() }
39
+ var digest = SHA256()
40
+ var loaded = 0
41
+ var lastProgress = ProcessInfo.processInfo.systemUptime
42
+ while true {
43
+ if self.cancelled(id) {
44
+ throw NSError(domain: "OxyAssetFiles", code: 2, userInfo: [NSLocalizedDescriptionKey: "Upload hash cancelled"])
45
+ }
46
+ // Drain Foundation's temporary buffers on every iteration, not at the
47
+ // end of a multi-gigabyte worker invocation.
48
+ let count = try autoreleasepool { () throws -> Int in
49
+ let data = try input.read(upToCount: 1024 * 1024) ?? Data()
50
+ digest.update(data: data)
51
+ return data.count
52
+ }
53
+ if count == 0 { break }
54
+ loaded += count
55
+ let now = ProcessInfo.processInfo.systemUptime
56
+ if now - lastProgress >= 0.1 || Double(loaded) == expectedSize {
57
+ lastProgress = now
58
+ self.sendEvent("hashProgress", ["id": id, "loaded": loaded])
59
+ }
60
+ }
61
+ guard !self.cancelled(id), Double(loaded) == expectedSize else {
62
+ throw NSError(domain: "OxyAssetFiles", code: 3, userInfo: [NSLocalizedDescriptionKey: "Upload cancelled or file changed"])
63
+ }
64
+ return digest.finalize().map { String(format: "%02x", $0) }.joined()
65
+ }.runOnQueue(DispatchQueue.global(qos: .userInitiated))
66
+ OnDestroy {
67
+ self.lock.lock()
68
+ self.jobs.removeAll()
69
+ self.lock.unlock()
70
+ }
71
+ }
72
+ }
@@ -129,6 +129,12 @@ Object.defineProperty(exports, "OxyDeleteAccountPanel", {
129
129
  return _OxyDeleteAccountPanel.OxyDeleteAccountPanel;
130
130
  }
131
131
  });
132
+ Object.defineProperty(exports, "OxyDeviceSignIn", {
133
+ enumerable: true,
134
+ get: function () {
135
+ return _OxyDeviceSignIn.OxyDeviceSignIn;
136
+ }
137
+ });
132
138
  Object.defineProperty(exports, "OxyEmailPanel", {
133
139
  enumerable: true,
134
140
  get: function () {
@@ -937,6 +943,7 @@ var _errorHandlers = require("./ui/utils/errorHandlers.js");
937
943
  var _useFileFiltering = require("./ui/hooks/useFileFiltering.js");
938
944
  var _core = require("@oxy.so/core");
939
945
  var _OxySignInButton = _interopRequireDefault(require("./ui/components/OxySignInButton.js"));
946
+ var _OxyDeviceSignIn = require("./ui/components/OxyDeviceSignIn.js");
940
947
  var _oauthPopup = require("./ui/oauth/oauthPopup.js");
941
948
  var _OxyAuthPrompt = require("./ui/components/OxyAuthPrompt.js");
942
949
  var _OxyOAuthCallback = require("./ui/components/OxyOAuthCallback.js");
@@ -1095,6 +1102,9 @@ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e
1095
1102
  // UI components
1096
1103
  // ---------------------------------------------------------------------------
1097
1104
 
1105
+ // Sign-in on a device with no keyboard (a TV, a photo frame): a large QR any
1106
+ // phone camera opens, the request's https approval page, and the code to compare.
1107
+
1098
1108
  // Web OAuth transport (popup / redirect). RPs that ship their own sign-in
1099
1109
  // button call `useOxy().startWebOAuthSignIn(...)`; only the popup opener is
1100
1110
  // exported, because it MUST run synchronously inside the press handler to keep
@@ -1 +1 @@
1
- {"version":3,"names":["require","_routes","_screenComponents","_OxyProvider","_interopRequireDefault","_OxyContext","_index","_useAuth","_AppAssertionContext","_productAnalytics","_identityBinding","_authStore","_assetStore","_useAssets","_useFileDownloadUrl","_useFollow","_useStorage","_useAccountQueries","_useServicesQueries","_useSecurityQueries","_useAuthMethods","_usePaymentQueries","_useAccountMutations","_useServicesMutations","_mutationFactory","_mutationKeys","_queryKeys","_userCache","_useMutationStatus","_useOnlineStatus","_useOxyEvent","_errorHandlers","_useFileFiltering","_core","_OxySignInButton","_oauthPopup","_OxyAuthPrompt","_OxyOAuthCallback","_OxyConsentScreen","_RequireOxyAuth","_FollowButton","_FollowTargetButton","_followRules","_followLabels","_useFollowTarget","_followTargetStore","_PeableButton","_OxyPayButton","_LogoIcon","_LogoText","_ProfileButton","_OxySignInPanel","_OxySignUpPanel","_OxyAccountPicker","_OxySignInSecurityPanel","_OxyEmailPanel","_OxyDeleteAccountPanel","_OxyLinkCommonsPanel","_OxyPasswordPanel","_OxyAuthenticatorPanel","_OxyAuthScreen","_OxySignInRequestSurface","_useDeviceSwitcher","_bottomSheetManager","_useSurfaceHeader","_SurfaceHeaderAction","_accountDialogManager","_usePersonalPlans","_AccountInvitationAcceptance","_DisplayCurrencySelector","_useDisplayCurrency","_useDisplayPrice","e","__esModule","default","registerScreens","screenComponents"],"sourceRoot":"../../src","sources":["index.ts"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["require","_routes","_screenComponents","_OxyProvider","_interopRequireDefault","_OxyContext","_index","_useAuth","_AppAssertionContext","_productAnalytics","_identityBinding","_authStore","_assetStore","_useAssets","_useFileDownloadUrl","_useFollow","_useStorage","_useAccountQueries","_useServicesQueries","_useSecurityQueries","_useAuthMethods","_usePaymentQueries","_useAccountMutations","_useServicesMutations","_mutationFactory","_mutationKeys","_queryKeys","_userCache","_useMutationStatus","_useOnlineStatus","_useOxyEvent","_errorHandlers","_useFileFiltering","_core","_OxySignInButton","_OxyDeviceSignIn","_oauthPopup","_OxyAuthPrompt","_OxyOAuthCallback","_OxyConsentScreen","_RequireOxyAuth","_FollowButton","_FollowTargetButton","_followRules","_followLabels","_useFollowTarget","_followTargetStore","_PeableButton","_OxyPayButton","_LogoIcon","_LogoText","_ProfileButton","_OxySignInPanel","_OxySignUpPanel","_OxyAccountPicker","_OxySignInSecurityPanel","_OxyEmailPanel","_OxyDeleteAccountPanel","_OxyLinkCommonsPanel","_OxyPasswordPanel","_OxyAuthenticatorPanel","_OxyAuthScreen","_OxySignInRequestSurface","_useDeviceSwitcher","_bottomSheetManager","_useSurfaceHeader","_SurfaceHeaderAction","_accountDialogManager","_usePersonalPlans","_AccountInvitationAcceptance","_DisplayCurrencySelector","_useDisplayCurrency","_useDisplayPrice","e","__esModule","default","registerScreens","screenComponents"],"sourceRoot":"../../src","sources":["index.ts"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,192 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.OxyDeviceSignIn = void 0;
7
+ var _react = require("react");
8
+ var _reactNative = require("react-native");
9
+ var _reactNativeQrcodeSvg = _interopRequireDefault(require("react-native-qrcode-svg"));
10
+ var _button = require("@oxy.so/bloom/button");
11
+ var _code = require("@oxy.so/bloom/code");
12
+ var _RiCheckboxCircleLine = require("@oxy.so/bloom/icons/RiCheckboxCircleLine");
13
+ var _RiRefreshLine = require("@oxy.so/bloom/icons/RiRefreshLine");
14
+ var _loading = require("@oxy.so/bloom/loading");
15
+ var _theme = require("@oxy.so/bloom/theme");
16
+ var _typography = require("@oxy.so/bloom/typography");
17
+ var _oxyRuntimeContext = require("../context/oxyRuntimeContext.js");
18
+ var _useI18n = require("../hooks/useI18n.js");
19
+ var _accountDialogSnapshot = require("../hooks/accountDialogSnapshot.js");
20
+ var _jsxRuntime = require("react/jsx-runtime");
21
+ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
22
+ /**
23
+ * Sign-in for a device with no keyboard — a TV, a photo frame, a kiosk: a large
24
+ * QR that any phone camera opens, and the code to compare on the phone.
25
+ *
26
+ * The QR encodes the request's https approval page
27
+ * (`signIn.approvalUrl`, `auth.oxy.so/device?user_code=…`), not the
28
+ * `oxycommons://` deep link the account dialog shows: whoever scans a frame may
29
+ * not have Commons, and the page works in any phone browser. It prints the same
30
+ * code this surface shows, so the person can check they are approving THIS
31
+ * screen before they press Allow there.
32
+ *
33
+ * It owns one QR-only request (`controller.startInlineQr()`), exactly like the
34
+ * sign-in entry's embedded QR (`signIn/InlineCommonsQr.tsx`): started on mount,
35
+ * renewed when it expires, withdrawn on unmount while it is still approvable.
36
+ * It never pushes to a phone or opens Commons. On approval the controller
37
+ * claims the session and `OxyProvider` signs the app in, so the host simply
38
+ * stops rendering this.
39
+ *
40
+ * Anti-phishing: the plate encodes `signIn.approvalUrl` and the code line shows
41
+ * `signIn.authorizeCode`, both PUBLIC; nothing about the application is read out
42
+ * of either here. The secret `sessionToken` never leaves the controller.
43
+ */
44
+
45
+ /** High-contrast, un-themed on purpose: scan reliability. */const QR_PLATE_BG = '#FFFFFF';
46
+ const QR_FOREGROUND = '#000000';
47
+ /** Big enough to scan from across a room at the default size. */
48
+ const DEFAULT_QR_SIZE = 280;
49
+ /** The quiet zone around the symbol, as a fraction of its size. */
50
+ const PLATE_PADDING_RATIO = 0.06;
51
+ const OxyDeviceSignIn = ({
52
+ size = DEFAULT_QR_SIZE
53
+ }) => {
54
+ const theme = (0, _theme.useTheme)();
55
+ const {
56
+ t
57
+ } = (0, _useI18n.useI18n)();
58
+ const {
59
+ accountDialogController: controller
60
+ } = (0, _oxyRuntimeContext.useOxy)();
61
+ const {
62
+ signIn
63
+ } = (0, _accountDialogSnapshot.useAccountDialogSnapshot)(controller);
64
+ const live = signIn.inline && (signIn.phase === 'starting' || signIn.phase === 'waiting');
65
+ const expired = signIn.inline && signIn.phase === 'error' && signIn.failure === 'expired';
66
+
67
+ // One request for as long as this is on screen. Withdrawn on the way out only
68
+ // while it is still ours and still approvable.
69
+ (0, _react.useEffect)(() => {
70
+ if (!controller) return;
71
+ const {
72
+ signIn: current
73
+ } = controller.getSnapshot();
74
+ if (!(current.inline && (current.phase === 'starting' || current.phase === 'waiting'))) {
75
+ void controller.startInlineQr();
76
+ }
77
+ return () => {
78
+ const {
79
+ signIn: last
80
+ } = controller.getSnapshot();
81
+ if (last.inline && (last.phase === 'starting' || last.phase === 'waiting')) controller.cancelSignIn();
82
+ };
83
+ }, [controller]);
84
+
85
+ // A code only lives a few minutes; an expired one is replaced, not reported.
86
+ (0, _react.useEffect)(() => {
87
+ if (controller && expired) void controller.startInlineQr();
88
+ }, [controller, expired]);
89
+ const padding = Math.round(size * PLATE_PADDING_RATIO);
90
+ const showsCode = live && signIn.approvalUrl && signIn.progress !== 'confirming-identity';
91
+ let plate;
92
+ if (signIn.inline && signIn.progress === 'identity-confirmed') {
93
+ plate = /*#__PURE__*/(0, _jsxRuntime.jsx)(_RiCheckboxCircleLine.RiCheckboxCircleLine, {
94
+ size: "3xl",
95
+ fill: theme.colors.success
96
+ });
97
+ } else if (showsCode && signIn.approvalUrl) {
98
+ plate = /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNativeQrcodeSvg.default, {
99
+ value: signIn.approvalUrl,
100
+ size: size,
101
+ backgroundColor: QR_PLATE_BG,
102
+ color: QR_FOREGROUND
103
+ });
104
+ } else if (live || expired || signIn.inline && signIn.phase === 'completed') {
105
+ plate = /*#__PURE__*/(0, _jsxRuntime.jsx)(_loading.SpinnerIcon, {
106
+ size: Math.round(size / 6),
107
+ color: QR_FOREGROUND
108
+ });
109
+ } else {
110
+ // Failed for a reason renewing will not fix by itself, or superseded and
111
+ // then withdrawn: one press for a new code.
112
+ plate = /*#__PURE__*/(0, _jsxRuntime.jsx)(_button.Button, {
113
+ appearance: "plain",
114
+ tone: "neutral",
115
+ leadingIcon: _RiRefreshLine.RiRefreshLine,
116
+ onPress: () => void controller?.startInlineQr(),
117
+ testID: "device-sign-in-renew",
118
+ children: t('signin.qr.renew')
119
+ });
120
+ }
121
+ return /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
122
+ style: styles.block,
123
+ testID: "oxy-device-sign-in",
124
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_typography.Text, {
125
+ style: [styles.title, {
126
+ color: theme.colors.text
127
+ }],
128
+ children: t('signin.device.title')
129
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_typography.Text, {
130
+ style: [styles.caption, {
131
+ color: theme.colors.textSecondary
132
+ }],
133
+ children: t('signin.device.caption')
134
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.View, {
135
+ style: [styles.plate, {
136
+ width: size + padding * 2,
137
+ height: size + padding * 2,
138
+ padding
139
+ }],
140
+ children: plate
141
+ }), showsCode && signIn.authorizeCode ? /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
142
+ style: styles.codeBlock,
143
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_typography.Text, {
144
+ style: [styles.codeHint, {
145
+ color: theme.colors.textSecondary
146
+ }],
147
+ children: t('signin.device.codeHint')
148
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_code.Code, {
149
+ testID: "device-sign-in-code",
150
+ style: styles.code,
151
+ children: signIn.authorizeCode
152
+ })]
153
+ }) : null]
154
+ });
155
+ };
156
+ exports.OxyDeviceSignIn = OxyDeviceSignIn;
157
+ const styles = _reactNative.StyleSheet.create({
158
+ block: {
159
+ alignItems: 'center',
160
+ gap: 16
161
+ },
162
+ title: {
163
+ fontSize: 28,
164
+ lineHeight: 34,
165
+ fontWeight: '600',
166
+ textAlign: 'center'
167
+ },
168
+ caption: {
169
+ fontSize: 16,
170
+ lineHeight: 22,
171
+ textAlign: 'center'
172
+ },
173
+ plate: {
174
+ borderRadius: 16,
175
+ backgroundColor: QR_PLATE_BG,
176
+ alignItems: 'center',
177
+ justifyContent: 'center'
178
+ },
179
+ codeBlock: {
180
+ alignItems: 'center',
181
+ gap: 4
182
+ },
183
+ codeHint: {
184
+ fontSize: 13,
185
+ lineHeight: 18,
186
+ textAlign: 'center'
187
+ },
188
+ code: {
189
+ fontSize: 14
190
+ }
191
+ });
192
+ //# sourceMappingURL=OxyDeviceSignIn.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["_react","require","_reactNative","_reactNativeQrcodeSvg","_interopRequireDefault","_button","_code","_RiCheckboxCircleLine","_RiRefreshLine","_loading","_theme","_typography","_oxyRuntimeContext","_useI18n","_accountDialogSnapshot","_jsxRuntime","e","__esModule","default","QR_PLATE_BG","QR_FOREGROUND","DEFAULT_QR_SIZE","PLATE_PADDING_RATIO","OxyDeviceSignIn","size","theme","useTheme","t","useI18n","accountDialogController","controller","useOxy","signIn","useAccountDialogSnapshot","live","inline","phase","expired","failure","useEffect","current","getSnapshot","startInlineQr","last","cancelSignIn","padding","Math","round","showsCode","approvalUrl","progress","plate","jsx","RiCheckboxCircleLine","fill","colors","success","value","backgroundColor","color","SpinnerIcon","Button","appearance","tone","leadingIcon","RiRefreshLine","onPress","testID","children","jsxs","View","style","styles","block","Text","title","text","caption","textSecondary","width","height","authorizeCode","codeBlock","codeHint","Code","code","exports","StyleSheet","create","alignItems","gap","fontSize","lineHeight","fontWeight","textAlign","borderRadius","justifyContent"],"sourceRoot":"../../../../src","sources":["ui/components/OxyDeviceSignIn.tsx"],"mappings":"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","ignoreList":[]}
@@ -28,6 +28,7 @@ Object.defineProperty(exports, "useOxyAuthActions", {
28
28
  return _oxyRuntimeContext.useOxyAuthActions;
29
29
  }
30
30
  });
31
+ var _nativeAssetFiles = require("../utils/nativeAssetFiles");
31
32
  var _nativeAuthTransport = require("../oauth/nativeAuthTransport.js");
32
33
  var _isolatedOAuthSession = require("./isolatedOAuthSession.js");
33
34
  var _react = require("react");
@@ -126,6 +127,9 @@ const OxyRuntimeProvider = ({
126
127
  }
127
128
  }
128
129
  const oxyServices = oxyServicesRef.current;
130
+ // Child passive effects may upload immediately on mount. Configure transport
131
+ // during commit, before those effects, without mutating the client in render.
132
+ (0, _react.useLayoutEffect)(() => (0, _nativeAssetFiles.installNativeAssetFiles)(oxyServices), [oxyServices]);
129
133
 
130
134
  // The device-first persisted auth-state store (per-origin device credential on
131
135
  // web; SecureStore session blob on native). Built ONCE per provider mount.