diff --git a/packages/react-native/Libraries/AppDelegate/RCTAppSetupUtils.mm b/packages/react-native/Libraries/AppDelegate/RCTAppSetupUtils.mm index 99484c42092..a416e90b907 100644 --- a/packages/react-native/Libraries/AppDelegate/RCTAppSetupUtils.mm +++ b/packages/react-native/Libraries/AppDelegate/RCTAppSetupUtils.mm @@ -10,13 +10,13 @@ #if RCT_NEW_ARCH_ENABLED // Turbo Module #import +#import #import #import #import #import #import #import -#import #import // Fabric @@ -83,7 +83,7 @@ id RCTAppSetupDefaultModuleFromClass(Class moduleClass) if (moduleClass == RCTImageLoader.class) { return [[moduleClass alloc] initWithRedirectDelegate:nil loadersProvider:^NSArray> *(RCTModuleRegistry *moduleRegistry) { - return @[ [RCTLocalAssetImageLoader new] ]; + return @[ [RCTBundleAssetImageLoader new] ]; } decodersProvider:^NSArray> *(RCTModuleRegistry *moduleRegistry) { return @[ [RCTGIFImageDecoder new] ]; diff --git a/packages/react-native/Libraries/Image/RCTBundleAssetImageLoader.h b/packages/react-native/Libraries/Image/RCTBundleAssetImageLoader.h new file mode 100644 index 00000000000..fd91a7b86d9 --- /dev/null +++ b/packages/react-native/Libraries/Image/RCTBundleAssetImageLoader.h @@ -0,0 +1,12 @@ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +#import + +@interface RCTBundleAssetImageLoader : NSObject + +@end diff --git a/packages/react-native/Libraries/Image/RCTBundleAssetImageLoader.mm b/packages/react-native/Libraries/Image/RCTBundleAssetImageLoader.mm new file mode 100644 index 00000000000..f412e9b74c1 --- /dev/null +++ b/packages/react-native/Libraries/Image/RCTBundleAssetImageLoader.mm @@ -0,0 +1,83 @@ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +#import + +#import +#import + +#import +#import + +#import "RCTImagePlugins.h" + +@interface RCTBundleAssetImageLoader () +@end + +@implementation RCTBundleAssetImageLoader + +RCT_EXPORT_MODULE() + +- (BOOL)canLoadImageURL:(NSURL *)requestURL +{ + return RCTIsBundleAssetURL(requestURL); +} + +- (BOOL)requiresScheduling +{ + // Don't schedule this loader on the URL queue so we can load the + // local assets synchronously to avoid flickers. + return NO; +} + +- (BOOL)shouldCacheLoadedImages +{ + // UIImage imageNamed handles the caching automatically so we don't want + // to add it to the image cache. + return NO; +} + +- (nullable RCTImageLoaderCancellationBlock)loadImageForURL:(NSURL *)imageURL + size:(CGSize)size + scale:(CGFloat)scale + resizeMode:(RCTResizeMode)resizeMode + progressHandler:(RCTImageLoaderProgressBlock)progressHandler + partialLoadHandler:(RCTImageLoaderPartialLoadBlock)partialLoadHandler + completionHandler:(RCTImageLoaderCompletionBlock)completionHandler +{ + UIImage *image = RCTImageFromLocalAssetURL(imageURL); + if (image) { + if (progressHandler) { + progressHandler(1, 1); + } + completionHandler(nil, image); + } else { + NSString *message = [NSString stringWithFormat:@"Could not find image %@", imageURL]; + RCTLogWarn(@"%@", message); + completionHandler(RCTErrorWithMessage(message), nil); + } + + return nil; +} + +- (std::shared_ptr)getTurboModule: + (const facebook::react::ObjCTurboModule::InitParams &)params +{ + return nullptr; +} + +- (float)loaderPriority +{ + return 1; +} + +@end + +Class RCTBundleAssetImageLoaderCls(void) +{ + return RCTBundleAssetImageLoader.class; +} diff --git a/packages/react-native/Libraries/Image/RCTLocalAssetImageLoader.h b/packages/react-native/Libraries/Image/RCTLocalAssetImageLoader.h index 453accef355..c7d3465b827 100644 --- a/packages/react-native/Libraries/Image/RCTLocalAssetImageLoader.h +++ b/packages/react-native/Libraries/Image/RCTLocalAssetImageLoader.h @@ -7,6 +7,7 @@ #import -@interface RCTLocalAssetImageLoader : NSObject +__deprecated_msg("Use RCTBundleAssetImageLoader instead") @interface RCTLocalAssetImageLoader + : NSObject @end diff --git a/packages/react-native/Libraries/Image/RCTLocalAssetImageLoader.mm b/packages/react-native/Libraries/Image/RCTLocalAssetImageLoader.mm index a79b4666b18..8f6e1b5c0d1 100644 --- a/packages/react-native/Libraries/Image/RCTLocalAssetImageLoader.mm +++ b/packages/react-native/Libraries/Image/RCTLocalAssetImageLoader.mm @@ -24,7 +24,7 @@ RCT_EXPORT_MODULE() - (BOOL)canLoadImageURL:(NSURL *)requestURL { - return RCTIsLocalAssetURL(requestURL); + return RCTIsBundleAssetURL(requestURL); } - (BOOL)requiresScheduling @@ -70,6 +70,11 @@ RCT_EXPORT_MODULE() return nullptr; } +- (float)loaderPriority +{ + return 0; +} + @end Class RCTLocalAssetImageLoaderCls(void)