package com.jedaireactnativepackage.react_bridge import com.facebook.react.ReactApplication import com.facebook.react.ReactInstanceManager.ReactInstanceEventListener import com.facebook.react.bridge.Arguments import com.facebook.react.bridge.ReactContext import com.facebook.react.bridge.UiThreadUtil import com.facebook.react.jstasks.HeadlessJsTaskConfig import com.facebook.react.jstasks.HeadlessJsTaskContext import com.jedaireactnativepackage.utils.toReadableMap internal object HeadlessEmitter : AbstractEmitter() { private var headlessJsTaskContext: HeadlessJsTaskContext? = null private val reactEventListener = object : ReactInstanceEventListener { override fun onReactContextInitialized(context: ReactContext) { sLogger.info { "addReactInstanceEventListener: onReactInstanceEvent $context" } headlessJsTaskContext = HeadlessJsTaskContext.getInstance(context) if (pendingEventsQueue.isNotEmpty()) { sLogger.info { "pendingMessageQueue isn't empty, flushPendingMessagesQueue" } flushPendingEventsQueue() } } } override fun setContext(reactContext: ReactContext) { this.reactContext = reactContext reactContext.let { val app = it.applicationContext if (app is ReactApplication) { app.reactHost?.let { host -> host.removeReactInstanceEventListener(reactEventListener) host.addReactInstanceEventListener(reactEventListener) } } } } override fun emit(key: String, params: Map?) { //Emit only campaignTriggered events if (key == ON_CAMPAIGN_TRIGGERED_KEY || key == ON_BEST_MOMENT || key == ON_BEST_MOMENT_NOTIFICATION) { headlessJsTaskContext?.let { sLogger.info("emit event: $key:$params") startHeadlessTask(key, params) } ?: run { sLogger.info("headlessJsTaskContext not ready, add event to pendingEventsQueue ..") enqueuePendingEvent((key to params)) } } } private fun startHeadlessTask(key: String, params: Map?) { val config = HeadlessJsTaskConfig( "Anagog_$key", params?.toReadableMap() ?: Arguments.createMap(), 5000, true ) UiThreadUtil.runOnUiThread { try { headlessJsTaskContext?.startTask(config) } catch (e: java.lang.Exception) { sLogger.error { "pendingMessageQueue isn't empty, flushPendingMessagesQueue" } } } } }