Skip to content

Commit

Permalink
Refactor Receive Address module navigation
Browse files Browse the repository at this point in the history
  • Loading branch information
rafaelekol committed Dec 22, 2023
1 parent 9ad86c3 commit 11b2c08
Show file tree
Hide file tree
Showing 32 changed files with 679 additions and 670 deletions.
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

0 comments on commit 11b2c08

Please sign in to comment.