@depup/react-native-fast-image 8.6.3-depup.0 → 8.13.1-depup.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (36) hide show
  1. package/README.md +2 -2
  2. package/RNFastImage.podspec +5 -2
  3. package/android/build.gradle +13 -0
  4. package/android/src/main/AndroidManifestNew.xml +3 -0
  5. package/android/src/main/java/com/dylanvann/fastimage/FastImageCookieHandler.java +84 -0
  6. package/android/src/main/java/com/dylanvann/fastimage/FastImageEvent.java +45 -0
  7. package/android/src/main/java/com/dylanvann/fastimage/FastImageEvents.java +60 -0
  8. package/android/src/main/java/com/dylanvann/fastimage/FastImageGif.java +110 -0
  9. package/android/src/main/java/com/dylanvann/fastimage/FastImageOkHttpProgressGlideModule.java +65 -5
  10. package/android/src/main/java/com/dylanvann/fastimage/FastImageRequestListener.java +65 -22
  11. package/android/src/main/java/com/dylanvann/fastimage/FastImageShadowNode.java +21 -0
  12. package/android/src/main/java/com/dylanvann/fastimage/FastImageSource.java +21 -1
  13. package/android/src/main/java/com/dylanvann/fastimage/FastImageSourceSize.java +237 -0
  14. package/android/src/main/java/com/dylanvann/fastimage/FastImageViewConverter.java +14 -5
  15. package/android/src/main/java/com/dylanvann/fastimage/FastImageViewManager.java +66 -22
  16. package/android/src/main/java/com/dylanvann/fastimage/FastImageViewModule.java +130 -24
  17. package/android/src/main/java/com/dylanvann/fastimage/FastImageViewWithUrl.java +359 -39
  18. package/android/src/main/java/com/dylanvann/fastimage/FastImageWebGlideUrl.java +13 -0
  19. package/changes.json +1 -1
  20. package/dist/index.cjs.js +166 -130
  21. package/dist/index.cjs.js.flow +33 -2
  22. package/dist/index.d.ts +77 -22
  23. package/dist/index.js +141 -121
  24. package/dist/index.js.flow +33 -2
  25. package/ios/FastImage/FFFDownsampledImage.h +28 -0
  26. package/ios/FastImage/FFFDownsampledImage.m +169 -0
  27. package/ios/FastImage/FFFastImageSource.h +6 -0
  28. package/ios/FastImage/FFFastImageSource.m +13 -0
  29. package/ios/FastImage/FFFastImageView.h +17 -0
  30. package/ios/FastImage/FFFastImageView.m +498 -71
  31. package/ios/FastImage/FFFastImageViewManager.m +106 -8
  32. package/ios/FastImage/RCTConvert+FFFastImage.m +4 -1
  33. package/package.json +31 -43
  34. package/dist/index.d.ts.map +0 -1
  35. package/dist/index.test.d.ts +0 -2
  36. package/dist/index.test.d.ts.map +0 -1
@@ -2,6 +2,8 @@
2
2
  #import "FFFastImageView.h"
3
3
 
4
4
  #import <SDWebImage/SDImageCache.h>
5
+ #import <SDWebImage/SDWebImageManager.h>
6
+ #import <SDWebImage/SDWebImageError.h>
5
7
  #import <SDWebImage/SDWebImagePrefetcher.h>
6
8
 
7
9
  @implementation FFFastImageViewManager
@@ -15,6 +17,11 @@ RCT_EXPORT_MODULE(FastImageView)
15
17
  RCT_EXPORT_VIEW_PROPERTY(source, FFFastImageSource)
16
18
  RCT_EXPORT_VIEW_PROPERTY(defaultSource, UIImage)
17
19
  RCT_EXPORT_VIEW_PROPERTY(resizeMode, RCTResizeMode)
20
+ RCT_EXPORT_VIEW_PROPERTY(recyclingKey, NSString)
21
+ RCT_EXPORT_VIEW_PROPERTY(loopCount, NSInteger)
22
+ RCT_EXPORT_VIEW_PROPERTY(imageRendering, NSString)
23
+ RCT_EXPORT_VIEW_PROPERTY(paused, BOOL)
24
+ RCT_EXPORT_VIEW_PROPERTY(downsample, BOOL)
18
25
  RCT_EXPORT_VIEW_PROPERTY(onFastImageLoadStart, RCTDirectEventBlock)
