package com.blaze.rtnblazesdk.utils import com.blaze.blazesdk.delegates.models.BlazeCTAActionType import com.blaze.blazesdk.style.shared.models.BlazePlayerCustomActionButtonParams import com.blaze.blazesdk.delegates.models.BlazePlayerEvent import com.blaze.blazesdk.delegates.models.BlazePlayerType import com.blaze.blazesdk.shared.results.BlazeResult import com.facebook.react.bridge.Arguments import com.facebook.react.bridge.WritableMap /** * Shared helper class for building event parameters to eliminate duplication between widget events * and SDK module events. */ object EventParamsBuilder { /** Extension function to map BlazePlayerType to React string values */ fun BlazePlayerType.mapToReact(): String { return when (this) { BlazePlayerType.MOMENTS -> "Moments" BlazePlayerType.STORIES -> "Stories" BlazePlayerType.VIDEOS -> "Videos" } } /** Builds parameters for data load started events */ fun buildDataLoadStartedParams(playerType: BlazePlayerType, sourceId: String?): WritableMap { return Arguments.createMap().apply { putString("playerType", playerType.mapToReact()) putString("sourceId", sourceId) } } /** Builds parameters for data load completed events */ fun buildDataLoadCompletedParams( playerType: BlazePlayerType, sourceId: String?, itemsCount: Int, result: BlazeResult? ): WritableMap { return Arguments.createMap().apply { putString("playerType", playerType.mapToReact()) putString("sourceId", sourceId) putInt("itemsCount", itemsCount) if (result is BlazeResult.Error) { putString("error", result.toReactValue()) } } } /** Builds parameters for player did appear events */ fun buildPlayerDidAppearParams(playerType: BlazePlayerType, sourceId: String?): WritableMap { return Arguments.createMap().apply { putString("playerType", playerType.mapToReact()) putString("sourceId", sourceId) } } /** Builds parameters for player did dismiss events */ fun buildPlayerDidDismissParams(playerType: BlazePlayerType, sourceId: String?): WritableMap { return Arguments.createMap().apply { putString("playerType", playerType.mapToReact()) putString("sourceId", sourceId) } } /** Builds parameters for trigger CTA events */ fun buildTriggerCTAParams( playerType: BlazePlayerType, sourceId: String?, actionType: BlazeCTAActionType, actionParam: String ): WritableMap { return Arguments.createMap().apply { putString("playerType", playerType.mapToReact()) putString("sourceId", sourceId) putString("actionType", actionType.mapToReact()) putString("actionParam", actionParam) } } /** Builds parameters for trigger player body text link events */ fun buildTriggerPlayerBodyTextLinkParams( playerType: BlazePlayerType, sourceId: String?, actionParam: String ): WritableMap { return Arguments.createMap().apply { putString("playerType", playerType.mapToReact()) putString("sourceId", sourceId) putString("actionParam", actionParam) } } /** Builds parameters for player event triggered events */ fun buildPlayerEventTriggeredParams( playerType: BlazePlayerType, sourceId: String?, event: BlazePlayerEvent ): WritableMap { return Arguments.createMap().apply { putString("playerType", playerType.mapToReact()) putString("sourceId", sourceId) putString("playerEventType", event.toReactEventType()) putString("playerEventParams", event.toReactEventParams()) } } /** Builds parameters for trigger custom action button events */ fun buildTriggerCustomActionButtonParams( playerType: BlazePlayerType, sourceId: String?, customParams: BlazePlayerCustomActionButtonParams ): WritableMap { return Arguments.createMap().apply { putString("playerType", playerType.mapToReact()) putString("sourceId", sourceId) putString("buttonId", customParams.id) putString("buttonName", customParams.name) val metadata = customParams.appMetadata if (!metadata.isNullOrEmpty()) { val metadataMap = metadata.populateContainer( container = Arguments.createMap(), putString = WritableMap::putString, putBoolean = WritableMap::putBoolean, putInt = WritableMap::putInt, putDouble = WritableMap::putDouble, putDefault = { key, value -> putString(key, value.toString()) } ) putMap("appMetadata", metadataMap) } } } /** Builds parameters for read status changed events */ fun buildReadStatusChangedParams( playerType: BlazePlayerType, sourceId: String?, dataSourceStringRepresentation: String, isEntireContentRead: Boolean, itemReadStatus: Map ): WritableMap { return Arguments.createMap().apply { putString("playerType", playerType.mapToReact()) putString("sourceId", sourceId) putString("dataSourceStringRepresentation", dataSourceStringRepresentation) putBoolean("isEntireContentRead", isEntireContentRead) val itemReadStatusMap = Arguments.createMap() itemReadStatus.forEach { (key, value) -> itemReadStatusMap.putBoolean(key, value) } putMap("itemReadStatus", itemReadStatusMap) } } /** Builds parameters for follow entity clicked events */ fun buildFollowEntityClickedParams( playerType: BlazePlayerType, sourceId: String?, newFollowingState: Boolean, followEntityId: String ): WritableMap { return Arguments.createMap().apply { putString("playerType", playerType.mapToReact()) putString("sourceId", sourceId) putBoolean("newFollowingState", newFollowingState) putString("followEntityId", followEntityId) } } /** Builds parameters for widget item clicked events */ fun buildWidgetItemClickedParams( sourceId: String?, widgetItemId: String, widgetItemTitle: String? ): WritableMap { return Arguments.createMap().apply { putString("sourceId", sourceId) putString("widgetItemId", widgetItemId) putString("widgetItemTitle", widgetItemTitle) } } }