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

Refactor Receive Address module navigation #6924

Merged
merged 1 commit into from
Dec 22, 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 @@ -113,7 +113,7 @@ fun BalanceForAccountCex(navController: NavController, accountViewItem: AccountV
modifier = Modifier.weight(1f),
title = stringResource(R.string.Balance_Deposit),
onClick = {
navController.slideFromRight(R.id.depositCexChooseAssetFragment)
navController.slideFromRight(R.id.depositCexFragment)
}
)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,6 @@ import io.horizontalsystems.bankwallet.core.slideFromRight
import io.horizontalsystems.bankwallet.modules.balance.cex.BalanceCexViewItem
import io.horizontalsystems.bankwallet.modules.balance.cex.WalletIconCex
import io.horizontalsystems.bankwallet.modules.coin.CoinFragment
import io.horizontalsystems.bankwallet.modules.depositcex.DepositCexFragment
import io.horizontalsystems.bankwallet.ui.compose.ComposeAppTheme
import io.horizontalsystems.bankwallet.ui.compose.components.AppBar
import io.horizontalsystems.bankwallet.ui.compose.components.ButtonPrimaryCircle
Expand Down Expand Up @@ -207,7 +206,7 @@ private fun ButtonsRow(viewItem: BalanceCexViewItem, navController: NavControlle
title = stringResource(R.string.Balance_Deposit),
enabled = viewItem.depositEnabled,
onClick = {
navController.slideFromRight(R.id.depositCexFragment, DepositCexFragment.Input(viewItem.cexAsset))
navController.slideFromRight(R.id.depositCexFragment, viewItem.cexAsset)
},
)
HSpacer(width = 8.dp)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -205,7 +205,7 @@ fun BalanceItems(
onClick = {
when (val receiveAllowedState = viewModel.getReceiveAllowedState()) {
ReceiveAllowedState.Allowed -> {
navController.slideFromRight(R.id.receiveTokenSelectFragment)
navController.slideFromRight(R.id.receiveFragment)
}

is ReceiveAllowedState.BackupRequired -> {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package io.horizontalsystems.bankwallet.modules.depositcex

import androidx.lifecycle.ViewModel
import io.horizontalsystems.bankwallet.core.providers.CexAsset
import io.horizontalsystems.bankwallet.core.providers.CexDepositNetwork
import io.horizontalsystems.bankwallet.modules.receive.ui.UsedAddressesParams

class CexDepositSharedViewModel : ViewModel() {

var network: CexDepositNetwork? = null
var cexAsset: CexAsset? = null
var usedAddressesParams: UsedAddressesParams? = null

}
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ import io.horizontalsystems.bankwallet.core.providers.CexDepositNetwork
import io.horizontalsystems.bankwallet.core.providers.CexProviderManager
import io.horizontalsystems.bankwallet.core.providers.Translator
import io.horizontalsystems.bankwallet.entities.ViewState
import io.horizontalsystems.bankwallet.modules.receive.address.ReceiveAddressModule
import io.horizontalsystems.bankwallet.modules.receive.ReceiveModule
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import java.math.BigDecimal
Expand All @@ -34,7 +34,7 @@ class DepositAddressViewModel(
private val watchAccount = false

var uiState by mutableStateOf(
ReceiveAddressModule.UiState(
ReceiveModule.UiState(
viewState = viewState,
address = address,
usedAddresses = listOf(),
Expand Down Expand Up @@ -76,7 +76,7 @@ class DepositAddressViewModel(
}

private fun emitState() {
uiState = ReceiveAddressModule.UiState(
uiState = ReceiveModule.UiState(
viewState = viewState,
address = address,
usedAddresses = listOf(),
Expand All @@ -89,20 +89,20 @@ class DepositAddressViewModel(
)
}

private fun getAdditionalData(): List<ReceiveAddressModule.AdditionalData> {
val items = mutableListOf<ReceiveAddressModule.AdditionalData>()
private fun getAdditionalData(): List<ReceiveModule.AdditionalData> {
val items = mutableListOf<ReceiveModule.AdditionalData>()

memo?.let {
items.add(
ReceiveAddressModule.AdditionalData.Memo(
ReceiveModule.AdditionalData.Memo(
value = it
)
)
}

amount?.let {
items.add(
ReceiveAddressModule.AdditionalData.Amount(
ReceiveModule.AdditionalData.Amount(
value = it.toString()
)
)
Expand All @@ -111,13 +111,13 @@ class DepositAddressViewModel(
return items
}

private fun getAlertText(hasMemo: Boolean): ReceiveAddressModule.AlertText {
private fun getAlertText(hasMemo: Boolean): ReceiveModule.AlertText {
return when {
hasMemo -> ReceiveAddressModule.AlertText.Critical(
hasMemo -> ReceiveModule.AlertText.Critical(
Translator.getString(R.string.Balance_Receive_AddressMemoAlert)
)

else -> ReceiveAddressModule.AlertText.Normal(
else -> ReceiveModule.AlertText.Normal(
Translator.getString(R.string.Balance_Receive_AddressAlert)
)
}
Expand Down

This file was deleted.

Original file line number Diff line number Diff line change
@@ -1,75 +1,143 @@
package io.horizontalsystems.bankwallet.modules.depositcex

import android.content.Intent
import android.os.Parcelable
import androidx.compose.runtime.Composable
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.platform.LocalView
import androidx.compose.ui.res.stringResource
import androidx.lifecycle.viewmodel.compose.viewModel
import androidx.navigation.NavController
import androidx.navigation.compose.NavHost
import androidx.navigation.compose.rememberNavController
import androidx.navigation.navigation
import io.horizontalsystems.bankwallet.R
import io.horizontalsystems.bankwallet.core.BaseComposeFragment
import io.horizontalsystems.bankwallet.core.composablePage
import io.horizontalsystems.bankwallet.core.getInput
import io.horizontalsystems.bankwallet.core.providers.CexAsset
import io.horizontalsystems.bankwallet.core.providers.CexDepositNetwork
import io.horizontalsystems.bankwallet.core.slideFromRight
import io.horizontalsystems.bankwallet.modules.receive.address.ReceiveAddressScreen
import io.horizontalsystems.core.helpers.HudHelper
import kotlinx.parcelize.Parcelize
import io.horizontalsystems.bankwallet.modules.depositcex.ReceiveRoutes.ASSET_SELECT_SCREEN
import io.horizontalsystems.bankwallet.modules.depositcex.ReceiveRoutes.DEPOSIT_SCREEN
import io.horizontalsystems.bankwallet.modules.depositcex.ReceiveRoutes.NETWORK_SELECT_SCREEN
import io.horizontalsystems.bankwallet.modules.depositcex.ReceiveRoutes.USED_ADDRESS_SCREEN
import io.horizontalsystems.bankwallet.modules.receive.CloseWithMessage
import io.horizontalsystems.bankwallet.modules.receive.navigateBack
import io.horizontalsystems.bankwallet.modules.receive.sharedViewModel
import io.horizontalsystems.bankwallet.modules.receive.ui.ReceiveAddressScreen
import io.horizontalsystems.bankwallet.modules.receive.ui.UsedAddressScreen
import io.horizontalsystems.bankwallet.modules.receive.ui.UsedAddressesParams

class DepositCexFragment : BaseComposeFragment() {

@Parcelize
data class Input(val cexAsset: CexAsset, val network: CexDepositNetwork? = null) : Parcelable

@Composable
override fun GetContent(navController: NavController) {
val input = navController.getInput<Input>()
val cexAsset = input?.cexAsset
val network = input?.network
val input = navController.getInput<CexAsset>()
CexDepositScreen(input, navController)
}
}

if (cexAsset != null) {
val networks = cexAsset.depositNetworks
if (networks.isEmpty() || network != null || networks.size == 1) {
val viewContent = LocalContext.current
object ReceiveRoutes {
const val DEPOSIT_SCREEN = "deposit_screen"
const val ASSET_SELECT_SCREEN = "asset_select_screen"
const val NETWORK_SELECT_SCREEN = "network_select_screen"
const val USED_ADDRESS_SCREEN = "used_address_screen"
}

val viewModel =
viewModel<DepositAddressViewModel>(factory = DepositAddressViewModel.Factory(cexAsset, network))
@Composable
fun CexDepositScreen(
asset: CexAsset?,
fragmentNavController: NavController
) {
val startDestination = if (asset == null) {
ASSET_SELECT_SCREEN
} else if (asset.depositNetworks.isEmpty() || asset.depositNetworks.size == 1) {
DEPOSIT_SCREEN
} else {
NETWORK_SELECT_SCREEN
}

val navController = rememberNavController()

NavHost(
navController = navController,
startDestination = "deposit_address"
) {
navigation(
startDestination = startDestination,
route = "deposit_address"
) {
composablePage(DEPOSIT_SCREEN) { entry ->
val viewModel = entry.sharedViewModel<CexDepositSharedViewModel>(navController)
val cexAsset = asset ?: viewModel.cexAsset
if (cexAsset == null) {
CloseWithMessage(fragmentNavController)
return@composablePage
}

val addressViewModel =
viewModel<DepositAddressViewModel>(factory = DepositAddressViewModel.Factory(cexAsset, viewModel.network))
val context = LocalContext.current

ReceiveAddressScreen(
title = stringResource(R.string.CexDeposit_Title, cexAsset.id),
coinName = cexAsset.name,
uiState = viewModel.uiState,
onErrorClick = { viewModel.onErrorClick() },
setAmount = { amount -> viewModel.setAmount(amount) },
navController = navController,
uiState = addressViewModel.uiState,
onErrorClick = { addressViewModel.onErrorClick() },
setAmount = { amount -> addressViewModel.setAmount(amount) },
onShareClick = { address ->
viewContent.startActivity(Intent().apply {
context.startActivity(Intent().apply {
action = Intent.ACTION_SEND
putExtra(Intent.EXTRA_TEXT, address)
type = "text/plain"
})
},
showUsedAddresses = { usedAddresses ->
viewModel.usedAddressesParams = UsedAddressesParams(cexAsset.name, usedAddresses)
navController.navigate(USED_ADDRESS_SCREEN)
},
onBackPress = navigateBack(fragmentNavController, navController),
closeModule = { fragmentNavController.popBackStack() },
)
} else {
val navigatedFromMain = navController.previousBackStackEntry?.destination?.id == R.id.mainFragment
val navigateBack: () -> Unit = { navController.popBackStack() }
}
composablePage(USED_ADDRESS_SCREEN) { entry ->
val viewModel = entry.sharedViewModel<CexDepositSharedViewModel>(navController)
val usedAddressesParams = viewModel.usedAddressesParams
if (usedAddressesParams == null) {
CloseWithMessage(fragmentNavController)
return@composablePage
}
UsedAddressScreen(usedAddressesParams) { navController.popBackStack() }
}
composablePage(ASSET_SELECT_SCREEN) { entry ->
val viewModel = entry.sharedViewModel<CexDepositSharedViewModel>(navController)
SelectCoinScreen(
onClose = navigateBack(fragmentNavController, navController),
itemIsSuspended = { !it.depositEnabled },
onSelectAsset = { cexAsset ->
viewModel.cexAsset = cexAsset
if (cexAsset.depositNetworks.isEmpty() || cexAsset.depositNetworks.size == 1) {
viewModel.network = cexAsset.depositNetworks.firstOrNull()
navController.navigate(DEPOSIT_SCREEN)
} else {
navController.navigate(NETWORK_SELECT_SCREEN)
}
},
withBalance = false
)
}
composablePage(NETWORK_SELECT_SCREEN) { entry ->
val viewModel = entry.sharedViewModel<CexDepositSharedViewModel>(navController)
val cexAsset = asset ?: viewModel.cexAsset
if (cexAsset == null) {
CloseWithMessage(fragmentNavController)
return@composablePage
}
SelectNetworkScreen(
networks = networks,
onNavigateBack = if (navigatedFromMain) null else navigateBack,
onClose = { navController.popBackStack(R.id.mainFragment, false) },
networks = cexAsset.depositNetworks,
onNavigateBack = navigateBack(fragmentNavController, navController),
onSelectNetwork = {
navController.slideFromRight(R.id.depositCexFragment, Input(cexAsset, it))
viewModel.network = it
navController.navigate(DEPOSIT_SCREEN)
}
)
}

} else {
val view = LocalView.current
HudHelper.showErrorMessage(view, stringResource(id = R.string.Error_ParameterNotSet))
navController.popBackStack()
}
}

}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,12 @@ package io.horizontalsystems.bankwallet.modules.depositcex

import androidx.compose.animation.Crossfade
import androidx.compose.animation.ExperimentalAnimationApi
import androidx.compose.foundation.layout.*
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size
import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.foundation.lazy.items
import androidx.compose.material.Divider
Expand All @@ -17,7 +22,14 @@ import io.horizontalsystems.bankwallet.R
import io.horizontalsystems.bankwallet.core.providers.CexAsset
import io.horizontalsystems.bankwallet.modules.coin.overview.ui.Loading
import io.horizontalsystems.bankwallet.ui.compose.ComposeAppTheme
import io.horizontalsystems.bankwallet.ui.compose.components.*
import io.horizontalsystems.bankwallet.ui.compose.components.Badge
import io.horizontalsystems.bankwallet.ui.compose.components.CoinImage
import io.horizontalsystems.bankwallet.ui.compose.components.HSpacer
import io.horizontalsystems.bankwallet.ui.compose.components.ListEmptyView
import io.horizontalsystems.bankwallet.ui.compose.components.RowUniversal
import io.horizontalsystems.bankwallet.ui.compose.components.SearchBar
import io.horizontalsystems.bankwallet.ui.compose.components.body_leah
import io.horizontalsystems.bankwallet.ui.compose.components.subhead2_grey

@OptIn(ExperimentalAnimationApi::class)
@Composable
Expand All @@ -44,7 +56,7 @@ fun SelectCoinScreen(
)
}
) {
Crossfade(targetState = uiState.loading) { loading ->
Crossfade(targetState = uiState.loading, label = "") { loading ->
Column(modifier = Modifier.padding(it)) {
if (loading) {
Loading()
Expand Down
Loading