Skip to content

Commit ba67ab6

Browse files
committed
feat: 화면 분석 연결
1 parent e0819d8 commit ba67ab6

6 files changed

Lines changed: 49 additions & 2 deletions

File tree

Application/DevLogApp/Sources/App/DevLogApp.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ struct DevLogApp: App {
2727
sessionUseCase: container.resolve(ObserveAuthSessionUseCase.self),
2828
networkConnectivityUseCase: container.resolve(ObserveNetworkConnectivityUseCase.self),
2929
systemThemeUseCase: container.resolve(ObserveSystemThemeUseCase.self),
30+
trackAnalyticsEventUseCase: container.resolve(TrackAnalyticsEventUseCase.self),
3031
widgetURLTab: { MainTab(widgetURL: $0) },
3132
pushNotificationTodoIdPublisher: PushNotificationRoute.shared.observe(),
3233
clearPushNotificationRoute: { PushNotificationRoute.shared.clear() }

Application/DevLogPresentation/Sources/Main/MainView.swift

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,8 @@ struct MainView: View {
4242
coordinator.mainViewModel.send(.onAppear)
4343
}
4444
.onChange(of: selectedTab, initial: true) { _, newValue in
45+
guard let newValue else { return }
46+
coordinator.mainViewModel.send(.selectedTabChanged(newValue))
4547
if newValue == .home {
4648
homeViewCoordinator.fetchData()
4749
} else if newValue == .today {

Application/DevLogPresentation/Sources/Main/MainViewCoordinator.swift

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ final class MainViewCoordinator {
2424
init(container: DIContainer) {
2525
self.diContainer = container
2626
self.mainViewModel = MainViewModel(
27+
trackAnalyticsEventUseCase: container.resolve(TrackAnalyticsEventUseCase.self),
2728
unreadPushCountUseCase: container.resolve(ObserveUnreadPushCountUseCase.self)
2829
)
2930
self.pushNotificationListViewModel = PushNotificationListViewModel(
@@ -48,6 +49,7 @@ final class MainViewCoordinator {
4849
upsertTodoUseCase: diContainer.resolve(UpsertTodoUseCase.self),
4950
deleteTodoUseCase: diContainer.resolve(DeleteTodoUseCase.self),
5051
undoDeleteTodoUseCase: diContainer.resolve(UndoDeleteTodoUseCase.self),
52+
trackAnalyticsEventUseCase: diContainer.resolve(TrackAnalyticsEventUseCase.self),
5153
category: category
5254
)
5355
self.todoListViewModel = todoListViewModel

Application/DevLogPresentation/Sources/Main/MainViewModel.swift

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,24 +22,29 @@ final class MainViewModel: Store {
2222

2323
enum Action {
2424
case onAppear
25+
case selectedTabChanged(MainTab)
2526
case setUnreadPushCount(Int)
2627
case setAlert(Bool)
2728
}
2829

2930
enum SideEffect {
3031
case observeUnreadPushCount
32+
case trackScreenView(MainTab)
3133
case updateBadgeCount(Int)
3234
}
3335

3436
private(set) var state = State()
3537
private let logger = Logger(category: "MainViewModel")
3638
private var cancellables = Set<AnyCancellable>()
3739
private var isObservingUnreadPushCount = false
40+
private let trackAnalyticsEventUseCase: TrackAnalyticsEventUseCase
3841
private let unreadPushCountUseCase: ObserveUnreadPushCountUseCase
3942

4043
init(
44+
trackAnalyticsEventUseCase: TrackAnalyticsEventUseCase,
4145
unreadPushCountUseCase: ObserveUnreadPushCountUseCase
4246
) {
47+
self.trackAnalyticsEventUseCase = trackAnalyticsEventUseCase
4348
self.unreadPushCountUseCase = unreadPushCountUseCase
4449
}
4550

@@ -53,6 +58,10 @@ final class MainViewModel: Store {
5358
isObservingUnreadPushCount = true
5459
sideEffects = [.observeUnreadPushCount]
5560
}
61+
case .selectedTabChanged(let tab):
62+
if tab.analyticsScreenName != nil {
63+
sideEffects = [.trackScreenView(tab)]
64+
}
5665
case .setUnreadPushCount(let count):
5766
state.unreadPushCount = count
5867
sideEffects = [.updateBadgeCount(count)]
@@ -68,6 +77,8 @@ final class MainViewModel: Store {
6877
switch effect {
6978
case .observeUnreadPushCount:
7079
observeUnreadPushCount()
80+
case .trackScreenView(let tab):
81+
trackScreenView(tab)
7182
case .updateBadgeCount(let count):
7283
updateBadgeCount(count)
7384
}
@@ -116,4 +127,24 @@ private extension MainViewModel {
116127
}
117128
}
118129
}
130+
131+
func trackScreenView(_ tab: MainTab) {
132+
guard let screenName = tab.analyticsScreenName else { return }
133+
trackAnalyticsEventUseCase.execute(.screenView(screenName))
134+
}
135+
}
136+
137+
private extension MainTab {
138+
var analyticsScreenName: String? {
139+
switch self {
140+
case .home:
141+
return "home"
142+
case .today:
143+
return "today"
144+
case .notification:
145+
return nil
146+
case .profile:
147+
return "profile"
148+
}
149+
}
119150
}

Application/DevLogPresentation/Sources/Root/RootView.swift

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,14 +23,16 @@ public struct RootView: View {
2323
sessionUseCase: ObserveAuthSessionUseCase,
2424
networkConnectivityUseCase: ObserveNetworkConnectivityUseCase,
2525
systemThemeUseCase: ObserveSystemThemeUseCase,
26+
trackAnalyticsEventUseCase: TrackAnalyticsEventUseCase,
2627
widgetURLTab: @escaping (URL) -> MainTab?,
2728
pushNotificationTodoIdPublisher: AnyPublisher<String, Never>,
2829
clearPushNotificationRoute: @escaping () -> Void
2930
) {
3031
self._viewModel = State(initialValue: RootViewModel(
3132
sessionUseCase: sessionUseCase,
3233
networkConnectivityUseCase: networkConnectivityUseCase,
33-
systemThemeUseCase: systemThemeUseCase
34+
systemThemeUseCase: systemThemeUseCase,
35+
trackAnalyticsEventUseCase: trackAnalyticsEventUseCase
3436
))
3537
self.widgetURLTab = widgetURLTab
3638
self.pushNotificationTodoIdPublisher = pushNotificationTodoIdPublisher

Application/DevLogPresentation/Sources/Root/RootViewModel.swift

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,22 +32,26 @@ final class RootViewModel: Store {
3232

3333
enum SideEffect {
3434
case clearApplicationBadgeCount
35+
case trackLoginScreen
3536
}
3637

3738
private(set) var state: State
3839
private var cancellables = Set<AnyCancellable>()
3940
private let sessionUseCase: ObserveAuthSessionUseCase
4041
private let networkConnectivityUseCase: ObserveNetworkConnectivityUseCase
4142
private let systemThemeUseCase: ObserveSystemThemeUseCase
43+
private let trackAnalyticsEventUseCase: TrackAnalyticsEventUseCase
4244

4345
init(
4446
sessionUseCase: ObserveAuthSessionUseCase,
4547
networkConnectivityUseCase: ObserveNetworkConnectivityUseCase,
46-
systemThemeUseCase: ObserveSystemThemeUseCase
48+
systemThemeUseCase: ObserveSystemThemeUseCase,
49+
trackAnalyticsEventUseCase: TrackAnalyticsEventUseCase
4750
) {
4851
self.sessionUseCase = sessionUseCase
4952
self.networkConnectivityUseCase = networkConnectivityUseCase
5053
self.systemThemeUseCase = systemThemeUseCase
54+
self.trackAnalyticsEventUseCase = trackAnalyticsEventUseCase
5155
self.state = State()
5256

5357
setupNetworkObserving()
@@ -74,6 +78,9 @@ final class RootViewModel: Store {
7478
state.theme = theme
7579
case .didLogined(let result):
7680
state.signIn = result
81+
if !result {
82+
effects = [.trackLoginScreen]
83+
}
7784
}
7885

7986
if self.state != state { self.state = state }
@@ -84,6 +91,8 @@ final class RootViewModel: Store {
8491
switch effect {
8592
case .clearApplicationBadgeCount:
8693
UNUserNotificationCenter.current().setBadgeCount(0) { _ in }
94+
case .trackLoginScreen:
95+
trackAnalyticsEventUseCase.execute(.screenView("login"))
8796
}
8897
}
8998
}

0 commit comments

Comments
 (0)