Skip to content

Commit

Permalink
feat: new arch fixes (rnmapbox#3141)
Browse files Browse the repository at this point in the history
* fix: static cast for props

* feat: add viewTagResolver to other modules
  • Loading branch information
WoLewicki authored Oct 27, 2023
1 parent 32d0990 commit 6e77c7b
Show file tree
Hide file tree
Showing 32 changed files with 84 additions and 31 deletions.
6 changes: 3 additions & 3 deletions android/src/main/java/com/rnmapbox/rnmbx/RNMBXPackage.kt
Original file line number Diff line number Diff line change
Expand Up @@ -90,20 +90,20 @@ class RNMBXPackage : TurboReactPackage() {

// annotations
managers.add(RNMBXMarkerViewManager(reactApplicationContext))
managers.add(RNMBXPointAnnotationManager(reactApplicationContext))
managers.add(RNMBXPointAnnotationManager(reactApplicationContext, getViewTagResolver(reactApplicationContext)))
managers.add(RNMBXCalloutManager())
managers.add(RNMBXNativeUserLocationManager())

// sources
managers.add(RNMBXVectorSourceManager(reactApplicationContext))
managers.add(RNMBXShapeSourceManager(reactApplicationContext))
managers.add(RNMBXShapeSourceManager(reactApplicationContext, getViewTagResolver(reactApplicationContext)))
managers.add(RNMBXRasterDemSourceManager(reactApplicationContext))
managers.add(RNMBXRasterSourceManager(reactApplicationContext))
managers.add(RNMBXImageSourceManager())

// images
managers.add(RNMBXImagesManager(reactApplicationContext))
managers.add(RNMBXImageManager(reactApplicationContext))
managers.add(RNMBXImageManager(reactApplicationContext, getViewTagResolver(reactApplicationContext)))

// layers
managers.add(RNMBXFillLayerManager())
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,11 @@ class RNMBXPointAnnotation(private val mContext: Context, private val mManager:
mMapView?.offscreenAnnotationViewContainer?.removeView(childView)
}

override fun setId(id: Int) {
super.setId(id)
mManager.tagAssigned(id)
}

override fun addToMap(mapView: RNMBXMapView) {
super.addToMap(mapView)
mMap = mapView.getMapboxMap()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,10 +9,12 @@ import com.facebook.react.uimanager.annotations.ReactProp
import com.facebook.react.viewmanagers.RNMBXPointAnnotationManagerDelegate
import com.facebook.react.viewmanagers.RNMBXPointAnnotationManagerInterface
import com.rnmapbox.rnmbx.components.AbstractEventEmitter
import com.rnmapbox.rnmbx.components.styles.sources.RNMBXShapeSource
import com.rnmapbox.rnmbx.events.constants.EventKeys
import com.rnmapbox.rnmbx.utils.GeoJSONUtils.toPointGeometry
import com.rnmapbox.rnmbx.utils.ViewTagResolver

class RNMBXPointAnnotationManager(reactApplicationContext: ReactApplicationContext) : AbstractEventEmitter<RNMBXPointAnnotation>(reactApplicationContext),
class RNMBXPointAnnotationManager(reactApplicationContext: ReactApplicationContext, val viewTagResolver: ViewTagResolver) : AbstractEventEmitter<RNMBXPointAnnotation>(reactApplicationContext),
RNMBXPointAnnotationManagerInterface<RNMBXPointAnnotation> {

private val mDelegate: ViewManagerDelegate<RNMBXPointAnnotation>
Expand Down Expand Up @@ -44,6 +46,17 @@ class RNMBXPointAnnotationManager(reactApplicationContext: ReactApplicationConte
return RNMBXPointAnnotation(reactContext!!, this)
}

override fun onDropViewInstance(view: RNMBXPointAnnotation) {
val reactTag = view.id

viewTagResolver.viewRemoved(reactTag)
super.onDropViewInstance(view)
}

fun tagAssigned(reactTag: Int) {
return viewTagResolver.tagAssigned(reactTag)
}

@ReactProp(name = "id")
override fun setId(annotation: RNMBXPointAnnotation, id: Dynamic) {
annotation.iD = id.asString()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,11 @@ class RNMBXImage(private val mContext: ReactApplicationContext, private val mMan

var mBitmap : Bitmap? = null

override fun setId(id: Int) {
super.setId(id)
mManager.tagAssigned(id)
}

override fun onLayoutChange(v: View, left: Int, top: Int, right: Int, bottom: Int, oldLeft: Int, oldTop: Int,
oldRight: Int, oldBottom: Int) {
if (left == 0 && top == 0 && right == 0 && bottom == 0) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,10 @@ import com.facebook.react.uimanager.ThemedReactContext
import com.facebook.react.uimanager.annotations.ReactProp
import com.facebook.react.viewmanagers.RNMBXImageManagerInterface
import com.rnmapbox.rnmbx.components.AbstractEventEmitter
import com.rnmapbox.rnmbx.components.styles.sources.RNMBXShapeSource
import com.rnmapbox.rnmbx.utils.ViewTagResolver

class RNMBXImageManager(private val mContext: ReactApplicationContext) : AbstractEventEmitter<RNMBXImage>(
class RNMBXImageManager(private val mContext: ReactApplicationContext, val viewTagResolver: ViewTagResolver) : AbstractEventEmitter<RNMBXImage>(
mContext
), RNMBXImageManagerInterface<RNMBXImage> {
override fun getName(): String {
Expand All @@ -23,6 +25,17 @@ mContext
return mutableMapOf();
}

override fun onDropViewInstance(view: RNMBXImage) {
val reactTag = view.id

viewTagResolver.viewRemoved(reactTag)
super.onDropViewInstance(view)
}

fun tagAssigned(reactTag: Int) {
return viewTagResolver.tagAssigned(reactTag)
}

// region React properties
@ReactProp(name="name")
override fun setName(image: RNMBXImage, value: Dynamic) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,11 @@ class RNMBXShapeSource(context: Context, private val mManager: RNMBXShapeSourceM
}
}

override fun setId(id: Int) {
super.setId(id)
mManager.tagAssigned(id)
}

override fun makeSource(): GeoJsonSource {
val builder = GeoJsonSource.Builder(iD.toString())
getOptions(builder)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,13 +14,14 @@ import com.mapbox.maps.extension.style.expressions.generated.Expression
import com.rnmapbox.rnmbx.events.constants.EventKeys
import com.rnmapbox.rnmbx.utils.ExpressionParser
import com.rnmapbox.rnmbx.utils.Logger
import com.rnmapbox.rnmbx.utils.ViewTagResolver
import java.net.MalformedURLException
import java.net.URL
import java.util.ArrayList
import java.util.HashMap


class RNMBXShapeSourceManager(private val mContext: ReactApplicationContext) :
class RNMBXShapeSourceManager(private val mContext: ReactApplicationContext, val viewTagResolver: ViewTagResolver) :
AbstractEventEmitter<RNMBXShapeSource>(
mContext
), RNMBXShapeSourceManagerInterface<RNMBXShapeSource> {
Expand Down Expand Up @@ -48,6 +49,17 @@ class RNMBXShapeSourceManager(private val mContext: ReactApplicationContext) :
source.removeLayer(childPosition)
}

override fun onDropViewInstance(view: RNMBXShapeSource) {
val reactTag = view.id

viewTagResolver.viewRemoved(reactTag)
super.onDropViewInstance(view)
}

fun tagAssigned(reactTag: Int) {
return viewTagResolver.tagAssigned(reactTag)
}

@ReactProp(name = "id")
override fun setId(source: RNMBXShapeSource, id: Dynamic) {
source.iD = id.asString()
Expand Down
2 changes: 1 addition & 1 deletion ios/RNMBX/RNMBXAtmosphereComponentView.mm
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@ + (ComponentDescriptorProvider)componentDescriptorProvider

- (void)updateProps:(const Props::Shared &)props oldProps:(const Props::Shared &)oldProps
{
const auto &newProps = *std::static_pointer_cast<const RNMBXAtmosphereProps>(props);
const auto &newProps = static_cast<const RNMBXAtmosphereProps &>(*props);
id reactStyle = RNMBXConvertFollyDynamicToId(newProps.reactStyle);
if (reactStyle != nil) {
_view.reactStyle = reactStyle;
Expand Down
2 changes: 1 addition & 1 deletion ios/RNMBX/RNMBXBackgroundLayerComponentView.mm
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@ + (ComponentDescriptorProvider)componentDescriptorProvider

- (void)updateProps:(const Props::Shared &)props oldProps:(const Props::Shared &)oldProps
{
const auto &newProps = *std::static_pointer_cast<const RNMBXBackgroundLayerProps>(props);
const auto &newProps = static_cast<const RNMBXBackgroundLayerProps &>(*props);
RNMBXSetCommonLayerPropsWithoutSourceID(newProps, _view);


Expand Down
2 changes: 1 addition & 1 deletion ios/RNMBX/RNMBXCalloutComponentView.mm
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ + (ComponentDescriptorProvider)componentDescriptorProvider

- (void)updateProps:(const Props::Shared &)props oldProps:(const Props::Shared &)oldProps
{
const auto &newProps = *std::static_pointer_cast<const RNMBXCalloutProps>(props);
const auto &newProps = static_cast<const RNMBXCalloutProps &>(*props);

[super updateProps:props oldProps:oldProps];
}
Expand Down
2 changes: 1 addition & 1 deletion ios/RNMBX/RNMBXCameraComponentView.mm
Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,7 @@ + (ComponentDescriptorProvider)componentDescriptorProvider

- (void)updateProps:(const Props::Shared &)props oldProps:(const Props::Shared &)oldProps
{
const auto &newProps = *std::static_pointer_cast<const RNMBXCameraProps>(props);
const auto &newProps = static_cast<const RNMBXCameraProps &>(*props);
id maxBounds = RNMBXConvertFollyDynamicToId(newProps.maxBounds);
if (maxBounds != nil) {
_view.maxBounds = maxBounds;
Expand Down
2 changes: 1 addition & 1 deletion ios/RNMBX/RNMBXCircleLayerComponentView.mm
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@ + (ComponentDescriptorProvider)componentDescriptorProvider

- (void)updateProps:(const Props::Shared &)props oldProps:(const Props::Shared &)oldProps
{
const auto &newProps = *std::static_pointer_cast<const RNMBXCircleLayerProps>(props);
const auto &newProps = static_cast<const RNMBXCircleLayerProps &>(*props);
RNMBXSetCommonLayerProps(newProps, _view);

[super updateProps:props oldProps:oldProps];
Expand Down
2 changes: 1 addition & 1 deletion ios/RNMBX/RNMBXFillExtrusionLayerComponentView.mm
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@ + (ComponentDescriptorProvider)componentDescriptorProvider

- (void)updateProps:(const Props::Shared &)props oldProps:(const Props::Shared &)oldProps
{
const auto &newProps = *std::static_pointer_cast<const RNMBXFillExtrusionLayerProps>(props);
const auto &newProps = static_cast<const RNMBXFillExtrusionLayerProps &>(*props);
RNMBXSetCommonLayerProps(newProps, _view);


Expand Down
2 changes: 1 addition & 1 deletion ios/RNMBX/RNMBXFillLayerComponentView.mm
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@ + (ComponentDescriptorProvider)componentDescriptorProvider

- (void)updateProps:(const Props::Shared &)props oldProps:(const Props::Shared &)oldProps
{
const auto &newProps = *std::static_pointer_cast<const RNMBXFillLayerProps>(props);
const auto &newProps = static_cast<const RNMBXFillLayerProps &>(*props);
RNMBXSetCommonLayerProps(newProps, _view);

[super updateProps:props oldProps:oldProps];
Expand Down
2 changes: 1 addition & 1 deletion ios/RNMBX/RNMBXHeatmapLayerComponentView.mm
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ + (ComponentDescriptorProvider)componentDescriptorProvider

- (void)updateProps:(const Props::Shared &)props oldProps:(const Props::Shared &)oldProps
{
const auto &newProps = *std::static_pointer_cast<const RNMBXHeatmapLayerProps>(props);
const auto &newProps = static_cast<const RNMBXHeatmapLayerProps &>(*props);
RNMBXSetCommonLayerProps(newProps, _view);


Expand Down
2 changes: 1 addition & 1 deletion ios/RNMBX/RNMBXImageComponentView.mm
Original file line number Diff line number Diff line change
Expand Up @@ -65,7 +65,7 @@ + (ComponentDescriptorProvider)componentDescriptorProvider

- (void)updateProps:(const Props::Shared &)props oldProps:(const Props::Shared &)oldProps
{
const auto &newProps = *std::static_pointer_cast<const RNMBXImageProps>(props);
const auto &newProps = static_cast<const RNMBXImageProps &>(*props);
id stretchX = RNMBXConvertFollyDynamicToId(newProps.stretchX);
if (stretchX != nil) {
_view.stretchX = stretchX;
Expand Down
2 changes: 1 addition & 1 deletion ios/RNMBX/RNMBXImageSourceComponentView.mm
Original file line number Diff line number Diff line change
Expand Up @@ -70,7 +70,7 @@ + (ComponentDescriptorProvider)componentDescriptorProvider

- (void)updateProps:(const Props::Shared &)props oldProps:(const Props::Shared &)oldProps
{
const auto &newProps = *std::static_pointer_cast<const RNMBXImageSourceProps>(props);
const auto &newProps = static_cast<const RNMBXImageSourceProps &>(*props);
id idx = RNMBXConvertFollyDynamicToId(newProps.id);
if (idx != nil) {
_view.id = idx;
Expand Down
2 changes: 1 addition & 1 deletion ios/RNMBX/RNMBXImagesComponentView.mm
Original file line number Diff line number Diff line change
Expand Up @@ -68,7 +68,7 @@ + (ComponentDescriptorProvider)componentDescriptorProvider

- (void)updateProps:(const Props::Shared &)props oldProps:(const Props::Shared &)oldProps
{
const auto &newProps = *std::static_pointer_cast<const RNMBXImagesProps>(props);
const auto &newProps = static_cast<const RNMBXImagesProps &>(*props);
id images = RNMBXConvertFollyDynamicToId(newProps.images);
if (images != nil) {
_view.images = images;
Expand Down
2 changes: 1 addition & 1 deletion ios/RNMBX/RNMBXLightComponentView.mm
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@ + (ComponentDescriptorProvider)componentDescriptorProvider

- (void)updateProps:(const Props::Shared &)props oldProps:(const Props::Shared &)oldProps
{
const auto &newProps = *std::static_pointer_cast<const RNMBXLightProps>(props);
const auto &newProps = static_cast<const RNMBXLightProps &>(*props);
id reactStyle = RNMBXConvertFollyDynamicToId(newProps.reactStyle);
if (reactStyle != nil) {
_view.reactStyle = reactStyle;
Expand Down
2 changes: 1 addition & 1 deletion ios/RNMBX/RNMBXLineLayerComponentView.mm
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@ + (ComponentDescriptorProvider)componentDescriptorProvider

- (void)updateProps:(const Props::Shared &)props oldProps:(const Props::Shared &)oldProps
{
const auto &newProps = *std::static_pointer_cast<const RNMBXLineLayerProps>(props);
const auto &newProps = static_cast<const RNMBXLineLayerProps &>(*props);
RNMBXSetCommonLayerProps(newProps, _view);

[super updateProps:props oldProps:oldProps];
Expand Down
2 changes: 1 addition & 1 deletion ios/RNMBX/RNMBXMapViewComponentView.mm
Original file line number Diff line number Diff line change
Expand Up @@ -125,7 +125,7 @@ + (ComponentDescriptorProvider)componentDescriptorProvider

- (void)updateProps:(const Props::Shared &)props oldProps:(const Props::Shared &)oldProps
{
const auto &newProps = *std::static_pointer_cast<const RNMBXMapViewProps>(props);
const auto &newProps = static_cast<const RNMBXMapViewProps &>(*props);
id attributionEnabled = RNMBXConvertFollyDynamicToId(newProps.attributionEnabled);
if (attributionEnabled != nil) {
_view.reactAttributionEnabled = attributionEnabled;
Expand Down
2 changes: 1 addition & 1 deletion ios/RNMBX/RNMBXMarkerViewComponentView.mm
Original file line number Diff line number Diff line change
Expand Up @@ -70,7 +70,7 @@ + (ComponentDescriptorProvider)componentDescriptorProvider

- (void)updateProps:(const Props::Shared &)props oldProps:(const Props::Shared &)oldProps
{
const auto &newProps = *std::static_pointer_cast<const RNMBXMarkerViewProps>(props);
const auto &newProps = static_cast<const RNMBXMarkerViewProps &>(*props);

id coordinate = RNMBXConvertFollyDynamicToId(newProps.coordinate);
if (coordinate != nil) {
Expand Down
2 changes: 1 addition & 1 deletion ios/RNMBX/RNMBXNativeUserLocationComponentView.mm
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@ + (ComponentDescriptorProvider)componentDescriptorProvider

- (void)updateProps:(const Props::Shared &)props oldProps:(const Props::Shared &)oldProps
{
const auto &newProps = *std::static_pointer_cast<const RNMBXNativeUserLocationProps>(props);
const auto &newProps = static_cast<const RNMBXNativeUserLocationProps &>(*props);
id iosShowsUserHeadingIndicator = RNMBXConvertFollyDynamicToId(newProps.iosShowsUserHeadingIndicator);
if (iosShowsUserHeadingIndicator != nil) {
_view.iosShowsUserHeadingIndicator = iosShowsUserHeadingIndicator;
Expand Down
2 changes: 1 addition & 1 deletion ios/RNMBX/RNMBXPointAnnotationComponentView.mm
Original file line number Diff line number Diff line change
Expand Up @@ -116,7 +116,7 @@ - (void)unmountChildComponentView:(UIView<RCTComponentViewProtocol> *)childCompo

- (void)updateProps:(const Props::Shared &)props oldProps:(const Props::Shared &)oldProps
{
const auto &newProps = *std::static_pointer_cast<const RNMBXPointAnnotationProps>(props);
const auto &newProps = static_cast<const RNMBXPointAnnotationProps &>(*props);
id coordinate = RNMBXConvertFollyDynamicToId(newProps.coordinate);
if (coordinate != nil) {
_view.coordinate = coordinate;
Expand Down
2 changes: 1 addition & 1 deletion ios/RNMBX/RNMBXRasterDemSourceComponentView.mm
Original file line number Diff line number Diff line change
Expand Up @@ -71,7 +71,7 @@ + (ComponentDescriptorProvider)componentDescriptorProvider

- (void)updateProps:(const Props::Shared &)props oldProps:(const Props::Shared &)oldProps
{
const auto &newProps = *std::static_pointer_cast<const RNMBXRasterDemSourceProps>(props);
const auto &newProps = static_cast<const RNMBXRasterDemSourceProps &>(*props);
id idx = RNMBXConvertFollyDynamicToId(newProps.id);
if (idx != nil) {
_view.id = idx;
Expand Down
2 changes: 1 addition & 1 deletion ios/RNMBX/RNMBXRasterLayerComponentView.mm
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@ + (ComponentDescriptorProvider)componentDescriptorProvider

- (void)updateProps:(const Props::Shared &)props oldProps:(const Props::Shared &)oldProps
{
const auto &newProps = *std::static_pointer_cast<const RNMBXRasterLayerProps>(props);
const auto &newProps = static_cast<const RNMBXRasterLayerProps &>(*props);
RNMBXSetCommonLayerProps(newProps, _view);

[super updateProps:props oldProps:oldProps];
Expand Down
2 changes: 1 addition & 1 deletion ios/RNMBX/RNMBXRasterSourceComponentView.mm
Original file line number Diff line number Diff line change
Expand Up @@ -71,7 +71,7 @@ + (ComponentDescriptorProvider)componentDescriptorProvider

- (void)updateProps:(const Props::Shared &)props oldProps:(const Props::Shared &)oldProps
{
const auto &newProps = *std::static_pointer_cast<const RNMBXRasterSourceProps>(props);
const auto &newProps = static_cast<const RNMBXRasterSourceProps &>(*props);
id idx = RNMBXConvertFollyDynamicToId(newProps.id);
if (idx != nil) {
_view.id = idx;
Expand Down
2 changes: 1 addition & 1 deletion ios/RNMBX/RNMBXShapeSourceComponentView.mm
Original file line number Diff line number Diff line change
Expand Up @@ -85,7 +85,7 @@ + (ComponentDescriptorProvider)componentDescriptorProvider

- (void)updateProps:(const Props::Shared &)props oldProps:(const Props::Shared &)oldProps
{
const auto &newProps = *std::static_pointer_cast<const RNMBXShapeSourceProps>(props);
const auto &newProps = static_cast<const RNMBXShapeSourceProps &>(*props);
id idx = RNMBXConvertFollyDynamicToId(newProps.id);
if (idx != nil) {
_view.id = idx;
Expand Down
2 changes: 1 addition & 1 deletion ios/RNMBX/RNMBXSkyLayerComponentView.mm
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@ + (ComponentDescriptorProvider)componentDescriptorProvider

- (void)updateProps:(const Props::Shared &)props oldProps:(const Props::Shared &)oldProps
{
const auto &newProps = *std::static_pointer_cast<const RNMBXSkyLayerProps>(props);
const auto &newProps = static_cast<const RNMBXSkyLayerProps &>(*props);
RNMBXSetCommonLayerPropsWithoutSourceID(newProps, _view);

[super updateProps:props oldProps:oldProps];
Expand Down
2 changes: 1 addition & 1 deletion ios/RNMBX/RNMBXSymbolLayerComponentView.mm
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@ + (ComponentDescriptorProvider)componentDescriptorProvider

- (void)updateProps:(const Props::Shared &)props oldProps:(const Props::Shared &)oldProps
{
const auto &newProps = *std::static_pointer_cast<const RNMBXSymbolLayerProps>(props);
const auto &newProps = static_cast<const RNMBXSymbolLayerProps &>(*props);
RNMBXSetCommonLayerProps(newProps, _view);

[super updateProps:props oldProps:oldProps];
Expand Down
2 changes: 1 addition & 1 deletion ios/RNMBX/RNMBXTerrainComponentView.mm
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,7 @@ + (ComponentDescriptorProvider)componentDescriptorProvider

- (void)updateProps:(const Props::Shared &)props oldProps:(const Props::Shared &)oldProps
{
const auto &newProps = *std::static_pointer_cast<const RNMBXTerrainProps>(props);
const auto &newProps = static_cast<const RNMBXTerrainProps &>(*props);

id sourceID = RNMBXConvertFollyDynamicToId(newProps.sourceID);
if (sourceID != nil) {
Expand Down
2 changes: 1 addition & 1 deletion ios/RNMBX/RNMBXVectorSourceComponentView.mm
Original file line number Diff line number Diff line change
Expand Up @@ -84,7 +84,7 @@ + (ComponentDescriptorProvider)componentDescriptorProvider

- (void)updateProps:(const Props::Shared &)props oldProps:(const Props::Shared &)oldProps
{
const auto &newProps = *std::static_pointer_cast<const RNMBXVectorSourceProps>(props);
const auto &newProps = static_cast<const RNMBXVectorSourceProps &>(*props);
id idx = RNMBXConvertFollyDynamicToId(newProps.id);
if (idx != nil) {
_view.id = idx;
Expand Down

0 comments on commit 6e77c7b

Please sign in to comment.