Skip to content

Commit

Permalink
Merge pull request #17 from airrobe/eli/addListenerForTelemetryEvents
Browse files Browse the repository at this point in the history
Eli/add listener for telemetry events
  • Loading branch information
creative-dev-lab authored Jun 2, 2022
2 parents 05dac9a + 8c3ac48 commit e664343
Show file tree
Hide file tree
Showing 11 changed files with 160 additions and 20 deletions.
45 changes: 44 additions & 1 deletion AirRobeDemo/AirRobeDemo/Application/AppDelegate.swift
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,49 @@ import UIKit
import AirRobeWidget

@main
class AppDelegate: UIResponder, UIApplicationDelegate {
class AppDelegate: UIResponder, UIApplicationDelegate, AirRobeEventDelegate {

func onEventEmitted(event: AirRobeEventData) {

switch event.event_name {
case .pageView:
print("pageview")
case .widgetRender:
print("widget rendered")
case .widgetNotRendered:
print("widget not rendered")
case .optIn:
print("opted in")
case .optOut:
print("opted out")
case .expand:
print("widget expand")
case .collapse:
print("widget collapse")
case .popupOpen:
print("popup open")
case .popupClose:
print("popup close")
case .confirmationRender:
print("confirmation rendered")
case .confirmationClick:
print("claim link click")
case .other:
print("other")
}

switch event.page_name {
case .product:
print("product")
case .cart:
print("cart")
case .thankYou:
print("thank you")
case .other:
print("other")
}

}

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {

Expand All @@ -21,6 +63,7 @@ class AppDelegate: UIResponder, UIApplicationDelegate {
mode: .production
)
)
AirRobeWidget.delegate = self

// This part is how you can configure the colors of the Widgets globally
// AirRobeWidget.AirRobeTextColor = .systemBlue
Expand Down
4 changes: 3 additions & 1 deletion Sources/AirRobeWidget/AirRobeWidget.swift
Original file line number Diff line number Diff line change
Expand Up @@ -36,8 +36,10 @@ public func initialize(config: AirRobeWidgetConfig) {
})
}

public weak var delegate: AirRobeEventDelegate?

public func trackPageView(pageName: String) {
AirRobeUtils.telemetryEvent(eventName: "pageview", pageName: pageName)
AirRobeUtils.telemetryEvent(eventName: EventName.pageView.rawValue, pageName: pageName)
}

public func checkMultiOptInEligibility(items: [String]) -> Bool {
Expand Down
23 changes: 23 additions & 0 deletions Sources/AirRobeWidget/Config/AirRobeEventDelegate.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
//
// AirRobeEventDelegate.swift
//
//
// Created by King on 5/24/22.
//

import Foundation

public protocol AirRobeEventDelegate: AnyObject {
func onEventEmitted(event: AirRobeEventData)
}

public struct AirRobeEventData {
public let app_id: String
public let anonymous_id: String
public let session_id: String
public let event_name: EventName
public let source: String
public let version: String
public let split_test_variant: String
public let page_name: PageName
}
22 changes: 22 additions & 0 deletions Sources/AirRobeWidget/Config/AirRobeWidgetConfig.swift
Original file line number Diff line number Diff line change
Expand Up @@ -41,3 +41,25 @@ public struct AirRobeWidgetConfig {
}

}

public enum EventName: String {
case pageView = "airrobe-pageview"
case widgetRender = "airrobe-widget-render"
case widgetNotRendered = "airrobe-widget-not-rendered"
case optIn = "airrobe-widget-opt-in"
case optOut = "airrobe-widget-opt-out"
case expand = "airrobe-widget-expand"
case collapse = "airrobe-widget-collapse"
case popupOpen = "airrobe-widget-popup-open"
case popupClose = "airrobe-widget-popup-close"
case confirmationRender = "airrobe-confirmation-render"
case confirmationClick = "airrobe-confirmation-click"
case other = "Other"
}

