diff --git a/app/src/main/java/com/tangem/tap/common/DialogManager.kt b/app/src/main/java/com/tangem/tap/common/DialogManager.kt index 4f4494f2bc..3339239daa 100644 --- a/app/src/main/java/com/tangem/tap/common/DialogManager.kt +++ b/app/src/main/java/com/tangem/tap/common/DialogManager.kt @@ -46,7 +46,7 @@ class DialogManager : StoreSubscriber { dialog = when (state.dialog) { is AppDialog.SimpleOkDialogRes -> SimpleOkDialog.create(state.dialog, context) - is StateDialog.ScanFailsDialog -> ScanFailsDialog.create(context) + is StateDialog.ScanFailsDialog -> ScanFailsDialog.create(context, state.dialog.source) is AppDialog.AddressInfoDialog -> AddressInfoBottomSheetDialog(state.dialog, context) is AppDialog.TestActionsDialog -> TestActionsBottomSheetDialog(state.dialog, context) is AppDialog.RussianCardholdersWarningDialog -> RussianCardholdersWarningBottomSheetDialog( diff --git a/app/src/main/java/com/tangem/tap/common/redux/AppReducer.kt b/app/src/main/java/com/tangem/tap/common/redux/AppReducer.kt index a1232dd031..91992dd437 100644 --- a/app/src/main/java/com/tangem/tap/common/redux/AppReducer.kt +++ b/app/src/main/java/com/tangem/tap/common/redux/AppReducer.kt @@ -13,7 +13,6 @@ import com.tangem.tap.features.onboarding.products.wallet.redux.OnboardingWallet import com.tangem.tap.features.saveWallet.redux.SaveWalletReducer import com.tangem.tap.features.send.redux.reducers.SendScreenReducer import com.tangem.tap.features.shop.redux.ShopReducer -import com.tangem.tap.features.signin.redux.SignInReducer import com.tangem.tap.features.tokens.legacy.redux.TokensReducer import com.tangem.tap.features.welcome.redux.WelcomeReducer import com.tangem.tap.proxy.AppStateHolder @@ -40,7 +39,6 @@ fun appReducer(action: Action, state: AppState?, appStateHolder: AppStateHolder) shopState = ShopReducer.reduce(action, state.shopState), welcomeState = WelcomeReducer.reduce(action, state), saveWalletState = SaveWalletReducer.reduce(action, state), - signInState = SignInReducer.reduce(action, state), daggerGraphState = DaggerGraphReducer.reduce(action, state), ) } diff --git a/app/src/main/java/com/tangem/tap/common/redux/AppState.kt b/app/src/main/java/com/tangem/tap/common/redux/AppState.kt index 892271058e..72726532fe 100644 --- a/app/src/main/java/com/tangem/tap/common/redux/AppState.kt +++ b/app/src/main/java/com/tangem/tap/common/redux/AppState.kt @@ -31,8 +31,6 @@ import com.tangem.tap.features.send.redux.middlewares.SendMiddleware import com.tangem.tap.features.send.redux.states.SendState import com.tangem.tap.features.shop.redux.ShopMiddleware import com.tangem.tap.features.shop.redux.ShopState -import com.tangem.tap.features.signin.redux.SignInMiddleware -import com.tangem.tap.features.signin.redux.SignInState import com.tangem.tap.features.tokens.legacy.redux.TokensState import com.tangem.tap.features.wallet.redux.middlewares.TradeCryptoMiddleware import com.tangem.tap.features.welcome.redux.WelcomeMiddleware @@ -59,7 +57,6 @@ data class AppState( val shopState: ShopState = ShopState(), val welcomeState: WelcomeState = WelcomeState(), val saveWalletState: SaveWalletState = SaveWalletState(), - val signInState: SignInState = SignInState(), val daggerGraphState: DaggerGraphState = DaggerGraphState(), ) : StateType { @@ -97,7 +94,6 @@ data class AppState( SaveWalletMiddleware().middleware, LockUserWalletsTimerMiddleware().middleware, AccessCodeRequestPolicyMiddleware().middleware, - SignInMiddleware.middleware, DaggerGraphMiddleware.daggerGraphMiddleware, LegacyMiddleware.legacyMiddleware, TradeCryptoMiddleware.middleware, diff --git a/app/src/main/java/com/tangem/tap/common/redux/global/GlobalAction.kt b/app/src/main/java/com/tangem/tap/common/redux/global/GlobalAction.kt index e3b376b612..a9c23d448f 100644 --- a/app/src/main/java/com/tangem/tap/common/redux/global/GlobalAction.kt +++ b/app/src/main/java/com/tangem/tap/common/redux/global/GlobalAction.kt @@ -2,6 +2,7 @@ package com.tangem.tap.common.redux.global import com.tangem.blockchain.common.WalletManager import com.tangem.common.CompletionResult +import com.tangem.core.analytics.models.AnalyticsParam import com.tangem.core.navigation.StateDialog import com.tangem.datasource.config.ConfigManager import com.tangem.datasource.config.models.ChatConfig @@ -51,7 +52,11 @@ sealed class GlobalAction : Action { } object ScanFailsCounter { - data class ChooseBehavior(val result: CompletionResult) : GlobalAction() + data class ChooseBehavior( + val result: CompletionResult, + val analyticsSource: AnalyticsParam.ScreensSources, + ) : GlobalAction() + object Reset : GlobalAction() object Increment : GlobalAction() } diff --git a/app/src/main/java/com/tangem/tap/common/redux/global/GlobalMiddleware.kt b/app/src/main/java/com/tangem/tap/common/redux/global/GlobalMiddleware.kt index 79d6ed3a69..921898e383 100644 --- a/app/src/main/java/com/tangem/tap/common/redux/global/GlobalMiddleware.kt +++ b/app/src/main/java/com/tangem/tap/common/redux/global/GlobalMiddleware.kt @@ -4,6 +4,7 @@ import com.tangem.common.CompletionResult import com.tangem.common.core.TangemSdkError import com.tangem.common.extensions.guard import com.tangem.core.analytics.Analytics +import com.tangem.core.analytics.models.AnalyticsParam import com.tangem.core.analytics.models.Basic import com.tangem.core.navigation.StateDialog import com.tangem.datasource.config.models.Config @@ -54,14 +55,7 @@ private fun handleAction(action: Action, appState: () -> AppState?) { when (action.result) { is CompletionResult.Success -> store.dispatch(GlobalAction.ScanFailsCounter.Reset) is CompletionResult.Failure -> { - if (action.result.error is TangemSdkError.UserCancelled) { - store.dispatch(GlobalAction.ScanFailsCounter.Increment) - if (store.state.globalState.scanCardFailsCounter >= 2) { - store.dispatchDialogShow(StateDialog.ScanFailsDialog) - } - } else { - store.dispatch(GlobalAction.ScanFailsCounter.Reset) - } + handleFailureChooseBehaviour(action.result, action.analyticsSource) } } } @@ -184,6 +178,26 @@ private fun handleAction(action: Action, appState: () -> AppState?) { } } +private fun handleFailureChooseBehaviour( + result: CompletionResult.Failure, + analyticsSource: AnalyticsParam.ScreensSources, +) { + if (result.error is TangemSdkError.UserCancelled) { + store.dispatch(GlobalAction.ScanFailsCounter.Increment) + if (store.state.globalState.scanCardFailsCounter >= 2) { + val scanFailsSource = when (analyticsSource) { + is AnalyticsParam.ScreensSources.SignIn -> StateDialog.ScanFailsSource.SIGN_IN + is AnalyticsParam.ScreensSources.Settings -> StateDialog.ScanFailsSource.SETTINGS + is AnalyticsParam.ScreensSources.Intro -> StateDialog.ScanFailsSource.INTRO + else -> StateDialog.ScanFailsSource.MAIN + } + store.dispatchDialogShow(StateDialog.ScanFailsDialog(scanFailsSource)) + } + } else { + store.dispatch(GlobalAction.ScanFailsCounter.Reset) + } +} + private fun restoreAppCurrency() { scope.launch { val currency = store.inject(DaggerGraphState::appCurrencyRepository) diff --git a/app/src/main/java/com/tangem/tap/common/ui/ScanFailsDialog.kt b/app/src/main/java/com/tangem/tap/common/ui/ScanFailsDialog.kt index 70ad852f71..d59f668687 100644 --- a/app/src/main/java/com/tangem/tap/common/ui/ScanFailsDialog.kt +++ b/app/src/main/java/com/tangem/tap/common/ui/ScanFailsDialog.kt @@ -4,7 +4,9 @@ import android.content.Context import androidx.appcompat.app.AlertDialog import com.google.android.material.dialog.MaterialAlertDialogBuilder import com.tangem.core.analytics.Analytics +import com.tangem.core.analytics.models.AnalyticsParam import com.tangem.core.analytics.models.Basic +import com.tangem.core.navigation.StateDialog import com.tangem.tap.common.extensions.dispatchDialogHide import com.tangem.tap.common.feedback.ScanFailsEmail import com.tangem.tap.common.redux.global.GlobalAction @@ -15,12 +17,18 @@ import com.tangem.wallet.R [REDACTED_AUTHOR] */ object ScanFailsDialog { - fun create(context: Context): AlertDialog { + fun create(context: Context, source: StateDialog.ScanFailsSource): AlertDialog { return MaterialAlertDialogBuilder(context, R.style.CustomMaterialDialog).apply { setTitle(context.getString(R.string.common_warning)) setMessage(R.string.alert_troubleshooting_scan_card_title) setPositiveButton(R.string.alert_button_request_support) { _, _ -> - Analytics.send(Basic.ButtonSupport()) + val sourceAnalytics = when (source) { + StateDialog.ScanFailsSource.MAIN -> AnalyticsParam.ScreensSources.Main + StateDialog.ScanFailsSource.SIGN_IN -> AnalyticsParam.ScreensSources.SignIn + StateDialog.ScanFailsSource.SETTINGS -> AnalyticsParam.ScreensSources.Settings + StateDialog.ScanFailsSource.INTRO -> AnalyticsParam.ScreensSources.Intro + } + Analytics.send(Basic.ButtonSupport(sourceAnalytics)) store.dispatch(GlobalAction.SendEmail(ScanFailsEmail())) } setNeutralButton(R.string.common_cancel) { _, _ -> } diff --git a/app/src/main/java/com/tangem/tap/domain/scanCard/DefaultScanCardProcessor.kt b/app/src/main/java/com/tangem/tap/domain/scanCard/DefaultScanCardProcessor.kt index 1bac186d83..c72d366b37 100644 --- a/app/src/main/java/com/tangem/tap/domain/scanCard/DefaultScanCardProcessor.kt +++ b/app/src/main/java/com/tangem/tap/domain/scanCard/DefaultScanCardProcessor.kt @@ -2,7 +2,7 @@ package com.tangem.tap.domain.scanCard import com.tangem.common.CompletionResult import com.tangem.common.core.TangemError -import com.tangem.core.analytics.models.AnalyticsEvent +import com.tangem.core.analytics.models.AnalyticsParam import com.tangem.domain.card.ScanCardProcessor import com.tangem.domain.models.scan.ScanResponse import com.tangem.tap.common.extensions.inject @@ -27,7 +27,7 @@ internal class DefaultScanCardProcessor : ScanCardProcessor { @Suppress("LongParameterList") override suspend fun scan( - analyticsEvent: AnalyticsEvent?, + analyticsSource: AnalyticsParam.ScreensSources, cardId: String?, onProgressStateChange: suspend (showProgress: Boolean) -> Unit, onScanStateChange: suspend (scanInProgress: Boolean) -> Unit, @@ -38,7 +38,7 @@ internal class DefaultScanCardProcessor : ScanCardProcessor { ) { if (isNewCardScanningEnabled) { UseCaseScanProcessor.scan( - analyticsEvent, + analyticsSource, cardId, onProgressStateChange, onScanStateChange, @@ -49,7 +49,7 @@ internal class DefaultScanCardProcessor : ScanCardProcessor { ) } else { LegacyScanProcessor.scan( - analyticsEvent, + analyticsSource, cardId, onProgressStateChange, onScanStateChange, diff --git a/app/src/main/java/com/tangem/tap/domain/scanCard/LegacyScanProcessor.kt b/app/src/main/java/com/tangem/tap/domain/scanCard/LegacyScanProcessor.kt index 757e78cb34..9164a9bfd6 100644 --- a/app/src/main/java/com/tangem/tap/domain/scanCard/LegacyScanProcessor.kt +++ b/app/src/main/java/com/tangem/tap/domain/scanCard/LegacyScanProcessor.kt @@ -7,6 +7,8 @@ import com.tangem.common.doOnFailure import com.tangem.common.doOnSuccess import com.tangem.core.analytics.Analytics import com.tangem.core.analytics.models.AnalyticsEvent +import com.tangem.core.analytics.models.AnalyticsParam +import com.tangem.core.analytics.models.Basic import com.tangem.core.navigation.AppScreen import com.tangem.core.navigation.NavigationAction import com.tangem.domain.common.TapWorkarounds.canSkipBackup @@ -45,7 +47,7 @@ internal object LegacyScanProcessor { @Suppress("LongParameterList") suspend fun scan( - analyticsEvent: AnalyticsEvent?, + analyticsSource: AnalyticsParam.ScreensSources, cardId: String?, onProgressStateChange: suspend (showProgress: Boolean) -> Unit, onScanStateChange: suspend (scanInProgress: Boolean) -> Unit, @@ -61,7 +63,8 @@ internal object LegacyScanProcessor { val result = tangemSdkManager.scanProduct(cardId) - store.dispatchOnMain(GlobalAction.ScanFailsCounter.ChooseBehavior(result)) + val analyticsEvent = Basic.CardWasScanned(analyticsSource) + store.dispatchOnMain(GlobalAction.ScanFailsCounter.ChooseBehavior(result, analyticsSource)) result .doOnFailure { error -> diff --git a/app/src/main/java/com/tangem/tap/domain/scanCard/UseCaseScanProcessor.kt b/app/src/main/java/com/tangem/tap/domain/scanCard/UseCaseScanProcessor.kt index 02e1701894..2afbd6d813 100644 --- a/app/src/main/java/com/tangem/tap/domain/scanCard/UseCaseScanProcessor.kt +++ b/app/src/main/java/com/tangem/tap/domain/scanCard/UseCaseScanProcessor.kt @@ -3,7 +3,8 @@ package com.tangem.tap.domain.scanCard import arrow.fx.coroutines.resourceScope import com.tangem.common.CompletionResult import com.tangem.common.core.TangemError -import com.tangem.core.analytics.models.AnalyticsEvent +import com.tangem.core.analytics.models.AnalyticsParam +import com.tangem.core.analytics.models.Basic import com.tangem.core.navigation.AppScreen import com.tangem.core.navigation.NavigationAction import com.tangem.domain.card.ScanCardException @@ -34,7 +35,7 @@ internal object UseCaseScanProcessor { @Suppress("LongParameterList") suspend fun scan( - analyticsEvent: AnalyticsEvent?, + analyticsSource: AnalyticsParam.ScreensSources, cardId: String?, onProgressStateChange: suspend (showProgress: Boolean) -> Unit, onScanStateChange: suspend (scanInProgress: Boolean) -> Unit, @@ -48,9 +49,7 @@ internal object UseCaseScanProcessor { val scanCardUseCase = store.inject(DaggerGraphState::scanCardUseCase) val chains = buildList { add(ScanningFinishedChain { onScanStateChange(false) }) - if (analyticsEvent != null) { - add(AnalyticsChain(analyticsEvent)) - } + add(AnalyticsChain(Basic.CardWasScanned(analyticsSource))) add(DisclaimerChain(store, disclaimerWillShow)) add(CheckForOnboardingChain(store, store.state.globalState.tapWalletManager)) } diff --git a/app/src/main/java/com/tangem/tap/domain/walletconnect/WalletConnectRepository.kt b/app/src/main/java/com/tangem/tap/domain/walletconnect/WalletConnectRepository.kt index e38e7fcaf1..de77928810 100644 --- a/app/src/main/java/com/tangem/tap/domain/walletconnect/WalletConnectRepository.kt +++ b/app/src/main/java/com/tangem/tap/domain/walletconnect/WalletConnectRepository.kt @@ -13,6 +13,7 @@ import com.tangem.tap.features.details.redux.walletconnect.WalletForSession import com.trustwallet.walletconnect.models.WCPeerMeta import com.trustwallet.walletconnect.models.session.WCSession import timber.log.Timber +import java.io.FileNotFoundException import java.nio.charset.Charset class WalletConnectRepository(val context: Application) { @@ -35,6 +36,8 @@ class WalletConnectRepository(val context: Application) { val json = context.readFileText(FILE_NAME_PREFIX_SESSIONS) .hexToUtf8() walletConnectAdapter.fromJson(json)!!.map { it.toSession() } + } catch (e: FileNotFoundException) { + emptyList() } catch (exception: Exception) { Timber.w(exception) emptyList() diff --git a/app/src/main/java/com/tangem/tap/domain/walletconnect2/data/WalletConnectRepositoryImpl.kt b/app/src/main/java/com/tangem/tap/domain/walletconnect2/data/WalletConnectRepositoryImpl.kt index 4f37c03839..71f910ce82 100644 --- a/app/src/main/java/com/tangem/tap/domain/walletconnect2/data/WalletConnectRepositoryImpl.kt +++ b/app/src/main/java/com/tangem/tap/domain/walletconnect2/data/WalletConnectRepositoryImpl.kt @@ -14,12 +14,9 @@ import com.walletconnect.android.CoreClient import com.walletconnect.android.relay.ConnectionType import com.walletconnect.web3.wallet.client.Wallet import com.walletconnect.web3.wallet.client.Web3Wallet -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.SupervisorJob +import kotlinx.coroutines.* import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.MutableSharedFlow -import kotlinx.coroutines.launch import timber.log.Timber import javax.inject.Inject @@ -192,8 +189,8 @@ class WalletConnectRepositoryImpl @Inject constructor( if (sessionDelete is Wallet.Model.SessionDelete.Success) { scope.launch { _events.emit(WalletConnectEvents.SessionDeleted(sessionDelete.topic)) + updateSessionsInternal().join() } - updateSessions() } Timber.d("onSessionDelete: $sessionDelete") } @@ -209,21 +206,21 @@ class WalletConnectRepositoryImpl @Inject constructor( accounts = userNamespaces?.flatMap { it.value } ?: emptyList(), ), ) + updateSessionsInternal().join() } - updateSessions() } } override fun onSessionUpdateResponse(sessionUpdateResponse: Wallet.Model.SessionUpdateResponse) { // Triggered when wallet receives the session update response from Dapp Timber.d("onSessionUpdateResponse: $sessionUpdateResponse") - updateSessions() + updateSessionsInternal() } override fun onConnectionStateChange(state: Wallet.Model.ConnectionState) { // Triggered whenever the connection state is changed Timber.d("onConnectionStateChange: $state") - if (state.isAvailable) updateSessions() + if (state.isAvailable) updateSessionsInternal() } override fun onError(error: Wallet.Model.Error) { @@ -416,7 +413,7 @@ class WalletConnectRepositoryImpl @Inject constructor( dAppUrl = session?.url ?: "", ), ) - updateSessions() + updateSessionsInternal() Timber.d("Disconnected successfully: $it") }, onError = { @@ -440,20 +437,22 @@ class WalletConnectRepositoryImpl @Inject constructor( } override fun updateSessions() { - scope.launch { - val availableSessions = Web3Wallet.getListOfActiveSessions() - .map { - WalletConnectSession( - topic = it.topic, - icon = it.metaData?.icons?.firstOrNull(), - name = it.metaData?.name, - url = it.metaData?.url, - ) - } - Timber.d("Available sessions: $availableSessions") - currentSessions = availableSessions - _activeSessions.emit(availableSessions) - } + updateSessionsInternal() + } + + private fun updateSessionsInternal(): Job = scope.launch { + val availableSessions = Web3Wallet.getListOfActiveSessions() + .map { + WalletConnectSession( + topic = it.topic, + icon = it.metaData?.icons?.firstOrNull(), + name = it.metaData?.name, + url = it.metaData?.url, + ) + } + Timber.d("Available sessions: $availableSessions") + currentSessions = availableSessions + _activeSessions.emit(availableSessions) } private fun findMissingNetworks( diff --git a/app/src/main/java/com/tangem/tap/domain/walletconnect2/domain/WalletConnectInteractor.kt b/app/src/main/java/com/tangem/tap/domain/walletconnect2/domain/WalletConnectInteractor.kt index c3af721e25..884d3ac5d7 100644 --- a/app/src/main/java/com/tangem/tap/domain/walletconnect2/domain/WalletConnectInteractor.kt +++ b/app/src/main/java/com/tangem/tap/domain/walletconnect2/domain/WalletConnectInteractor.kt @@ -37,10 +37,12 @@ class WalletConnectInteractor( suspend fun startListening(userWalletId: String, cardId: String?) { this.userWalletId = userWalletId this.cardId = cardId - walletConnectRepository.updateSessions() + coroutineScope { launch { subscribeToEvents() } launch { subscribeToSessions() } + + walletConnectRepository.updateSessions() } } @@ -88,11 +90,12 @@ class WalletConnectInteractor( is WalletConnectEvents.SessionApprovalSuccess -> { sessionsRepository.saveSession( userWallet = userWalletId, - session = Session.fromAccounts( + session = Session( accounts = wcEvent.accounts, topic = wcEvent.topic, ), ) + walletConnectRepository.updateSessions() handler.onSessionEstablished() } is WalletConnectEvents.SessionDeleted -> { diff --git a/app/src/main/java/com/tangem/tap/domain/walletconnect2/domain/models/Session.kt b/app/src/main/java/com/tangem/tap/domain/walletconnect2/domain/models/Session.kt index 4637a99acb..896b6dc97a 100644 --- a/app/src/main/java/com/tangem/tap/domain/walletconnect2/domain/models/Session.kt +++ b/app/src/main/java/com/tangem/tap/domain/walletconnect2/domain/models/Session.kt @@ -3,13 +3,4 @@ package com.tangem.tap.domain.walletconnect2.domain.models data class Session( val topic: String, val accounts: List, -) { - companion object { - fun fromAccounts(accounts: List, topic: String): Session { - return Session( - topic = topic, - accounts = accounts, - ) - } - } -} \ No newline at end of file +) \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/features/details/redux/DetailsMiddleware.kt b/app/src/main/java/com/tangem/tap/features/details/redux/DetailsMiddleware.kt index 90aa10f2cd..654edd4102 100644 --- a/app/src/main/java/com/tangem/tap/features/details/redux/DetailsMiddleware.kt +++ b/app/src/main/java/com/tangem/tap/features/details/redux/DetailsMiddleware.kt @@ -7,7 +7,6 @@ import com.tangem.common.core.TangemSdkError import com.tangem.common.core.UserCodeRequestPolicy import com.tangem.common.extensions.guard import com.tangem.core.analytics.Analytics -import com.tangem.core.analytics.models.Basic import com.tangem.core.navigation.AppScreen import com.tangem.core.navigation.NavigationAction import com.tangem.core.ui.extensions.TextReference @@ -580,7 +579,7 @@ class DetailsMiddleware { ) store.inject(DaggerGraphState::scanCardProcessor).scan( - analyticsEvent = Basic.CardWasScanned(CoreAnalyticsParam.ScannedFrom.MyWallets), + analyticsSource = CoreAnalyticsParam.ScreensSources.Settings, onWalletNotCreated = { // No need to rollback policy, continue with the policy set before the card scan store.dispatchWithMain(DetailsAction.ScanAndSaveUserWallet.Success) diff --git a/app/src/main/java/com/tangem/tap/features/details/redux/walletconnect/WalletConnectAction.kt b/app/src/main/java/com/tangem/tap/features/details/redux/walletconnect/WalletConnectAction.kt index 8e1bb3f2e1..47afd1b484 100644 --- a/app/src/main/java/com/tangem/tap/features/details/redux/walletconnect/WalletConnectAction.kt +++ b/app/src/main/java/com/tangem/tap/features/details/redux/walletconnect/WalletConnectAction.kt @@ -59,8 +59,7 @@ sealed class WalletConnectAction : Action { ) : WalletConnectAction() data class FailureEstablishingSession(val session: WCSession?, val error: TapError? = null) : WalletConnectAction() - data class SetSessionsRestored(val sessions: List) : - WalletConnectAction() + data class SetSessionsRestored(val sessions: List) : WalletConnectAction() data class DisconnectSession(val topic: String, val session: WCSession?) : WalletConnectAction() diff --git a/app/src/main/java/com/tangem/tap/features/details/redux/walletconnect/WalletConnectReducer.kt b/app/src/main/java/com/tangem/tap/features/details/redux/walletconnect/WalletConnectReducer.kt index 44130862c0..6840f26c63 100644 --- a/app/src/main/java/com/tangem/tap/features/details/redux/walletconnect/WalletConnectReducer.kt +++ b/app/src/main/java/com/tangem/tap/features/details/redux/walletconnect/WalletConnectReducer.kt @@ -20,8 +20,9 @@ object WalletConnectReducer { is WalletConnectAction.SetNewSessionData -> { state.copy(newSessionData = action.newSession) } - is WalletConnectAction.SetSessionsRestored -> - WalletConnectState(sessions = action.sessions) + is WalletConnectAction.SetSessionsRestored -> state.copy( + sessions = action.sessions, + ) is WalletConnectAction.RemoveSession -> { val sessions = state.sessions.filterNot { it.session.toUri() == action.session.toUri() } diff --git a/app/src/main/java/com/tangem/tap/features/details/ui/details/DetailsViewModel.kt b/app/src/main/java/com/tangem/tap/features/details/ui/details/DetailsViewModel.kt index 12698bcde4..5ce6bc642a 100644 --- a/app/src/main/java/com/tangem/tap/features/details/ui/details/DetailsViewModel.kt +++ b/app/src/main/java/com/tangem/tap/features/details/ui/details/DetailsViewModel.kt @@ -4,6 +4,7 @@ import androidx.compose.runtime.MutableState import androidx.compose.runtime.mutableStateOf import com.tangem.common.extensions.guard import com.tangem.core.analytics.Analytics +import com.tangem.core.analytics.models.AnalyticsParam import com.tangem.core.analytics.models.Basic import com.tangem.core.navigation.AppScreen import com.tangem.core.navigation.NavigationAction @@ -138,7 +139,7 @@ internal class DetailsViewModel( } private fun sendFeedback() { - Analytics.send(Basic.ButtonSupport()) + Analytics.send(Basic.ButtonSupport(AnalyticsParam.ScreensSources.Settings)) store.dispatchOnMain(GlobalAction.SendEmail(FeedbackEmail())) } diff --git a/app/src/main/java/com/tangem/tap/features/home/redux/HomeAction.kt b/app/src/main/java/com/tangem/tap/features/home/redux/HomeAction.kt index e87ba1ee99..987d3d51a5 100644 --- a/app/src/main/java/com/tangem/tap/features/home/redux/HomeAction.kt +++ b/app/src/main/java/com/tangem/tap/features/home/redux/HomeAction.kt @@ -1,8 +1,5 @@ package com.tangem.tap.features.home.redux -import com.tangem.core.analytics.models.AnalyticsEvent -import com.tangem.core.analytics.models.AnalyticsParam -import com.tangem.core.analytics.models.Basic import com.tangem.tap.common.entities.IndeterminateProgressButton import kotlinx.coroutines.CoroutineScope import org.rekotlin.Action @@ -17,11 +14,9 @@ sealed class HomeAction : Action { /** * Action for scanning card * - * @property analyticsEvent analytics event * @property scope lifecycle scope. It will be canceled when lifecycle-aware component is destroyed */ data class ReadCard( - val analyticsEvent: AnalyticsEvent? = Basic.CardWasScanned(AnalyticsParam.ScannedFrom.Introduction), val scope: CoroutineScope, ) : HomeAction() diff --git a/app/src/main/java/com/tangem/tap/features/home/redux/HomeMiddleware.kt b/app/src/main/java/com/tangem/tap/features/home/redux/HomeMiddleware.kt index 2bec7b7af6..9a936a74e8 100644 --- a/app/src/main/java/com/tangem/tap/features/home/redux/HomeMiddleware.kt +++ b/app/src/main/java/com/tangem/tap/features/home/redux/HomeMiddleware.kt @@ -5,12 +5,14 @@ import com.tangem.common.doOnResult import com.tangem.common.doOnSuccess import com.tangem.common.extensions.guard import com.tangem.core.analytics.Analytics -import com.tangem.core.analytics.models.AnalyticsEvent +import com.tangem.core.analytics.models.AnalyticsParam import com.tangem.core.analytics.models.Basic import com.tangem.core.navigation.AppScreen import com.tangem.core.navigation.NavigationAction +import com.tangem.domain.common.util.cardTypesResolver import com.tangem.domain.models.scan.ScanResponse import com.tangem.domain.userwallets.UserWalletBuilder +import com.tangem.tap.common.analytics.converters.ParamCardCurrencyConverter import com.tangem.tap.common.analytics.events.IntroductionProcess import com.tangem.tap.common.analytics.events.Shop import com.tangem.tap.common.entities.IndeterminateProgressButton @@ -19,7 +21,6 @@ import com.tangem.tap.common.redux.AppState import com.tangem.tap.common.redux.global.GlobalAction import com.tangem.tap.features.home.redux.HomeMiddleware.NEW_BUY_WALLET_URL import com.tangem.tap.features.send.redux.states.ButtonState -import com.tangem.tap.features.signin.redux.SignInAction import com.tangem.tap.preferencesStorage import com.tangem.tap.proxy.redux.DaggerGraphState import com.tangem.tap.scope @@ -59,7 +60,7 @@ private fun handleHomeAction(action: Action) { } is HomeAction.ReadCard -> { action.scope.launch { - readCard(action.analyticsEvent) + readCard() } } is HomeAction.GoToShop -> { @@ -75,13 +76,13 @@ private fun handleHomeAction(action: Action) { } } -private suspend fun readCard(analyticsEvent: AnalyticsEvent?) { +private suspend fun readCard() { store.inject(DaggerGraphState::cardSdkConfigRepository).setAccessCodeRequestPolicy( isBiometricsRequestPolicy = preferencesStorage.shouldSaveAccessCodes, ) store.inject(DaggerGraphState::scanCardProcessor).scan( - analyticsEvent = analyticsEvent, + analyticsSource = AnalyticsParam.ScreensSources.Intro, onProgressStateChange = { showProgress -> if (showProgress) { changeButtonState(ButtonState.PROGRESS) @@ -113,14 +114,32 @@ private fun proceedWithScanResponse(scanResponse: ScanResponse) = scope.launch { Timber.e(error, "Unable to save user wallet") } .doOnSuccess { + sendSignedInCardAnalyticsEvent(scanResponse) scope.launch { store.onUserWalletSelected(userWallet = userWallet) } } .doOnResult { - store.dispatchOnMain(SignInAction.SetSignInType(Basic.SignedIn.SignInType.Card)) navigateTo(AppScreen.Wallet) } } +private fun sendSignedInCardAnalyticsEvent(scanResponse: ScanResponse) { + val currency = ParamCardCurrencyConverter().convert( + value = scanResponse.cardTypesResolver, + ) + + if (currency != null) { + Analytics.send( + event = Basic.SignedIn( + currency = currency, + batch = scanResponse.card.batchId, + signInType = Basic.SignedIn.SignInType.Card, + walletsCount = userWalletsListManager.walletsCount.toString(), + hasBackup = scanResponse.card.backupStatus?.isActive, + ), + ) + } +} + private suspend fun navigateTo(appScreen: AppScreen) { store.dispatchOnMain(NavigationAction.NavigateTo(appScreen)) delay(timeMillis = 200) diff --git a/app/src/main/java/com/tangem/tap/features/onboarding/OnboardingMenuProvider.kt b/app/src/main/java/com/tangem/tap/features/onboarding/OnboardingMenuProvider.kt index 936a202358..5e0028b00d 100644 --- a/app/src/main/java/com/tangem/tap/features/onboarding/OnboardingMenuProvider.kt +++ b/app/src/main/java/com/tangem/tap/features/onboarding/OnboardingMenuProvider.kt @@ -5,6 +5,7 @@ import android.view.MenuInflater import android.view.MenuItem import androidx.core.view.MenuProvider import com.tangem.core.analytics.Analytics +import com.tangem.core.analytics.models.AnalyticsParam import com.tangem.core.analytics.models.Basic import com.tangem.tap.common.feedback.SupportInfo import com.tangem.tap.common.redux.global.GlobalAction @@ -21,7 +22,7 @@ class OnboardingMenuProvider : MenuProvider { override fun onMenuItemSelected(menuItem: MenuItem): Boolean = when (menuItem.itemId) { R.id.menu_item_chat_support -> { - Analytics.send(Basic.ButtonSupport()) + Analytics.send(Basic.ButtonSupport(AnalyticsParam.ScreensSources.Intro)) // changed on email support [REDACTED_TASK_KEY] store.dispatch(GlobalAction.SendEmail(SupportInfo())) true diff --git a/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/ui/OnboardingWalletFragment.kt b/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/ui/OnboardingWalletFragment.kt index 0655d01aa9..f7e6ab244e 100644 --- a/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/ui/OnboardingWalletFragment.kt +++ b/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/ui/OnboardingWalletFragment.kt @@ -22,6 +22,7 @@ import com.tangem.common.CardIdFormatter import com.tangem.common.CompletionResult import com.tangem.common.core.CardIdDisplayFormat import com.tangem.core.analytics.Analytics +import com.tangem.core.analytics.models.AnalyticsParam import com.tangem.core.analytics.models.Basic import com.tangem.core.ui.extensions.setStatusBarColor import com.tangem.domain.common.util.cardTypesResolver @@ -502,7 +503,7 @@ class OnboardingWalletFragment : private fun makeSeedPhraseRouter(): SeedPhraseRouter = SeedPhraseRouter( onBack = ::legacyOnBackHandler, onOpenChat = { - Analytics.send(Basic.ButtonSupport()) + Analytics.send(Basic.ButtonSupport(AnalyticsParam.ScreensSources.Intro)) // changed on email support [REDACTED_TASK_KEY] store.dispatch(GlobalAction.SendEmail(SupportInfo())) }, diff --git a/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/ui/dialogs/WalletActivationErrorDialog.kt b/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/ui/dialogs/WalletActivationErrorDialog.kt index ddec9cdfb3..ace9edcf19 100644 --- a/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/ui/dialogs/WalletActivationErrorDialog.kt +++ b/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/ui/dialogs/WalletActivationErrorDialog.kt @@ -4,6 +4,7 @@ import android.app.Dialog import android.content.Context import com.google.android.material.dialog.MaterialAlertDialogBuilder import com.tangem.core.analytics.Analytics +import com.tangem.core.analytics.models.AnalyticsParam import com.tangem.core.analytics.models.Basic import com.tangem.tap.common.extensions.dispatchDialogHide import com.tangem.tap.common.feedback.SupportInfo @@ -21,7 +22,7 @@ object WalletActivationErrorDialog { setPositiveButton(R.string.common_ok) { _, _ -> dialog.onConfirm() } setNegativeButton(R.string.common_support) { _, _ -> // changed on email support [REDACTED_TASK_KEY] - Analytics.send(Basic.ButtonSupport()) + Analytics.send(Basic.ButtonSupport(AnalyticsParam.ScreensSources.Intro)) store.dispatch(GlobalAction.SendEmail(SupportInfo())) } setOnDismissListener { store.dispatchDialogHide() } diff --git a/app/src/main/java/com/tangem/tap/features/send/ui/dialogs/RequestFeeErrorDialog.kt b/app/src/main/java/com/tangem/tap/features/send/ui/dialogs/RequestFeeErrorDialog.kt index 9cf4359f72..cf27394348 100644 --- a/app/src/main/java/com/tangem/tap/features/send/ui/dialogs/RequestFeeErrorDialog.kt +++ b/app/src/main/java/com/tangem/tap/features/send/ui/dialogs/RequestFeeErrorDialog.kt @@ -3,6 +3,7 @@ package com.tangem.tap.features.send.ui.dialogs import android.content.Context import androidx.appcompat.app.AlertDialog import com.tangem.core.analytics.Analytics +import com.tangem.core.analytics.models.AnalyticsParam import com.tangem.core.analytics.models.Basic import com.tangem.tap.common.feedback.SendTransactionFailedEmail import com.tangem.tap.common.redux.global.GlobalAction @@ -21,7 +22,7 @@ object RequestFeeErrorDialog { setTitle(R.string.common_fee_error) setMessage(context.getString(R.string.alert_failed_to_send_transaction_message, errorMessage)) setNegativeButton(R.string.details_row_title_contact_to_support) { _, _ -> - Analytics.send(Basic.ButtonSupport()) + Analytics.send(Basic.ButtonSupport(AnalyticsParam.ScreensSources.Send)) store.dispatch(GlobalAction.SendEmail(SendTransactionFailedEmail(errorMessage))) } setPositiveButton(R.string.common_retry) { _, _ -> dialog.onRetry() } diff --git a/app/src/main/java/com/tangem/tap/features/send/ui/dialogs/SendTransactionFailsDialog.kt b/app/src/main/java/com/tangem/tap/features/send/ui/dialogs/SendTransactionFailsDialog.kt index f862ff5e94..5687caa590 100644 --- a/app/src/main/java/com/tangem/tap/features/send/ui/dialogs/SendTransactionFailsDialog.kt +++ b/app/src/main/java/com/tangem/tap/features/send/ui/dialogs/SendTransactionFailsDialog.kt @@ -6,6 +6,7 @@ import com.tangem.blockchain.common.Blockchain import com.tangem.blockchain.common.BlockchainSdkError import com.tangem.common.module.ModuleMessageConverter import com.tangem.core.analytics.Analytics +import com.tangem.core.analytics.models.AnalyticsParam import com.tangem.core.analytics.models.Basic import com.tangem.sdk.extensions.localizedDescription import com.tangem.tap.common.extensions.stripZeroPlainString @@ -33,7 +34,7 @@ object SendTransactionFailsDialog { setTitle(R.string.alert_failed_to_send_transaction_title) setMessage(context.getString(R.string.alert_failed_to_send_transaction_message, errorMessage)) setNeutralButton(R.string.details_row_title_contact_to_support) { _, _ -> - Analytics.send(Basic.ButtonSupport()) + Analytics.send(Basic.ButtonSupport(AnalyticsParam.ScreensSources.Send)) store.dispatch(GlobalAction.SendEmail(SendTransactionFailedEmail(errorMessage))) } setPositiveButton(R.string.common_cancel) { _, _ -> } diff --git a/app/src/main/java/com/tangem/tap/features/signin/redux/SignInAction.kt b/app/src/main/java/com/tangem/tap/features/signin/redux/SignInAction.kt deleted file mode 100644 index 7978ed3f13..0000000000 --- a/app/src/main/java/com/tangem/tap/features/signin/redux/SignInAction.kt +++ /dev/null @@ -1,12 +0,0 @@ -package com.tangem.tap.features.signin.redux - -import com.tangem.core.analytics.models.Basic -import org.rekotlin.Action - -/** -[REDACTED_AUTHOR] - */ -sealed interface SignInAction : Action { - - data class SetSignInType(val type: Basic.SignedIn.SignInType) : SignInAction -} \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/features/signin/redux/SignInMiddleware.kt b/app/src/main/java/com/tangem/tap/features/signin/redux/SignInMiddleware.kt deleted file mode 100644 index 1f44dff0f7..0000000000 --- a/app/src/main/java/com/tangem/tap/features/signin/redux/SignInMiddleware.kt +++ /dev/null @@ -1,15 +0,0 @@ -package com.tangem.tap.features.signin.redux - -import com.tangem.tap.common.redux.AppState -import org.rekotlin.Middleware - -/** -[REDACTED_AUTHOR] - */ -object SignInMiddleware { - val middleware: Middleware = { _, _ -> - { next -> - { action -> next(action) } - } - } -} \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/features/signin/redux/SignInReducer.kt b/app/src/main/java/com/tangem/tap/features/signin/redux/SignInReducer.kt deleted file mode 100644 index 3d5910774d..0000000000 --- a/app/src/main/java/com/tangem/tap/features/signin/redux/SignInReducer.kt +++ /dev/null @@ -1,17 +0,0 @@ -package com.tangem.tap.features.signin.redux - -import com.tangem.tap.common.redux.AppState -import org.rekotlin.Action - -/** -[REDACTED_AUTHOR] - */ -object SignInReducer { - fun reduce(action: Action, state: AppState): SignInState { - if (action !is SignInAction) return state.signInState - - return when (action) { - is SignInAction.SetSignInType -> state.signInState.copy(type = action.type) - } - } -} \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/features/signin/redux/SignInState.kt b/app/src/main/java/com/tangem/tap/features/signin/redux/SignInState.kt deleted file mode 100644 index 27858a8ad7..0000000000 --- a/app/src/main/java/com/tangem/tap/features/signin/redux/SignInState.kt +++ /dev/null @@ -1,8 +0,0 @@ -package com.tangem.tap.features.signin.redux - -import com.tangem.core.analytics.models.Basic - -/** -[REDACTED_AUTHOR] - */ -data class SignInState(val type: Basic.SignedIn.SignInType? = null) \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/features/welcome/redux/WelcomeMiddleware.kt b/app/src/main/java/com/tangem/tap/features/welcome/redux/WelcomeMiddleware.kt index ca7d00d461..638776a6ed 100644 --- a/app/src/main/java/com/tangem/tap/features/welcome/redux/WelcomeMiddleware.kt +++ b/app/src/main/java/com/tangem/tap/features/welcome/redux/WelcomeMiddleware.kt @@ -25,7 +25,6 @@ import com.tangem.tap.common.extensions.onUserWalletSelected import com.tangem.tap.common.redux.AppState import com.tangem.tap.features.intentHandler.handlers.BackgroundScanIntentHandler import com.tangem.tap.features.intentHandler.handlers.WalletConnectLinkIntentHandler -import com.tangem.tap.features.signin.redux.SignInAction import com.tangem.tap.proxy.redux.DaggerGraphState import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.launch @@ -98,7 +97,6 @@ internal class WelcomeMiddleware { signInType = Basic.SignedIn.SignInType.Biometric, ) - store.dispatchWithMain(SignInAction.SetSignInType(Basic.SignedIn.SignInType.Biometric)) store.dispatchWithMain(NavigationAction.NavigateTo(AppScreen.Wallet)) store.dispatchWithMain(WelcomeAction.ProceedWithBiometrics.Success) store.onUserWalletSelected(userWallet = selectedUserWallet) @@ -128,7 +126,6 @@ internal class WelcomeMiddleware { .doOnSuccess { sendSignedInAnalyticsEvent(scanResponse = scanResponse, signInType = Basic.SignedIn.SignInType.Card) - store.dispatchWithMain(SignInAction.SetSignInType(Basic.SignedIn.SignInType.Card)) store.dispatchWithMain(NavigationAction.NavigateTo(AppScreen.Wallet)) store.dispatchWithMain(WelcomeAction.ProceedWithCard.Success) store.onUserWalletSelected(userWallet = userWallet) @@ -175,7 +172,7 @@ internal class WelcomeMiddleware { isBiometricsRequestPolicy = preferencesStorage.shouldSaveAccessCodes, ) store.inject(DaggerGraphState::scanCardProcessor).scan( - analyticsEvent = Basic.CardWasScanned(AnalyticsParam.ScannedFrom.SignIn), + analyticsSource = AnalyticsParam.ScreensSources.SignIn, onSuccess = { scanResponse -> scope.launch { onCardScanned(scanResponse) } }, diff --git a/core/analytics/models/src/main/java/com/tangem/core/analytics/models/AnalyticsParam.kt b/core/analytics/models/src/main/java/com/tangem/core/analytics/models/AnalyticsParam.kt index 5f53ab40d7..a20223d2cb 100644 --- a/core/analytics/models/src/main/java/com/tangem/core/analytics/models/AnalyticsParam.kt +++ b/core/analytics/models/src/main/java/com/tangem/core/analytics/models/AnalyticsParam.kt @@ -57,11 +57,13 @@ sealed class AnalyticsParam { object BlockchainSdk : Error("Blockchain Sdk Error") } - sealed class ScannedFrom(val value: String) { - object Introduction : ScannedFrom("Introduction") - object Main : ScannedFrom("Main") - object SignIn : ScannedFrom("Sign In") - object MyWallets : ScannedFrom("My Wallets") + sealed class ScreensSources(val value: String) { + data object Settings : ScreensSources("Settings") + data object Main : ScreensSources("Main") + data object SignIn : ScreensSources("Sign In") + data object Send : ScreensSources("Send") + data object Intro : ScreensSources("Introduction") + data object MyWallets : ScreensSources("My Wallets") } sealed class TxSentFrom(val value: String) { diff --git a/core/analytics/models/src/main/java/com/tangem/core/analytics/models/Basic.kt b/core/analytics/models/src/main/java/com/tangem/core/analytics/models/Basic.kt index 8820f8ff12..9f39ae5bdd 100644 --- a/core/analytics/models/src/main/java/com/tangem/core/analytics/models/Basic.kt +++ b/core/analytics/models/src/main/java/com/tangem/core/analytics/models/Basic.kt @@ -7,7 +7,7 @@ sealed class Basic( ) : AnalyticsEvent("Basic", event, params, error) { class CardWasScanned( - source: AnalyticsParam.ScannedFrom, + source: AnalyticsParam.ScreensSources, ) : Basic( event = "Card Was Scanned", params = mapOf( @@ -76,5 +76,10 @@ sealed class Basic( class WalletOpened : Basic(event = "Wallet Opened") - class ButtonSupport : Basic("Request Support") + class ButtonSupport(source: AnalyticsParam.ScreensSources) : Basic( + event = "Request Support", + params = mapOf( + AnalyticsParam.SOURCE to source.value, + ), + ) } \ No newline at end of file diff --git a/core/navigation/src/main/java/com/tangem/core/navigation/StateDialog.kt b/core/navigation/src/main/java/com/tangem/core/navigation/StateDialog.kt index 416307b644..75aa1f0579 100644 --- a/core/navigation/src/main/java/com/tangem/core/navigation/StateDialog.kt +++ b/core/navigation/src/main/java/com/tangem/core/navigation/StateDialog.kt @@ -2,5 +2,9 @@ package com.tangem.core.navigation interface StateDialog { - object ScanFailsDialog : StateDialog + data class ScanFailsDialog(val source: ScanFailsSource) : StateDialog + + enum class ScanFailsSource { + MAIN, SIGN_IN, SETTINGS, INTRO; + } } \ No newline at end of file diff --git a/domain/card/src/main/kotlin/com/tangem/domain/card/ScanCardProcessor.kt b/domain/card/src/main/kotlin/com/tangem/domain/card/ScanCardProcessor.kt index 961d9acd07..5b3824d63e 100644 --- a/domain/card/src/main/kotlin/com/tangem/domain/card/ScanCardProcessor.kt +++ b/domain/card/src/main/kotlin/com/tangem/domain/card/ScanCardProcessor.kt @@ -2,7 +2,7 @@ package com.tangem.domain.card import com.tangem.common.CompletionResult import com.tangem.common.core.TangemError -import com.tangem.core.analytics.models.AnalyticsEvent +import com.tangem.core.analytics.models.AnalyticsParam import com.tangem.domain.models.scan.ScanResponse interface ScanCardProcessor { @@ -13,7 +13,7 @@ interface ScanCardProcessor { ): CompletionResult suspend fun scan( - analyticsEvent: AnalyticsEvent? = null, + analyticsSource: AnalyticsParam.ScreensSources, cardId: String? = null, onProgressStateChange: suspend (showProgress: Boolean) -> Unit = {}, onScanStateChange: suspend (scanInProgress: Boolean) -> Unit = {}, diff --git a/features/swap/presentation/src/main/java/com/tangem/feature/swap/ui/StateBuilder.kt b/features/swap/presentation/src/main/java/com/tangem/feature/swap/ui/StateBuilder.kt index 4566c64fae..1761af22d7 100644 --- a/features/swap/presentation/src/main/java/com/tangem/feature/swap/ui/StateBuilder.kt +++ b/features/swap/presentation/src/main/java/com/tangem/feature/swap/ui/StateBuilder.kt @@ -410,11 +410,11 @@ internal class StateBuilder( fromToken: CryptoCurrency, warnings: MutableList, ) { - val feeEnoughState = quoteModel.preparedSwapConfigState.feeState - if (feeEnoughState is SwapFeeState.NotEnough && - quoteModel.preparedSwapConfigState.isBalanceEnough && - quoteModel.permissionState !is PermissionDataState.PermissionLoading - ) { + val feeEnoughState = quoteModel.preparedSwapConfigState.feeState as? SwapFeeState.NotEnough ?: return + val needShowCoverWarning = quoteModel.preparedSwapConfigState.isBalanceEnough && + quoteModel.permissionState !is PermissionDataState.PermissionLoading && + feeEnoughState.feeCurrency != fromToken + if (needShowCoverWarning) { warnings.add( SwapWarning.UnableToCoverFeeWarning( createUnableToCoverFeeNotificationConfig( @@ -1027,7 +1027,6 @@ internal class StateBuilder( fun showSelectProviderBottomSheet( uiState: SwapStateHolder, selectedProviderId: String, - bestRatedProviderId: String, pricesLowerBest: Map, providersStates: Map, unavailableProviders: List, @@ -1035,7 +1034,7 @@ internal class StateBuilder( ): SwapStateHolder { val availableProvidersStates = providersStates.entries .mapNotNull { - it.convertToProviderBottomSheetState(pricesLowerBest, bestRatedProviderId, actions.onProviderSelect) + it.convertToProviderBottomSheetState(pricesLowerBest, actions.onProviderSelect) } .sortedWith(ProviderPercentDiffComparator) val unavailableProviderStates = unavailableProviders.map { @@ -1183,7 +1182,6 @@ internal class StateBuilder( private fun Map.Entry.convertToProviderBottomSheetState( pricesLowerBest: Map, - bestRatedProviderId: String, onProviderSelect: (String) -> Unit, ): ProviderState? { val provider = this.key @@ -1191,7 +1189,6 @@ internal class StateBuilder( is SwapState.EmptyAmountState -> null is SwapState.QuotesLoadedState -> { provider.convertToContentSelectableProviderState( - isBestRate = bestRatedProviderId == provider.providerId, state = state, onProviderClick = onProviderSelect, pricesLowerBest = pricesLowerBest, @@ -1301,7 +1298,6 @@ internal class StateBuilder( } private fun SwapProvider.convertToContentSelectableProviderState( - isBestRate: Boolean, state: SwapState.QuotesLoadedState, selectionType: ProviderState.SelectionType, pricesLowerBest: Map, @@ -1311,8 +1307,6 @@ internal class StateBuilder( val rateString = toTokenInfo.tokenAmount.getFormattedCryptoAmount(toTokenInfo.cryptoCurrencyStatus.currency) val additionalBadge = if (state.permissionState is PermissionDataState.PermissionReadyForRequest) { ProviderState.AdditionalBadge.PermissionRequired - } else if (isBestRate) { - ProviderState.AdditionalBadge.BestTrade } else { ProviderState.AdditionalBadge.Empty } diff --git a/features/swap/presentation/src/main/java/com/tangem/feature/swap/viewmodels/SwapViewModel.kt b/features/swap/presentation/src/main/java/com/tangem/feature/swap/viewmodels/SwapViewModel.kt index 51969a1ec1..d30242c9f2 100644 --- a/features/swap/presentation/src/main/java/com/tangem/feature/swap/viewmodels/SwapViewModel.kt +++ b/features/swap/presentation/src/main/java/com/tangem/feature/swap/viewmodels/SwapViewModel.kt @@ -928,7 +928,6 @@ internal class SwapViewModel @Inject constructor( selectedProviderId = providerId, pricesLowerBest = pricesLowerBest, unavailableProviders = unavailableProviders, - bestRatedProviderId = findBestQuoteProvider(states)?.providerId ?: providerId, providersStates = dataState.lastLoadedSwapStates, ) { uiState = stateBuilder.dismissBottomSheet(uiState) } }, diff --git a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/router/DefaultWalletRouter.kt b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/router/DefaultWalletRouter.kt index 5ae3d34992..c0f4910bfe 100644 --- a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/router/DefaultWalletRouter.kt +++ b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/router/DefaultWalletRouter.kt @@ -163,7 +163,11 @@ internal class DefaultWalletRouter( } override fun openScanFailedDialog() { - reduxNavController.navigate(action = NavigationAction.OpenDialog(StateDialog.ScanFailsDialog)) + reduxNavController.navigate( + action = NavigationAction.OpenDialog( + StateDialog.ScanFailsDialog(StateDialog.ScanFailsSource.MAIN), + ), + ) } private companion object { diff --git a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/analytics/WalletScreenAnalyticsEvent.kt b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/analytics/WalletScreenAnalyticsEvent.kt index 04535b6a3b..fcecd054bb 100644 --- a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/analytics/WalletScreenAnalyticsEvent.kt +++ b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/analytics/WalletScreenAnalyticsEvent.kt @@ -25,7 +25,7 @@ sealed class WalletScreenAnalyticsEvent { data object WalletOpened : Basic(event = "Wallet Opened") - class CardWasScanned(source: AnalyticsParam.ScannedFrom) : Basic( + class CardWasScanned(source: AnalyticsParam.ScreensSources) : Basic( event = "Card Was Scanned", params = mapOf( AnalyticsParam.SOURCE to source.value, diff --git a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/viewmodels/intents/WalletWarningsClickIntents.kt b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/viewmodels/intents/WalletWarningsClickIntents.kt index 1ff5dc6191..553dafc78b 100644 --- a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/viewmodels/intents/WalletWarningsClickIntents.kt +++ b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/viewmodels/intents/WalletWarningsClickIntents.kt @@ -107,7 +107,7 @@ internal class WalletWarningsClickIntentsImplementor @Inject constructor( } override fun onGenerateMissedAddressesClick(missedAddressCurrencies: List) { - analyticsEventHandler.send(Basic.CardWasScanned(AnalyticsParam.ScannedFrom.Main)) + analyticsEventHandler.send(Basic.CardWasScanned(AnalyticsParam.ScreensSources.Main)) analyticsEventHandler.send(MainScreen.NoticeScanYourCardTapped) viewModelScope.launch(dispatchers.main) {