package io.scanbot.sdk.reactnative.components.cropping_view import com.facebook.react.bridge.ReadableArray import com.facebook.react.common.MapBuilder import com.facebook.react.module.annotations.ReactModule import com.facebook.react.uimanager.SimpleViewManager import com.facebook.react.uimanager.ThemedReactContext import com.facebook.react.uimanager.ViewManagerDelegate import com.facebook.react.uimanager.annotations.ReactProp import com.facebook.react.viewmanagers.ScanbotCroppingViewManagerDelegate import com.facebook.react.viewmanagers.ScanbotCroppingViewManagerInterface import io.scanbot.sdk.reactnative.extensions.toPx import io.scanbot.sdk.reactnative.models.CroppingViewDefaultConfiguration @ReactModule(name = ScanbotCroppingViewManager.NAME) class ScanbotCroppingViewManager : SimpleViewManager(), ScanbotCroppingViewManagerInterface { private val mDelegate: ViewManagerDelegate = ScanbotCroppingViewManagerDelegate(this) override fun getDelegate(): ViewManagerDelegate? { return mDelegate } override fun getName(): String { return NAME } companion object { const val NAME = "ScanbotCroppingView" } override fun createViewInstance(context: ThemedReactContext): ScanbotCroppingView { return ScanbotCroppingView(context) } @Suppress("DEPRECATION") override fun getExportedCustomDirectEventTypeConstants(): MutableMap? { return MapBuilder.of( CroppingViewExtractCroppedAreaEvent.NAME, MapBuilder.of("registrationName", "onCroppedAreaResult"), CroppingViewErrorEvent.NAME, MapBuilder.of("registrationName", "onError") ) } override fun onDropViewInstance(view: ScanbotCroppingView) { view.removeAttachedListeners() super.onDropViewInstance(view) } override fun onAfterUpdateTransaction(view: ScanbotCroppingView) { view.editPolygonImageView.invalidate() super.onAfterUpdateTransaction(view) } //region Commands override fun receiveCommand( root: ScanbotCroppingView, commandId: String?, args: ReadableArray? ) { when (commandId) { "resetPolygon" -> resetPolygon(root) "detectPolygon" -> detectPolygon(root) "rotate" -> rotate(root, args?.getBoolean(0) == true) "extractCroppedArea" -> extractCroppedArea(root) else -> throw Error("Unrecognized command $commandId") } } override fun resetPolygon(view: ScanbotCroppingView) { view.resetPolygon() } override fun detectPolygon(view: ScanbotCroppingView) { view.detectPolygon() } override fun rotate(view: ScanbotCroppingView, clockwise: Boolean) { view.rotate(clockwise) } override fun extractCroppedArea(view: ScanbotCroppingView) { view.extractCroppedArea() } //endregion //region Props @ReactProp(name = "imageFileSrc") override fun setImageFileSrc(view: ScanbotCroppingView, value: String?) { value?.let { view.setEditingImage(it) } } @ReactProp(name = "imageRefSrc") override fun setImageRefSrc(view: ScanbotCroppingView, value: String?) { value?.let { view.setEditingImageRef(uuid = it) } } @ReactProp(name = "edgeColor", customType = "Color") override fun setEdgeColor(view: ScanbotCroppingView, value: Int?) { val color = value ?: CroppingViewDefaultConfiguration.DEFAULT_EDGE_COLOR view.editPolygonImageView.setEdgeColor(color) } @ReactProp(name = "edgeLineWidth") override fun setEdgeLineWidth(view: ScanbotCroppingView, value: Double) { view.editPolygonImageView.setEdgeWidth(value.toPx(view.resources).toFloat()) } @ReactProp(name = "edgeColorOnLine", customType = "Color") override fun setEdgeColorOnLine(view: ScanbotCroppingView, value: Int?) { val color = value ?: CroppingViewDefaultConfiguration.DEFAULT_EDGE_ON_LINE_COLOR view.editPolygonImageView.setEdgeColorOnLine(color) } @ReactProp(name = "anchorPointsColor", customType = "Color") override fun setAnchorPointsColor(view: ScanbotCroppingView, value: Int?) { val color = value ?: CroppingViewDefaultConfiguration.DEFAULT_ANCHOR_POINTS_COLOR view.editPolygonImageView.setAnchorPointsColor(color) } }