Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[PWN-9338] Add Amplitude events for Wallet, Crypto, and Tab Bar #1501

Merged
merged 4 commits into from
Jul 26, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -33,11 +33,36 @@ enum KeyAppAnalyticsEvent: AnalyticsEvent {
case mainScreenSwapBar
case mainScreenCashOutBar

case mainScreenWalletsOpen(isSellEnabled: Bool)
case mainCopyAddress
case mainScreenOpened(isSellEnabled: Bool)
case mainScreenAddressClick
case mainScreenAmountClick
case mainScreenAddMoneyClick
case mainScreenWithdrawClick
case mainScreenMainClick
case mainScreenTokenDetailsOpen(tokenTicker: String)
case mainScreenBuyToken(tokenName: String)
case mainScreenHiddenTokens

case mainScreenCryptoClick
case mainScreenSendClick
case mainScreenHistoryClick
case mainScreenSettingsClick

case userAggregateBalanceBase(amountUsd: Double, currency: String)
case userHasPositiveBalanceBase(state: Bool)

// MARK: - Crypto

case cryptoScreenOpened
case cryptoAmountClick
case cryptoReceiveClick
case cryptoSwapClick
case cryptoTokenClick(tokenName: String)
case cryptoClaimTransferredViewed(claimCount: Int)
case cryptoClaimTransferredClick

case userAggregateBalanceTokens(amountUsd: Double, currency: String)
case userHasPositiveBalanceTokens(state: Bool)

// MARK: - Tokens

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ final class CryptoAccountsViewModel: BaseViewModel, ObservableObject {

// MARK: - Dependencies

private let analyticsManager: AnalyticsManager
private let solanaAccountsService: SolanaAccountsService
private let ethereumAccountsService: EthereumAccountsService
private let userActionService: UserActionService
Expand All @@ -40,12 +41,14 @@ final class CryptoAccountsViewModel: BaseViewModel, ObservableObject {
// MARK: - Initialization

init(
analyticsManager: AnalyticsManager = Resolver.resolve(),
solanaAccountsService: SolanaAccountsService = Resolver.resolve(),
ethereumAccountsService: EthereumAccountsService = Resolver.resolve(),
userActionService: UserActionService = Resolver.resolve(),
favouriteAccountsStore: FavouriteAccountsDataSource = Resolver.resolve(),
navigation: PassthroughSubject<CryptoNavigation, Never>
) {
self.analyticsManager = analyticsManager
self.solanaAccountsService = solanaAccountsService
self.ethereumAccountsService = ethereumAccountsService
self.userActionService = userActionService
Expand Down Expand Up @@ -97,10 +100,12 @@ final class CryptoAccountsViewModel: BaseViewModel, ObservableObject {
cryptoAccountsAggregator.transform(input: (solanaAccounts, ethereumAccounts))
}
.receive(on: RunLoop.main)
.sink { transfer, primary, secondary in
self.transferAccounts = transfer
self.accounts = primary
self.hiddenAccounts = secondary
.sink { [weak self] transfer, primary, secondary in
self?.transferAccounts = transfer
self?.accounts = primary
self?.hiddenAccounts = secondary

self?.analyticsManager.log(event: .cryptoClaimTransferredViewed(claimCount: transfer.count))
}
.store(in: &subscriptions)
}
Expand All @@ -120,6 +125,7 @@ final class CryptoAccountsViewModel: BaseViewModel, ObservableObject {
case let renderableAccount as RenderableSolanaAccount:
switch event {
case .tap:
analyticsManager.log(event: .cryptoTokenClick(tokenName: renderableAccount.account.token.symbol))
navigation.send(.solanaAccount(renderableAccount.account))
case .visibleToggle:
let pubkey = renderableAccount.account.address
Expand All @@ -138,7 +144,10 @@ final class CryptoAccountsViewModel: BaseViewModel, ObservableObject {

case let renderableAccount as RenderableEthereumAccount:
switch event {
case .tap:
analyticsManager.log(event: .cryptoTokenClick(tokenName: renderableAccount.account.token.symbol))
case .extraButtonTap:
analyticsManager.log(event: .cryptoClaimTransferredClick)
navigation.send(.claim(renderableAccount.account, renderableAccount.userAction))
default:
break
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,9 +21,11 @@ struct CryptoActionsPanelView: View {
actions: viewModel.actions,
balance: viewModel.balance,
usdAmount: "",
action: { action in
self.viewModel.actionClicked(action)
}
action: viewModel.actionClicked,
balanceTapAction: viewModel.balanceTapped
)
.onAppear {
viewModel.viewDidAppear()
}
}
}
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import AnalyticsManager
import Combine
import Foundation
import Resolver
Expand All @@ -12,6 +13,7 @@ final class CryptoActionsPanelViewModel: BaseViewModel, ObservableObject {
// MARK: - Dependencies

@Injected var solanaAccountsService: SolanaAccountsService
@Injected var analyticsManager: AnalyticsManager

// MARK: - Properties

Expand Down Expand Up @@ -63,11 +65,24 @@ final class CryptoActionsPanelViewModel: BaseViewModel, ObservableObject {
case .receive:
guard let pubkey = try? PublicKey(string: solanaAccountsService.state.value.nativeWallet?.address)
else { return }
analyticsManager.log(event: .cryptoReceiveClick)
navigation.send(.receive(publicKey: pubkey))
case .swap:
analyticsManager.log(event: .cryptoSwapClick)
navigation.send(.swap)
default: break
}
}

func balanceTapped() {
analyticsManager.log(event: .cryptoAmountClick)
}

func viewDidAppear() {
if let balance = Double(balance) {
analyticsManager.log(event: .userAggregateBalanceTokens(amountUsd: balance, currency: Defaults.fiat.code))
analyticsManager.log(event: .userHasPositiveBalanceTokens(state: balance > 0))
}
}
}

6 changes: 2 additions & 4 deletions p2p_wallet/Scenes/Main/Crypto/Container/CryptoViewModel.swift
Original file line number Diff line number Diff line change
Expand Up @@ -54,10 +54,8 @@ final class CryptoViewModel: BaseViewModel, ObservableObject {
if available(.solanaNegativeStatus) {
solanaTracker.startTracking()
}

analyticsManager.log(
event: .mainScreenWalletsOpen(isSellEnabled: sellDataService.isAvailable)
)

analyticsManager.log(event: .cryptoScreenOpened)
}
}

Expand Down
6 changes: 3 additions & 3 deletions p2p_wallet/Scenes/Main/NewHome/HomeViewModel.swift
Original file line number Diff line number Diff line change
Expand Up @@ -66,8 +66,8 @@ class HomeViewModel: ObservableObject {
} else {
text = L10n.addressCopiedToClipboard
}
notificationsService.showToast(title: "", text: text, haptic: true)
analyticsManager.log(event: .mainCopyAddress)
notificationsService.showToast(title: "🖤", text: text, haptic: true)
analyticsManager.log(event: .mainScreenAddressClick)
}

func updateAddressIfNeeded() {
Expand All @@ -84,7 +84,7 @@ class HomeViewModel: ObservableObject {
}

analyticsManager.log(
event: .mainScreenWalletsOpen(isSellEnabled: sellDataService.isAvailable)
event: .mainScreenOpened(isSellEnabled: sellDataService.isAvailable)
)
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -38,14 +38,18 @@ struct HomeAccountsView: View {
scrollAnimationIsEnded = false
}
}
.onAppear {
viewModel.viewDidAppear()
}
}

private var header: some View {
ActionsPanelView(
actions: [],
balance: viewModel.balance,
usdAmount: viewModel.usdcAmount,
action: { _ in }
action: { _ in },
balanceTapAction: viewModel.balanceTapped
)
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -179,14 +179,27 @@ final class HomeAccountsViewModel: BaseViewModel, ObservableObject {
func actionClicked(_ action: HomeAction) {
switch action {
case .addMoney:
analyticsManager.log(event: .mainScreenAddMoneyClick)
navigation.send(.addMoney)
case .withdraw: break
case .withdraw:
analyticsManager.log(event: .mainScreenWithdrawClick)
}
}

func scrollToTop() {
scrollOnTheTop = true
}

func viewDidAppear() {
if let balance = Double(balance) {
analyticsManager.log(event: .userAggregateBalanceBase(amountUsd: balance, currency: Defaults.fiat.code))
analyticsManager.log(event: .userHasPositiveBalanceBase(state: balance > 0))
}
}

func balanceTapped() {
analyticsManager.log(event: .mainScreenAmountClick)
}

func hiddenTokensTapped() {
analyticsManager.log(event: .mainScreenHiddenTokens)
Expand Down
25 changes: 18 additions & 7 deletions p2p_wallet/Scenes/TabBar/TabBarController.swift
Original file line number Diff line number Diff line change
Expand Up @@ -314,13 +314,24 @@ extension TabBarController: UITabBarControllerDelegate {
return true
}

if TabItem(rawValue: selectedIndex) == .send {
return false
} else if TabItem(rawValue: selectedIndex) == .wallet,
(viewController as! UINavigationController).viewControllers.count == 1,
self.selectedIndex == selectedIndex
{
homeTabClickedTwicelySubject.send()
if let tabItem = TabItem(rawValue: selectedIndex) {
switch tabItem {
case .wallet:
viewModel.walletTapped()

if (viewController as! UINavigationController).viewControllers.count == 1, self.selectedIndex == selectedIndex {
homeTabClickedTwicelySubject.send()
}
case .crypto:
viewModel.cryptoTapped()
case .send:
viewModel.sendTapped()
return false
case .history:
viewModel.historyTapped()
case .settings:
viewModel.settingsTapped()
}
}

customTabBar.updateSelectedViewPositionIfNeeded()
Expand Down
23 changes: 23 additions & 0 deletions p2p_wallet/Scenes/TabBar/TabBarViewModel.swift
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import AnalyticsManager
import Combine
import Wormhole
import Foundation
Expand All @@ -22,6 +23,8 @@ final class TabBarViewModel {
@Injected private var userActionService: UserActionService
@Injected private var ethereumAccountsService: EthereumAccountsService
@Injected private var solanaAccountsService: SolanaAccountsService

@Injected private var analyticsManager: AnalyticsManager

// Input
let viewDidLoad = PassthroughSubject<Void, Never>()
Expand Down Expand Up @@ -65,6 +68,26 @@ final class TabBarViewModel {
})
.store(in: &cancellables)
}

func walletTapped() {
analyticsManager.log(event: .mainScreenMainClick)
}

func cryptoTapped() {
analyticsManager.log(event: .mainScreenCryptoClick)
}

func sendTapped() {
analyticsManager.log(event: .mainScreenSendClick)
}

func historyTapped() {
analyticsManager.log(event: .mainScreenHistoryClick)
}

func settingsTapped() {
analyticsManager.log(event: .mainScreenSettingsClick)
}
}

// MARK: - Output
Expand Down
6 changes: 5 additions & 1 deletion p2p_wallet/UI/SwiftUI/ActionsPanel/ActionsPanelView.swift
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,8 @@ struct ActionsPanelView: View {
let balance: String
let usdAmount: String
let action: (WalletActionType) -> Void

let balanceTapAction: (() -> ())?

var body: some View {
VStack(alignment: .center, spacing: 0) {
if !balance.isEmpty {
Expand All @@ -16,6 +17,9 @@ struct ActionsPanelView: View {
.foregroundColor(Color(Asset.Colors.night.color))
.padding(.top, 24)
.padding(.bottom, usdAmount.isEmpty ? 46 : 12)
.onTapGesture {
balanceTapAction?()
}
} else {
Rectangle()
.fill(Color.clear)
Expand Down