mirror of
https://github.com/status-im/react-native.git
synced 2025-01-17 13:01:13 +00:00
1658a4c080
Summary: The API was available only on Android (with no mention to that effect in the docs, AFAICT). This commit adds a simple iOS implementation based on NSURLCache. It should be possible to query the decoded image cache as well to provide higher fidelity (i.e. "disk", "memory", "decoded") if the caller passes size, scale, etc. in addition to the image URL, but it's probably not worth the complexity. The assumption is that callers are interested in the durability rather than performance aspect of the returned information. Tested with RNTester on iPhone emulator. [IOS] [ENHANCEMENT] [Image] - Implemented queryCache Pull Request resolved: https://github.com/facebook/react-native/pull/18782 Differential Revision: D9411533 Pulled By: hramos fbshipit-source-id: b430263959bb5f9b8ed9e28bb0a95f8879df881a
93 lines
3.3 KiB
Objective-C
93 lines
3.3 KiB
Objective-C
/**
|
|
* Copyright (c) 2015-present, Facebook, Inc.
|
|
*
|
|
* This source code is licensed under the MIT license found in the
|
|
* LICENSE file in the root directory of this source tree.
|
|
*/
|
|
|
|
#import "RCTImageViewManager.h"
|
|
|
|
#import <UIKit/UIKit.h>
|
|
|
|
#import <React/RCTConvert.h>
|
|
|
|
#import "RCTImageLoader.h"
|
|
#import "RCTImageShadowView.h"
|
|
#import "RCTImageView.h"
|
|
|
|
@implementation RCTImageViewManager
|
|
|
|
RCT_EXPORT_MODULE()
|
|
|
|
- (RCTShadowView *)shadowView
|
|
{
|
|
return [RCTImageShadowView new];
|
|
}
|
|
|
|
- (UIView *)view
|
|
{
|
|
return [[RCTImageView alloc] initWithBridge:self.bridge];
|
|
}
|
|
|
|
RCT_EXPORT_VIEW_PROPERTY(blurRadius, CGFloat)
|
|
RCT_EXPORT_VIEW_PROPERTY(capInsets, UIEdgeInsets)
|
|
RCT_REMAP_VIEW_PROPERTY(defaultSource, defaultImage, UIImage)
|
|
RCT_EXPORT_VIEW_PROPERTY(onLoadStart, RCTDirectEventBlock)
|
|
RCT_EXPORT_VIEW_PROPERTY(onProgress, RCTDirectEventBlock)
|
|
RCT_EXPORT_VIEW_PROPERTY(onError, RCTDirectEventBlock)
|
|
RCT_EXPORT_VIEW_PROPERTY(onPartialLoad, RCTDirectEventBlock)
|
|
RCT_EXPORT_VIEW_PROPERTY(onLoad, RCTDirectEventBlock)
|
|
RCT_EXPORT_VIEW_PROPERTY(onLoadEnd, RCTDirectEventBlock)
|
|
RCT_EXPORT_VIEW_PROPERTY(resizeMode, RCTResizeMode)
|
|
RCT_REMAP_VIEW_PROPERTY(source, imageSources, NSArray<RCTImageSource *>);
|
|
RCT_CUSTOM_VIEW_PROPERTY(tintColor, UIColor, RCTImageView)
|
|
{
|
|
// Default tintColor isn't nil - it's inherited from the superView - but we
|
|
// want to treat a null json value for `tintColor` as meaning 'disable tint',
|
|
// so we toggle `renderingMode` here instead of in `-[RCTImageView setTintColor:]`
|
|
view.tintColor = [RCTConvert UIColor:json] ?: defaultView.tintColor;
|
|
view.renderingMode = json ? UIImageRenderingModeAlwaysTemplate : defaultView.renderingMode;
|
|
}
|
|
|
|
RCT_EXPORT_METHOD(getSize:(NSURLRequest *)request
|
|
successBlock:(RCTResponseSenderBlock)successBlock
|
|
errorBlock:(RCTResponseErrorBlock)errorBlock)
|
|
{
|
|
[self.bridge.imageLoader getImageSizeForURLRequest:request
|
|
block:^(NSError *error, CGSize size) {
|
|
if (error) {
|
|
errorBlock(error);
|
|
} else {
|
|
successBlock(@[@(size.width), @(size.height)]);
|
|
}
|
|
}];
|
|
}
|
|
|
|
RCT_EXPORT_METHOD(prefetchImage:(NSURLRequest *)request
|
|
resolve:(RCTPromiseResolveBlock)resolve
|
|
reject:(RCTPromiseRejectBlock)reject)
|
|
{
|
|
if (!request) {
|
|
reject(@"E_INVALID_URI", @"Cannot prefetch an image for an empty URI", nil);
|
|
return;
|
|
}
|
|
|
|
[self.bridge.imageLoader loadImageWithURLRequest:request
|
|
callback:^(NSError *error, UIImage *image) {
|
|
if (error) {
|
|
reject(@"E_PREFETCH_FAILURE", nil, error);
|
|
return;
|
|
}
|
|
resolve(@YES);
|
|
}];
|
|
}
|
|
|
|
RCT_EXPORT_METHOD(queryCache:(NSArray *)requests
|
|
resolve:(RCTPromiseResolveBlock)resolve
|
|
reject:(RCTPromiseRejectBlock)reject)
|
|
{
|
|
resolve([self.bridge.imageLoader getImageCacheStatus:requests]);
|
|
}
|
|
|
|
@end
|