diff --git a/WebImage/WebImage/WebImageView.h b/WebImage/WebImage/WebImageView.h index ac7177c8..2a003d21 100644 --- a/WebImage/WebImage/WebImageView.h +++ b/WebImage/WebImage/WebImageView.h @@ -9,6 +9,7 @@ @interface WebImageView : UIImageView @property (nonatomic, copy) RCTDirectEventBlock onWebImageError; +@property (nonatomic, copy) RCTDirectEventBlock onWebImageSuccess; @property (nonatomic) WebImageSource* source; @end diff --git a/WebImage/WebImage/WebImageView.m b/WebImage/WebImage/WebImageView.m index d2ce1573..c8f36c82 100644 --- a/WebImage/WebImage/WebImageView.m +++ b/WebImage/WebImage/WebImageView.m @@ -1,9 +1,23 @@ #import "WebImageView.h" -@implementation WebImageView +@implementation WebImageView{ + BOOL isCallback; +} - (void)setSource:(WebImageSource *)source { _source = source; + isCallback= NO; + + SDWebImageManager* manager =[[SDWebImageManager alloc] init]; + [manager cachedImageExistsForURL:source.uri completion:^(BOOL inCache) { + if(!inCache || isCallback) return ; + if(_onWebImageSuccess){ + _onWebImageSuccess(@{ @"uri":self->_source.uri.absoluteString, @"type" : @"cache"}); + } + + isCallback = YES; + }]; + [self sd_setImageWithURL:source.uri completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, NSURL *imageURL) { if (error) { if (_onWebImageError) { @@ -11,6 +25,12 @@ - (void)setSource:(WebImageSource *)source { } return; } + else{ + if(_onWebImageSuccess && !self->isCallback){ + self->isCallback = YES; + _onWebImageSuccess(@{ @"uri":imageURL.absoluteString}); + } + } }]; } diff --git a/WebImage/WebImage/WebImageViewManager.m b/WebImage/WebImage/WebImageViewManager.m index c8baacf2..09ba315d 100644 --- a/WebImage/WebImage/WebImageViewManager.m +++ b/WebImage/WebImage/WebImageViewManager.m @@ -50,5 +50,6 @@ - (UIView*)view { } RCT_EXPORT_VIEW_PROPERTY(onWebImageError, RCTDirectEventBlock); +RCT_EXPORT_VIEW_PROPERTY(onWebImageSuccess, RCTDirectEventBlock); @end diff --git a/android/src/main/java/org/vovkasm/WebImage/WebImageView.java b/android/src/main/java/org/vovkasm/WebImage/WebImageView.java index df57e71b..54fecaca 100644 --- a/android/src/main/java/org/vovkasm/WebImage/WebImageView.java +++ b/android/src/main/java/org/vovkasm/WebImage/WebImageView.java @@ -230,6 +230,15 @@ private static class WebImageViewTarget extends ViewTarget @Override public void onResourceReady(Bitmap bitmap, GlideAnimation glideAnimation) { view.setBitmap(bitmap); + ThemedReactContext context = view.getThemedReactContext(); + if (context != null) { + WritableMap event = Arguments.createMap(); + final Uri uri = view.getImageUri(); + if (uri != null) { + event.putString("uri", uri.toString()); + } + context.getJSModule(RCTEventEmitter.class).receiveEvent(view.getId(), "onWebImageSuccess", event); + } } @Override diff --git a/android/src/main/java/org/vovkasm/WebImage/WebImageViewManager.java b/android/src/main/java/org/vovkasm/WebImage/WebImageViewManager.java index 3d7d7453..156f9ad7 100644 --- a/android/src/main/java/org/vovkasm/WebImage/WebImageViewManager.java +++ b/android/src/main/java/org/vovkasm/WebImage/WebImageViewManager.java @@ -128,6 +128,12 @@ public Map getExportedCustomDirectEventTypeConstants() { Map onErrorEventExport = new HashMap<>(); onErrorEventExport.put("registrationName", "onWebImageError"); exportedEvents.put("onWebImageError", onErrorEventExport); + + // declare success event + Map onSuccessEventExport = new HashMap<>(); + onSuccessEventExport.put("registrationName", "onWebImageSuccess"); + exportedEvents.put("onWebImageSuccess", onSuccessEventExport); + return exportedEvents; } diff --git a/lib/index.js b/lib/index.js index f3159b01..81b2ea21 100644 --- a/lib/index.js +++ b/lib/index.js @@ -42,14 +42,23 @@ class WebImage extends React.Component { * error - error message * uri - URL that result this error */ - onError: PropTypes.func + onError: PropTypes.func, + /** + * Callback called on success. With event.nativeEvent object with props: + * uri - URL that result this success + */ + onSuccess : PropTypes.func } render () { const { source, ...props } = this.props const resolvedSource = resolveAssetSource(source) - return + return + } + + _onSuccess = (e) => { + this.props.onSuccess && this.props.onSuccess(e.nativeEvent) } _onError = (e) => { @@ -62,7 +71,7 @@ WebImage.defaultProps = { } var WebImageView = requireNativeComponent('WebImageView', WebImage, { - nativeOnly: {onWebImageError: true} + nativeOnly: {onWebImageError: true, onWebImageSuccess : true} }) export default WebImage