Skip to content

Commit 9c5a9f4

Browse files
committed
[ITDS-73] feat: #56 - GA 이벤트 적용
[2. 홈 화면 > 프로필 아이콘 버튼 / 배너 이미지 / 더보기 버튼] • 공모전 더보기 버튼 : contest_more_selected✅ • 해커톤 더보기 버튼 : hackathon_more_selected✅ • IT 동아리 더보기 버튼 : it_club_more_selected✅ [3. 공모전 리스트 화면 > 전체 / 개발 / 디자인 / 기획아이디어 Chip] • contest_all_chip_selected✅ • contest_develop_chip_selected✅ • contest_design_chip_selected✅ • contest_idea_chip_selected ✅ [4. 공고글 리스트 화면 > 정렬 버튼 / 최신순 버튼 / 마감순 버튼] • 정렬 버튼 -> OrderDropDownMenu : array_menu_selected ✅ • 최신순 -> latestLabel : latest_array_selected ✅ • 마감순 -> oldestLabel : oldest_array_selected✅ [5. 상세 공고 화면 > 지원하기 버튼 /공유 버튼] • 지원하기 버튼 -> showMoreButton : apply_button_selected ✅ • 공유 버튼 -> shareButton : share_button_selected ✅ [6. 회원가입 화면 > 카카오 로그인 버튼 / 애플 로그인 버튼] • 카카오 -> kakaoLoginButton : kakao_login_button_selected ✅ • 애플 -> appleLoginButton : apple_login_button_selected✅
1 parent 2d76dbb commit 9c5a9f4

File tree

6 files changed

+66
-16
lines changed

6 files changed

+66
-16
lines changed

Targets/DesignSystem/Sources/Component/PostList/JobCategoryView.swift

+12-1
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,13 @@
88

99
import DomainLayer
1010
import UIKit
11+
import MozipCore
1112

1213
import RxSwift
1314
import RxCocoa
1415
import PinLayout
1516
import FlexLayout
17+
import FirebaseAnalytics
1618

