Updated on 2026-08-14

This commit is contained in:
Tangem 2023-04-28 21:13:53 +08:00
parent cc7f567fee
commit de449519a3

View file

@ -19,9 +19,15 @@ import androidx.compose.material.FabPosition
import androidx.compose.material.Scaffold
import androidx.compose.material.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
import androidx.compose.ui.Alignment
import androidx.compose.ui.ExperimentalComposeUiApi
import androidx.compose.ui.Modifier
import androidx.compose.ui.layout.onSizeChanged
import androidx.compose.ui.platform.LocalDensity
import androidx.compose.ui.platform.LocalSoftwareKeyboardController
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.AnnotatedString
@ -29,9 +35,10 @@ import androidx.compose.ui.text.SpanStyle
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.ExperimentalUnitApi
import androidx.compose.ui.unit.Dp
import androidx.compose.ui.unit.TextUnit
import androidx.compose.ui.unit.TextUnitType
import androidx.compose.ui.unit.dp
import androidx.paging.PagingData
import androidx.paging.compose.LazyPagingItems
import androidx.paging.compose.collectAsLazyPagingItems
@ -44,27 +51,46 @@ import com.tangem.tap.features.tokens.impl.presentation.states.TokensListStateHo
import com.tangem.tap.features.tokens.impl.presentation.states.TokensListToolbarState
import com.tangem.wallet.R
import kotlinx.coroutines.flow.emptyFlow
import kotlinx.coroutines.flow.flow
import kotlinx.coroutines.flow.flowOf
/**
* Tokens list screen
*
* @param stateHolder state holder
*
[REDACTED_AUTHOR]
*/
@Composable
internal fun TokensListScreen(stateHolder: TokensListStateHolder) {
BackHandler(onBack = stateHolder.toolbarState.onBackButtonClick)
var floatingButtonHeight by remember { mutableStateOf(value = 0.dp) }
Scaffold(
topBar = { TokensListToolbar(state = stateHolder.toolbarState) },
floatingActionButton = {
if (stateHolder is TokensListStateHolder.ManageContent) {
SaveChangesButton(onClick = stateHolder.onSaveButtonClick)
val density = LocalDensity.current
val verticalPadding = TangemTheme.dimens.spacing32
SaveChangesButton(
onClick = stateHolder.onSaveButtonClick,
modifier = Modifier.onSizeChanged {
with(density) { floatingButtonHeight = it.height.toDp() + verticalPadding }
},
)
}
},
floatingActionButtonPosition = FabPosition.Center,
) { scaffoldPadding ->
val tokens = stateHolder.tokens.collectAsLazyPagingItems()
TokensListContent(stateHolder.isDifferentAddressesBlockVisible, tokens, scaffoldPadding)
TokensListContent(
isDifferentAddressesBlockVisible = stateHolder.isDifferentAddressesBlockVisible,
tokens = tokens,
scaffoldPadding = scaffoldPadding,
bottomMarginDp = floatingButtonHeight,
)
stateHolder.onTokensLoadStateChanged(tokens.loadState.refresh)
@ -96,6 +122,7 @@ private fun TokensListContent(
isDifferentAddressesBlockVisible: Boolean,
tokens: LazyPagingItems<TokenItemState>,
scaffoldPadding: PaddingValues,
bottomMarginDp: Dp,
) {
val state = rememberLazyListState()
@ -108,6 +135,7 @@ private fun TokensListContent(
.fillMaxSize()
.padding(scaffoldPadding),
state = state,
contentPadding = PaddingValues(bottom = bottomMarginDp),
) {
if (isDifferentAddressesBlockVisible) {
item { DifferentAddressesWarning() }
@ -119,7 +147,6 @@ private fun TokensListContent(
}
}
@OptIn(ExperimentalUnitApi::class)
@Composable
private fun DifferentAddressesWarning() {
Box(
@ -159,9 +186,9 @@ private fun DifferentAddressesWarning() {
}
@Composable
private fun SaveChangesButton(onClick: () -> Unit) {
private fun SaveChangesButton(onClick: () -> Unit, modifier: Modifier = Modifier) {
PrimaryButton(
modifier = Modifier
modifier = modifier
.imePadding()
.padding(horizontal = TangemTheme.dimens.spacing16)
.fillMaxWidth(),
@ -205,16 +232,11 @@ private fun Preview_TokensListScreen_Manage() {
),
isLoading = false,
isDifferentAddressesBlockVisible = true,
tokens = flow {
emit(
PagingData.from(
listOf(
TokenListPreviewData.createManageToken(),
TokenListPreviewData.createManageToken(),
),
),
)
},
tokens = flowOf(
PagingData.from(
listOf(TokenListPreviewData.createManageToken()),
),
),
onSaveButtonClick = {},
onTokensLoadStateChanged = {},
),
@ -235,16 +257,11 @@ private fun Preview_TokensListScreen_Read() {
),
isLoading = false,
isDifferentAddressesBlockVisible = false,
tokens = flow {
emit(
PagingData.from(
listOf(
TokenListPreviewData.createManageToken(),
TokenListPreviewData.createManageToken(),
),
),
)
},
tokens = flowOf(
PagingData.from(
listOf(TokenListPreviewData.createManageToken()),
),
),
onTokensLoadStateChanged = {},
),
)