add onLoad prop to Image component (#2293)

# Summary

Closes #1442

We want to add new props to the Image Component.

## Test Plan

Added the Test component. 
Manually test that in Android and IOS platforms on new and old
Architectures.

### What are the steps to reproduce (after prerequisites)?

## Compatibility

| OS      | Implemented |
| ------- | :---------: |
| iOS     |         |
| Android |         |
This commit is contained in:
Bohdan Artiukhov
2024-06-27 16:10:28 +02:00
committed by GitHub
parent 7b5d4daaed
commit c0ee3e9ca0
13 changed files with 225 additions and 9 deletions
@@ -30,8 +30,12 @@ import com.facebook.react.bridge.Dynamic;
import com.facebook.react.bridge.ReactContext;
import com.facebook.react.bridge.ReadableMap;
import com.facebook.react.common.ReactConstants;
import com.facebook.react.uimanager.UIManagerHelper;
import com.facebook.react.uimanager.events.EventDispatcher;
import com.facebook.react.views.imagehelper.ImageSource;
import com.facebook.react.views.imagehelper.ResourceDrawableIdHelper;
import com.horcrux.svg.events.SvgLoadEvent;
import java.util.concurrent.atomic.AtomicBoolean;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
@@ -137,6 +141,15 @@ class ImageView extends RenderableView {
new BaseBitmapDataSubscriber() {
@Override
public void onNewResultImpl(Bitmap bitmap) {
final EventDispatcher mEventDispatcher =
UIManagerHelper.getEventDispatcherForReactTag(mContext, getId());
mEventDispatcher.dispatchEvent(new SvgLoadEvent(
UIManagerHelper.getSurfaceId(ImageView.this),
getId(),
mContext,
uriString,
bitmap.getWidth(),
bitmap.getHeight()));
mLoading.set(false);
SvgView view = getSvgView();
if (view != null) {
@@ -82,6 +82,7 @@ import com.facebook.react.bridge.JavaOnlyMap;
import com.facebook.react.bridge.ReadableArray;
import com.facebook.react.bridge.ReadableMap;
import com.facebook.react.bridge.ReadableType;
import com.facebook.react.common.MapBuilder;
import com.facebook.react.uimanager.DisplayMetricsHolder;
import com.facebook.react.uimanager.LayoutShadowNode;
import com.facebook.react.uimanager.MatrixMathHelper;
@@ -134,7 +135,10 @@ import com.facebook.react.viewmanagers.RNSVGTextPathManagerDelegate;
import com.facebook.react.viewmanagers.RNSVGTextPathManagerInterface;
import com.facebook.react.viewmanagers.RNSVGUseManagerDelegate;
import com.facebook.react.viewmanagers.RNSVGUseManagerInterface;
import com.horcrux.svg.events.SvgLoadEvent;
import java.util.HashMap;
import java.util.Locale;
import java.util.Map;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
@@ -926,6 +930,12 @@ class RenderableViewManager<T extends RenderableView> extends VirtualViewManager
public void setMeetOrSlice(ImageView node, int meetOrSlice) {
node.setMeetOrSlice(meetOrSlice);
}
public Map<String, Object> getExportedCustomDirectEventTypeConstants() {
Map<String, Object> eventTypes = new HashMap<>();
eventTypes.put(SvgLoadEvent.EVENT_NAME, MapBuilder.of("registrationName", "onLoad"));
return eventTypes;
}
}
static class CircleViewManager extends RenderableViewManager<CircleView>
@@ -0,0 +1,47 @@
package com.horcrux.svg.events;
import com.facebook.react.bridge.Arguments;
import com.facebook.react.bridge.ReactContext;
import com.facebook.react.bridge.WritableMap;
import com.facebook.react.uimanager.events.Event;
import com.facebook.react.uimanager.events.RCTEventEmitter;
import com.facebook.react.views.imagehelper.ImageSource;
public class SvgLoadEvent extends Event<SvgLoadEvent> {
public static final String EVENT_NAME = "topLoad";
private final float width;
private final float height;
private final String uri;
public SvgLoadEvent(int surfaceId, int viewId, ReactContext mContext, String uriString, float width, float height) {
super(surfaceId, viewId);
ImageSource imageSource = new ImageSource(mContext, uriString);
this.uri = imageSource.getSource();;
this.width = width;
this.height = height;
}
@Override
public String getEventName() {
return EVENT_NAME;
}
@Override
public short getCoalescingKey() {
return 0;
}
@Override
public void dispatch(RCTEventEmitter rctEventEmitter) {
rctEventEmitter.receiveEvent(getViewTag(), getEventName(), getEventData());
}
protected WritableMap getEventData() {
WritableMap eventData = Arguments.createMap();
eventData.putDouble("width", width);
eventData.putDouble("height", height);
eventData.putString("uri", uri);
return eventData;
}
}