diff --git a/app/src/main/java/io/horizontalsystems/bankwallet/modules/balance/cex/BalanceForAccountCex.kt b/app/src/main/java/io/horizontalsystems/bankwallet/modules/balance/cex/BalanceForAccountCex.kt index 619e45d92a4..72fbb32eb12 100644 --- a/app/src/main/java/io/horizontalsystems/bankwallet/modules/balance/cex/BalanceForAccountCex.kt +++ b/app/src/main/java/io/horizontalsystems/bankwallet/modules/balance/cex/BalanceForAccountCex.kt @@ -1,16 +1,35 @@ package io.horizontalsystems.bankwallet.modules.balance.cex -import androidx.compose.animation.* +import androidx.compose.animation.AnimatedVisibility +import androidx.compose.animation.expandVertically +import androidx.compose.animation.fadeIn +import androidx.compose.animation.fadeOut +import androidx.compose.animation.shrinkVertically +import androidx.compose.foundation.ExperimentalFoundationApi import androidx.compose.foundation.background import androidx.compose.foundation.clickable import androidx.compose.foundation.interaction.MutableInteractionSource -import androidx.compose.foundation.layout.* +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.fillMaxHeight +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.layout.width +import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.foundation.lazy.LazyListState import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material.Divider import androidx.compose.material.Scaffold import androidx.compose.material.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.remember +import androidx.compose.runtime.saveable.rememberSaveable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip @@ -28,13 +47,25 @@ import io.horizontalsystems.bankwallet.modules.balance.BalanceModule import io.horizontalsystems.bankwallet.modules.balance.ui.BalanceSortingSelector import io.horizontalsystems.bankwallet.modules.balance.ui.BalanceTitleRow import io.horizontalsystems.bankwallet.modules.balance.ui.TotalBalanceRow -import io.horizontalsystems.bankwallet.modules.balance.ui.Wallets +import io.horizontalsystems.bankwallet.modules.balance.ui.wallets 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.* +import io.horizontalsystems.bankwallet.ui.compose.HSSwipeRefresh +import io.horizontalsystems.bankwallet.ui.compose.components.AppBar +import io.horizontalsystems.bankwallet.ui.compose.components.ButtonPrimaryCircle +import io.horizontalsystems.bankwallet.ui.compose.components.ButtonPrimaryDefault +import io.horizontalsystems.bankwallet.ui.compose.components.ButtonPrimaryYellow +import io.horizontalsystems.bankwallet.ui.compose.components.CellMultilineClear +import io.horizontalsystems.bankwallet.ui.compose.components.CoinImage +import io.horizontalsystems.bankwallet.ui.compose.components.HSpacer +import io.horizontalsystems.bankwallet.ui.compose.components.HeaderSorting +import io.horizontalsystems.bankwallet.ui.compose.components.RateColor +import io.horizontalsystems.bankwallet.ui.compose.components.RateText +import io.horizontalsystems.bankwallet.ui.compose.components.body_leah import io.horizontalsystems.core.helpers.HudHelper +@OptIn(ExperimentalFoundationApi::class) @Composable fun BalanceForAccountCex(navController: NavController, accountViewItem: AccountViewItem) { val viewModel = viewModel(factory = BalanceModule.FactoryCex()) @@ -57,60 +88,85 @@ fun BalanceForAccountCex(navController: NavController, accountViewItem: AccountV ) { paddingValues -> Column(Modifier.padding(paddingValues)) { - TotalBalanceRow( - totalState = totalState, - onClickTitle = { - viewModel.toggleBalanceVisibility() - HudHelper.vibrate(context) - }, - onClickSubtitle = { - viewModel.toggleTotalType() - HudHelper.vibrate(context) - } - ) - - Row( - modifier = Modifier - .fillMaxWidth() - .padding(start = 24.dp, top = 4.dp, end = 24.dp, bottom = 16.dp) + HSSwipeRefresh( + refreshing = uiState.isRefreshing, + onRefresh = viewModel::onRefresh ) { - ButtonPrimaryYellow( - modifier = Modifier.weight(1f), - title = stringResource(R.string.Balance_Withdraw), - onClick = { - navController.slideFromBottom(R.id.withdrawCexFragment) - }, - ) + LazyColumn( + modifier = Modifier.fillMaxSize(), + state = rememberSaveable( + accountViewItem.id, + uiState.sortType, + saver = LazyListState.Saver + ) { + LazyListState() + } + ) { + item { + TotalBalanceRow( + totalState = totalState, + onClickTitle = { + viewModel.toggleBalanceVisibility() + HudHelper.vibrate(context) + }, + onClickSubtitle = { + viewModel.toggleTotalType() + HudHelper.vibrate(context) + } + ) + } + + item { + Row( + modifier = Modifier + .fillMaxWidth() + .padding(start = 24.dp, top = 4.dp, end = 24.dp, bottom = 16.dp) + ) { + ButtonPrimaryYellow( + modifier = Modifier.weight(1f), + title = stringResource(R.string.Balance_Withdraw), + onClick = { + navController.slideFromBottom(R.id.withdrawCexFragment) + }, + ) - HSpacer(width = 8.dp) + HSpacer(width = 8.dp) - ButtonPrimaryDefault( - modifier = Modifier.weight(1f), - title = stringResource(R.string.Balance_Deposit), - onClick = { - navController.slideFromRight(R.id.depositCexFragmentChooseAsset) + ButtonPrimaryDefault( + modifier = Modifier.weight(1f), + title = stringResource(R.string.Balance_Deposit), + onClick = { + navController.slideFromRight(R.id.depositCexFragmentChooseAsset) + } + ) + } } - ) - } - HeaderSorting(borderTop = true) { - BalanceSortingSelector( - sortType = uiState.sortType, - sortTypes = viewModel.sortTypes, - onSelectSortType = viewModel::onSelectSortType - ) - } + item { + Divider( + thickness = 1.dp, + color = ComposeAppTheme.colors.steel10, + ) + } - Wallets( - items = uiState.viewItems, - key = { it.assetId }, - accountId = accountViewItem.id, - sortType = uiState.sortType, - refreshing = uiState.isRefreshing, - onRefresh = viewModel::onRefresh - ) { item -> - BalanceCardCex(navController, item) { - viewModel.onClickItem(item) + stickyHeader { + HeaderSorting { + BalanceSortingSelector( + sortType = uiState.sortType, + sortTypes = viewModel.sortTypes, + onSelectSortType = viewModel::onSelectSortType + ) + } + } + + wallets( + items = uiState.viewItems, + key = { it.assetId }, + ) { item -> + BalanceCardCex(navController, item) { + viewModel.onClickItem(item) + } + } } } } diff --git a/app/src/main/java/io/horizontalsystems/bankwallet/modules/balance/ui/BalanceItems.kt b/app/src/main/java/io/horizontalsystems/bankwallet/modules/balance/ui/BalanceItems.kt index 4ce739efb70..f0bf05341d2 100644 --- a/app/src/main/java/io/horizontalsystems/bankwallet/modules/balance/ui/BalanceItems.kt +++ b/app/src/main/java/io/horizontalsystems/bankwallet/modules/balance/ui/BalanceItems.kt @@ -1,6 +1,7 @@ package io.horizontalsystems.bankwallet.modules.balance.ui import androidx.annotation.DrawableRes +import androidx.compose.foundation.ExperimentalFoundationApi import androidx.compose.foundation.Image import androidx.compose.foundation.background import androidx.compose.foundation.border @@ -8,9 +9,11 @@ import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.* import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.LazyItemScope +import androidx.compose.foundation.lazy.LazyListScope import androidx.compose.foundation.lazy.LazyListState import androidx.compose.foundation.lazy.items import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material.Divider import androidx.compose.material.Icon import androidx.compose.material.Text import androidx.compose.runtime.* @@ -127,6 +130,7 @@ fun Note( } } +@OptIn(ExperimentalFoundationApi::class) @Composable fun BalanceItems( balanceViewItems: List, @@ -144,110 +148,132 @@ fun BalanceItems( } } - Column { - val context = LocalContext.current + val context = LocalContext.current + var revealedCardId by remember { mutableStateOf(null) } - TotalBalanceRow( - totalState = totalState, - onClickTitle = { - viewModel.toggleBalanceVisibility() - HudHelper.vibrate(context) - }, - onClickSubtitle = { - viewModel.toggleTotalType() - HudHelper.vibrate(context) - } - ) - - HeaderSorting(borderTop = true) { - BalanceSortingSelector( - sortType = viewModel.sortType, - sortTypes = viewModel.sortTypes + HSSwipeRefresh( + refreshing = uiState.isRefreshing, + onRefresh = viewModel::onRefresh + ) { + LazyColumn( + modifier = Modifier.fillMaxSize(), + state = rememberSaveable( + accountViewItem.id, + viewModel.sortType, + saver = LazyListState.Saver ) { - viewModel.sortType = it + LazyListState() } - - Spacer(modifier = Modifier.weight(1f)) - - if (accountViewItem.isWatchAccount) { - Image( - painter = painterResource(R.drawable.icon_binocule_24), - contentDescription = "binoculars icon" - ) - } else { - ButtonSecondaryCircle( - icon = R.drawable.ic_manage_2, - contentDescription = stringResource(R.string.ManageCoins_title), - onClick = { - navController.slideFromRight(R.id.manageWalletsFragment) + ) { + item { + TotalBalanceRow( + totalState = totalState, + onClickTitle = { + viewModel.toggleBalanceVisibility() + HudHelper.vibrate(context) + }, + onClickSubtitle = { + viewModel.toggleTotalType() + HudHelper.vibrate(context) } ) } - Spacer(modifier = Modifier.width(16.dp)) - } + item { + Divider( + thickness = 1.dp, + color = ComposeAppTheme.colors.steel10, + ) + } + + stickyHeader { + HeaderSorting { + BalanceSortingSelector( + sortType = viewModel.sortType, + sortTypes = viewModel.sortTypes + ) { + viewModel.sortType = it + } - when (uiState.headerNote) { - HeaderNote.None -> Unit - HeaderNote.NonStandardAccount -> { - NoteError( - modifier = Modifier.padding(start = 16.dp, end = 16.dp, top = 12.dp, bottom = 24.dp), - text = stringResource(R.string.AccountRecovery_MigrationRequired), - onClick = { - FaqManager.showFaqPage( - navController, - FaqManager.faqPathMigrationRequired + Spacer(modifier = Modifier.weight(1f)) + + if (accountViewItem.isWatchAccount) { + Image( + painter = painterResource(R.drawable.icon_binocule_24), + contentDescription = "binoculars icon" + ) + } else { + ButtonSecondaryCircle( + icon = R.drawable.ic_manage_2, + contentDescription = stringResource(R.string.ManageCoins_title), + onClick = { + navController.slideFromRight(R.id.manageWalletsFragment) + } ) } - ) + + Spacer(modifier = Modifier.width(16.dp)) + } } - HeaderNote.NonRecommendedAccount -> { - NoteWarning( - modifier = Modifier.padding(start = 16.dp, end = 16.dp, top = 12.dp, bottom = 24.dp), - text = stringResource(R.string.AccountRecovery_MigrationRecommended), - onClick = { - FaqManager.showFaqPage( - navController, - FaqManager.faqPathMigrationRecommended + + item { + when (uiState.headerNote) { + HeaderNote.None -> Unit + HeaderNote.NonStandardAccount -> { + NoteError( + modifier = Modifier.padding(start = 16.dp, end = 16.dp, top = 12.dp, bottom = 24.dp), + text = stringResource(R.string.AccountRecovery_MigrationRequired), + onClick = { + FaqManager.showFaqPage( + navController, + FaqManager.faqPathMigrationRequired + ) + } ) - }, - onClose = { - viewModel.onCloseHeaderNote(HeaderNote.NonRecommendedAccount) } - ) - } - } - var revealedCardId by remember { mutableStateOf(null) } - Wallets( - items = balanceViewItems, - key = { - it.wallet.hashCode() - }, - accountId = accountViewItem.id, - sortType = viewModel.sortType, - refreshing = uiState.isRefreshing, - onRefresh = { - viewModel.onRefresh() + HeaderNote.NonRecommendedAccount -> { + NoteWarning( + modifier = Modifier.padding(start = 16.dp, end = 16.dp, top = 12.dp, bottom = 24.dp), + text = stringResource(R.string.AccountRecovery_MigrationRecommended), + onClick = { + FaqManager.showFaqPage( + navController, + FaqManager.faqPathMigrationRecommended + ) + }, + onClose = { + viewModel.onCloseHeaderNote(HeaderNote.NonRecommendedAccount) + } + ) + } + } } - ) { item -> - if (item.isWatchAccount) { - BalanceCard(item, viewModel, navController) - } else { - BalanceCardSwipable( - viewItem = item, - viewModel = viewModel, - navController = navController, - revealed = revealedCardId == item.wallet.hashCode(), - onReveal = { walletHashCode -> - if (revealedCardId != walletHashCode) { - revealedCardId = walletHashCode + + wallets( + items = balanceViewItems, + key = { + it.wallet.hashCode() + } + ) { item -> + if (item.isWatchAccount) { + BalanceCard(item, viewModel, navController) + } else { + BalanceCardSwipable( + viewItem = item, + viewModel = viewModel, + navController = navController, + revealed = revealedCardId == item.wallet.hashCode(), + onReveal = { walletHashCode -> + if (revealedCardId != walletHashCode) { + revealedCardId = walletHashCode + } + }, + onConceal = { + revealedCardId = null } - }, - onConceal = { - revealedCardId = null - }, - ) + ) + } } } } @@ -312,34 +338,21 @@ fun TotalBalanceRow( } } -@Composable -fun Wallets( +fun LazyListScope.wallets( items: List, key: ((item: T) -> Any)? = null, - accountId: String, - sortType: BalanceSortType, - refreshing: Boolean, - onRefresh: () -> Unit, - itemContent: @Composable() (LazyItemScope.(item: T) -> Unit), + itemContent: @Composable (LazyItemScope.(item: T) -> Unit), ) { - HSSwipeRefresh( - refreshing = refreshing, - onRefresh = onRefresh - ) { - LazyColumn( - modifier = Modifier.fillMaxSize(), - state = rememberSaveable( - accountId, - sortType, - saver = LazyListState.Saver - ) { - LazyListState() - }, - contentPadding = PaddingValues(top = 8.dp, bottom = 18.dp), - verticalArrangement = Arrangement.spacedBy(8.dp) - ) { - items(items = items, key = key, itemContent = itemContent) + item { + VSpacer(height = 8.dp) + } + items(items = items, key = key, itemContent = { + Row(modifier = Modifier.padding(bottom = 8.dp)) { + itemContent(it) } + }) + item { + VSpacer(height = 10.dp) } }