@onekeyfe/react-native-image 3.0.106 → 3.0.107
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/src/main/java/com/margelo/nitro/onekeyimage/OneKeyImage.kt +13 -1
- package/android/src/main/java/com/margelo/nitro/onekeyimage/OneKeyTosUrl.kt +10 -11
- package/android/src/test/java/com/margelo/nitro/onekeyimage/OneKeyImageRequestSignatureTest.kt +10 -1
- package/android/src/test/java/com/margelo/nitro/onekeyimage/OneKeyTosUrlTest.kt +42 -10
- package/ios/OneKeyImage.swift +10 -1
- package/ios/OneKeyTosURL.swift +13 -14
- package/ios/tests/OneKeyTosURLTests.swift +43 -3
- package/lib/module/index.js +3 -1
- package/lib/nitrogen/generated/android/c++/JHybridOneKeyImageSpec.cpp +9 -0
- package/lib/nitrogen/generated/android/c++/JHybridOneKeyImageSpec.hpp +2 -0
- package/lib/nitrogen/generated/android/c++/views/JHybridOneKeyImageStateUpdater.cpp +5 -0
- package/lib/nitrogen/generated/android/kotlin/com/margelo/nitro/onekeyimage/HybridOneKeyImageSpec.kt +6 -0
- package/lib/nitrogen/generated/ios/c++/HybridOneKeyImageSpecSwift.hpp +7 -0
- package/lib/nitrogen/generated/ios/c++/views/HybridOneKeyImageComponent.mm +6 -0
- package/lib/nitrogen/generated/ios/swift/HybridOneKeyImageSpec.swift +1 -0
- package/lib/nitrogen/generated/ios/swift/HybridOneKeyImageSpec_cxx.swift +24 -0
- package/lib/nitrogen/generated/shared/c++/HybridOneKeyImageSpec.cpp +2 -0
- package/lib/nitrogen/generated/shared/c++/HybridOneKeyImageSpec.hpp +2 -0
- package/lib/nitrogen/generated/shared/c++/views/HybridOneKeyImageComponent.cpp +2 -0
- package/lib/nitrogen/generated/shared/c++/views/HybridOneKeyImageComponent.hpp +3 -0
- package/lib/nitrogen/generated/shared/json/OneKeyImageConfig.json +1 -0
- package/lib/typescript/src/OneKeyImage.nitro.d.ts +2 -0
- package/lib/typescript/src/index.d.ts +1 -1
- package/nitrogen/generated/android/c++/JHybridOneKeyImageSpec.cpp +9 -0
- package/nitrogen/generated/android/c++/JHybridOneKeyImageSpec.hpp +2 -0
- package/nitrogen/generated/android/c++/views/JHybridOneKeyImageStateUpdater.cpp +5 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/onekeyimage/HybridOneKeyImageSpec.kt +6 -0
- package/nitrogen/generated/ios/c++/HybridOneKeyImageSpecSwift.hpp +7 -0
- package/nitrogen/generated/ios/c++/views/HybridOneKeyImageComponent.mm +6 -0
- package/nitrogen/generated/ios/swift/HybridOneKeyImageSpec.swift +1 -0
- package/nitrogen/generated/ios/swift/HybridOneKeyImageSpec_cxx.swift +24 -0
- package/nitrogen/generated/shared/c++/HybridOneKeyImageSpec.cpp +2 -0
- package/nitrogen/generated/shared/c++/HybridOneKeyImageSpec.hpp +2 -0
- package/nitrogen/generated/shared/c++/views/HybridOneKeyImageComponent.cpp +2 -0
- package/nitrogen/generated/shared/c++/views/HybridOneKeyImageComponent.hpp +3 -0
- package/nitrogen/generated/shared/json/OneKeyImageConfig.json +1 -0
- package/package.json +2 -2
- package/src/OneKeyImage.nitro.ts +2 -0
- package/src/index.tsx +3 -1
|
@@ -118,6 +118,7 @@ internal fun oneKeyImageRequestSignature(
|
|
|
118
118
|
width: Int,
|
|
119
119
|
height: Int,
|
|
120
120
|
density: Float,
|
|
121
|
+
resizeWidth: Double? = null,
|
|
121
122
|
): String = listOf(
|
|
122
123
|
rawUrl,
|
|
123
124
|
sourceHeadersJson.orEmpty(),
|
|
@@ -126,6 +127,7 @@ internal fun oneKeyImageRequestSignature(
|
|
|
126
127
|
(contentFit ?: OneKeyImageContentFit.COVER).name,
|
|
127
128
|
optimizeTos.toString(),
|
|
128
129
|
overscan.toString(),
|
|
130
|
+
resizeWidth.toString(),
|
|
129
131
|
width.toString(),
|
|
130
132
|
height.toString(),
|
|
131
133
|
density.toString(),
|
|
@@ -223,6 +225,12 @@ class HybridOneKeyImage(private val context: ThemedReactContext) :
|
|
|
223
225
|
field = value
|
|
224
226
|
requestIdentityChanged()
|
|
225
227
|
}
|
|
228
|
+
override var resizeWidth: Double? = null
|
|
229
|
+
set(value) {
|
|
230
|
+
if (field == value) return
|
|
231
|
+
field = value
|
|
232
|
+
requestIdentityChanged()
|
|
233
|
+
}
|
|
226
234
|
override var loadingStrategy: OneKeyImageLoadingStrategy? = OneKeyImageLoadingStrategy.STATIC
|
|
227
235
|
set(value) {
|
|
228
236
|
field = value
|
|
@@ -306,6 +314,7 @@ class HybridOneKeyImage(private val context: ThemedReactContext) :
|
|
|
306
314
|
autoplay = false
|
|
307
315
|
recyclingKey = null
|
|
308
316
|
optimizeTos = true
|
|
317
|
+
resizeWidth = null
|
|
309
318
|
overscan = 1.1
|
|
310
319
|
loadingStrategy = OneKeyImageLoadingStrategy.STATIC
|
|
311
320
|
onLoadStart = null
|
|
@@ -359,6 +368,7 @@ class HybridOneKeyImage(private val context: ThemedReactContext) :
|
|
|
359
368
|
width = hostView.width,
|
|
360
369
|
height = hostView.height,
|
|
361
370
|
density = hostView.resources.displayMetrics.density,
|
|
371
|
+
resizeWidth = resizeWidth,
|
|
362
372
|
)
|
|
363
373
|
if (!force && signature == lastSignature) return
|
|
364
374
|
lastSignature = signature
|
|
@@ -370,9 +380,11 @@ class HybridOneKeyImage(private val context: ThemedReactContext) :
|
|
|
370
380
|
val customIdentity = OneKeyImageModel.headers(sourceHeadersJson).isNotEmpty()
|
|
371
381
|
val optimizedUrl = if (optimizeTos != false) {
|
|
372
382
|
val density = hostView.resources.displayMetrics.density.coerceAtLeast(1f)
|
|
383
|
+
val displaySize = resizeWidth?.takeIf { it.isFinite() && it > 0.0 }
|
|
384
|
+
?: (maxOf(hostView.width, hostView.height) / density.toDouble())
|
|
373
385
|
OneKeyTosUrl.optimized(
|
|
374
386
|
rawUrl,
|
|
375
|
-
ceil(
|
|
387
|
+
ceil(displaySize).toInt(),
|
|
376
388
|
density,
|
|
377
389
|
overscan ?: 1.1,
|
|
378
390
|
customIdentity,
|
|
@@ -3,11 +3,12 @@ package com.margelo.nitro.onekeyimage
|
|
|
3
3
|
import java.net.URI
|
|
4
4
|
import java.net.URLDecoder
|
|
5
5
|
import java.nio.charset.StandardCharsets
|
|
6
|
-
import kotlin.math.ceil
|
|
7
6
|
|
|
8
7
|
internal object OneKeyTosUrl {
|
|
9
|
-
|
|
10
|
-
|
|
8
|
+
// Select by layout size first. Density can only choose between this tier's renditions.
|
|
9
|
+
private val sizeTiers = arrayOf(
|
|
10
|
+
Triple(48, 96, 160), Triple(96, 192, 320), Triple(192, 384, 640),
|
|
11
|
+
Triple(384, 768, 1280), Triple(Int.MAX_VALUE, 1280, 1280),
|
|
11
12
|
)
|
|
12
13
|
|
|
13
14
|
fun optimized(
|
|
@@ -41,14 +42,12 @@ internal object OneKeyTosUrl {
|
|
|
41
42
|
}
|
|
42
43
|
|
|
43
44
|
internal fun selectWidthBucket(displaySize: Int, density: Float, overscan: Double): Int {
|
|
44
|
-
val
|
|
45
|
-
val
|
|
46
|
-
val
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
val requested = requestedPixels.toInt()
|
|
51
|
-
return widthBuckets.firstOrNull { it >= requested } ?: widthBuckets.last()
|
|
45
|
+
val tier = sizeTiers.first { displaySize <= it.first }
|
|
46
|
+
val normalizedDensity = if (density.isFinite()) density.coerceIn(1f, MAX_DPR).toDouble() else 1.0
|
|
47
|
+
val normalizedOverscan = if (overscan.isFinite()) overscan.coerceAtLeast(1.0) else 1.1
|
|
48
|
+
// Fixed renditions already account for the default margin. Custom margins stay within the tier.
|
|
49
|
+
val requestedDensity = normalizedDensity * (normalizedOverscan / 1.1)
|
|
50
|
+
return if (requestedDensity > 2) tier.third else tier.second
|
|
52
51
|
}
|
|
53
52
|
|
|
54
53
|
private fun unsupportedExtension(path: String): Boolean {
|
package/android/src/test/java/com/margelo/nitro/onekeyimage/OneKeyImageRequestSignatureTest.kt
CHANGED
|
@@ -18,7 +18,15 @@ class OneKeyImageRequestSignatureTest {
|
|
|
18
18
|
assertEquals(signature(OneKeyImageContentFit.COVER), signature(null))
|
|
19
19
|
}
|
|
20
20
|
|
|
21
|
-
|
|
21
|
+
@Test
|
|
22
|
+
fun resizeWidthParticipatesInRequestIdentity() {
|
|
23
|
+
assertNotEquals(
|
|
24
|
+
signature(OneKeyImageContentFit.COVER, 32.0),
|
|
25
|
+
signature(OneKeyImageContentFit.COVER, 64.0),
|
|
26
|
+
)
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
private fun signature(contentFit: OneKeyImageContentFit?, resizeWidth: Double? = null): String = oneKeyImageRequestSignature(
|
|
22
30
|
rawUrl = "https://example.com/image.png",
|
|
23
31
|
sourceHeadersJson = null,
|
|
24
32
|
recyclingKey = null,
|
|
@@ -29,5 +37,6 @@ class OneKeyImageRequestSignatureTest {
|
|
|
29
37
|
width = 200,
|
|
30
38
|
height = 100,
|
|
31
39
|
density = 2f,
|
|
40
|
+
resizeWidth = resizeWidth,
|
|
32
41
|
)
|
|
33
42
|
}
|
|
@@ -6,24 +6,56 @@ import org.junit.Test
|
|
|
6
6
|
|
|
7
7
|
class OneKeyTosUrlTest {
|
|
8
8
|
@Test
|
|
9
|
-
fun
|
|
10
|
-
|
|
11
|
-
|
|
9
|
+
fun commonIconsShareRenditionsAfterApplyingScreenDensity() {
|
|
10
|
+
for (size in listOf(32, 40, 48)) {
|
|
11
|
+
for (density in listOf(1f, 2f)) {
|
|
12
|
+
assertEquals(96, OneKeyTosUrl.selectWidthBucket(size, density, 1.1))
|
|
13
|
+
}
|
|
14
|
+
for (density in listOf(2.625f, 3f)) {
|
|
15
|
+
assertEquals(160, OneKeyTosUrl.selectWidthBucket(size, density, 1.1))
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
assertEquals(192, OneKeyTosUrl.selectWidthBucket(64, 2f, 1.1))
|
|
19
|
+
assertEquals(320, OneKeyTosUrl.selectWidthBucket(64, 3f, 1.1))
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
@Test
|
|
23
|
+
fun emitsTheCanonicalEncodedURLAndPreservesSourceQuery() {
|
|
24
|
+
assertEquals(
|
|
25
|
+
"https://common.onekey-asset.com/token.png?foo=a%20b&x-tos-process=image%2Fresize%2Cw_160#preview",
|
|
26
|
+
OneKeyTosUrl.optimized(
|
|
27
|
+
"https://common.onekey-asset.com/token.png?foo=a%20b#preview", 32, 3f, 1.1, false,
|
|
28
|
+
),
|
|
29
|
+
)
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
@Test
|
|
33
|
+
fun selectsLayoutTierBeforeDensityAndKeepsOverscanWithinIt() {
|
|
34
|
+
for ((size, standard, highDensity) in listOf(
|
|
35
|
+
Triple(48, 96, 160), Triple(49, 192, 320), Triple(96, 192, 320),
|
|
36
|
+
Triple(97, 384, 640), Triple(192, 384, 640), Triple(193, 768, 1280),
|
|
37
|
+
Triple(384, 768, 1280), Triple(385, 1280, 1280),
|
|
38
|
+
)) {
|
|
39
|
+
assertEquals(standard, OneKeyTosUrl.selectWidthBucket(size, 2f, 1.1))
|
|
40
|
+
assertEquals(highDensity, OneKeyTosUrl.selectWidthBucket(size, 2.625f, 1.1))
|
|
41
|
+
}
|
|
42
|
+
assertEquals(160, OneKeyTosUrl.selectWidthBucket(48, 2f, 2.0))
|
|
43
|
+
assertEquals(384, OneKeyTosUrl.selectWidthBucket(160, 1f, 1.0))
|
|
12
44
|
}
|
|
13
45
|
|
|
14
46
|
@Test
|
|
15
47
|
fun capsDprAndSelectionAtLargestBucket() {
|
|
16
|
-
assertEquals(
|
|
48
|
+
assertEquals(640, OneKeyTosUrl.selectWidthBucket(100, 5f, 1.1))
|
|
17
49
|
assertEquals(1280, OneKeyTosUrl.selectWidthBucket(2000, 3f, 1.1))
|
|
18
50
|
}
|
|
19
51
|
|
|
20
52
|
@Test
|
|
21
53
|
fun normalizesNonFiniteDensityAndOverscan() {
|
|
22
|
-
assertEquals(
|
|
23
|
-
assertEquals(
|
|
24
|
-
assertEquals(
|
|
25
|
-
assertEquals(
|
|
26
|
-
assertEquals(
|
|
54
|
+
assertEquals(384, OneKeyTosUrl.selectWidthBucket(100, Float.NaN, 1.1))
|
|
55
|
+
assertEquals(384, OneKeyTosUrl.selectWidthBucket(100, Float.POSITIVE_INFINITY, 1.1))
|
|
56
|
+
assertEquals(384, OneKeyTosUrl.selectWidthBucket(100, 2f, Double.NaN))
|
|
57
|
+
assertEquals(384, OneKeyTosUrl.selectWidthBucket(100, 2f, Double.POSITIVE_INFINITY))
|
|
58
|
+
assertEquals(640, OneKeyTosUrl.selectWidthBucket(100, 2f, Double.MAX_VALUE))
|
|
27
59
|
}
|
|
28
60
|
|
|
29
61
|
@Test
|
|
@@ -44,7 +76,7 @@ class OneKeyTosUrlTest {
|
|
|
44
76
|
false,
|
|
45
77
|
)
|
|
46
78
|
assertTrue(result.contains("x-tos-process="))
|
|
47
|
-
assertTrue(result.contains("
|
|
79
|
+
assertTrue(result.contains("w_384"))
|
|
48
80
|
}
|
|
49
81
|
assertEquals(
|
|
50
82
|
"https://web.onekey-asset.com/token.png",
|
package/ios/OneKeyImage.swift
CHANGED
|
@@ -121,6 +121,11 @@ final class HybridOneKeyImage: HybridOneKeyImageSpec, RecyclableView {
|
|
|
121
121
|
var optimizeTos: Bool? = true {
|
|
122
122
|
didSet { if optimizeTos != oldValue { identityDidChange() } }
|
|
123
123
|
}
|
|
124
|
+
var resizeWidth: Double? {
|
|
125
|
+
didSet {
|
|
126
|
+
if !Self.equalOptionalDouble(resizeWidth, oldValue) { identityDidChange() }
|
|
127
|
+
}
|
|
128
|
+
}
|
|
124
129
|
var overscan: Double? = 1.1 {
|
|
125
130
|
didSet {
|
|
126
131
|
if !Self.equalOptionalDouble(overscan, oldValue) { identityDidChange() }
|
|
@@ -241,6 +246,7 @@ final class HybridOneKeyImage: HybridOneKeyImageSpec, RecyclableView {
|
|
|
241
246
|
cachePolicy?.stringValue ?? "memory-disk",
|
|
242
247
|
contentFit?.stringValue ?? "cover",
|
|
243
248
|
String(optimizeTos ?? true),
|
|
249
|
+
resizeWidth.map(String.init(describing:)) ?? "",
|
|
244
250
|
String(overscan ?? 1.1),
|
|
245
251
|
String(Int(hostView.bounds.width.rounded())),
|
|
246
252
|
String(Int(hostView.bounds.height.rounded())),
|
|
@@ -270,11 +276,13 @@ final class HybridOneKeyImage: HybridOneKeyImageSpec, RecyclableView {
|
|
|
270
276
|
}
|
|
271
277
|
|
|
272
278
|
let hasCustomIdentity = OneKeyImageRequestContext.headers(from: sourceHeadersJson) != nil
|
|
279
|
+
let displaySize = resizeWidth.flatMap { $0.isFinite && $0 > 0 ? CGFloat($0) : nil }
|
|
280
|
+
?? max(hostView.bounds.width, hostView.bounds.height)
|
|
273
281
|
let requestURL =
|
|
274
282
|
(optimizeTos ?? true)
|
|
275
283
|
? OneKeyTosURL.optimized(
|
|
276
284
|
rawURL: rawURL,
|
|
277
|
-
displaySize:
|
|
285
|
+
displaySize: displaySize,
|
|
278
286
|
scale: screenScale,
|
|
279
287
|
overscan: overscan ?? 1.1,
|
|
280
288
|
hasCustomIdentity: hasCustomIdentity
|
|
@@ -463,6 +471,7 @@ final class HybridOneKeyImage: HybridOneKeyImageSpec, RecyclableView {
|
|
|
463
471
|
autoplay = true
|
|
464
472
|
recyclingKey = nil
|
|
465
473
|
optimizeTos = true
|
|
474
|
+
resizeWidth = nil
|
|
466
475
|
overscan = 1.1
|
|
467
476
|
loadingStrategy = .static
|
|
468
477
|
onLoadStart = nil
|
package/ios/OneKeyTosURL.swift
CHANGED
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
import Foundation
|
|
2
2
|
|
|
3
3
|
enum OneKeyTosURL {
|
|
4
|
-
|
|
5
|
-
|
|
4
|
+
// Select by layout size first. Density can only choose between this tier's renditions.
|
|
5
|
+
static let sizeTiers: [(maxDisplaySize: CGFloat, standard: Int, highDensity: Int)] = [
|
|
6
|
+
(48, 96, 160), (96, 192, 320), (192, 384, 640),
|
|
7
|
+
(384, 768, 1280), (.infinity, 1280, 1280),
|
|
6
8
|
]
|
|
7
9
|
|
|
8
10
|
static func optimized(
|
|
@@ -24,19 +26,16 @@ enum OneKeyTosURL {
|
|
|
24
26
|
return rawURL
|
|
25
27
|
}
|
|
26
28
|
|
|
29
|
+
let tier = sizeTiers.first(where: { displaySize <= $0.maxDisplaySize })!
|
|
27
30
|
let normalizedScale = scale.isFinite ? min(max(scale, 1), 3) : 1
|
|
28
|
-
let normalizedOverscan = overscan.isFinite ? max(overscan, 1) : 1
|
|
29
|
-
|
|
30
|
-
let
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
}
|
|
37
|
-
var queryItems = components.queryItems ?? []
|
|
38
|
-
queryItems.append(URLQueryItem(name: "x-tos-process", value: "image/resize,w_\(bucket)"))
|
|
39
|
-
components.queryItems = queryItems
|
|
31
|
+
let normalizedOverscan = overscan.isFinite ? max(overscan, 1) : 1.1
|
|
32
|
+
// Fixed renditions already account for the default margin. Custom margins stay within the tier.
|
|
33
|
+
let density = normalizedScale * CGFloat(normalizedOverscan / 1.1)
|
|
34
|
+
let pixelWidth = density > 2 ? tier.highDensity : tier.standard
|
|
35
|
+
// Match Android and Web without rewriting the source URL's existing query.
|
|
36
|
+
let query = components.percentEncodedQuery ?? ""
|
|
37
|
+
let separator = query.isEmpty || query.hasSuffix("&") ? "" : "&"
|
|
38
|
+
components.percentEncodedQuery = "\(query)\(separator)x-tos-process=image%2Fresize%2Cw_\(pixelWidth)"
|
|
40
39
|
return components.url ?? rawURL
|
|
41
40
|
}
|
|
42
41
|
|
|
@@ -3,6 +3,46 @@ import XCTest
|
|
|
3
3
|
@testable import OneKeyImage
|
|
4
4
|
|
|
5
5
|
final class OneKeyTosURLTests: XCTestCase {
|
|
6
|
+
func testCommonIconsShareRenditionsAfterApplyingScreenDensity() throws {
|
|
7
|
+
let raw = try XCTUnwrap(URL(string: "https://common.onekey-asset.com/token.png"))
|
|
8
|
+
for size: CGFloat in [32, 40, 48] {
|
|
9
|
+
for scale: CGFloat in [1, 2, 2.625, 3] {
|
|
10
|
+
let result = OneKeyTosURL.optimized(
|
|
11
|
+
rawURL: raw, displaySize: size, scale: scale, overscan: 1.1, hasCustomIdentity: false
|
|
12
|
+
)
|
|
13
|
+
let width = scale <= 2 ? 96 : 160
|
|
14
|
+
XCTAssertEqual(result.absoluteString, "\(raw.absoluteString)?x-tos-process=image%2Fresize%2Cw_\(width)")
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
for (size, standard, highDensity): (CGFloat, Int, Int) in [
|
|
18
|
+
(48, 96, 160), (48.1, 192, 320), (96, 192, 320),
|
|
19
|
+
(96.1, 384, 640), (192, 384, 640), (192.1, 768, 1280),
|
|
20
|
+
(384, 768, 1280), (384.1, 1280, 1280),
|
|
21
|
+
] {
|
|
22
|
+
for (scale, width): (CGFloat, Int) in [(2, standard), (2.625, highDensity)] {
|
|
23
|
+
let result = OneKeyTosURL.optimized(
|
|
24
|
+
rawURL: raw, displaySize: size, scale: scale, overscan: 1.1, hasCustomIdentity: false
|
|
25
|
+
)
|
|
26
|
+
XCTAssertTrue(result.absoluteString.hasSuffix("w_\(width)"))
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
let overscanned = OneKeyTosURL.optimized(
|
|
30
|
+
rawURL: raw, displaySize: 48, scale: 2, overscan: 2, hasCustomIdentity: false
|
|
31
|
+
)
|
|
32
|
+
XCTAssertTrue(overscanned.absoluteString.hasSuffix("w_160"))
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
func testPreservesSourceQueryAndFragment() throws {
|
|
36
|
+
let raw = try XCTUnwrap(URL(string: "https://common.onekey-asset.com/token.png?foo=a%20b#preview"))
|
|
37
|
+
let result = OneKeyTosURL.optimized(
|
|
38
|
+
rawURL: raw, displaySize: 32, scale: 3, overscan: 1.1, hasCustomIdentity: false
|
|
39
|
+
)
|
|
40
|
+
XCTAssertEqual(
|
|
41
|
+
result.absoluteString,
|
|
42
|
+
"https://common.onekey-asset.com/token.png?foo=a%20b&x-tos-process=image%2Fresize%2Cw_160#preview"
|
|
43
|
+
)
|
|
44
|
+
}
|
|
45
|
+
|
|
6
46
|
func testOptimizesAllowedOneKeyAssetURL() throws {
|
|
7
47
|
let raw = try XCTUnwrap(URL(string: "https://common.onekey-asset.com/tokens/btc.png"))
|
|
8
48
|
let result = OneKeyTosURL.optimized(
|
|
@@ -13,7 +53,7 @@ final class OneKeyTosURLTests: XCTestCase {
|
|
|
13
53
|
hasCustomIdentity: false
|
|
14
54
|
)
|
|
15
55
|
XCTAssertTrue(result.absoluteString.contains("x-tos-process="))
|
|
16
|
-
XCTAssertTrue(result.absoluteString.contains("
|
|
56
|
+
XCTAssertTrue(result.absoluteString.contains("w_384"))
|
|
17
57
|
}
|
|
18
58
|
|
|
19
59
|
func testDoesNotRewriteSignedOrCustomIdentityURL() throws {
|
|
@@ -84,7 +124,7 @@ final class OneKeyTosURLTests: XCTestCase {
|
|
|
84
124
|
overscan: 1.1,
|
|
85
125
|
hasCustomIdentity: false
|
|
86
126
|
)
|
|
87
|
-
XCTAssertTrue(result.absoluteString.contains("
|
|
127
|
+
XCTAssertTrue(result.absoluteString.contains("w_640"))
|
|
88
128
|
}
|
|
89
129
|
}
|
|
90
130
|
|
|
@@ -97,7 +137,7 @@ final class OneKeyTosURLTests: XCTestCase {
|
|
|
97
137
|
overscan: .infinity,
|
|
98
138
|
hasCustomIdentity: false
|
|
99
139
|
)
|
|
100
|
-
XCTAssertTrue(result.absoluteString.contains("
|
|
140
|
+
XCTAssertTrue(result.absoluteString.contains("w_384"))
|
|
101
141
|
XCTAssertEqual(
|
|
102
142
|
OneKeyTosURL.optimized(
|
|
103
143
|
rawURL: raw,
|
package/lib/module/index.js
CHANGED
|
@@ -44,6 +44,7 @@ export function OneKeyImage({
|
|
|
44
44
|
autoplay,
|
|
45
45
|
recyclingKey,
|
|
46
46
|
optimizeTos = true,
|
|
47
|
+
resizeWidth,
|
|
47
48
|
overscan = 1.1,
|
|
48
49
|
loadingStrategy = OneKeyImageLoadingStrategy.STATIC,
|
|
49
50
|
hybridRef,
|
|
@@ -57,7 +58,7 @@ export function OneKeyImage({
|
|
|
57
58
|
}) {
|
|
58
59
|
const normalized = useMemo(() => normalizeSource(source), [source]);
|
|
59
60
|
const resolvedCachePolicy = cachePolicy ?? normalized?.cachePolicy ?? OneKeyImageCachePolicy.MEMORY_DISK;
|
|
60
|
-
const identity = `${normalized?.uri ?? ''}|${JSON.stringify(normalized?.headers ?? {})}|${resolvedCachePolicy}|${recyclingKey ?? ''}|${contentFit}|${optimizeTos ? '1' : '0'}|${overscan}`;
|
|
61
|
+
const identity = `${normalized?.uri ?? ''}|${JSON.stringify(normalized?.headers ?? {})}|${resolvedCachePolicy}|${recyclingKey ?? ''}|${contentFit}|${optimizeTos ? '1' : '0'}|${resizeWidth ?? ''}|${overscan}`;
|
|
61
62
|
const hasSource = normalized != null;
|
|
62
63
|
const hasOverlay = placeholder != null || fallback != null;
|
|
63
64
|
const [loadState, setLoadState] = useState({
|
|
@@ -183,6 +184,7 @@ export function OneKeyImage({
|
|
|
183
184
|
autoplay: autoplay ?? Platform.OS !== 'android',
|
|
184
185
|
recyclingKey,
|
|
185
186
|
optimizeTos,
|
|
187
|
+
resizeWidth,
|
|
186
188
|
overscan,
|
|
187
189
|
loadingStrategy: placeholder == null ? loadingStrategy : OneKeyImageLoadingStrategy.NONE
|
|
188
190
|
});
|
|
@@ -138,6 +138,15 @@ namespace margelo::nitro::onekeyimage {
|
|
|
138
138
|
static const auto method = _javaPart->javaClassStatic()->getMethod<void(jni::alias_ref<jni::JBoolean> /* optimizeTos */)>("setOptimizeTos");
|
|
139
139
|
method(_javaPart, optimizeTos.has_value() ? jni::JBoolean::valueOf(optimizeTos.value()) : nullptr);
|
|
140
140
|
}
|
|
141
|
+
std::optional<double> JHybridOneKeyImageSpec::getResizeWidth() {
|
|
142
|
+
static const auto method = _javaPart->javaClassStatic()->getMethod<jni::local_ref<jni::JDouble>()>("getResizeWidth");
|
|
143
|
+
auto __result = method(_javaPart);
|
|
144
|
+
return __result != nullptr ? std::make_optional(__result->value()) : std::nullopt;
|
|
145
|
+
}
|
|
146
|
+
void JHybridOneKeyImageSpec::setResizeWidth(std::optional<double> resizeWidth) {
|
|
147
|
+
static const auto method = _javaPart->javaClassStatic()->getMethod<void(jni::alias_ref<jni::JDouble> /* resizeWidth */)>("setResizeWidth");
|
|
148
|
+
method(_javaPart, resizeWidth.has_value() ? jni::JDouble::valueOf(resizeWidth.value()) : nullptr);
|
|
149
|
+
}
|
|
141
150
|
std::optional<double> JHybridOneKeyImageSpec::getOverscan() {
|
|
142
151
|
static const auto method = _javaPart->javaClassStatic()->getMethod<jni::local_ref<jni::JDouble>()>("getOverscan");
|
|
143
152
|
auto __result = method(_javaPart);
|
|
@@ -66,6 +66,8 @@ namespace margelo::nitro::onekeyimage {
|
|
|
66
66
|
void setRecyclingKey(const std::optional<std::string>& recyclingKey) override;
|
|
67
67
|
std::optional<bool> getOptimizeTos() override;
|
|
68
68
|
void setOptimizeTos(std::optional<bool> optimizeTos) override;
|
|
69
|
+
std::optional<double> getResizeWidth() override;
|
|
70
|
+
void setResizeWidth(std::optional<double> resizeWidth) override;
|
|
69
71
|
std::optional<double> getOverscan() override;
|
|
70
72
|
void setOverscan(std::optional<double> overscan) override;
|
|
71
73
|
std::optional<OneKeyImageLoadingStrategy> getLoadingStrategy() override;
|
|
@@ -93,6 +93,11 @@ void JHybridOneKeyImageStateUpdater::updateViewProps(jni::alias_ref<jni::JClass>
|
|
|
93
93
|
: !newProps->optimizeTos.hasSameValue(oldProps->optimizeTos)) {
|
|
94
94
|
hybridView->setOptimizeTos(newProps->optimizeTos.get());
|
|
95
95
|
}
|
|
96
|
+
if (oldProps == nullptr
|
|
97
|
+
? newProps->resizeWidth.isProvided()
|
|
98
|
+
: !newProps->resizeWidth.hasSameValue(oldProps->resizeWidth)) {
|
|
99
|
+
hybridView->setResizeWidth(newProps->resizeWidth.get());
|
|
100
|
+
}
|
|
96
101
|
if (oldProps == nullptr
|
|
97
102
|
? newProps->overscan.isProvided()
|
|
98
103
|
: !newProps->overscan.hasSameValue(oldProps->overscan)) {
|
package/lib/nitrogen/generated/android/kotlin/com/margelo/nitro/onekeyimage/HybridOneKeyImageSpec.kt
CHANGED
|
@@ -75,6 +75,12 @@ abstract class HybridOneKeyImageSpec: HybridView() {
|
|
|
75
75
|
@set:Keep
|
|
76
76
|
abstract var optimizeTos: Boolean?
|
|
77
77
|
|
|
78
|
+
@get:DoNotStrip
|
|
79
|
+
@get:Keep
|
|
80
|
+
@set:DoNotStrip
|
|
81
|
+
@set:Keep
|
|
82
|
+
abstract var resizeWidth: Double?
|
|
83
|
+
|
|
78
84
|
@get:DoNotStrip
|
|
79
85
|
@get:Keep
|
|
80
86
|
@set:DoNotStrip
|
|
@@ -134,6 +134,13 @@ namespace margelo::nitro::onekeyimage {
|
|
|
134
134
|
inline void setOptimizeTos(std::optional<bool> optimizeTos) noexcept override {
|
|
135
135
|
_swiftPart.setOptimizeTos(optimizeTos);
|
|
136
136
|
}
|
|
137
|
+
inline std::optional<double> getResizeWidth() noexcept override {
|
|
138
|
+
auto __result = _swiftPart.getResizeWidth();
|
|
139
|
+
return __result;
|
|
140
|
+
}
|
|
141
|
+
inline void setResizeWidth(std::optional<double> resizeWidth) noexcept override {
|
|
142
|
+
_swiftPart.setResizeWidth(resizeWidth);
|
|
143
|
+
}
|
|
137
144
|
inline std::optional<double> getOverscan() noexcept override {
|
|
138
145
|
auto __result = _swiftPart.getOverscan();
|
|
139
146
|
return __result;
|
|
@@ -146,6 +146,12 @@ using namespace margelo::nitro::onekeyimage::views;
|
|
|
146
146
|
: !newViewProps.optimizeTos.hasSameValue(oldViewProps->optimizeTos)) {
|
|
147
147
|
swiftPart.setOptimizeTos(newViewProps.optimizeTos.get());
|
|
148
148
|
}
|
|
149
|
+
// resizeWidth: optional
|
|
150
|
+
if (oldViewProps == nullptr
|
|
151
|
+
? newViewProps.resizeWidth.isProvided()
|
|
152
|
+
: !newViewProps.resizeWidth.hasSameValue(oldViewProps->resizeWidth)) {
|
|
153
|
+
swiftPart.setResizeWidth(newViewProps.resizeWidth.get());
|
|
154
|
+
}
|
|
149
155
|
// overscan: optional
|
|
150
156
|
if (oldViewProps == nullptr
|
|
151
157
|
? newViewProps.overscan.isProvided()
|
|
@@ -18,6 +18,7 @@ public protocol HybridOneKeyImageSpec_protocol: HybridObject, HybridView {
|
|
|
18
18
|
var autoplay: Bool? { get set }
|
|
19
19
|
var recyclingKey: String? { get set }
|
|
20
20
|
var optimizeTos: Bool? { get set }
|
|
21
|
+
var resizeWidth: Double? { get set }
|
|
21
22
|
var overscan: Double? { get set }
|
|
22
23
|
var loadingStrategy: OneKeyImageLoadingStrategy? { get set }
|
|
23
24
|
var onLoadStart: (() -> Void)? { get set }
|
|
@@ -292,6 +292,30 @@ open class HybridOneKeyImageSpec_cxx {
|
|
|
292
292
|
}
|
|
293
293
|
}
|
|
294
294
|
|
|
295
|
+
public final var resizeWidth: bridge.std__optional_double_ {
|
|
296
|
+
@inline(__always)
|
|
297
|
+
get {
|
|
298
|
+
return { () -> bridge.std__optional_double_ in
|
|
299
|
+
if let __unwrappedValue = self.__implementation.resizeWidth {
|
|
300
|
+
return bridge.create_std__optional_double_(__unwrappedValue)
|
|
301
|
+
} else {
|
|
302
|
+
return .init()
|
|
303
|
+
}
|
|
304
|
+
}()
|
|
305
|
+
}
|
|
306
|
+
@inline(__always)
|
|
307
|
+
set {
|
|
308
|
+
self.__implementation.resizeWidth = { () -> Double? in
|
|
309
|
+
if bridge.has_value_std__optional_double_(newValue) {
|
|
310
|
+
let __unwrapped = bridge.get_std__optional_double_(newValue)
|
|
311
|
+
return __unwrapped
|
|
312
|
+
} else {
|
|
313
|
+
return nil
|
|
314
|
+
}
|
|
315
|
+
}()
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
|
|
295
319
|
public final var overscan: bridge.std__optional_double_ {
|
|
296
320
|
@inline(__always)
|
|
297
321
|
get {
|
|
@@ -30,6 +30,8 @@ namespace margelo::nitro::onekeyimage {
|
|
|
30
30
|
prototype.registerHybridSetter("recyclingKey", &HybridOneKeyImageSpec::setRecyclingKey);
|
|
31
31
|
prototype.registerHybridGetter("optimizeTos", &HybridOneKeyImageSpec::getOptimizeTos);
|
|
32
32
|
prototype.registerHybridSetter("optimizeTos", &HybridOneKeyImageSpec::setOptimizeTos);
|
|
33
|
+
prototype.registerHybridGetter("resizeWidth", &HybridOneKeyImageSpec::getResizeWidth);
|
|
34
|
+
prototype.registerHybridSetter("resizeWidth", &HybridOneKeyImageSpec::setResizeWidth);
|
|
33
35
|
prototype.registerHybridGetter("overscan", &HybridOneKeyImageSpec::getOverscan);
|
|
34
36
|
prototype.registerHybridSetter("overscan", &HybridOneKeyImageSpec::setOverscan);
|
|
35
37
|
prototype.registerHybridGetter("loadingStrategy", &HybridOneKeyImageSpec::getLoadingStrategy);
|
|
@@ -76,6 +76,8 @@ namespace margelo::nitro::onekeyimage {
|
|
|
76
76
|
virtual void setRecyclingKey(const std::optional<std::string>& recyclingKey) = 0;
|
|
77
77
|
virtual std::optional<bool> getOptimizeTos() = 0;
|
|
78
78
|
virtual void setOptimizeTos(std::optional<bool> optimizeTos) = 0;
|
|
79
|
+
virtual std::optional<double> getResizeWidth() = 0;
|
|
80
|
+
virtual void setResizeWidth(std::optional<double> resizeWidth) = 0;
|
|
79
81
|
virtual std::optional<double> getOverscan() = 0;
|
|
80
82
|
virtual void setOverscan(std::optional<double> overscan) = 0;
|
|
81
83
|
virtual std::optional<OneKeyImageLoadingStrategy> getLoadingStrategy() = 0;
|
|
@@ -28,6 +28,7 @@ namespace margelo::nitro::onekeyimage::views {
|
|
|
28
28
|
autoplay(nitro::ReactProp<std::optional<bool>>::fromRawValue("OneKeyImage", "autoplay", rawProps, sourceProps.autoplay)),
|
|
29
29
|
recyclingKey(nitro::ReactProp<std::optional<std::string>>::fromRawValue("OneKeyImage", "recyclingKey", rawProps, sourceProps.recyclingKey)),
|
|
30
30
|
optimizeTos(nitro::ReactProp<std::optional<bool>>::fromRawValue("OneKeyImage", "optimizeTos", rawProps, sourceProps.optimizeTos)),
|
|
31
|
+
resizeWidth(nitro::ReactProp<std::optional<double>>::fromRawValue("OneKeyImage", "resizeWidth", rawProps, sourceProps.resizeWidth)),
|
|
31
32
|
overscan(nitro::ReactProp<std::optional<double>>::fromRawValue("OneKeyImage", "overscan", rawProps, sourceProps.overscan)),
|
|
32
33
|
loadingStrategy(nitro::ReactProp<std::optional<OneKeyImageLoadingStrategy>>::fromRawValue("OneKeyImage", "loadingStrategy", rawProps, sourceProps.loadingStrategy)),
|
|
33
34
|
onLoadStart(nitro::ReactProp<std::optional<std::function<void()>>>::fromRawValue("OneKeyImage", "onLoadStart", rawProps, sourceProps.onLoadStart)),
|
|
@@ -47,6 +48,7 @@ namespace margelo::nitro::onekeyimage::views {
|
|
|
47
48
|
case hashString("autoplay"): return true;
|
|
48
49
|
case hashString("recyclingKey"): return true;
|
|
49
50
|
case hashString("optimizeTos"): return true;
|
|
51
|
+
case hashString("resizeWidth"): return true;
|
|
50
52
|
case hashString("overscan"): return true;
|
|
51
53
|
case hashString("loadingStrategy"): return true;
|
|
52
54
|
case hashString("onLoadStart"): return true;
|
|
@@ -56,6 +56,7 @@ namespace margelo::nitro::onekeyimage::views {
|
|
|
56
56
|
nitro::ReactProp<std::optional<bool>> autoplay;
|
|
57
57
|
nitro::ReactProp<std::optional<std::string>> recyclingKey;
|
|
58
58
|
nitro::ReactProp<std::optional<bool>> optimizeTos;
|
|
59
|
+
nitro::ReactProp<std::optional<double>> resizeWidth;
|
|
59
60
|
nitro::ReactProp<std::optional<double>> overscan;
|
|
60
61
|
nitro::ReactProp<std::optional<OneKeyImageLoadingStrategy>> loadingStrategy;
|
|
61
62
|
nitro::ReactProp<std::optional<std::function<void()>>> onLoadStart;
|
|
@@ -75,6 +76,7 @@ namespace margelo::nitro::onekeyimage::views {
|
|
|
75
76
|
autoplay.hasSameValue(other.autoplay) &&
|
|
76
77
|
recyclingKey.hasSameValue(other.recyclingKey) &&
|
|
77
78
|
optimizeTos.hasSameValue(other.optimizeTos) &&
|
|
79
|
+
resizeWidth.hasSameValue(other.resizeWidth) &&
|
|
78
80
|
overscan.hasSameValue(other.overscan) &&
|
|
79
81
|
loadingStrategy.hasSameValue(other.loadingStrategy) &&
|
|
80
82
|
onLoadStart.hasSameValue(other.onLoadStart) &&
|
|
@@ -95,6 +97,7 @@ namespace margelo::nitro::onekeyimage::views {
|
|
|
95
97
|
autoplay.isProvided() ||
|
|
96
98
|
recyclingKey.isProvided() ||
|
|
97
99
|
optimizeTos.isProvided() ||
|
|
100
|
+
resizeWidth.isProvided() ||
|
|
98
101
|
overscan.isProvided() ||
|
|
99
102
|
loadingStrategy.isProvided() ||
|
|
100
103
|
onLoadStart.isProvided() ||
|
|
@@ -32,6 +32,8 @@ export interface OneKeyImageNativeProps extends HybridViewProps {
|
|
|
32
32
|
autoplay?: boolean;
|
|
33
33
|
recyclingKey?: string;
|
|
34
34
|
optimizeTos?: boolean;
|
|
35
|
+
/** Display width hint in layout units. Native applies the screen density. */
|
|
36
|
+
resizeWidth?: number;
|
|
35
37
|
overscan?: number;
|
|
36
38
|
loadingStrategy?: OneKeyImageLoadingStrategy;
|
|
37
39
|
onLoadStart?: () => void;
|
|
@@ -45,7 +45,7 @@ export interface OneKeyImageProps extends Omit<OneKeyImageNativeProps, 'sourceUr
|
|
|
45
45
|
onError?: MaybeWrappedCallback<(event: OneKeyImageErrorEvent) => void>;
|
|
46
46
|
onLoadEnd?: MaybeWrappedCallback<() => void>;
|
|
47
47
|
}
|
|
48
|
-
export declare function OneKeyImage({ source, placeholder, fallback, variant, contentFit, cachePolicy, autoplay, recyclingKey, optimizeTos, overscan, loadingStrategy, hybridRef, onLoadStart, onLoad, onDisplay, onError, onLoadEnd, style, ...viewProps }: OneKeyImageProps): import("react/jsx-runtime").JSX.Element;
|
|
48
|
+
export declare function OneKeyImage({ source, placeholder, fallback, variant, contentFit, cachePolicy, autoplay, recyclingKey, optimizeTos, resizeWidth, overscan, loadingStrategy, hybridRef, onLoadStart, onLoad, onDisplay, onError, onLoadEnd, style, ...viewProps }: OneKeyImageProps): import("react/jsx-runtime").JSX.Element;
|
|
49
49
|
export declare const OneKeyImageCache: {
|
|
50
50
|
preload(sources: OneKeyImagePreloadInput[]): Promise<boolean>;
|
|
51
51
|
clearMemory: () => Promise<void>;
|
|
@@ -138,6 +138,15 @@ namespace margelo::nitro::onekeyimage {
|
|
|
138
138
|
static const auto method = _javaPart->javaClassStatic()->getMethod<void(jni::alias_ref<jni::JBoolean> /* optimizeTos */)>("setOptimizeTos");
|
|
139
139
|
method(_javaPart, optimizeTos.has_value() ? jni::JBoolean::valueOf(optimizeTos.value()) : nullptr);
|
|
140
140
|
}
|
|
141
|
+
std::optional<double> JHybridOneKeyImageSpec::getResizeWidth() {
|
|
142
|
+
static const auto method = _javaPart->javaClassStatic()->getMethod<jni::local_ref<jni::JDouble>()>("getResizeWidth");
|
|
143
|
+
auto __result = method(_javaPart);
|
|
144
|
+
return __result != nullptr ? std::make_optional(__result->value()) : std::nullopt;
|
|
145
|
+
}
|
|
146
|
+
void JHybridOneKeyImageSpec::setResizeWidth(std::optional<double> resizeWidth) {
|
|
147
|
+
static const auto method = _javaPart->javaClassStatic()->getMethod<void(jni::alias_ref<jni::JDouble> /* resizeWidth */)>("setResizeWidth");
|
|
148
|
+
method(_javaPart, resizeWidth.has_value() ? jni::JDouble::valueOf(resizeWidth.value()) : nullptr);
|
|
149
|
+
}
|
|
141
150
|
std::optional<double> JHybridOneKeyImageSpec::getOverscan() {
|
|
142
151
|
static const auto method = _javaPart->javaClassStatic()->getMethod<jni::local_ref<jni::JDouble>()>("getOverscan");
|
|
143
152
|
auto __result = method(_javaPart);
|
|
@@ -66,6 +66,8 @@ namespace margelo::nitro::onekeyimage {
|
|
|
66
66
|
void setRecyclingKey(const std::optional<std::string>& recyclingKey) override;
|
|
67
67
|
std::optional<bool> getOptimizeTos() override;
|
|
68
68
|
void setOptimizeTos(std::optional<bool> optimizeTos) override;
|
|
69
|
+
std::optional<double> getResizeWidth() override;
|
|
70
|
+
void setResizeWidth(std::optional<double> resizeWidth) override;
|
|
69
71
|
std::optional<double> getOverscan() override;
|
|
70
72
|
void setOverscan(std::optional<double> overscan) override;
|
|
71
73
|
std::optional<OneKeyImageLoadingStrategy> getLoadingStrategy() override;
|
|
@@ -93,6 +93,11 @@ void JHybridOneKeyImageStateUpdater::updateViewProps(jni::alias_ref<jni::JClass>
|
|
|
93
93
|
: !newProps->optimizeTos.hasSameValue(oldProps->optimizeTos)) {
|
|
94
94
|
hybridView->setOptimizeTos(newProps->optimizeTos.get());
|
|
95
95
|
}
|
|
96
|
+
if (oldProps == nullptr
|
|
97
|
+
? newProps->resizeWidth.isProvided()
|
|
98
|
+
: !newProps->resizeWidth.hasSameValue(oldProps->resizeWidth)) {
|
|
99
|
+
hybridView->setResizeWidth(newProps->resizeWidth.get());
|
|
100
|
+
}
|
|
96
101
|
if (oldProps == nullptr
|
|
97
102
|
? newProps->overscan.isProvided()
|
|
98
103
|
: !newProps->overscan.hasSameValue(oldProps->overscan)) {
|
package/nitrogen/generated/android/kotlin/com/margelo/nitro/onekeyimage/HybridOneKeyImageSpec.kt
CHANGED
|
@@ -75,6 +75,12 @@ abstract class HybridOneKeyImageSpec: HybridView() {
|
|
|
75
75
|
@set:Keep
|
|
76
76
|
abstract var optimizeTos: Boolean?
|
|
77
77
|
|
|
78
|
+
@get:DoNotStrip
|
|
79
|
+
@get:Keep
|
|
80
|
+
@set:DoNotStrip
|
|
81
|
+
@set:Keep
|
|
82
|
+
abstract var resizeWidth: Double?
|
|
83
|
+
|
|
78
84
|
@get:DoNotStrip
|
|
79
85
|
@get:Keep
|
|
80
86
|
@set:DoNotStrip
|
|
@@ -134,6 +134,13 @@ namespace margelo::nitro::onekeyimage {
|
|
|
134
134
|
inline void setOptimizeTos(std::optional<bool> optimizeTos) noexcept override {
|
|
135
135
|
_swiftPart.setOptimizeTos(optimizeTos);
|
|
136
136
|
}
|
|
137
|
+
inline std::optional<double> getResizeWidth() noexcept override {
|
|
138
|
+
auto __result = _swiftPart.getResizeWidth();
|
|
139
|
+
return __result;
|
|
140
|
+
}
|
|
141
|
+
inline void setResizeWidth(std::optional<double> resizeWidth) noexcept override {
|
|
142
|
+
_swiftPart.setResizeWidth(resizeWidth);
|
|
143
|
+
}
|
|
137
144
|
inline std::optional<double> getOverscan() noexcept override {
|
|
138
145
|
auto __result = _swiftPart.getOverscan();
|
|
139
146
|
return __result;
|
|
@@ -146,6 +146,12 @@ using namespace margelo::nitro::onekeyimage::views;
|
|
|
146
146
|
: !newViewProps.optimizeTos.hasSameValue(oldViewProps->optimizeTos)) {
|
|
147
147
|
swiftPart.setOptimizeTos(newViewProps.optimizeTos.get());
|
|
148
148
|
}
|
|
149
|
+
// resizeWidth: optional
|
|
150
|
+
if (oldViewProps == nullptr
|
|
151
|
+
? newViewProps.resizeWidth.isProvided()
|
|
152
|
+
: !newViewProps.resizeWidth.hasSameValue(oldViewProps->resizeWidth)) {
|
|
153
|
+
swiftPart.setResizeWidth(newViewProps.resizeWidth.get());
|
|
154
|
+
}
|
|
149
155
|
// overscan: optional
|
|
150
156
|
if (oldViewProps == nullptr
|
|
151
157
|
? newViewProps.overscan.isProvided()
|
|
@@ -18,6 +18,7 @@ public protocol HybridOneKeyImageSpec_protocol: HybridObject, HybridView {
|
|
|
18
18
|
var autoplay: Bool? { get set }
|
|
19
19
|
var recyclingKey: String? { get set }
|
|
20
20
|
var optimizeTos: Bool? { get set }
|
|
21
|
+
var resizeWidth: Double? { get set }
|
|
21
22
|
var overscan: Double? { get set }
|
|
22
23
|
var loadingStrategy: OneKeyImageLoadingStrategy? { get set }
|
|
23
24
|
var onLoadStart: (() -> Void)? { get set }
|
|
@@ -292,6 +292,30 @@ open class HybridOneKeyImageSpec_cxx {
|
|
|
292
292
|
}
|
|
293
293
|
}
|
|
294
294
|
|
|
295
|
+
public final var resizeWidth: bridge.std__optional_double_ {
|
|
296
|
+
@inline(__always)
|
|
297
|
+
get {
|
|
298
|
+
return { () -> bridge.std__optional_double_ in
|
|
299
|
+
if let __unwrappedValue = self.__implementation.resizeWidth {
|
|
300
|
+
return bridge.create_std__optional_double_(__unwrappedValue)
|
|
301
|
+
} else {
|
|
302
|
+
return .init()
|
|
303
|
+
}
|
|
304
|
+
}()
|
|
305
|
+
}
|
|
306
|
+
@inline(__always)
|
|
307
|
+
set {
|
|
308
|
+
self.__implementation.resizeWidth = { () -> Double? in
|
|
309
|
+
if bridge.has_value_std__optional_double_(newValue) {
|
|
310
|
+
let __unwrapped = bridge.get_std__optional_double_(newValue)
|
|
311
|
+
return __unwrapped
|
|
312
|
+
} else {
|
|
313
|
+
return nil
|
|
314
|
+
}
|
|
315
|
+
}()
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
|
|
295
319
|
public final var overscan: bridge.std__optional_double_ {
|
|
296
320
|
@inline(__always)
|
|
297
321
|
get {
|
|
@@ -30,6 +30,8 @@ namespace margelo::nitro::onekeyimage {
|
|
|
30
30
|
prototype.registerHybridSetter("recyclingKey", &HybridOneKeyImageSpec::setRecyclingKey);
|
|
31
31
|
prototype.registerHybridGetter("optimizeTos", &HybridOneKeyImageSpec::getOptimizeTos);
|
|
32
32
|
prototype.registerHybridSetter("optimizeTos", &HybridOneKeyImageSpec::setOptimizeTos);
|
|
33
|
+
prototype.registerHybridGetter("resizeWidth", &HybridOneKeyImageSpec::getResizeWidth);
|
|
34
|
+
prototype.registerHybridSetter("resizeWidth", &HybridOneKeyImageSpec::setResizeWidth);
|
|
33
35
|
prototype.registerHybridGetter("overscan", &HybridOneKeyImageSpec::getOverscan);
|
|
34
36
|
prototype.registerHybridSetter("overscan", &HybridOneKeyImageSpec::setOverscan);
|
|
35
37
|
prototype.registerHybridGetter("loadingStrategy", &HybridOneKeyImageSpec::getLoadingStrategy);
|
|
@@ -76,6 +76,8 @@ namespace margelo::nitro::onekeyimage {
|
|
|
76
76
|
virtual void setRecyclingKey(const std::optional<std::string>& recyclingKey) = 0;
|
|
77
77
|
virtual std::optional<bool> getOptimizeTos() = 0;
|
|
78
78
|
virtual void setOptimizeTos(std::optional<bool> optimizeTos) = 0;
|
|
79
|
+
virtual std::optional<double> getResizeWidth() = 0;
|
|
80
|
+
virtual void setResizeWidth(std::optional<double> resizeWidth) = 0;
|
|
79
81
|
virtual std::optional<double> getOverscan() = 0;
|
|
80
82
|
virtual void setOverscan(std::optional<double> overscan) = 0;
|
|
81
83
|
virtual std::optional<OneKeyImageLoadingStrategy> getLoadingStrategy() = 0;
|
|
@@ -28,6 +28,7 @@ namespace margelo::nitro::onekeyimage::views {
|
|
|
28
28
|
autoplay(nitro::ReactProp<std::optional<bool>>::fromRawValue("OneKeyImage", "autoplay", rawProps, sourceProps.autoplay)),
|
|
29
29
|
recyclingKey(nitro::ReactProp<std::optional<std::string>>::fromRawValue("OneKeyImage", "recyclingKey", rawProps, sourceProps.recyclingKey)),
|
|
30
30
|
optimizeTos(nitro::ReactProp<std::optional<bool>>::fromRawValue("OneKeyImage", "optimizeTos", rawProps, sourceProps.optimizeTos)),
|
|
31
|
+
resizeWidth(nitro::ReactProp<std::optional<double>>::fromRawValue("OneKeyImage", "resizeWidth", rawProps, sourceProps.resizeWidth)),
|
|
31
32
|
overscan(nitro::ReactProp<std::optional<double>>::fromRawValue("OneKeyImage", "overscan", rawProps, sourceProps.overscan)),
|
|
32
33
|
loadingStrategy(nitro::ReactProp<std::optional<OneKeyImageLoadingStrategy>>::fromRawValue("OneKeyImage", "loadingStrategy", rawProps, sourceProps.loadingStrategy)),
|
|
33
34
|
onLoadStart(nitro::ReactProp<std::optional<std::function<void()>>>::fromRawValue("OneKeyImage", "onLoadStart", rawProps, sourceProps.onLoadStart)),
|
|
@@ -47,6 +48,7 @@ namespace margelo::nitro::onekeyimage::views {
|
|
|
47
48
|
case hashString("autoplay"): return true;
|
|
48
49
|
case hashString("recyclingKey"): return true;
|
|
49
50
|
case hashString("optimizeTos"): return true;
|
|
51
|
+
case hashString("resizeWidth"): return true;
|
|
50
52
|
case hashString("overscan"): return true;
|
|
51
53
|
case hashString("loadingStrategy"): return true;
|
|
52
54
|
case hashString("onLoadStart"): return true;
|
|
@@ -56,6 +56,7 @@ namespace margelo::nitro::onekeyimage::views {
|
|
|
56
56
|
nitro::ReactProp<std::optional<bool>> autoplay;
|
|
57
57
|
nitro::ReactProp<std::optional<std::string>> recyclingKey;
|
|
58
58
|
nitro::ReactProp<std::optional<bool>> optimizeTos;
|
|
59
|
+
nitro::ReactProp<std::optional<double>> resizeWidth;
|
|
59
60
|
nitro::ReactProp<std::optional<double>> overscan;
|
|
60
61
|
nitro::ReactProp<std::optional<OneKeyImageLoadingStrategy>> loadingStrategy;
|
|
61
62
|
nitro::ReactProp<std::optional<std::function<void()>>> onLoadStart;
|
|
@@ -75,6 +76,7 @@ namespace margelo::nitro::onekeyimage::views {
|
|
|
75
76
|
autoplay.hasSameValue(other.autoplay) &&
|
|
76
77
|
recyclingKey.hasSameValue(other.recyclingKey) &&
|
|
77
78
|
optimizeTos.hasSameValue(other.optimizeTos) &&
|
|
79
|
+
resizeWidth.hasSameValue(other.resizeWidth) &&
|
|
78
80
|
overscan.hasSameValue(other.overscan) &&
|
|
79
81
|
loadingStrategy.hasSameValue(other.loadingStrategy) &&
|
|
80
82
|
onLoadStart.hasSameValue(other.onLoadStart) &&
|
|
@@ -95,6 +97,7 @@ namespace margelo::nitro::onekeyimage::views {
|
|
|
95
97
|
autoplay.isProvided() ||
|
|
96
98
|
recyclingKey.isProvided() ||
|
|
97
99
|
optimizeTos.isProvided() ||
|
|
100
|
+
resizeWidth.isProvided() ||
|
|
98
101
|
overscan.isProvided() ||
|
|
99
102
|
loadingStrategy.isProvided() ||
|
|
100
103
|
onLoadStart.isProvided() ||
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@onekeyfe/react-native-image",
|
|
3
|
-
"version": "3.0.
|
|
3
|
+
"version": "3.0.107",
|
|
4
4
|
"description": "High-performance native image view for OneKey",
|
|
5
5
|
"main": "./lib/module/index.js",
|
|
6
6
|
"types": "./lib/typescript/src/index.d.ts",
|
|
@@ -81,7 +81,7 @@
|
|
|
81
81
|
"typescript": "^5.9.2"
|
|
82
82
|
},
|
|
83
83
|
"peerDependencies": {
|
|
84
|
-
"@onekeyfe/react-native-skeleton": "3.0.
|
|
84
|
+
"@onekeyfe/react-native-skeleton": "3.0.107",
|
|
85
85
|
"react": "*",
|
|
86
86
|
"react-native": "*",
|
|
87
87
|
"react-native-nitro-modules": "0.37.0"
|
package/src/OneKeyImage.nitro.ts
CHANGED
|
@@ -43,6 +43,8 @@ export interface OneKeyImageNativeProps extends HybridViewProps {
|
|
|
43
43
|
autoplay?: boolean;
|
|
44
44
|
recyclingKey?: string;
|
|
45
45
|
optimizeTos?: boolean;
|
|
46
|
+
/** Display width hint in layout units. Native applies the screen density. */
|
|
47
|
+
resizeWidth?: number;
|
|
46
48
|
overscan?: number;
|
|
47
49
|
loadingStrategy?: OneKeyImageLoadingStrategy;
|
|
48
50
|
onLoadStart?: () => void;
|
package/src/index.tsx
CHANGED
|
@@ -153,6 +153,7 @@ export function OneKeyImage({
|
|
|
153
153
|
autoplay,
|
|
154
154
|
recyclingKey,
|
|
155
155
|
optimizeTos = true,
|
|
156
|
+
resizeWidth,
|
|
156
157
|
overscan = 1.1,
|
|
157
158
|
loadingStrategy = OneKeyImageLoadingStrategy.STATIC,
|
|
158
159
|
hybridRef,
|
|
@@ -173,7 +174,7 @@ export function OneKeyImage({
|
|
|
173
174
|
normalized?.headers ?? {}
|
|
174
175
|
)}|${resolvedCachePolicy}|${recyclingKey ?? ''}|${contentFit}|${
|
|
175
176
|
optimizeTos ? '1' : '0'
|
|
176
|
-
}|${overscan}`;
|
|
177
|
+
}|${resizeWidth ?? ''}|${overscan}`;
|
|
177
178
|
const hasSource = normalized != null;
|
|
178
179
|
const hasOverlay = placeholder != null || fallback != null;
|
|
179
180
|
type LoadState = {
|
|
@@ -338,6 +339,7 @@ export function OneKeyImage({
|
|
|
338
339
|
autoplay: autoplay ?? Platform.OS !== 'android',
|
|
339
340
|
recyclingKey,
|
|
340
341
|
optimizeTos,
|
|
342
|
+
resizeWidth,
|
|
341
343
|
overscan,
|
|
342
344
|
loadingStrategy:
|
|
343
345
|
placeholder == null ? loadingStrategy : OneKeyImageLoadingStrategy.NONE,
|