1719
public final class JobCategoryView: UIView {
1820
private enum Metric {
@@ -116,7 +118,16 @@ public final class JobCategoryView: UIView {
116118
.disposed(by: disposeBag)
117119

118120
Observable.combineLatest(collectionView.rx.itemSelected, dataRelay)
119-
.map { (indexPath, dataList) in ContestCategory.init(rawValue: dataList[indexPath.row]) ?? .all }
121+
.map { (indexPath, dataList) in
122+
let category = ContestCategory.init(rawValue: dataList[indexPath.row]) ?? .all
123+
switch category {
124+
case .all: Analytics.logEvent(GA.전체칩, parameters: nil)
125+
case .design: Analytics.logEvent(GA.디자인칩, parameters: nil)
126+
case .develop: Analytics.logEvent(GA.개발칩, parameters: nil)
127+
case .idea: Analytics.logEvent(GA.기획아이디어칩, parameters: nil)
128+
}
129+
return category
130+
}
120131
.bind(to: selectionRelay)
121132
.disposed(by: disposeBag)
122133
}

Targets/DesignSystem/Sources/Component/PostList/OrderDropDownMenu.swift

+10-2
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,12 @@
77
//
88

99
import UIKit
10+
import MozipCore
1011

1112
import FlexLayout
1213
import RxCocoa
1314
import RxSwift
15+
import FirebaseAnalytics
1416

1517
public final class OrderDropDownMenu: UIView {
1618
// MARK: - Properties
@@ -47,12 +49,18 @@ public final class OrderDropDownMenu: UIView {
4749
oldestLabel.isUserInteractionEnabled = true
4850

4951
latestLabel.rxGesture.tap
50-
.map { _ in return true }
52+
.map { _ in
53+
Analytics.logEvent(GA.최신순버튼, parameters: nil)
54+
return true
55+
}
5156
.bind(to: isLatestOrder)
5257
.disposed(by: disposeBag)
5358

5459
oldestLabel.rxGesture.tap
55-
.map { _ in return false }
60+
.map { _ in
61+
Analytics.logEvent(GA.마감순버튼, parameters: nil)
62+
return false
63+
}
5664
.bind(to: isLatestOrder)
5765
.disposed(by: disposeBag)
5866
}

Targets/DesignSystem/Sources/Component/PostList/PostOrderControlView.swift

+3
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,13 @@
88

99
import UIKit
1010
import DomainLayer
11+
import MozipCore
1112

1213
import RxSwift
1314
import RxCocoa
1415
import PinLayout
1516
import FlexLayout
17+
import FirebaseAnalytics
1618

1719
public final class PostOrderControlView: UIView {
1820

@@ -82,6 +84,7 @@ public final class PostOrderControlView: UIView {
8284
private func bind() {
8385
orderButton.rxGesture.tap
8486
.bind(with: self) { owner, _ in
87+
Analytics.logEvent(GA.정렬버튼, parameters: nil)
8588
let currentValue = owner.isOrderButtonTappedRelay.value
8689
owner.isOrderButtonTappedRelay.accept(!currentValue)
8790
}

Targets/PresentationLayer/Sources/Home/View/HomeViewController.swift

+12-3
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import FlexLayout
1515
import PinLayout
1616
import ReactorKit
1717
import RxCocoa
18+
import FirebaseAnalytics
1819

1920
final class HomeViewController: BaseViewController<HomeReactor>, Coordinatable {
2021

@@ -195,30 +196,38 @@ private extension HomeViewController {
195196
navigationBar.myPageButtonTapObservable
196197
.asSignal(onErrorJustReturn: ())
197198
.emit(with: self) { owner, _ in
199+
Analytics.logEvent(GA.마이페이지버튼, parameters: nil)
198200
AppProperties.accessToken == .init() ? owner.coordinator?.pushLoginPage() : owner.coordinator?.pushMyPage()
199201
}
200202
.disposed(by: disposeBag)
201203

202204
navigationBar.searchButtonTapObservable
203205
.asSignal(onErrorJustReturn: ())
204206
.emit(with: self) { owner, _ in
207+
Analytics.logEvent(GA.검색버튼, parameters: nil)
205208
owner.coordinator?.pushPostSearch()
206209
}
207210
.disposed(by: disposeBag)
208211

209212
bannerView.bannerTapObservable
210213
.asSignal(onErrorJustReturn: .stub())
211214
.emit(with: self) { owner, banner in
215+
Analytics.logEvent(GA.배너이미지, parameters: nil)
212216
owner.coordinator?.pushPostDetail(id: banner.infoPostID)
213217
}
214218
.disposed(by: disposeBag)
215219

216220
collectionView.headerTapRelay
217221
.asSignal()
218222
.emit(with: self) { owner, indexPath in
219-
let list = owner.reactor?.currentState.postHeaderTitles ?? []
220-
let code = list[indexPath.section]
221-
owner.coordinator?.pushPostList(code: code)
223+
let postHeaders = owner.reactor?.currentState.postHeaders ?? []
224+
let postKind = postHeaders[indexPath.section]
225+
switch postKind {
226+
case .공모전: Analytics.logEvent(GA.공모전더보기버튼, parameters: nil)
227+
case .해커톤: Analytics.logEvent(GA.해커톤더보기버튼, parameters: nil)
228+
case .동아리: Analytics.logEvent(GA.IT동아리더보기버튼, parameters: nil)
229+
}
230+
owner.coordinator?.pushPostList(postKind: postKind)
222231
}
223232
.disposed(by: disposeBag)
224233

Targets/PresentationLayer/Sources/Login/Reactor/LoginReactor.swift

+26-10
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import MozipCore
1010
import DomainLayer
1111

1212
import ReactorKit
13+
import FirebaseAnalytics
1314

1415
final class LoginReactor: Reactor {
1516

@@ -43,14 +44,32 @@ final class LoginReactor: Reactor {
4344
// MARK: - Methods
4445
func mutate(action: Action) -> Observable<Mutation> {
4546
switch action {
46-
case .didTapKakaoLoginButton:
47-
return loginUseCase.tryKakaoLogin().map { .setUserToken(userToken: $0) }
48-
case .didTapAppleLoginButton:
49-
return loginUseCase.tryAppleLogin().map { .setUserToken(userToken: $0) }
50-
case .fetchUserInfo:
51-
return fetchUserInfo()
47+
case .didTapKakaoLoginButton: return didTapKakaoLoginButtonMutation()
48+
case .didTapAppleLoginButton: return didTapAppleLoginButtonMutation()
49+
case .fetchUserInfo: return fetchUserInfoMutation()
5250
}
5351
}
52+
53+
private func didTapKakaoLoginButtonMutation() -> Observable<Mutation> {
54+
return loginUseCase.tryKakaoLogin()
55+
.do(onNext: { _ in
56+
Analytics.logEvent(GA.카카오버튼, parameters: nil)
57+
})
58+
.map { .setUserToken(userToken: $0) }
59+
}
60+
61+
private func didTapAppleLoginButtonMutation() -> Observable<Mutation> {
62+
return loginUseCase.tryAppleLogin()
63+
.do(onNext: { _ in
64+
Analytics.logEvent(GA.애플버튼, parameters: nil)
65+
})
66+
.map { .setUserToken(userToken: $0) }
67+
}
68+
69+
func fetchUserInfoMutation() -> Observable<Mutation> {
70+
userUseCase.fetchUserInformation()
71+
.flatMap { Observable<Mutation>.just(.setUserInfo(isAdmin: $0.isAdmin, provider: $0.provider)) }
72+
}
5473

5574
func reduce(state: State, mutation: Mutation) -> State {
5675
var newState = state
@@ -78,10 +97,7 @@ final class LoginReactor: Reactor {
7897

7998
// MARK: - Private Extenion
8099
private extension LoginReactor {
81-
func fetchUserInfo() -> Observable<Mutation> {
82-
userUseCase.fetchUserInformation()
83-
.flatMap { Observable<Mutation>.just(.setUserInfo(isAdmin: $0.isAdmin, provider: $0.provider)) }
84-
}
100+
85101

86102
func saveUserInfo(isAdmin: Bool, provider: String) {
87103
guard let isAdminData = "\(isAdmin)".data(using: .utf8),

Targets/PresentationLayer/Sources/PostDetail/View/PostDetailViewController.swift

+3
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import FlexLayout
1515
import PinLayout
1616
import ReactorKit
1717
import RxCocoa
18+
import FirebaseAnalytics
1819

1920
final class PostDetailViewController: BaseViewController<PostDetailReactor>, Coordinatable, Alertable {
2021

@@ -366,13 +367,15 @@ private extension PostDetailViewController {
366367
shareButton.rx.tap
367368
.asSignal()
368369
.emit(with: self, onNext: { owner, _ in
370+
Analytics.logEvent(GA.공유버튼, parameters: nil)
369371
owner.showActivityController()
370372
})
371373
.disposed(by: disposeBag)
372374

373375
showMoreButton.tapObservable
374376
.asSignal(onErrorSignalWith: .empty())
375377
.emit(with: self, onNext: { owner, _ in
378+
Analytics.logEvent(GA.지원하기버튼, parameters: nil)
376379
guard let reactor = owner.reactor else { return }
377380
owner.coordinator?.pushWebView(urlString: reactor.currentState.post.postUrlString)
378381
})

0 commit comments

Comments
 (0)