Skip to content

Commit

Permalink
Add backup_manager stats
Browse files Browse the repository at this point in the history
  • Loading branch information
ant013 authored and ealymbaev committed Apr 17, 2024
1 parent ec6a721 commit b1d6231
Show file tree
Hide file tree
Showing 12 changed files with 81 additions and 46 deletions.
6 changes: 6 additions & 0 deletions UnstoppableWallet/UnstoppableWallet.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -2145,6 +2145,8 @@
6B29072A2AF0CB8A006157D6 /* EventHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6B29071E2AF0CB8A006157D6 /* EventHandler.swift */; };
6B55E33B2AF26D6400616B60 /* Starscream in Frameworks */ = {isa = PBXBuildFile; productRef = 6B55E33A2AF26D6400616B60 /* Starscream */; };
6B55E33D2AF26D7A00616B60 /* Starscream in Frameworks */ = {isa = PBXBuildFile; productRef = 6B55E33C2AF26D7A00616B60 /* Starscream */; };
6BA5117D2BCFA06F00CB5A54 /* FirstAppearModifier.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6BA5117C2BCFA06F00CB5A54 /* FirstAppearModifier.swift */; };
6BA5117E2BCFA06F00CB5A54 /* FirstAppearModifier.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6BA5117C2BCFA06F00CB5A54 /* FirstAppearModifier.swift */; };
6BAAF3472B9B245C00EFE5B2 /* ShimmerEffect.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6BAAF3442B9B245C00EFE5B2 /* ShimmerEffect.swift */; };
6BAAF3492B9B245C00EFE5B2 /* SlideButtonStyling.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6BAAF3452B9B245C00EFE5B2 /* SlideButtonStyling.swift */; };
6BAAF34B2B9B245C00EFE5B2 /* SlideButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6BAAF3462B9B245C00EFE5B2 /* SlideButton.swift */; };
Expand Down Expand Up @@ -4360,6 +4362,7 @@
6B29071B2AF0CB8A006157D6 /* WalletConnectAppShowView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = WalletConnectAppShowView.swift; sourceTree = "<group>"; };
6B29071D2AF0CB8A006157D6 /* WidgetCoinAppShowModule.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = WidgetCoinAppShowModule.swift; sourceTree = "<group>"; };
6B29071E2AF0CB8A006157D6 /* EventHandler.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = EventHandler.swift; sourceTree = "<group>"; };
6BA5117C2BCFA06F00CB5A54 /* FirstAppearModifier.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FirstAppearModifier.swift; sourceTree = "<group>"; };
6BAAF3442B9B245C00EFE5B2 /* ShimmerEffect.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ShimmerEffect.swift; sourceTree = "<group>"; };
6BAAF3452B9B245C00EFE5B2 /* SlideButtonStyling.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SlideButtonStyling.swift; sourceTree = "<group>"; };
6BAAF3462B9B245C00EFE5B2 /* SlideButton.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SlideButton.swift; sourceTree = "<group>"; };
Expand Down Expand Up @@ -5487,6 +5490,7 @@
ABC9A0B48D3C4172D9C06DE7 /* SlideButton */,
ABC9A07015564A3BE995B0D7 /* Recipient */,
ABC9A49FE1A041CAC3B6C1E9 /* Alert */,
6BA5117C2BCFA06F00CB5A54 /* FirstAppearModifier.swift */,
);
path = SwiftUI;
sourceTree = "<group>";
Expand Down Expand Up @@ -10089,6 +10093,7 @@
58AAAA07DC05EF7F912EA184 /* MarketListTvlDecorator.swift in Sources */,
58AAAFC5FE754A2286161D16 /* MarketGlobalTvlFetcher.swift in Sources */,
11B354283B8AC609B65AADDF /* FavoriteCoinRecord_v_0_22.swift in Sources */,
6BA5117E2BCFA06F00CB5A54 /* FirstAppearModifier.swift in Sources */,
58AAAD1BFFE70A777DDF27A9 /* AddressParserChain.swift in Sources */,
58AAAB9E86439B6DE1D22538 /* EvmAddressParserItem.swift in Sources */,
58AAA13C1DC5FA79BCA1D732 /* UdnAddressParserItem.swift in Sources */,
Expand Down Expand Up @@ -11595,6 +11600,7 @@
11B35E48AA074CB56CAC4A9C /* CoinReportsService.swift in Sources */,
11B35EBC08855AC0CDC0AF09 /* PostCell.swift in Sources */,
58AAAAC777502E0C331C109F /* MarketGlobalDefiMetricService.swift in Sources */,
6BA5117D2BCFA06F00CB5A54 /* FirstAppearModifier.swift in Sources */,
58AAA153DF6764D7FEA99D63 /* MarketGlobalTvlMetricService.swift in Sources */,
58AAAEB0F729B839B9B99A04 /* MarketListDefiDecorator.swift in Sources */,
58AAA331B4A743D9183F8449 /* MarketListTvlDecorator.swift in Sources */,
Expand Down
9 changes: 7 additions & 2 deletions UnstoppableWallet/UnstoppableWallet/Models/Stats.swift
Original file line number Diff line number Diff line change
Expand Up @@ -44,11 +44,13 @@ enum StatPage: String {
case coinRankTxCount = "coin_rank_tx_count"
case contacts
case contactUs = "contact_us"
case createBackup = "create_backup"
case donate
case donateAddressList = "donate_address_list"
case evmAddress = "evm_address"
case evmPrivateKey = "evm_private_key"
case exportFull = "export_full"
case exportFullToCloud = "export_full_to_cloud"
case exportFullToFiles = "export_full_to_files"
case externalBlockExplorer = "external_block_explorer"
case externalCoinWebsite = "external_coin_website"
case externalCoinWhitePaper = "external_coin_white_paper"
Expand Down Expand Up @@ -94,7 +96,6 @@ enum StatPage: String {
case receive
case receiveTokenList = "receive_token_list"
case recoveryPhrase = "recovery_phrase"
case restore
case restoreSelect = "restore_select"
case scanQrCode = "scan_qr_code"
case security
Expand Down Expand Up @@ -144,7 +145,9 @@ enum StatEvent {
case disableToken(token: Token)
case edit(entity: StatEntity)
case enableToken(token: Token)
case exportFull
case importWallet(walletType: String)
case importFull
case open(page: StatPage)
case openBlockchainSettingsBtc(chainUid: String)
case openBlockchainSettingsEvm(chainUid: String)
Expand Down Expand Up @@ -197,6 +200,8 @@ enum StatEvent {
case .disableToken: return "disable_token"
case .edit: return "edit"
case .enableToken: return "enable_token"
case .exportFull: return "export_full"
case .importFull: return "import_full"
case .importWallet: return "import_wallet"
case .open, .openCategory, .openCoin, .openPlatform, .openReceive, .openSend, .openTokenPage,
.openBlockchainSettingsBtc, .openBlockchainSettingsEvm, .openBlockchainSettingsEvmAdd: return "open_page"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -75,6 +75,7 @@ extension RestoreFileConfigurationViewModel {
}

func restore() {
stat(page: statPage, event: .importFull)
appBackupProvider.restore(raw: rawBackup)
finishedSubject.send(true)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ extension RestorePassphraseService {
switch rawBackup.account.type {
case .cex:
appBackupProvider.restore(raws: [rawBackup])
return .success
return .success(rawBackup.account.type)
default:
return .restoredAccount(rawBackup)
}
Expand All @@ -53,6 +53,6 @@ extension RestorePassphraseService {
enum RestoreResult {
case restoredAccount(RawWalletBackup)
case restoredFullBackup(RawFullBackup)
case success
case success(AccountType)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -118,10 +118,7 @@ class RestorePassphraseViewController: KeyboardAwareViewController {

viewModel.successPublisher
.receive(on: DispatchQueue.main)
.sink { [weak self] in
HudHelper.instance.show(banner: .imported)
(self?.returnViewController ?? self)?.dismiss(animated: true)
}
.sink { [weak self] in self?.onSuccess(accountType: $0) }
.store(in: &cancellables)

showDefaultPassphrase()
Expand Down Expand Up @@ -171,6 +168,13 @@ class RestorePassphraseViewController: KeyboardAwareViewController {
HudHelper.instance.show(banner: .error(string: error))
}

private func onSuccess(accountType: AccountType) {
HudHelper.instance.show(banner: .imported)

stat(page: statPage, event: .importWallet(walletType: accountType.statDescription))
(returnViewController ?? self)?.dismiss(animated: true)
}

private func openSelectCoins(accountName: String, accountType: AccountType, isManualBackedUp: Bool, isFileBackedUp: Bool) {
let viewController = RestoreSelectModule.viewController(
accountName: accountName,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ class RestorePassphraseViewModel {
private let showErrorSubject = PassthroughSubject<String, Never>()
private let openSelectCoinsSubject = PassthroughSubject<Account, Never>()
private let openConfigurationSubject = PassthroughSubject<RawFullBackup, Never>()
private let successSubject = PassthroughSubject<Void, Never>()
private let successSubject = PassthroughSubject<AccountType, Never>()

init(service: RestorePassphraseService) {
self.service = service
Expand Down Expand Up @@ -43,7 +43,7 @@ extension RestorePassphraseViewModel {
openConfigurationSubject.eraseToAnyPublisher()
}

var successPublisher: AnyPublisher<Void, Never> {
var successPublisher: AnyPublisher<AccountType, Never> {
successSubject.eraseToAnyPublisher()
}

Expand All @@ -70,13 +70,13 @@ extension RestorePassphraseViewModel {
self?.processing = false

switch result {
case .success:
self?.successSubject.send()
case let .success(accountType):
self?.successSubject.send(accountType)
case let .restoredAccount(rawBackup):
if rawBackup.enabledWallets.isEmpty {
self?.openSelectCoinsSubject.send(rawBackup.account)
} else {
self?.successSubject.send()
self?.successSubject.send(rawBackup.account.type)
}
case let .restoredFullBackup(rawBackup):
self?.openConfigurationSubject.send(rawBackup)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,11 +4,11 @@ import Foundation

class BackupAppViewModel: ObservableObject {
static let backupNamePrefix = "App Backup"
let accountManager: AccountManager
let contactManager: ContactBookManager
let cloudBackupManager: CloudBackupManager
let favoritesManager: FavoritesManager
let evmSyncSourceManager: EvmSyncSourceManager
private let accountManager = App.shared.accountManager
private let contactManager = App.shared.contactManager
private let cloudBackupManager = App.shared.cloudBackupManager
private let favoritesManager = App.shared.favoritesManager
private let evmSyncSourceManager = App.shared.evmSyncSourceManager

private var cancellables = Set<AnyCancellable>()

Expand Down Expand Up @@ -88,13 +88,7 @@ class BackupAppViewModel: ObservableObject {
private var dismissSubject = PassthroughSubject<Void, Never>()
@Published var sharePresented: URL?

init(accountManager: AccountManager, contactManager: ContactBookManager, cloudBackupManager: CloudBackupManager, favoritesManager: FavoritesManager, evmSyncSourceManager: EvmSyncSourceManager) {
self.accountManager = accountManager
self.contactManager = contactManager
self.cloudBackupManager = cloudBackupManager
self.favoritesManager = favoritesManager
self.evmSyncSourceManager = evmSyncSourceManager

init() {
cloudAvailable = cloudBackupManager.iCloudUrl != nil
cloudBackupManager.$state
.sink(receiveValue: { [weak self] state in
Expand Down Expand Up @@ -255,6 +249,8 @@ extension BackupAppViewModel {
try cloudBackupManager.save(accountIds: selectedIds, passphrase: password, name: name)
passwordButtonProcessing = false
await showSuccess()

stat(page: .exportFullToCloud, event: .exportFull)
dismissSubject.send()
} catch {
passwordButtonProcessing = false
Expand All @@ -278,6 +274,13 @@ extension BackupAppViewModel {
var dismissPublisher: AnyPublisher<Void, Never> {
dismissSubject.eraseToAnyPublisher()
}

var statPage: StatPage {
switch destination {
case .cloud: return .exportFullToCloud
default: return .exportFullToFiles
}
}
}

extension BackupAppViewModel {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,8 @@ struct BackupPasswordView: View {
.sheet(item: $viewModel.sharePresented) { url in
let completion: UIActivityViewController.CompletionWithItemsHandler = { _, success, _, error in
if success {
stat(page: .exportFullToFiles, event: .exportFull)

onDismiss?()
showDone()
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,18 @@ import SwiftUI
import ThemeKit

struct BackupTypeView: View {
@ObservedObject var viewModel: BackupAppViewModel
@StateObject var viewModel: BackupAppViewModel
var onDismiss: (() -> Void)?

@State var cloudNavigationPushed = false
@State var localNavigationPushed = false
@State var cloudAlertPresented = false

init(onDismiss: (() -> Void)?) {
self.onDismiss = onDismiss
_viewModel = StateObject(wrappedValue: BackupAppViewModel())
}

var body: some View {
ScrollableThemeView {
VStack(spacing: .margin12) {
Expand Down Expand Up @@ -71,9 +76,13 @@ struct BackupTypeView: View {
}

@ViewBuilder func navigation(image: String, text: String, description: String, isAvailable: Binding<Bool> = .constant(true), isActive: Binding<Bool>, action: @escaping () -> Void = {}) -> some View {
let statPage = viewModel.statPage
if isAvailable.wrappedValue {
NavigationRow(
destination: { BackupListView(viewModel: viewModel, onDismiss: onDismiss) },
destination: {
BackupListView(viewModel: viewModel, onDismiss: onDismiss)
.modifier(FirstAppear { stat(page: .exportFull, event: .open(page: statPage)) })
},
isActive: isActive
) {
row(image: image, text: text.localized, description: description)
Expand Down
Original file line number Diff line number Diff line change
@@ -1,20 +1,6 @@
import SwiftUI

enum BackupAppModule {
static func view(onDismiss: (() -> Void)?) -> some View {
let viewModel = BackupAppViewModel(
accountManager: App.shared.accountManager,
contactManager: App.shared.contactManager,
cloudBackupManager: App.shared.cloudBackupManager,
favoritesManager: App.shared.favoritesManager,
evmSyncSourceManager: App.shared.evmSyncSourceManager
)

return BackupTypeView(viewModel: viewModel, onDismiss: onDismiss)
}
}

extension BackupAppModule {
enum Destination: String, CaseIterable, Identifiable {
case cloud
case local
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,7 @@ class BackupManagerViewController: ThemeViewController {

private func onRestore() {
let viewController = RestoreTypeModule.viewController(type: .full, sourceViewController: self)
stat(page: .backupManager, event: .open(page: .restore))
stat(page: .backupManager, event: .open(page: .importFull))
present(viewController, animated: true)
}

Expand All @@ -73,12 +73,11 @@ class BackupManagerViewController: ThemeViewController {
}

private func onCreate() {
let viewController = BackupAppModule
.view { [weak self] in
self?.presentedViewController?.dismiss(animated: true)
let viewController = BackupTypeView { [weak self] in
(self?.presentedViewController ?? self)?.dismiss(animated: true)
}.toNavigationViewController()

stat(page: .backupManager, event: .open(page: .createBackup))
stat(page: .backupManager, event: .open(page: .exportFull))
present(viewController, animated: true)
}
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
import SwiftUI

struct FirstAppear: ViewModifier {
let action: () -> Void

@StateObject private var isFirstAppear = FirstAppearState()

func body(content: Content) -> some View {
content.onAppear {
if isFirstAppear.value {
isFirstAppear.value = false
action()
}
}
}
}

private class FirstAppearState: ObservableObject {
@Published var value: Bool = true
}

0 comments on commit b1d6231

Please sign in to comment.