package com.adyenreactnativesdk.react import android.util.Log import com.adyenreactnativesdk.configuration.CheckoutConfigurationFactory import com.adyenreactnativesdk.react.base.DynamicComponentView import com.adyenreactnativesdk.react.card.CardViewState import com.adyenreactnativesdk.util.ReactNativeJson import com.adyenreactnativesdk.util.messaging.MessageBusEmitter 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.viewmanagers.CardViewManagerDelegate import com.facebook.react.viewmanagers.CardViewManagerInterface import org.json.JSONObject @ReactModule(name = CardViewManager.NAME) class CardViewManager( private val messageBusEmitter: MessageBusEmitter, ) : SimpleViewManager(), CardViewManagerInterface { private val delegate: ViewManagerDelegate = CardViewManagerDelegate(this) private val viewStates = mutableMapOf() override fun getDelegate(): ViewManagerDelegate = delegate override fun getName(): String = NAME public override fun createViewInstance(context: ThemedReactContext): DynamicComponentView { val view = DynamicComponentView(context) val state = CardViewState(context, messageBusEmitter) view.layoutListener = state viewStates[view] = state return view } override fun onDropViewInstance(view: DynamicComponentView) { super.onDropViewInstance(view) viewStates.remove(view)?.dispose(view) } override fun onAfterUpdateTransaction(view: DynamicComponentView) { super.onAfterUpdateTransaction(view) if (view.isViewSet) return val state = viewStates[view] ?: return state.renderView(view) } override fun setPaymentMethod( view: DynamicComponentView?, value: String?, ) { val state = view?.let { viewStates[it] } ?: return if (value == null) { Log.e("CardViewManager", "paymentMethod value is null") return } try { state.paymentMethod = JSONObject(value) } catch (e: org.json.JSONException) { Log.e("CardViewManager", "Invalid paymentMethod JSON", e) } } override fun setConfiguration( view: DynamicComponentView?, value: String?, ) { val state = view?.let { viewStates[it] } ?: return if (value == null) { Log.e("CardViewManager", "configuration value is null") return } try { val json = JSONObject(value) val map = ReactNativeJson.convertJsonToMap(json) state.configuration = CheckoutConfigurationFactory.get(map) } catch (e: org.json.JSONException) { Log.e("CardViewManager", "Invalid configuration JSON", e) } } companion object { const val NAME = "CardView" } }