19
26
  RCT_EXPORT_VIEW_PROPERTY(onFastImageProgress, RCTDirectEventBlock)
20
27
  RCT_EXPORT_VIEW_PROPERTY(onFastImageError, RCTDirectEventBlock)
@@ -22,18 +29,109 @@ RCT_EXPORT_VIEW_PROPERTY(onFastImageLoad, RCTDirectEventBlock)
22
29
  RCT_EXPORT_VIEW_PROPERTY(onFastImageLoadEnd, RCTDirectEventBlock)
23
30
  RCT_REMAP_VIEW_PROPERTY(tintColor, imageColor, UIColor)
24
31
 
25
- RCT_EXPORT_METHOD(preload:(nonnull NSArray<FFFastImageSource *> *)sources)
32
+ // Preloads waiting to start, in the order they were added, and the number
33
+ // loading, across all preload calls. Like SDWebImagePrefetcher, at most
34
+ // maxConcurrentPrefetchCount load at a time, so a long list doesn't queue
35
+ // hundreds of operations ahead of the images the app is showing. Only used on
36
+ // the main queue (SDWebImageManager calls its completion blocks there).
37
+ static NSMutableArray<dispatch_block_t> *FFFPendingPreloads;
38
+ static NSUInteger FFFPreloadsInFlight;
39
+
40
+ static NSUInteger FFFPreloadLimit(void)
41
+ {
42
+ NSUInteger limit = [SDWebImagePrefetcher sharedImagePrefetcher].maxConcurrentPrefetchCount;
43
+ return MAX(limit, (NSUInteger)1);
44
+ }
45
+
46
+ // Starts pending preloads while there's room. A completion block calls it
47
+ // again, sometimes from inside start() (a memory cache hit completes
48
+ // synchronously on the main queue). That's fine: the counters are shared and
49
+ // updated before each start(), so the inner call starts what fits, and the
50
+ // outer loop sees the updated counters when it checks again.
51
+ static void FFFStartPendingPreloads(void)
26
52
  {
27
- NSMutableArray *urls = [NSMutableArray arrayWithCapacity:sources.count];
53
+ while (FFFPreloadsInFlight < FFFPreloadLimit() && FFFPendingPreloads.count > 0) {
54
+ dispatch_block_t start = FFFPendingPreloads.firstObject;
55
+ [FFFPendingPreloads removeObjectAtIndex:0];
56
+ FFFPreloadsInFlight++;
57
+ start();
58
+ }
59
+ }
60
+
61
+ // Resolves with a result per source, in order, once all have loaded or failed:
62
+ // { ok, width, height } or { ok: false, error }. Never rejects.
63
+ RCT_EXPORT_METHOD(preload:(nonnull NSArray<FFFastImageSource *> *)sources
64
+ resolve:(RCTPromiseResolveBlock)resolve
65
+ reject:(__unused RCTPromiseRejectBlock)reject)
66
+ {
67
+ // This runs on the UIManager queue; the queue state is only touched on
68
+ // the main queue.
69
+ dispatch_async(dispatch_get_main_queue(), ^{
70
+ if (!FFFPendingPreloads) {
71
+ FFFPendingPreloads = [NSMutableArray array];
72
+ }
73
+ NSMutableArray *results = [NSMutableArray arrayWithCapacity:sources.count];
74
+ // Sources of this call still to finish. It starts at the number of
75
+ // sources, so the promise can't resolve before they've all been added.
76
+ __block NSUInteger remaining = sources.count;
77
+ void (^finishOne)(void) = ^{
78
+ if (--remaining == 0) {
79
+ resolve(results);
80
+ }
81
+ };
82
+ // With the prefetcher's options (low priority), but one source at a
83
+ // time (not SDWebImagePrefetcher), to get each source's result and to
84
+ // send its headers with its own request only.
85
+ SDWebImageOptions prefetcherOptions = [SDWebImagePrefetcher sharedImagePrefetcher].options;
28
86
 
29
- [sources enumerateObjectsUsingBlock:^(FFFastImageSource * _Nonnull source, NSUInteger idx, BOOL * _Nonnull stop) {
30
- [source.headers enumerateKeysAndObjectsUsingBlock:^(NSString *key, NSString* header, BOOL *stop) {
31
- [[SDWebImageDownloader sharedDownloader] setValue:header forHTTPHeaderField:key];
87
+ [sources enumerateObjectsUsingBlock:^(FFFastImageSource * _Nonnull source, NSUInteger idx, BOOL * _Nonnull stop) {
88
+ if (!source.url) {
89
+ // An empty, missing or null uri (JS sends null sources as {}).
90
+ // It fails without taking a slot.
91
+ [results addObject:@{@"ok": @NO, @"error": @"Invalid source: no uri"}];
92
+ finishOne();
93
+ return;
94
+ }
95
+ [results addObject:[NSNull null]];
96
+ // A source's own priority replaces the prefetcher's, as on Android.
97
+ SDWebImageOptions options = prefetcherOptions;
98
+ if (source.hasPriority) {
99
+ options &= ~(SDWebImageLowPriority | SDWebImageHighPriority);
100
+ if (source.priority == FFFPriorityLow) {
101
+ options |= SDWebImageLowPriority;
102
+ } else if (source.priority == FFFPriorityHigh) {
103
+ options |= SDWebImageHighPriority;
104
+ }
105
+ }
106
+ [FFFPendingPreloads addObject:[^{
107
+ // Once per slot: SDWebImage calls this once with finished set
108
+ // (a progressive load calls it more, without).
109
+ __block BOOL done = NO;
110
+ [[SDWebImageManager sharedManager] loadImageWithURL:source.url
111
+ options:options
112
+ context:@{SDWebImageContextDownloadRequestModifier: source.requestModifier}
113
+ progress:nil
114
+ completed:^(UIImage *image, NSData *data, NSError *error, SDImageCacheType cacheType, BOOL finished, NSURL *imageURL) {
115
+ if (!finished || done) {
116
+ return;
117
+ }
118
+ done = YES;
119
+ results[idx] = image
120
+ ? @{@"ok": @YES, @"width": @(image.size.width), @"height": @(image.size.height)}
121
+ : @{@"ok": @NO, @"error": FFFErrorMessage(error)};
122
+ FFFPreloadsInFlight--;
123
+ finishOne();
124
+ FFFStartPendingPreloads();
125
+ }];
126
+ } copy]];
32
127
  }];
33
- [urls setObject:source.url atIndexedSubscript:idx];
34
- }];
35
128
 
36
- [[SDWebImagePrefetcher sharedImagePrefetcher] prefetchURLs:urls];
129
+ if (sources.count == 0) {
130
+ resolve(results);
131
+ return;
132
+ }
133
+ FFFStartPendingPreloads();
134
+ });
37
135
  }
38
136
 
39
137
  RCT_EXPORT_METHOD(clearMemoryCache:(RCTPromiseResolveBlock)resolve reject:(RCTPromiseRejectBlock)reject)
@@ -16,7 +16,8 @@ RCT_ENUM_CONVERTER(FFFCacheControl, (@{
16
16
  }), FFFCacheControlImmutable, integerValue);
17
17
 
18
18
  + (FFFastImageSource *)FFFastImageSource:(id)json {
19
- if (!json) {
19
+ // A null source (e.g. a null entry passed to preload).
20
+ if (!json || json == (id)kCFNull) {
20
21
  return nil;
21
22
  }
22
23
 
@@ -44,6 +45,8 @@ RCT_ENUM_CONVERTER(FFFCacheControl, (@{
44
45
  }
45
46
 
46
47
  FFFastImageSource *imageSource = [[FFFastImageSource alloc] initWithURL:uri priority:priority headers:headers cacheControl:cacheControl];
48
+ id priorityJSON = json[@"priority"];
49
+ imageSource.hasPriority = priorityJSON && priorityJSON != (id)kCFNull;
47
50
 
48
51
  return imageSource;
49
52
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@depup/react-native-fast-image",
3
- "version": "8.6.3-depup.0",
3
+ "version": "8.13.1-depup.0",
4
4
  "description": "🚩 FastImage, performant React Native image component. (with updated dependencies)",
5
5
  "keywords": [
6
6
  "react-native-fast-image",
@@ -21,7 +21,7 @@
21
21
  },
22
22
  "repository": {
23
23
  "type": "git",
24
- "url": "https://github.com/DylanVann/react-native-fast-image.git"
24
+ "url": "git+https://github.com/DylanVann/react-native-fast-image.git"
25
25
  },
26
26
  "license": "(MIT AND Apache-2.0)",
27
27
  "author": "Dylan Vann <dylan@dylanvann.com> (https://dylanvann.com)",
@@ -29,70 +29,58 @@
29
29
  "module": "dist/index.js",
30
30
  "typings": "dist/index.d.ts",
31
31
  "files": [
32
- "android",
33
- "!android/build",
34
- "ios",
35
- "!ios/build",
32
+ "android/build.gradle",
33
+ "android/src/main",
34
+ "ios/FastImage",
35
+ "ios/FastImage.xcodeproj/project.pbxproj",
36
+ "ios/FastImage.xcodeproj/xcshareddata",
36
37
  "dist",
37
38
  "RNFastImage.podspec",
38
39
  "changes.json",
39
40
  "README.md"
40
41
  ],
41
42
  "scripts": {
42
- "build": "dv-scripts build && cp src/index.js.flow dist/index.js.flow && cp src/index.js.flow dist/index.cjs.js.flow",
43
- "lint": "dv-scripts lint",
44
- "release": "dv-scripts release",
45
- "test": "dv-scripts test"
46
- },
47
- "prettier": {
48
- "semi": false,
49
- "singleQuote": true,
50
- "tabWidth": 4,
51
- "trailingComma": "all"
52
- },
53
- "eslintConfig": {
54
- "extends": "dv-scripts"
55
- },
56
- "jest": {
57
- "coveragePathIgnorePatterns": [
58
- "ReactNativeFastImageExample*",
59
- "ReactNativeFastImageExampleServer*"
60
- ],
61
- "modulePathIgnorePatterns": [
62
- "ReactNativeFastImageExample*",
63
- "ReactNativeFastImageExampleServer*"
64
- ],
65
- "preset": "react-native"
43
+ "build": "rm -rf dist && tsc -p tsconfig.build.json && rolldown -c && cp src/index.js.flow dist/index.js.flow && cp src/index.js.flow dist/index.cjs.js.flow",
44
+ "lint": "oxlint",
45
+ "release": "semantic-release",
46
+ "test": "bun test",
47
+ "typecheck": "tsc -p tsconfig.json",
48
+ "format": "oxfmt",
49
+ "format:check": "oxfmt --check"
66
50
  },
51
+ "packageManager": "bun@1.4.2",
67
52
  "resolutions": {
68
- "@jest/create-cache-key-function": "^27"
53
+ "@types/react": "^17.0.14"
69
54
  },
70
55
  "devDependencies": {
71
- "@babel/core": "^7.14.6",
72
- "@babel/runtime": "^7.14.6",
73
- "@types/jest": "^26.0.24",
56
+ "@semantic-release/changelog": "7.0.0",
57
+ "@semantic-release/git": "11.0.1",
58
+ "@types/bun": "^1.4.2",
74
59
  "@types/react": "^17.0.14",
75
60
  "@types/react-native": "^0.69.5",
76
61
  "@types/react-test-renderer": "^17.0.1",
77
- "dv-scripts": "^1.6.0",
78
- "eslint-config-dv-scripts": "^1.1.1",
79
- "metro-react-native-babel-preset": "^0.66.1",
80
- "prettier": "^2.3.2",
62
+ "conventional-changelog-angular": "8.3.1",
63
+ "maestro-runner": "1.1.27",
64
+ "odiff-bin": "^4.5.0",
65
+ "oxfmt": "0.70.0",
66
+ "oxlint": "1.85.0",
67
+ "pretty-format": "^30.5.1",
81
68
  "react": "17.0.2",
82
- "react-native": "0.64.2",
83
69
  "react-test-renderer": "17.0.2",
84
- "typescript": "^4.3.5"
70
+ "rolldown": "1.2.11",
71
+ "semantic-release": "25.0.9",
72
+ "typescript": "7.0.2"
85
73
  },
86
74
  "peerDependencies": {
87
- "react": "^17 || ^18",
75
+ "react": "^17 || ^18 || ^19",
88
76
  "react-native": ">=0.60.0"
89
77
  },
90
78
  "depup": {
91
79
  "changes": {},
92
80
  "depsUpdated": 0,
93
81
  "originalPackage": "react-native-fast-image",
94
- "originalVersion": "8.6.3",
95
- "processedAt": "2026-03-18T22:44:07.684Z",
82
+ "originalVersion": "8.13.1",
83
+ "processedAt": "2026-09-27T01:02:41.362Z",
96
84
  "smokeTest": "failed"
97
85
  }
98
86
  }
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.tsx"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=index.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.test.d.ts","sourceRoot":"","sources":["../src/index.test.tsx"],"names":[],"mappings":""}