public enum PageName: String {
case product = "Product"
case cart = "Cart"
case thankYou = "Thank You"
case other = "Other"
}
2 changes: 1 addition & 1 deletion Sources/AirRobeWidget/Config/AirRobeWidgetInfo.swift
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ public struct AirRobeWidgetInfo {
fileprivate(set) var version: String

/// Version of Widget being used
static let version = "1.0.6"
static let version = "1.0.7"

#if os(iOS)
/// Platform that is being used: ios, macos, unknown
Expand Down
28 changes: 28 additions & 0 deletions Sources/AirRobeWidget/Utils/AirRobeUtils.swift
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,18 @@ struct AirRobeUtils {

static func telemetryEvent(eventName: String, pageName: String) {
let apiService = AirRobeApiService()

let eventData = AirRobeEventData(
app_id: configuration?.appId ?? "",
anonymous_id: UIDevice.current.identifierForVendor?.uuidString ?? "",
session_id: sessionId,
event_name: EventName.init(rawValue: eventName) ?? .other,
source: AirRobeWidgetInfo.platform,
version: AirRobeWidgetInfo.version,
split_test_variant: "default",
page_name: PageName.init(rawValue: pageName) ?? .other
)

cancellable = apiService.telemetryEvent(eventName: eventName, pageName: pageName)
.sink(receiveCompletion: { completion in
switch completion {
Expand All @@ -46,9 +58,25 @@ struct AirRobeUtils {
}
}, receiveValue: {
print("Telemetry Event Succeed:", $0)
delegate?.onEventEmitted(event: eventData)
})
print("Telemetry Event => event: " + eventName + ", pageName: " + pageName)
}

static func dispatchEvent(eventName: String, pageName: String) {
let eventData = AirRobeEventData(
app_id: configuration?.appId ?? "",
anonymous_id: UIDevice.current.identifierForVendor?.uuidString ?? "",
session_id: sessionId,
event_name: EventName.init(rawValue: eventName) ?? .other,
source: AirRobeWidgetInfo.platform,
version: AirRobeWidgetInfo.version,
split_test_variant: "default",
page_name: PageName.init(rawValue: pageName) ?? .other
)

delegate?.onEventEmitted(event: eventData)
}

}
#endif
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ final class AirRobeLearnMoreAlertViewController: UIViewController, StoryboardBas
@IBOutlet weak var separator3: UIView!

var viewType: AirRobeOptInView.ViewType = .optIn

override func viewDidLoad() {
super.viewDidLoad()
titleLabel.text = AirRobeStrings.learnMoreTitle
Expand Down Expand Up @@ -84,24 +84,34 @@ final class AirRobeLearnMoreAlertViewController: UIViewController, StoryboardBas
UserDefaults.standard.OptedIn = sender.isOn
if sender.isOn {
if viewType == .optIn {
AirRobeUtils.telemetryEvent(eventName: "Opted in to AirRobe", pageName: "Product")
AirRobeUtils.telemetryEvent(eventName: EventName.optIn.rawValue, pageName: PageName.product.rawValue)
} else {
AirRobeUtils.telemetryEvent(eventName: "Opted in to AirRobe", pageName: "Cart")
AirRobeUtils.telemetryEvent(eventName: EventName.optIn.rawValue, pageName: PageName.cart.rawValue)
}
} else {
if viewType == .optIn {
AirRobeUtils.telemetryEvent(eventName: "Opted out of AirRobe", pageName: "Product")
AirRobeUtils.telemetryEvent(eventName: EventName.optOut.rawValue, pageName: PageName.product.rawValue)
} else {
AirRobeUtils.telemetryEvent(eventName: "Opted out of AirRobe", pageName: "Cart")
AirRobeUtils.telemetryEvent(eventName: EventName.optOut.rawValue, pageName: PageName.cart.rawValue)
}
}
}

@IBAction func onTapClose(_ sender: Any) {
dismiss(animated: true)
if viewType == .optIn {
AirRobeUtils.dispatchEvent(eventName: EventName.popupClose.rawValue, pageName: PageName.product.rawValue)
} else {
AirRobeUtils.dispatchEvent(eventName: EventName.popupClose.rawValue, pageName: PageName.cart.rawValue)
}
}

@objc func dismissController() {
dismiss(animated: true)
if viewType == .optIn {
AirRobeUtils.dispatchEvent(eventName: EventName.popupClose.rawValue, pageName: PageName.product.rawValue)
} else {
AirRobeUtils.dispatchEvent(eventName: EventName.popupClose.rawValue, pageName: PageName.cart.rawValue)
}
}
}
21 changes: 13 additions & 8 deletions Sources/AirRobeWidget/Views/OptInView/AirRobeOptInView.swift
Original file line number Diff line number Diff line change
Expand Up @@ -124,9 +124,9 @@ final class AirRobeOptInView: UIView, NibLoadable {
alert.viewType = viewType
vc.present(alert, animated: true)
if viewType == .optIn {
AirRobeUtils.telemetryEvent(eventName: "Pop up click", pageName: "Product")
AirRobeUtils.telemetryEvent(eventName: EventName.popupOpen.rawValue, pageName: PageName.product.rawValue)
} else {
AirRobeUtils.telemetryEvent(eventName: "Pop up click", pageName: "Cart")
AirRobeUtils.telemetryEvent(eventName: EventName.popupOpen.rawValue, pageName: PageName.cart.rawValue)
}
}

Expand All @@ -135,15 +135,15 @@ final class AirRobeOptInView: UIView, NibLoadable {
UserDefaults.standard.OptedIn = sender.isOn
if sender.isOn {
if viewType == .optIn {
AirRobeUtils.telemetryEvent(eventName: "Opted in to AirRobe", pageName: "Product")
AirRobeUtils.telemetryEvent(eventName: EventName.optIn.rawValue, pageName: PageName.product.rawValue)
} else {
AirRobeUtils.telemetryEvent(eventName: "Opted in to AirRobe", pageName: "Cart")
AirRobeUtils.telemetryEvent(eventName: EventName.optIn.rawValue, pageName: PageName.cart.rawValue)
}
} else {
if viewType == .optIn {
AirRobeUtils.telemetryEvent(eventName: "Opted out of AirRobe", pageName: "Product")
AirRobeUtils.telemetryEvent(eventName: EventName.optOut.rawValue, pageName: PageName.product.rawValue)
} else {
AirRobeUtils.telemetryEvent(eventName: "Opted out of AirRobe", pageName: "Cart")
AirRobeUtils.telemetryEvent(eventName: EventName.optOut.rawValue, pageName: PageName.cart.rawValue)
}
}
}
Expand All @@ -153,13 +153,18 @@ final class AirRobeOptInView: UIView, NibLoadable {
switch expandType {
case .opened:
expandType = .closed
if viewType == .optIn {
AirRobeUtils.dispatchEvent(eventName: EventName.collapse.rawValue, pageName: PageName.product.rawValue)
} else {
AirRobeUtils.dispatchEvent(eventName: EventName.collapse.rawValue, pageName: PageName.cart.rawValue)
}
return 0.0
case .closed:
expandType = .opened
if viewType == .optIn {
AirRobeUtils.telemetryEvent(eventName: "Widget Expand Arrow Click", pageName: "Product")
AirRobeUtils.telemetryEvent(eventName: EventName.expand.rawValue, pageName: PageName.product.rawValue)
} else {
AirRobeUtils.telemetryEvent(eventName: "Widget Expand Arrow Click", pageName: "Cart")
AirRobeUtils.telemetryEvent(eventName: EventName.expand.rawValue, pageName: PageName.cart.rawValue)
}
return 1.0
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,7 @@ final class AirRobeOptInViewModel {
return
}
if !alreadyInitialized {
AirRobeUtils.telemetryEvent(eventName: EventName.pageView.rawValue, pageName: PageName.product.rawValue)
alreadyInitialized = true
if category.isEmpty {
isAllSet = .paramIssue
Expand All @@ -56,8 +57,10 @@ final class AirRobeOptInViewModel {
let eligibility = AirRobeShoppingDataModelInstance.shared.categoryMapping.checkCategoryEligible(items: [category])
isAllSet = (eligibility.eligible && !shoppingDataModel.isBelowPriceThreshold(department: department, price: priceCents)) ? .eligible : .notEligible
if isAllSet == .eligible {
AirRobeUtils.telemetryEvent(eventName: "pageview", pageName: "Product")
AirRobeUtils.dispatchEvent(eventName: EventName.widgetRender.rawValue, pageName: PageName.product.rawValue)
callPriceEngine(category: eligibility.to)
} else {
AirRobeUtils.dispatchEvent(eventName: EventName.widgetNotRendered.rawValue, pageName: PageName.product.rawValue)
}
}
}
Expand All @@ -72,6 +75,7 @@ final class AirRobeOptInViewModel {
return
}
if !alreadyInitialized {
AirRobeUtils.telemetryEvent(eventName: EventName.pageView.rawValue, pageName: PageName.cart.rawValue)
alreadyInitialized = true
if items.isEmpty {
isAllSet = .paramIssue
Expand All @@ -82,7 +86,9 @@ final class AirRobeOptInViewModel {
isAllSet = eligibility.eligible ? .eligible : .notEligible
UserDefaults.standard.OrderOptedIn = eligibility.eligible && UserDefaults.standard.OptedIn ? true : false
if isAllSet == .eligible {
AirRobeUtils.telemetryEvent(eventName: "pageview", pageName: "Cart")
AirRobeUtils.dispatchEvent(eventName: EventName.widgetRender.rawValue, pageName: PageName.cart.rawValue)
} else {
AirRobeUtils.dispatchEvent(eventName: EventName.widgetNotRendered.rawValue, pageName: PageName.cart.rawValue)
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,7 @@ final class AirRobeOrderConfirmationView: UIView, NibLoadable {
guard let url = url else {
return
}
AirRobeUtils.telemetryEvent(eventName: "Claim link click", pageName: "Thank You")
AirRobeUtils.telemetryEvent(eventName: EventName.confirmationClick.rawValue, pageName: PageName.thankYou.rawValue)
AirRobeUtils.openUrl(url)
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,14 +26,15 @@ final class AirRobeOrderConfirmationViewModel {

func initializeConfirmationWidget() {
if !alreadyInitialized {
AirRobeUtils.telemetryEvent(eventName: EventName.pageView.rawValue, pageName: PageName.thankYou.rawValue)
alreadyInitialized = true
if orderId.isEmpty || email.isEmpty {
isAllSet = .paramIssue
return
}
isAllSet = UserDefaults.standard.OrderOptedIn && !fraudRisk ? .eligible : .notEligible
if isAllSet == .eligible {
AirRobeUtils.telemetryEvent(eventName: "pageview", pageName: "Thank you")
AirRobeUtils.dispatchEvent(eventName: EventName.confirmationRender.rawValue, pageName: PageName.thankYou.rawValue)
emailCheck(email: email)

identifyOrderCancellable = apiService.identifyOrder(orderId: orderId, orderOptedIn: UserDefaults.standard.OrderOptedIn)
Expand Down

0 comments on commit e664343

Please sign in to comment.