package com.jedaireactnativepackage.react_bridge import com.anagog.jedai.anagog_api.model.Message import com.anagog.jedai.core.logger.JedAILogger import com.anagog.jedai.core.sdk_state.SdkState import com.anagog.jedai.ui.JedaiUI import com.facebook.react.bridge.ReactContext import java.util.* internal const val ON_SDK_STATUS_CHANGED_KEY = "onJedAIStatusChange" internal const val ON_CAMPAIGN_TRIGGERED_KEY = "onCampaignTriggered" internal const val ON_NOTIFICATION_CLICKED_KEY = "onNotificationClick" internal const val ON_SNAPSHOT_REPORT_KEY = "onSnapshotReport" internal const val ON_ENCODED_ENRICHMENT_REPORT_KEY = "onEncodedEnrichmentReport" internal const val ON_BEST_MOMENT = "onBestMomentEvent" internal const val ON_BEST_MOMENT_NOTIFICATION = "onBestMomentNotification" abstract class AbstractEmitter { lateinit var reactContext : ReactContext protected val pendingEventsQueue: MutableList?>> = Collections.synchronizedList(LinkedList()) protected val sLogger: JedAILogger by lazy { JedAILogger.getLogger("com.anagog.jedaireactnativepackage.react_bridge.${this::class.java.simpleName}") } abstract fun emit(key: String, params: Map?) open fun setContext(reactContext: ReactContext){ this.reactContext = reactContext } fun flushPendingEventsQueue() { sLogger.info { "flushPendingEventsQueue: there are ${pendingEventsQueue.size} events" } synchronized(pendingEventsQueue){ pendingEventsQueue.forEach { emit(it.first, it.second) } pendingEventsQueue.clear() } } fun enqueuePendingEvent(event: Pair?>) { synchronized(pendingEventsQueue){ pendingEventsQueue.add(event) } } fun onBestMoment(){ emit(ON_BEST_MOMENT, emptyMap()) } fun onBestMomentNotification(payload: Map){ emit(ON_BEST_MOMENT_NOTIFICATION, payload) } fun onNewMessage(message: Message) { when (message) { is Message.OnSdkStatusChanged -> emit(ON_SDK_STATUS_CHANGED_KEY, mapOf("status" to (message.status == SdkState.RUNNING))) is Message.OnCampaignTriggered -> { val map = mutableMapOf() map.putAll(message.userObject) map["action"] = message.action val customData = JedaiUI.eventToNotificationPayload(message.userObject)?.customData map["custom_data"] = customData emit(ON_CAMPAIGN_TRIGGERED_KEY, map) } is Message.OnSnapshotReport -> emit(ON_SNAPSHOT_REPORT_KEY, message.snapshotReport) is Message.OnNotificationClicked -> emit(ON_NOTIFICATION_CLICKED_KEY, message.payload) is Message.OnEncodedEnrichmentReport -> emit(ON_ENCODED_ENRICHMENT_REPORT_KEY, message.encodedEnrichmentReport) } } }