RCTImageViewManager.mm 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. /*
  2. * Copyright (c) Facebook, Inc. and its affiliates.
  3. *
  4. * This source code is licensed under the MIT license found in the
  5. * LICENSE file in the root directory of this source tree.
  6. */
  7. #import <React/RCTImageViewManager.h>
  8. #import <UIKit/UIKit.h>
  9. #import <React/RCTConvert.h>
  10. #import <React/RCTImageSource.h>
  11. #import <React/RCTImageShadowView.h>
  12. #import <React/RCTImageView.h>
  13. #import <React/RCTImageLoaderProtocol.h>
  14. @implementation RCTImageViewManager
  15. RCT_EXPORT_MODULE()
  16. - (RCTShadowView *)shadowView
  17. {
  18. return [RCTImageShadowView new];
  19. }
  20. - (UIView *)view
  21. {
  22. return [[RCTImageView alloc] initWithBridge:self.bridge];
  23. }
  24. RCT_EXPORT_VIEW_PROPERTY(blurRadius, CGFloat)
  25. RCT_EXPORT_VIEW_PROPERTY(capInsets, UIEdgeInsets)
  26. RCT_REMAP_VIEW_PROPERTY(defaultSource, defaultImage, UIImage)
  27. RCT_EXPORT_VIEW_PROPERTY(onLoadStart, RCTDirectEventBlock)
  28. RCT_EXPORT_VIEW_PROPERTY(onProgress, RCTDirectEventBlock)
  29. RCT_EXPORT_VIEW_PROPERTY(onError, RCTDirectEventBlock)
  30. RCT_EXPORT_VIEW_PROPERTY(onPartialLoad, RCTDirectEventBlock)
  31. RCT_EXPORT_VIEW_PROPERTY(onLoad, RCTDirectEventBlock)
  32. RCT_EXPORT_VIEW_PROPERTY(onLoadEnd, RCTDirectEventBlock)
  33. RCT_EXPORT_VIEW_PROPERTY(resizeMode, RCTResizeMode)
  34. RCT_REMAP_VIEW_PROPERTY(source, imageSources, NSArray<RCTImageSource *>);
  35. RCT_CUSTOM_VIEW_PROPERTY(tintColor, UIColor, RCTImageView)
  36. {
  37. // Default tintColor isn't nil - it's inherited from the superView - but we
  38. // want to treat a null json value for `tintColor` as meaning 'disable tint',
  39. // so we toggle `renderingMode` here instead of in `-[RCTImageView setTintColor:]`
  40. view.tintColor = [RCTConvert UIColor:json] ?: defaultView.tintColor;
  41. view.renderingMode = json ? UIImageRenderingModeAlwaysTemplate : defaultView.renderingMode;
  42. }
  43. RCT_EXPORT_METHOD(getSize:(NSURLRequest *)request
  44. successBlock:(RCTResponseSenderBlock)successBlock
  45. errorBlock:(RCTResponseErrorBlock)errorBlock)
  46. {
  47. [[self.bridge moduleForName:@"ImageLoader" lazilyLoadIfNecessary:YES]
  48. getImageSizeForURLRequest:request
  49. block:^(NSError *error, CGSize size) {
  50. if (error) {
  51. errorBlock(error);
  52. } else {
  53. successBlock(@[@(size.width), @(size.height)]);
  54. }
  55. }];
  56. }
  57. RCT_EXPORT_METHOD(getSizeWithHeaders:(RCTImageSource *)source
  58. resolve:(RCTPromiseResolveBlock)resolve
  59. reject:(RCTPromiseRejectBlock)reject)
  60. {
  61. [[self.bridge moduleForName:@"ImageLoader" lazilyLoadIfNecessary:YES]
  62. getImageSizeForURLRequest:source.request
  63. block:^(NSError *error, CGSize size) {
  64. if (error) {
  65. reject(@"E_GET_SIZE_FAILURE", nil, error);
  66. return;
  67. }
  68. resolve(@{@"width":@(size.width),@"height":@(size.height)});
  69. }];
  70. }
  71. RCT_EXPORT_METHOD(prefetchImage:(NSURLRequest *)request
  72. resolve:(RCTPromiseResolveBlock)resolve
  73. reject:(RCTPromiseRejectBlock)reject)
  74. {
  75. if (!request) {
  76. reject(@"E_INVALID_URI", @"Cannot prefetch an image for an empty URI", nil);
  77. return;
  78. }
  79. id<RCTImageLoaderProtocol> imageLoader = (id<RCTImageLoaderProtocol>)[self.bridge
  80. moduleForName:@"ImageLoader" lazilyLoadIfNecessary:YES];
  81. [imageLoader loadImageWithURLRequest:request
  82. priority:RCTImageLoaderPriorityPrefetch
  83. callback:^(NSError *error, UIImage *image) {
  84. if (error) {
  85. reject(@"E_PREFETCH_FAILURE", nil, error);
  86. return;
  87. }
  88. resolve(@YES);
  89. }];
  90. }
  91. RCT_EXPORT_METHOD(queryCache:(NSArray *)requests
  92. resolve:(RCTPromiseResolveBlock)resolve
  93. reject:(RCTPromiseRejectBlock)reject)
  94. {
  95. resolve([[self.bridge moduleForName:@"ImageLoader"] getImageCacheStatus:requests]);
  96. }
  97. @end