Skip to content

Commit b648f9d

Browse files
committed
Pendo Integration
[ignore-commit-lint]
1 parent 09b2e5a commit b648f9d

File tree

4 files changed

+68
-0
lines changed

4 files changed

+68
-0
lines changed

Core/Core/Common/CommonModels/AppEnvironment/AppEnvironment.swift

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,8 @@ open class AppEnvironment {
5252
public var lastLoginAccount: APIAccountResult?
5353
public let k5 = K5State()
5454
public weak var loginDelegate: LoginDelegate?
55+
public var userDidLogin: (() -> Void)?
56+
5557
public weak var window: UIWindow?
5658
open var isTest: Bool { false }
5759
private var subscriptions = Set<AnyCancellable>()

Horizon/Horizon/Resources/Info.plist

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,16 @@
6060
<string>canvas-Horizon</string>
6161
</array>
6262
</dict>
63+
<dict>
64+
<key>CFBundleTypeRole</key>
65+
<string>Editor</string>
66+
<key>CFBundleURLName</key>
67+
<string>pendo-pairing-horizon</string>
68+
<key>CFBundleURLSchemes</key>
69+
<array>
70+
<string>pendo-9f913bef</string>
71+
</array>
72+
</dict>
6373
</array>
6474
<key>CFBundleVersion</key>
6575
<string>1</string>

Horizon/Horizon/Sources/AppDelegate.swift

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
// along with this program. If not, see <https://www.gnu.org/licenses/>.
1717
//
1818

19+
import Combine
1920
import Core
2021
import HorizonUI
2122
import UIKit
@@ -25,15 +26,20 @@ class AppDelegate: UIResponder, UIApplicationDelegate, AppEnvironmentDelegate {
2526
var window: UIWindow?
2627

2728
private let sessionInteractor = SessionInteractor()
29+
private lazy var analyticsTracker: PendoAnalyticsTracker = .init(environment: environment)
30+
2831
lazy var environment: AppEnvironment = {
2932
let env = AppEnvironment.shared
3033
env.loginDelegate = sessionInteractor
3134
env.router = Router(routes: HorizonRoutes.routeHandlers())
3235
env.app = .horizon
3336
env.window = window
37+
env.userDidLogin = userDidLogin
3438
return env
3539
}()
3640

41+
private var subscriptions = Set<AnyCancellable>()
42+
3743
func application(
3844
_: UIApplication,
3945
didFinishLaunchingWithOptions _: [UIApplication.LaunchOptionsKey: Any]?
@@ -66,4 +72,53 @@ extension AppDelegate {
6672
func application(_: UIApplication, didFailToRegisterForRemoteNotificationsWithError error: Error) {
6773
AppEnvironment.shared.reportError(error)
6874
}
75+
76+
func application(_: UIApplication, open url: URL, options _: [UIApplication.OpenURLOptionsKey: Any] = [:]) -> Bool {
77+
if url.scheme?.range(of: "pendo") != nil {
78+
analyticsTracker.initManager(with: url)
79+
return true
80+
}
81+
return false
82+
}
83+
}
84+
85+
// MARK: - Usage Analytics
86+
87+
extension AppDelegate: Core.AnalyticsHandler {
88+
func userDidLogin() {
89+
initializeTracking()
90+
}
91+
92+
func handleEvent(_ name: String, parameters: [String: Any]?) {
93+
analyticsTracker.track(name, properties: parameters)
94+
95+
PageViewEventController.instance.logPageView(
96+
name,
97+
attributes: parameters
98+
)
99+
}
100+
101+
private func initializeTracking() {
102+
guard !ProcessInfo.isUITest else { return }
103+
104+
ReactiveStore(
105+
useCase: GetEnvironmentFeatureFlags(context: Context.currentUser)
106+
)
107+
.getEntities()
108+
.replaceError(with: [])
109+
.sink { [weak self] environmentFeatureFlags in
110+
let isTrackingEnabled = environmentFeatureFlags.isFeatureEnabled(.send_usage_metrics)
111+
112+
if isTrackingEnabled {
113+
self?.analyticsTracker.startSession()
114+
} else {
115+
self?.analyticsTracker.endSession()
116+
}
117+
}
118+
.store(in: &subscriptions)
119+
}
120+
121+
private func disableTracking() {
122+
analyticsTracker.endSession()
123+
}
69124
}

Horizon/Horizon/Sources/Features/Splash/View/SplashViewModel.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@ final class SplashViewModel: ObservableObject {
6060
isLoginTransition: true,
6161
viewController: HorizonTabBarController()
6262
)
63+
environment.userDidLogin?()
6364
UIApplication.shared.registerForPushNotifications()
6465
})
6566
.store(in: &subscriptions)

0 commit comments

Comments
 (0)