@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.
Files changed (39) hide show
  1. package/android/src/main/java/com/margelo/nitro/onekeyimage/OneKeyImage.kt +13 -1
  2. package/android/src/main/java/com/margelo/nitro/onekeyimage/OneKeyTosUrl.kt +10 -11
  3. package/android/src/test/java/com/margelo/nitro/onekeyimage/OneKeyImageRequestSignatureTest.kt +10 -1
  4. package/android/src/test/java/com/margelo/nitro/onekeyimage/OneKeyTosUrlTest.kt +42 -10
  5. package/ios/OneKeyImage.swift +10 -1
  6. package/ios/OneKeyTosURL.swift +13 -14
  7. package/ios/tests/OneKeyTosURLTests.swift +43 -3
  8. package/lib/module/index.js +3 -1
  9. package/lib/nitrogen/generated/android/c++/JHybridOneKeyImageSpec.cpp +9 -0
  10. package/lib/nitrogen/generated/android/c++/JHybridOneKeyImageSpec.hpp +2 -0
  11. package/lib/nitrogen/generated/android/c++/views/JHybridOneKeyImageStateUpdater.cpp +5 -0
  12. package/lib/nitrogen/generated/android/kotlin/com/margelo/nitro/onekeyimage/HybridOneKeyImageSpec.kt +6 -0
  13. package/lib/nitrogen/generated/ios/c++/HybridOneKeyImageSpecSwift.hpp +7 -0
  14. package/lib/nitrogen/generated/ios/c++/views/HybridOneKeyImageComponent.mm +6 -0
  15. package/lib/nitrogen/generated/ios/swift/HybridOneKeyImageSpec.swift +1 -0
  16. package/lib/nitrogen/generated/ios/swift/HybridOneKeyImageSpec_cxx.swift +24 -0
  17. package/lib/nitrogen/generated/shared/c++/HybridOneKeyImageSpec.cpp +2 -0
  18. package/lib/nitrogen/generated/shared/c++/HybridOneKeyImageSpec.hpp +2 -0
  19. package/lib/nitrogen/generated/shared/c++/views/HybridOneKeyImageComponent.cpp +2 -0
  20. package/lib/nitrogen/generated/shared/c++/views/HybridOneKeyImageComponent.hpp +3 -0
  21. package/lib/nitrogen/generated/shared/json/OneKeyImageConfig.json +1 -0
  22. package/lib/typescript/src/OneKeyImage.nitro.d.ts +2 -0
  23. package/lib/typescript/src/index.d.ts +1 -1
  24. package/nitrogen/generated/android/c++/JHybridOneKeyImageSpec.cpp +9 -0
  25. package/nitrogen/generated/android/c++/JHybridOneKeyImageSpec.hpp +2 -0
  26. package/nitrogen/generated/android/c++/views/JHybridOneKeyImageStateUpdater.cpp +5 -0
  27. package/nitrogen/generated/android/kotlin/com/margelo/nitro/onekeyimage/HybridOneKeyImageSpec.kt +6 -0
  28. package/nitrogen/generated/ios/c++/HybridOneKeyImageSpecSwift.hpp +7 -0
  29. package/nitrogen/generated/ios/c++/views/HybridOneKeyImageComponent.mm +6 -0
  30. package/nitrogen/generated/ios/swift/HybridOneKeyImageSpec.swift +1 -0
  31. package/nitrogen/generated/ios/swift/HybridOneKeyImageSpec_cxx.swift +24 -0
  32. package/nitrogen/generated/shared/c++/HybridOneKeyImageSpec.cpp +2 -0
  33. package/nitrogen/generated/shared/c++/HybridOneKeyImageSpec.hpp +2 -0
  34. package/nitrogen/generated/shared/c++/views/HybridOneKeyImageComponent.cpp +2 -0
  35. package/nitrogen/generated/shared/c++/views/HybridOneKeyImageComponent.hpp +3 -0
  36. package/nitrogen/generated/shared/json/OneKeyImageConfig.json +1 -0
  37. package/package.json +2 -2
  38. package/src/OneKeyImage.nitro.ts +2 -0
  39. 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(maxOf(hostView.width, hostView.height) / density.toDouble()).toInt(),
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
- internal val widthBuckets = intArrayOf(
10
- 32, 40, 48, 64, 96, 128, 160, 200, 256, 320, 480, 640, 960, 1280,
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 normalizedDensity = if (density.isFinite()) density.coerceIn(1f, MAX_DPR) else 1f
45
- val normalizedOverscan = if (overscan.isFinite()) overscan.coerceAtLeast(1.0) else 1.0
46
- val requestedPixels = ceil(displaySize * normalizedDensity * normalizedOverscan)
47
- if (!requestedPixels.isFinite() || requestedPixels >= widthBuckets.last()) {
48
- return widthBuckets.last()
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 {
@@ -18,7 +18,15 @@ class OneKeyImageRequestSignatureTest {
18
18
  assertEquals(signature(OneKeyImageContentFit.COVER), signature(null))
19
19
  }
20
20
 
21
- private fun signature(contentFit: OneKeyImageContentFit?): String = oneKeyImageRequestSignature(
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 selectsFirstBucketCoveringPhysicalOverscannedWidth() {
10
- assertEquals(256, OneKeyTosUrl.selectWidthBucket(100, 2f, 1.1))
11
- assertEquals(160, OneKeyTosUrl.selectWidthBucket(160, 1f, 1.0))
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(480, OneKeyTosUrl.selectWidthBucket(100, 5f, 1.1))
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(128, OneKeyTosUrl.selectWidthBucket(100, Float.NaN, 1.1))
23
- assertEquals(128, OneKeyTosUrl.selectWidthBucket(100, Float.POSITIVE_INFINITY, 1.1))
24
- assertEquals(200, OneKeyTosUrl.selectWidthBucket(100, 2f, Double.NaN))
25
- assertEquals(200, OneKeyTosUrl.selectWidthBucket(100, 2f, Double.POSITIVE_INFINITY))
26
- assertEquals(1280, OneKeyTosUrl.selectWidthBucket(100, 2f, Double.MAX_VALUE))
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("w_256"))
79
+ assertTrue(result.contains("w_384"))
48
80
  }
49
81
  assertEquals(
50
82
  "https://web.onekey-asset.com/token.png",
@@ -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: max(hostView.bounds.width, hostView.bounds.height),
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
@@ -1,8 +1,10 @@
1
1
  import Foundation
2
2
 
3
3
  enum OneKeyTosURL {
4
- static let widthBuckets = [
5
- 32, 40, 48, 64, 96, 128, 160, 200, 256, 320, 480, 640, 960, 1280,
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
- let requestedPixels = ceil(displaySize * normalizedScale * normalizedOverscan)
30
- let bucket: Int
31
- if !requestedPixels.isFinite || requestedPixels >= CGFloat(widthBuckets.last!) {
32
- bucket = widthBuckets.last!
33
- } else {
34
- let requested = Int(requestedPixels)
35
- bucket = widthBuckets.first(where: { $0 >= requested }) ?? widthBuckets.last!
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("w_256"))
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("w_480"))
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("w_128"))
140
+ XCTAssertTrue(result.absoluteString.contains("w_384"))
101
141
  XCTAssertEqual(
102
142
  OneKeyTosURL.optimized(
103
143
  rawURL: raw,
@@ -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)) {
@@ -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() ||
@@ -12,6 +12,7 @@
12
12
  "autoplay": true,
13
13
  "recyclingKey": true,
14
14
  "optimizeTos": true,
15
+ "resizeWidth": true,
15
16
  "overscan": true,
16
17
  "loadingStrategy": true,
17
18
  "onLoadStart": true,
@@ -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)) {
@@ -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() ||
@@ -12,6 +12,7 @@
12
12
  "autoplay": true,
13
13
  "recyclingKey": true,
14
14
  "optimizeTos": true,
15
+ "resizeWidth": true,
15
16
  "overscan": true,
16
17
  "loadingStrategy": true,
17
18
  "onLoadStart": true,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@onekeyfe/react-native-image",
3
- "version": "3.0.106",
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.106",
84
+ "@onekeyfe/react-native-skeleton": "3.0.107",
85
85
  "react": "*",
86
86
  "react-native": "*",
87
87
  "react-native-nitro-modules": "0.37.0"
@@ -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,