diff --git a/app/src/main/java/com/tangem/tap/MainActivity.kt b/app/src/main/java/com/tangem/tap/MainActivity.kt index b5cd3eab19..e4a9b5ecf8 100644 --- a/app/src/main/java/com/tangem/tap/MainActivity.kt +++ b/app/src/main/java/com/tangem/tap/MainActivity.kt @@ -40,7 +40,6 @@ import com.tangem.core.decompose.di.RootAppComponentContext import com.tangem.core.deeplink.DeepLinksRegistry import com.tangem.core.navigation.email.EmailSender import com.tangem.core.ui.UiDependencies -import com.tangem.core.ui.event.StateEvent import com.tangem.core.ui.extensions.TextReference import com.tangem.core.ui.extensions.resolveReference import com.tangem.core.ui.message.EventMessageEffect @@ -88,7 +87,6 @@ import com.tangem.tap.features.intentHandler.handlers.BackgroundScanIntentHandle import com.tangem.tap.features.intentHandler.handlers.OnPushClickedIntentHandler import com.tangem.tap.features.intentHandler.handlers.WalletConnectLinkIntentHandler import com.tangem.tap.features.main.MainViewModel -import com.tangem.tap.features.main.model.Toast import com.tangem.tap.features.onboarding.products.wallet.redux.BackupAction import com.tangem.tap.proxy.AppStateHolder import com.tangem.tap.proxy.redux.DaggerGraphAction @@ -279,7 +277,6 @@ class MainActivity : AppCompatActivity(), SnackbarHandler, ActivityResultCallbac initContent() - observeStateUpdates() observePolkadotAccountHealthCheck() sendStakingUnsubmittedHashes() checkGoogleServicesAvailability() @@ -359,26 +356,6 @@ class MainActivity : AppCompatActivity(), SnackbarHandler, ActivityResultCallbac } } - private fun observeStateUpdates() { - viewModel.state - .flowWithLifecycle(lifecycle) - .onEach { state -> - if (state.toast is StateEvent.Triggered) { - showToast(state.toast.data) - state.toast.onConsume() - } - } - .launchIn(lifecycleScope) - } - - private fun showToast(toast: Toast) { - dismissSnackbar() - showSnackbar(toast.message, Snackbar.LENGTH_LONG, toast.action.text) { - toast.action.onClick() - dismissSnackbar() - } - } - private fun installActivityDependencies() { cardSdkOwner.register(activity = this) tangemSdkManager = injectedTangemSdkManager diff --git a/app/src/main/java/com/tangem/tap/features/main/MainViewModel.kt b/app/src/main/java/com/tangem/tap/features/main/MainViewModel.kt index 375b285fb1..29dc39ea0b 100644 --- a/app/src/main/java/com/tangem/tap/features/main/MainViewModel.kt +++ b/app/src/main/java/com/tangem/tap/features/main/MainViewModel.kt @@ -3,9 +3,14 @@ package com.tangem.tap.features.main import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import com.tangem.blockchainsdk.BlockchainSDKFactory -import com.tangem.common.routing.AppRoute -import com.tangem.common.routing.AppRouter import com.tangem.core.analytics.Analytics +import com.tangem.core.decompose.di.GlobalUiMessageSender +import com.tangem.core.decompose.ui.UiMessageSender +import com.tangem.core.ui.R +import com.tangem.core.ui.extensions.resourceReference +import com.tangem.core.ui.message.BottomSheetMessage +import com.tangem.core.ui.message.EventMessageAction +import com.tangem.core.ui.message.SnackbarMessage import com.tangem.datasource.api.common.config.managers.ApiConfigsManager import com.tangem.domain.appcurrency.FetchAppCurrenciesUseCase import com.tangem.domain.balancehiding.BalanceHidingSettings @@ -18,7 +23,6 @@ import com.tangem.domain.settings.usercountry.FetchUserCountryUseCase import com.tangem.domain.staking.FetchStakingTokensUseCase import com.tangem.domain.wallets.legacy.UserWalletsListManager import com.tangem.tap.common.extensions.setContext -import com.tangem.tap.features.main.model.MainScreenState import com.tangem.utils.coroutines.CoroutineDispatcherProvider import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.flow.* @@ -31,7 +35,6 @@ import javax.inject.Inject internal class MainViewModel @Inject constructor( private val updateBalanceHidingSettingsUseCase: UpdateBalanceHidingSettingsUseCase, private val listenToFlipsUseCase: ListenToFlipsUseCase, - private val router: AppRouter, private val fetchAppCurrenciesUseCase: FetchAppCurrenciesUseCase, deleteDeprecatedLogsUseCase: DeleteDeprecatedLogsUseCase, private val incrementAppLaunchCounterUseCase: IncrementAppLaunchCounterUseCase, @@ -41,18 +44,14 @@ internal class MainViewModel @Inject constructor( private val fetchStakingTokensUseCase: FetchStakingTokensUseCase, private val apiConfigsManager: ApiConfigsManager, private val fetchUserCountryUseCase: FetchUserCountryUseCase, + @GlobalUiMessageSender + private val messageSender: UiMessageSender, getBalanceHidingSettingsUseCase: GetBalanceHidingSettingsUseCase, -) : ViewModel(), MainIntents { - - private val stateHolder = MainScreenStateHolder( - intents = this, - ) +) : ViewModel() { private val balanceHidingSettingsFlow: SharedFlow = getBalanceHidingSettingsUseCase() .shareIn(viewModelScope, SharingStarted.WhileSubscribed()) - val state: StateFlow = stateHolder.stateFlow - var isSplashScreenShown: Boolean = true private set @@ -125,10 +124,34 @@ internal class MainViewModel @Inject constructor( it.isBalanceHidingNotificationEnabled && it.isBalanceHidden } .onEach { - if (state.value.modalNotification?.isShown != true && !it.isUpdateFromToast) { + if (!it.isUpdateFromToast) { listenToFlipsUseCase.changeUpdateEnabled(false) - stateHolder.updateWithHiddenBalancesNotification() - router.push(AppRoute.ModalNotification) + + val message = BottomSheetMessage.invoke( + iconResId = R.drawable.ic_eye_off_outline_24, + title = resourceReference(R.string.balance_hidden_title), + message = resourceReference(R.string.balance_hidden_description), + onDismissRequest = ::onBottomSheetDismissed, + firstActionBuilder = { + EventMessageAction( + title = resourceReference(R.string.balance_hidden_got_it_button), + onClick = { + onHiddenBalanceNotificationAction(isPermanent = false) + onDismissRequest() + }, + ) + }, + secondActionBuilder = { + EventMessageAction( + title = resourceReference(R.string.balance_hidden_do_not_show_button), + onClick = { + onHiddenBalanceNotificationAction(isPermanent = true) + onDismissRequest() + }, + ) + }, + ) + messageSender.send(message) } } .launchIn(viewModelScope) @@ -167,11 +190,27 @@ internal class MainViewModel @Inject constructor( private fun displayBalancesHiddenStatusToast(settings: BalanceHidingSettings) { // If modal notification is enabled and balances are hidden, the toast will not show if (!settings.isBalanceHidingNotificationEnabled || !settings.isBalanceHidden) { - stateHolder.updateWithHiddenBalancesToast(settings.isBalanceHidden) + val message = SnackbarMessage( + message = if (settings.isBalanceHidden) { + resourceReference(R.string.toast_balances_hidden) + } else { + resourceReference(R.string.toast_balances_shown) + }, + actionLabel = resourceReference(R.string.toast_undo), + action = { + if (settings.isBalanceHidden) { + onHiddenBalanceToastAction() + } else { + onShownBalanceToastAction() + } + }, + ) + + messageSender.send(message) } } - override fun onHiddenBalanceToastAction() { + private fun onHiddenBalanceToastAction() { viewModelScope.launch { updateBalanceHidingSettingsUseCase.invoke { copy( @@ -182,7 +221,7 @@ internal class MainViewModel @Inject constructor( } } - override fun onShownBalanceToastAction() { + private fun onShownBalanceToastAction() { viewModelScope.launch { updateBalanceHidingSettingsUseCase.invoke { copy( @@ -193,10 +232,14 @@ internal class MainViewModel @Inject constructor( } } - override fun onHiddenBalanceNotificationAction(isPermanent: Boolean) { - onDismissBottomSheet() + private fun onHiddenBalanceNotificationAction(isPermanent: Boolean) { + val message = SnackbarMessage( + message = resourceReference(R.string.toast_balances_hidden), + actionLabel = resourceReference(R.string.toast_undo), + action = ::onHiddenBalanceToastAction, + ) + messageSender.send(message) - stateHolder.updateWithHiddenBalancesToast(true) if (isPermanent) { viewModelScope.launch { updateBalanceHidingSettingsUseCase.invoke { @@ -206,10 +249,7 @@ internal class MainViewModel @Inject constructor( } } - override fun onDismissBottomSheet() { - listenToFlipsUseCase.changeUpdateEnabled(true) - router.pop() - stateHolder.updateWithoutModalNotification() - stateHolder.updateWithHiddenBalancesToast(true) + private fun onBottomSheetDismissed() { + listenToFlipsUseCase.changeUpdateEnabled(isUpdateEnabled = true) } } \ No newline at end of file