@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.
- package/android/build.gradle +1 -0
- package/android/src/main/java/so/oxy/assets/OxyAssetFilesModule.kt +49 -0
- package/android/src/main/java/so/oxy/assets/StreamSha256.kt +23 -0
- package/android/src/test/java/so/oxy/assets/StreamSha256Test.kt +45 -0
- package/expo-module.config.json +3 -2
- package/ios/OxyAssetFilesModule.swift +72 -0
- package/lib/commonjs/index.js +10 -0
- package/lib/commonjs/index.js.map +1 -1
- package/lib/commonjs/ui/components/OxyDeviceSignIn.js +192 -0
- package/lib/commonjs/ui/components/OxyDeviceSignIn.js.map +1 -0
- package/lib/commonjs/ui/context/OxyContext.js +4 -0
- package/lib/commonjs/ui/context/OxyContext.js.map +1 -1
- package/lib/commonjs/ui/hooks/accountDialogSnapshot.js +1 -0
- package/lib/commonjs/ui/hooks/accountDialogSnapshot.js.map +1 -1
- package/lib/commonjs/ui/index.js +7 -0
- package/lib/commonjs/ui/index.js.map +1 -1
- package/lib/commonjs/ui/utils/nativeAssetFiles.js +11 -0
- package/lib/commonjs/ui/utils/nativeAssetFiles.js.map +1 -0
- package/lib/commonjs/ui/utils/nativeAssetFiles.macos.js +11 -0
- package/lib/commonjs/ui/utils/nativeAssetFiles.macos.js.map +1 -0
- package/lib/commonjs/ui/utils/nativeAssetFiles.native.js +202 -0
- package/lib/commonjs/ui/utils/nativeAssetFiles.native.js.map +1 -0
- package/lib/module/index.js +3 -0
- package/lib/module/index.js.map +1 -1
- package/lib/module/ui/components/OxyDeviceSignIn.js +188 -0
- package/lib/module/ui/components/OxyDeviceSignIn.js.map +1 -0
- package/lib/module/ui/context/OxyContext.js +5 -1
- package/lib/module/ui/context/OxyContext.js.map +1 -1
- package/lib/module/ui/hooks/accountDialogSnapshot.js +1 -0
- package/lib/module/ui/hooks/accountDialogSnapshot.js.map +1 -1
- package/lib/module/ui/index.js +1 -0
- package/lib/module/ui/index.js.map +1 -1
- package/lib/module/ui/utils/nativeAssetFiles.js +7 -0
- package/lib/module/ui/utils/nativeAssetFiles.js.map +1 -0
- package/lib/module/ui/utils/nativeAssetFiles.macos.js +7 -0
- package/lib/module/ui/utils/nativeAssetFiles.macos.js.map +1 -0
- package/lib/module/ui/utils/nativeAssetFiles.native.js +197 -0
- package/lib/module/ui/utils/nativeAssetFiles.native.js.map +1 -0
- package/lib/typescript/commonjs/index.d.ts +2 -0
- package/lib/typescript/commonjs/index.d.ts.map +1 -1
- package/lib/typescript/commonjs/ui/components/OxyDeviceSignIn.d.ts +29 -0
- package/lib/typescript/commonjs/ui/components/OxyDeviceSignIn.d.ts.map +1 -0
- package/lib/typescript/commonjs/ui/context/OxyContext.d.ts.map +1 -1
- package/lib/typescript/commonjs/ui/hooks/accountDialogSnapshot.d.ts.map +1 -1
- package/lib/typescript/commonjs/ui/index.d.ts +2 -0
- package/lib/typescript/commonjs/ui/index.d.ts.map +1 -1
- package/lib/typescript/commonjs/ui/utils/nativeAssetFiles.d.ts +4 -0
- package/lib/typescript/commonjs/ui/utils/nativeAssetFiles.d.ts.map +1 -0
- package/lib/typescript/commonjs/ui/utils/nativeAssetFiles.macos.d.ts +4 -0
- package/lib/typescript/commonjs/ui/utils/nativeAssetFiles.macos.d.ts.map +1 -0
- package/lib/typescript/commonjs/ui/utils/nativeAssetFiles.native.d.ts +4 -0
- package/lib/typescript/commonjs/ui/utils/nativeAssetFiles.native.d.ts.map +1 -0
- package/lib/typescript/module/index.d.ts +2 -0
- package/lib/typescript/module/index.d.ts.map +1 -1
- package/lib/typescript/module/ui/components/OxyDeviceSignIn.d.ts +29 -0
- package/lib/typescript/module/ui/components/OxyDeviceSignIn.d.ts.map +1 -0
- package/lib/typescript/module/ui/context/OxyContext.d.ts.map +1 -1
- package/lib/typescript/module/ui/hooks/accountDialogSnapshot.d.ts.map +1 -1
- package/lib/typescript/module/ui/index.d.ts +2 -0
- package/lib/typescript/module/ui/index.d.ts.map +1 -1
- package/lib/typescript/module/ui/utils/nativeAssetFiles.d.ts +4 -0
- package/lib/typescript/module/ui/utils/nativeAssetFiles.d.ts.map +1 -0
- package/lib/typescript/module/ui/utils/nativeAssetFiles.macos.d.ts +4 -0
- package/lib/typescript/module/ui/utils/nativeAssetFiles.macos.d.ts.map +1 -0
- package/lib/typescript/module/ui/utils/nativeAssetFiles.native.d.ts +4 -0
- package/lib/typescript/module/ui/utils/nativeAssetFiles.native.d.ts.map +1 -0
- package/package.json +5 -4
- package/src/index.ts +4 -0
- package/src/ui/components/OxyDeviceSignIn.tsx +172 -0
- package/src/ui/context/OxyContext.tsx +13 -1
- package/src/ui/hooks/accountDialogSnapshot.ts +1 -0
- package/src/ui/index.ts +2 -0
- package/src/ui/utils/__tests__/nativeAssetFiles.test.ts +270 -0
- package/src/ui/utils/nativeAssetFiles.macos.ts +6 -0
- package/src/ui/utils/nativeAssetFiles.native.ts +212 -0
- package/src/ui/utils/nativeAssetFiles.ts +6 -0
package/android/build.gradle
CHANGED
|
@@ -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
|
+
}
|
package/expo-module.config.json
CHANGED
|
@@ -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
|
+
}
|
package/lib/commonjs/index.js
CHANGED
|
@@ -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":"
|
|
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.
|