import MutaSDK
import AppsFlyerLib
class AppsFlyerAnalytics {
var subscription: Subscription?
func setupTracking() {
subscription = Muta.shared.on { event in
var eventName = ""
var properties: [String: Any] = [:]
switch event {
case .flowStarted(let e):
eventName = "onboarding_flow_started"
properties = [
"placement_id": e.placementId,
"flow_name": e.flowName ?? "",
"total_screens": e.totalScreens,
"timestamp": e.timestamp
]
case .screenViewed(let e):
eventName = "onboarding_screen_viewed"
properties = [
"placement_id": e.placementId,
"flow_name": e.flowName ?? "",
"screen_index": e.screenIndex,
"total_screens": e.totalScreens,
"screen_name": e.screenName ?? ""
]
case .flowCompleted(let e):
eventName = "onboarding_flow_completed"
properties = [
"placement_id": e.placementId,
"flow_name": e.flowName,
"screen_index": e.screenIndex,
"total_screens": e.totalScreens,
"screen_name": e.screenName
]
case .flowAbandoned(let e):
eventName = "onboarding_flow_abandoned"
properties = [
"placement_id": e.placementId,
"flow_name": e.flowName ?? "",
"screen_index": e.screenIndex,
"total_screens": e.totalScreens,
"last_screen_index": e.lastScreenIndex
]
case .custom(let e):
// Use the custom event type as the event name
eventName = e.type
properties = [
"placement_id": e.placementId,
"flow_name": e.flowName ?? "",
"screen_index": e.screenIndex ?? -1
]
// Merge custom event data
if let eventData = e.eventData {
properties.merge(eventData) { _, new in new }
}
case .error(let error):
eventName = "onboarding_error"
switch error {
case .network(let message, _):
properties = [
"error_message": message,
"error_type": "network"
]
case .placement(let message, let code, _, let placementId):
properties = [
"error_message": message,
"error_code": code,
"error_type": "placement",
"placement_id": placementId
]
@unknown default:
break
}
@unknown default:
break
}
if !eventName.isEmpty {
AppsFlyerLib.shared().logEvent(eventName, withValues: properties)
}
}
}
deinit {
subscription?.unsubscribe()
}
}