package co.ab180.airbridge.reactnative.module import android.net.Uri import co.ab180.airbridge.Airbridge import com.facebook.react.bridge.Callback import com.facebook.react.bridge.Promise import com.facebook.react.bridge.ReactApplicationContext import com.facebook.react.bridge.ReactContext import com.facebook.react.bridge.ReactContextBaseJavaModule import com.facebook.react.bridge.ReactMethod import com.facebook.react.bridge.ReadableMap import com.facebook.react.bridge.WritableNativeMap import com.facebook.react.modules.core.DeviceEventManagerModule internal class PlacementInteractor( reactContext: ReactApplicationContext? ) : ReactContextBaseJavaModule(reactContext) { override fun getName(): String = "PlacementInteractor" @ReactMethod fun click(promiseID: String, trackingLink: String, onSuccess: Callback, onFailure: Callback) { val isHandled = Airbridge.click( trackingLink = Uri.parse(trackingLink), onSuccess = { onSuccess() }, onFailure = { onFailure(it.message ?: "Unexplained failure") } ) reactApplicationContext ?.getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter::class.java) ?.emit("airbridge.placement", WritableNativeMap().apply { putString("id", promiseID) putString("type", "onResolve") putBoolean("value", isHandled) }) } @ReactMethod fun impression(promiseID: String, trackingLink: String, onSuccess: Callback, onFailure: Callback) { val isHandled = Airbridge.impression( trackingLink = Uri.parse(trackingLink), onSuccess = { onSuccess() }, onFailure = { onFailure(it.message ?: "Unexplained failure") } ) reactApplicationContext ?.getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter::class.java) ?.emit("airbridge.placement", WritableNativeMap().apply { putString("id", promiseID) putString("type", "onResolve") putBoolean("value", isHandled) }) } @Suppress("SENSELESS_COMPARISON", "UNNECESSARY_NOT_NULL_ASSERTION") @ReactMethod fun createTrackingLink(channel: String, option: ReadableMap, onSuccess: Callback, onFailure: Callback) { // React Native 0.77.0 change: ReadableMap.toHashMap() now returns HashMap // rather than HashMap. Consumers of this method should handle potential null values accordingly. Airbridge.createTrackingLink( channel = channel, option = option.toHashMap() .filterValues { it != null } .mapValues { it.value!! } .toMap(), onSuccess = { onSuccess( WritableNativeMap().apply { putString("shortURL", it.shortURL.toString()) putString("qrcodeURL", it.qrcodeURL.toString()) } )}, onFailure = { onFailure(it.message ?: "Unexplained failure") }, ) } @ReactMethod fun addListener(eventName: String) {} @ReactMethod fun removeListeners(count: Int) {} }