From 3ff16909dfbbbced14f2ee7f83bb44ad0a20d31b Mon Sep 17 00:00:00 2001 From: Tangem Date: Thu, 4 Jul 2024 13:25:24 +0400 Subject: [PATCH 1/5] Updated on 2026-08-14 --- .../permission}/GiveTxPermisssionBottomSheet.kt | 4 ++-- .../permission}/state/GiveTxPermissionBottomSheetConfig.kt | 2 +- .../permission}/state/GiveTxPermissionState.kt | 2 +- .../java/com/tangem/feature/swap/analytics/SwapEvents.kt | 2 +- .../java/com/tangem/feature/swap/models/SwapStateHolder.kt | 2 +- .../main/java/com/tangem/feature/swap/models/UiActions.kt | 2 +- .../main/java/com/tangem/feature/swap/ui/StateBuilder.kt | 2 +- .../src/main/java/com/tangem/feature/swap/ui/SwapScreen.kt | 7 ++++--- .../java/com/tangem/feature/swap/ui/SwapScreenContent.kt | 2 +- .../tangem/feature/swap/viewmodels/SwapProcessDataState.kt | 2 +- .../com/tangem/feature/swap/viewmodels/SwapViewModel.kt | 2 +- 11 files changed, 15 insertions(+), 14 deletions(-) rename common/ui/src/main/java/com/tangem/common/ui/{bottomsheets => bottomsheet/permission}/GiveTxPermisssionBottomSheet.kt (99%) rename common/ui/src/main/java/com/tangem/common/ui/{bottomsheets => bottomsheet/permission}/state/GiveTxPermissionBottomSheetConfig.kt (80%) rename common/ui/src/main/java/com/tangem/common/ui/{bottomsheets => bottomsheet/permission}/state/GiveTxPermissionState.kt (95%) diff --git a/common/ui/src/main/java/com/tangem/common/ui/bottomsheets/GiveTxPermisssionBottomSheet.kt b/common/ui/src/main/java/com/tangem/common/ui/bottomsheet/permission/GiveTxPermisssionBottomSheet.kt similarity index 99% rename from common/ui/src/main/java/com/tangem/common/ui/bottomsheets/GiveTxPermisssionBottomSheet.kt rename to common/ui/src/main/java/com/tangem/common/ui/bottomsheet/permission/GiveTxPermisssionBottomSheet.kt index e0d8b57dd7..9ced912bdf 100644 --- a/common/ui/src/main/java/com/tangem/common/ui/bottomsheets/GiveTxPermisssionBottomSheet.kt +++ b/common/ui/src/main/java/com/tangem/common/ui/bottomsheet/permission/GiveTxPermisssionBottomSheet.kt @@ -1,4 +1,4 @@ -package com.tangem.common.ui.bottomsheets +package com.tangem.common.ui.bottomsheet.permission import android.content.res.Configuration import androidx.compose.foundation.background @@ -25,7 +25,7 @@ import androidx.compose.ui.unit.DpOffset import androidx.compose.ui.unit.IntSize import androidx.compose.ui.window.PopupProperties import com.tangem.common.ui.R -import com.tangem.common.ui.bottomsheets.state.* +import com.tangem.common.ui.bottomsheet.permission.state.* import com.tangem.core.ui.components.* import com.tangem.core.ui.components.appbar.AppBarWithAdditionalButtons import com.tangem.core.ui.components.appbar.models.AdditionalButton diff --git a/common/ui/src/main/java/com/tangem/common/ui/bottomsheets/state/GiveTxPermissionBottomSheetConfig.kt b/common/ui/src/main/java/com/tangem/common/ui/bottomsheet/permission/state/GiveTxPermissionBottomSheetConfig.kt similarity index 80% rename from common/ui/src/main/java/com/tangem/common/ui/bottomsheets/state/GiveTxPermissionBottomSheetConfig.kt rename to common/ui/src/main/java/com/tangem/common/ui/bottomsheet/permission/state/GiveTxPermissionBottomSheetConfig.kt index ad5b970ea9..08ffdcc086 100644 --- a/common/ui/src/main/java/com/tangem/common/ui/bottomsheets/state/GiveTxPermissionBottomSheetConfig.kt +++ b/common/ui/src/main/java/com/tangem/common/ui/bottomsheet/permission/state/GiveTxPermissionBottomSheetConfig.kt @@ -1,4 +1,4 @@ -package com.tangem.common.ui.bottomsheets.state +package com.tangem.common.ui.bottomsheet.permission.state import com.tangem.core.ui.components.bottomsheets.TangemBottomSheetConfigContent diff --git a/common/ui/src/main/java/com/tangem/common/ui/bottomsheets/state/GiveTxPermissionState.kt b/common/ui/src/main/java/com/tangem/common/ui/bottomsheet/permission/state/GiveTxPermissionState.kt similarity index 95% rename from common/ui/src/main/java/com/tangem/common/ui/bottomsheets/state/GiveTxPermissionState.kt rename to common/ui/src/main/java/com/tangem/common/ui/bottomsheet/permission/state/GiveTxPermissionState.kt index 5f8cc96667..dbdce22ba9 100644 --- a/common/ui/src/main/java/com/tangem/common/ui/bottomsheets/state/GiveTxPermissionState.kt +++ b/common/ui/src/main/java/com/tangem/common/ui/bottomsheet/permission/state/GiveTxPermissionState.kt @@ -1,4 +1,4 @@ -package com.tangem.common.ui.bottomsheets.state +package com.tangem.common.ui.bottomsheet.permission.state import com.tangem.core.ui.extensions.TextReference import kotlinx.collections.immutable.ImmutableList diff --git a/features/swap/presentation/src/main/java/com/tangem/feature/swap/analytics/SwapEvents.kt b/features/swap/presentation/src/main/java/com/tangem/feature/swap/analytics/SwapEvents.kt index fd4f8c9775..39df6ae13c 100644 --- a/features/swap/presentation/src/main/java/com/tangem/feature/swap/analytics/SwapEvents.kt +++ b/features/swap/presentation/src/main/java/com/tangem/feature/swap/analytics/SwapEvents.kt @@ -1,6 +1,6 @@ package com.tangem.feature.swap.analytics -import com.tangem.common.ui.bottomsheets.state.ApproveType +import com.tangem.common.ui.bottomsheet.permission.state.ApproveType import com.tangem.core.analytics.models.AnalyticsEvent import com.tangem.feature.swap.domain.models.domain.SwapProvider import com.tangem.feature.swap.domain.models.ui.FeeType diff --git a/features/swap/presentation/src/main/java/com/tangem/feature/swap/models/SwapStateHolder.kt b/features/swap/presentation/src/main/java/com/tangem/feature/swap/models/SwapStateHolder.kt index e3d7c3d5c8..f901691c85 100644 --- a/features/swap/presentation/src/main/java/com/tangem/feature/swap/models/SwapStateHolder.kt +++ b/features/swap/presentation/src/main/java/com/tangem/feature/swap/models/SwapStateHolder.kt @@ -3,7 +3,7 @@ package com.tangem.feature.swap.models import androidx.annotation.DrawableRes import androidx.annotation.StringRes import androidx.compose.ui.text.input.TextFieldValue -import com.tangem.common.ui.bottomsheets.state.GiveTxPermissionState +import com.tangem.common.ui.bottomsheet.permission.state.GiveTxPermissionState import com.tangem.core.ui.R import com.tangem.core.ui.components.bottomsheets.TangemBottomSheetConfig import com.tangem.core.ui.components.notifications.NotificationConfig diff --git a/features/swap/presentation/src/main/java/com/tangem/feature/swap/models/UiActions.kt b/features/swap/presentation/src/main/java/com/tangem/feature/swap/models/UiActions.kt index c0c890750e..c25fc38225 100644 --- a/features/swap/presentation/src/main/java/com/tangem/feature/swap/models/UiActions.kt +++ b/features/swap/presentation/src/main/java/com/tangem/feature/swap/models/UiActions.kt @@ -1,6 +1,6 @@ package com.tangem.feature.swap.models -import com.tangem.common.ui.bottomsheets.state.ApproveType +import com.tangem.common.ui.bottomsheet.permission.state.ApproveType import com.tangem.domain.tokens.model.CryptoCurrency import com.tangem.feature.swap.domain.models.SwapAmount import com.tangem.feature.swap.domain.models.ui.TxFee diff --git a/features/swap/presentation/src/main/java/com/tangem/feature/swap/ui/StateBuilder.kt b/features/swap/presentation/src/main/java/com/tangem/feature/swap/ui/StateBuilder.kt index 23a67bb6a5..427d112540 100644 --- a/features/swap/presentation/src/main/java/com/tangem/feature/swap/ui/StateBuilder.kt +++ b/features/swap/presentation/src/main/java/com/tangem/feature/swap/ui/StateBuilder.kt @@ -2,7 +2,7 @@ package com.tangem.feature.swap.ui import androidx.compose.ui.text.TextRange import androidx.compose.ui.text.input.TextFieldValue -import com.tangem.common.ui.bottomsheets.state.* +import com.tangem.common.ui.bottomsheet.permission.state.* import com.tangem.core.ui.components.bottomsheets.TangemBottomSheetConfig import com.tangem.core.ui.components.currency.icon.converter.CryptoCurrencyToIconStateConverter import com.tangem.core.ui.components.notifications.NotificationConfig diff --git a/features/swap/presentation/src/main/java/com/tangem/feature/swap/ui/SwapScreen.kt b/features/swap/presentation/src/main/java/com/tangem/feature/swap/ui/SwapScreen.kt index 9ae4b97bca..7379f7ad2a 100644 --- a/features/swap/presentation/src/main/java/com/tangem/feature/swap/ui/SwapScreen.kt +++ b/features/swap/presentation/src/main/java/com/tangem/feature/swap/ui/SwapScreen.kt @@ -1,13 +1,14 @@ package com.tangem.feature.swap.ui import androidx.activity.compose.BackHandler -import androidx.compose.foundation.layout.* +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.systemBarsPadding import androidx.compose.material3.Scaffold import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.res.stringResource -import com.tangem.common.ui.bottomsheets.GiveTxPermissionBottomSheet -import com.tangem.common.ui.bottomsheets.state.GiveTxPermissionBottomSheetConfig +import com.tangem.common.ui.bottomsheet.permission.GiveTxPermissionBottomSheet +import com.tangem.common.ui.bottomsheet.permission.state.GiveTxPermissionBottomSheetConfig import com.tangem.core.ui.components.appbar.AppBarWithBackButton import com.tangem.core.ui.res.TangemTheme import com.tangem.core.ui.utils.WindowInsetsZero diff --git a/features/swap/presentation/src/main/java/com/tangem/feature/swap/ui/SwapScreenContent.kt b/features/swap/presentation/src/main/java/com/tangem/feature/swap/ui/SwapScreenContent.kt index 582ba1f779..d58600cab3 100644 --- a/features/swap/presentation/src/main/java/com/tangem/feature/swap/ui/SwapScreenContent.kt +++ b/features/swap/presentation/src/main/java/com/tangem/feature/swap/ui/SwapScreenContent.kt @@ -23,7 +23,7 @@ import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.text.withStyle import androidx.compose.ui.tooling.preview.Preview import androidx.constraintlayout.compose.ConstraintLayout -import com.tangem.common.ui.bottomsheets.state.GiveTxPermissionState +import com.tangem.common.ui.bottomsheet.permission.state.GiveTxPermissionState import com.tangem.core.ui.components.* import com.tangem.core.ui.components.notifications.Notification import com.tangem.core.ui.components.notifications.NotificationConfig diff --git a/features/swap/presentation/src/main/java/com/tangem/feature/swap/viewmodels/SwapProcessDataState.kt b/features/swap/presentation/src/main/java/com/tangem/feature/swap/viewmodels/SwapProcessDataState.kt index 969fadc27a..8a505fb148 100644 --- a/features/swap/presentation/src/main/java/com/tangem/feature/swap/viewmodels/SwapProcessDataState.kt +++ b/features/swap/presentation/src/main/java/com/tangem/feature/swap/viewmodels/SwapProcessDataState.kt @@ -1,6 +1,6 @@ package com.tangem.feature.swap.viewmodels -import com.tangem.common.ui.bottomsheets.state.ApproveType +import com.tangem.common.ui.bottomsheet.permission.state.ApproveType import com.tangem.domain.tokens.model.CryptoCurrencyStatus import com.tangem.feature.swap.domain.models.domain.SwapDataModel import com.tangem.feature.swap.domain.models.domain.SwapProvider diff --git a/features/swap/presentation/src/main/java/com/tangem/feature/swap/viewmodels/SwapViewModel.kt b/features/swap/presentation/src/main/java/com/tangem/feature/swap/viewmodels/SwapViewModel.kt index 9e9a4eec98..0c7b32d114 100644 --- a/features/swap/presentation/src/main/java/com/tangem/feature/swap/viewmodels/SwapViewModel.kt +++ b/features/swap/presentation/src/main/java/com/tangem/feature/swap/viewmodels/SwapViewModel.kt @@ -9,7 +9,7 @@ import arrow.core.Either import arrow.core.getOrElse import com.tangem.common.routing.AppRoute import com.tangem.common.routing.bundle.unbundle -import com.tangem.common.ui.bottomsheets.state.ApproveType +import com.tangem.common.ui.bottomsheet.permission.state.ApproveType import com.tangem.core.analytics.api.AnalyticsEventHandler import com.tangem.core.analytics.models.AnalyticsParam import com.tangem.core.analytics.models.Basic From 97dc754f0f5f159468db92dcc5d66676d8d5e76c Mon Sep 17 00:00:00 2001 From: Tangem Date: Wed, 10 Jul 2024 17:17:29 +0400 Subject: [PATCH 2/5] Updated on 2026-08-14 --- .../core/ui/components/appbar/AppBar.kt | 55 --- .../appbar/AppBarWithAdditionalButtons.kt | 179 ---------- .../components/appbar/AppBarWithBackButton.kt | 53 +-- .../appbar/AppBarWithBackButtonAndIcon.kt | 44 +-- .../AppBarWithBackButtonAndIconContent.kt | 127 ------- .../ui/components/appbar/TangemTopAppBar.kt | 336 ++++++++++++++++++ .../ui/components/appbar/TopAppBarButton.kt | 26 ++ .../appbar/models/AdditionalButton.kt | 8 - .../appbar/models/TopAppBarButtonUM.kt | 19 + .../appbar/models/TopAppBarMedium.kt | 75 ---- 10 files changed, 409 insertions(+), 513 deletions(-) delete mode 100644 core/ui/src/main/java/com/tangem/core/ui/components/appbar/AppBar.kt delete mode 100644 core/ui/src/main/java/com/tangem/core/ui/components/appbar/AppBarWithAdditionalButtons.kt delete mode 100644 core/ui/src/main/java/com/tangem/core/ui/components/appbar/AppBarWithBackButtonAndIconContent.kt create mode 100644 core/ui/src/main/java/com/tangem/core/ui/components/appbar/TangemTopAppBar.kt create mode 100644 core/ui/src/main/java/com/tangem/core/ui/components/appbar/TopAppBarButton.kt delete mode 100644 core/ui/src/main/java/com/tangem/core/ui/components/appbar/models/AdditionalButton.kt create mode 100644 core/ui/src/main/java/com/tangem/core/ui/components/appbar/models/TopAppBarButtonUM.kt delete mode 100644 core/ui/src/main/java/com/tangem/core/ui/components/appbar/models/TopAppBarMedium.kt diff --git a/core/ui/src/main/java/com/tangem/core/ui/components/appbar/AppBar.kt b/core/ui/src/main/java/com/tangem/core/ui/components/appbar/AppBar.kt deleted file mode 100644 index 80afe74fd7..0000000000 --- a/core/ui/src/main/java/com/tangem/core/ui/components/appbar/AppBar.kt +++ /dev/null @@ -1,55 +0,0 @@ -package com.tangem.core.ui.components.appbar - -import android.content.res.Configuration -import androidx.compose.foundation.background -import androidx.compose.foundation.layout.Box -import androidx.compose.foundation.layout.fillMaxWidth -import androidx.compose.foundation.layout.padding -import androidx.compose.material3.Text -import androidx.compose.runtime.Composable -import androidx.compose.ui.Alignment -import androidx.compose.ui.Modifier -import androidx.compose.ui.tooling.preview.Preview -import com.tangem.core.ui.extensions.TextReference -import com.tangem.core.ui.extensions.resolveReference -import com.tangem.core.ui.extensions.stringReference -import com.tangem.core.ui.res.TangemTheme -import com.tangem.core.ui.res.TangemThemePreview - -/** - * App bar without buttons - * - * @param text title - * @param modifier modifier - * - * @see Figma component - */ -@Composable -fun AppBar(text: TextReference, modifier: Modifier = Modifier) { - Box(modifier = modifier.fillMaxWidth()) { - Text( - text = text.resolveReference(), - color = TangemTheme.colors.text.primary1, - maxLines = 1, - style = TangemTheme.typography.subtitle1, - modifier = Modifier - .align(Alignment.Center) - .padding(vertical = TangemTheme.dimens.spacing10), - ) - } -} - -// region Preview -@Preview(showBackground = true, widthDp = 360) -@Preview(showBackground = true, widthDp = 360, uiMode = Configuration.UI_MODE_NIGHT_YES) -@Composable -private fun AppBar_Preview() { - TangemThemePreview { - AppBar( - text = stringReference("Tangem"), - modifier = Modifier.background(TangemTheme.colors.background.primary), - ) - } -} -// endregion \ No newline at end of file diff --git a/core/ui/src/main/java/com/tangem/core/ui/components/appbar/AppBarWithAdditionalButtons.kt b/core/ui/src/main/java/com/tangem/core/ui/components/appbar/AppBarWithAdditionalButtons.kt deleted file mode 100644 index 07f48d4787..0000000000 --- a/core/ui/src/main/java/com/tangem/core/ui/components/appbar/AppBarWithAdditionalButtons.kt +++ /dev/null @@ -1,179 +0,0 @@ -package com.tangem.core.ui.components.appbar - -import android.content.res.Configuration -import androidx.compose.foundation.background -import androidx.compose.foundation.clickable -import androidx.compose.foundation.interaction.MutableInteractionSource -import androidx.compose.foundation.layout.Box -import androidx.compose.foundation.layout.fillMaxWidth -import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.layout.size -import androidx.compose.material3.Icon -import androidx.compose.material3.Text -import androidx.compose.runtime.Composable -import androidx.compose.runtime.remember -import androidx.compose.ui.Alignment -import androidx.compose.ui.Modifier -import androidx.compose.ui.graphics.Color -import androidx.compose.ui.res.painterResource -import androidx.compose.ui.semantics.Role -import androidx.compose.ui.tooling.preview.Preview -import com.tangem.core.ui.R -import com.tangem.core.ui.components.appbar.models.AdditionalButton -import com.tangem.core.ui.extensions.TextReference -import com.tangem.core.ui.extensions.resolveReference -import com.tangem.core.ui.res.TangemTheme -import com.tangem.core.ui.res.TangemThemePreview - -/** - * App bar with title and two additional buttons - * - * @param startButton button information attached to the left edge - * @param endButton button information attached to the right edge - * - * @see - * Figma Component - */ -@Composable -fun AppBarWithAdditionalButtons( - text: TextReference, - modifier: Modifier = Modifier, - startButton: AdditionalButton? = null, - endButton: AdditionalButton? = null, - textColor: Color = TangemTheme.colors.text.primary1, - iconColor: Color = TangemTheme.colors.icon.primary1, -) { - AppBarWithAdditionalButtons( - text = text.resolveReference(), - startButton = startButton, - endButton = endButton, - modifier = modifier, - textColor = textColor, - iconColor = iconColor, - ) -} - -/** - * App bar with title and two additional buttons - * - * @param startButton button information attached to the left edge - * @param endButton button information attached to the right edge - * - * @see - * Figma Component - */ -@Composable -fun AppBarWithAdditionalButtons( - text: String, - modifier: Modifier = Modifier, - startButton: AdditionalButton? = null, - endButton: AdditionalButton? = null, - textColor: Color = TangemTheme.colors.text.primary1, - iconColor: Color = TangemTheme.colors.icon.primary1, -) { - Box( - modifier = modifier - .fillMaxWidth() - .padding(all = TangemTheme.dimens.spacing16), - ) { - if (startButton != null) { - Icon( - painter = painterResource(id = startButton.iconRes), - contentDescription = null, - tint = iconColor, - modifier = Modifier - .size(TangemTheme.dimens.size24) - .align(Alignment.CenterStart) - .clickable( - onClick = startButton.onIconClicked, - role = Role.Button, - interactionSource = remember { MutableInteractionSource() }, - indication = androidx.compose.material.ripple.rememberRipple( - bounded = false, - radius = TangemTheme.dimens.size24 / 2, - ), - ), - ) - } - - Text( - text = text, - modifier = Modifier.align(Alignment.Center), - color = textColor, - maxLines = 1, - style = TangemTheme.typography.subtitle1, - ) - - if (endButton != null) { - Icon( - painter = painterResource(id = endButton.iconRes), - contentDescription = null, - tint = iconColor, - modifier = Modifier - .size(TangemTheme.dimens.size24) - .align(Alignment.CenterEnd) - .clickable( - onClick = endButton.onIconClicked, - role = Role.Button, - interactionSource = remember { MutableInteractionSource() }, - indication = androidx.compose.material.ripple.rememberRipple( - bounded = false, - radius = TangemTheme.dimens.size24 / 2, - ), - ), - ) - } - } -} - -@Preview(widthDp = 360, heightDp = 56, showBackground = true) -@Preview(widthDp = 360, heightDp = 56, showBackground = true, uiMode = Configuration.UI_MODE_NIGHT_YES) -@Composable -private fun Preview_AppBarWithAdditionalButtons() { - TangemThemePreview { - AppBarWithAdditionalButtons( - text = "Tangem", - startButton = AdditionalButton( - iconRes = R.drawable.ic_scan_24, - onIconClicked = {}, - ), - endButton = AdditionalButton( - iconRes = R.drawable.ic_more_vertical_24, - onIconClicked = {}, - ), - modifier = Modifier.background(TangemTheme.colors.background.secondary), - ) - } -} - -@Preview(widthDp = 360, heightDp = 56, showBackground = true) -@Preview(widthDp = 360, heightDp = 56, showBackground = true, uiMode = Configuration.UI_MODE_NIGHT_YES) -@Composable -private fun Preview_AppBarWithOnlyStartButtons() { - TangemThemePreview { - AppBarWithAdditionalButtons( - text = "Tangem", - startButton = AdditionalButton( - iconRes = R.drawable.ic_scan_24, - onIconClicked = {}, - ), - modifier = Modifier.background(TangemTheme.colors.background.secondary), - ) - } -} - -@Preview(widthDp = 360, heightDp = 56, showBackground = true) -@Preview(widthDp = 360, heightDp = 56, showBackground = true, uiMode = Configuration.UI_MODE_NIGHT_YES) -@Composable -private fun Preview_AppBarWithOnlyEndButtons() { - TangemThemePreview { - AppBarWithAdditionalButtons( - text = "Tangem", - endButton = AdditionalButton( - iconRes = R.drawable.ic_more_vertical_24, - onIconClicked = {}, - ), - modifier = Modifier.background(TangemTheme.colors.background.secondary), - ) - } -} \ No newline at end of file diff --git a/core/ui/src/main/java/com/tangem/core/ui/components/appbar/AppBarWithBackButton.kt b/core/ui/src/main/java/com/tangem/core/ui/components/appbar/AppBarWithBackButton.kt index 80d3014615..65304bcf57 100644 --- a/core/ui/src/main/java/com/tangem/core/ui/components/appbar/AppBarWithBackButton.kt +++ b/core/ui/src/main/java/com/tangem/core/ui/components/appbar/AppBarWithBackButton.kt @@ -2,22 +2,12 @@ package com.tangem.core.ui.components.appbar import android.content.res.Configuration import androidx.annotation.DrawableRes -import androidx.compose.foundation.background -import androidx.compose.foundation.clickable -import androidx.compose.foundation.interaction.MutableInteractionSource -import androidx.compose.foundation.layout.* -import androidx.compose.material.Icon -import androidx.compose.material.Text -import androidx.compose.material.ripple.rememberRipple import androidx.compose.runtime.Composable -import androidx.compose.runtime.remember -import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier -import androidx.compose.ui.res.painterResource import androidx.compose.ui.tooling.preview.Preview import com.tangem.core.ui.R +import com.tangem.core.ui.components.appbar.models.TopAppBarButtonUM import com.tangem.core.ui.res.TangemThemePreview -import com.tangem.core.ui.res.TangemTheme /** * App bar with back button and optional title @@ -37,37 +27,17 @@ fun AppBarWithBackButton( text: String? = null, @DrawableRes iconRes: Int? = null, ) { - Row( - modifier = modifier - .background(color = TangemTheme.colors.background.secondary) - .fillMaxWidth() - .padding(all = TangemTheme.dimens.spacing16), - horizontalArrangement = Arrangement.spacedBy(TangemTheme.dimens.spacing16), - verticalAlignment = Alignment.CenterVertically, - ) { - Icon( - painter = painterResource(iconRes ?: R.drawable.ic_back_24), - contentDescription = null, - modifier = Modifier - .size(size = TangemTheme.dimens.size24) - .clickable( - indication = rememberRipple(bounded = false), - interactionSource = remember { MutableInteractionSource() }, - onClick = onBackClick, - ), - tint = TangemTheme.colors.icon.primary1, - ) - if (!text.isNullOrBlank()) { - Text( - text = text, - color = TangemTheme.colors.text.primary1, - maxLines = 1, - style = TangemTheme.typography.subtitle1, - ) - } - } + TangemTopAppBar( + modifier = modifier, + title = text, + startButton = TopAppBarButtonUM( + iconRes = iconRes ?: R.drawable.ic_back_24, + onIconClicked = onBackClick, + ), + ) } +// region Preview @Preview(widthDp = 360, heightDp = 56, showBackground = true) @Preview(widthDp = 360, heightDp = 56, showBackground = true, uiMode = Configuration.UI_MODE_NIGHT_YES) @Composable @@ -75,4 +45,5 @@ private fun PreviewAppBarWithBackButton() { TangemThemePreview { AppBarWithBackButton(text = "Title", onBackClick = {}) } -} \ No newline at end of file +} +// endregion \ No newline at end of file diff --git a/core/ui/src/main/java/com/tangem/core/ui/components/appbar/AppBarWithBackButtonAndIcon.kt b/core/ui/src/main/java/com/tangem/core/ui/components/appbar/AppBarWithBackButtonAndIcon.kt index 0006bdad9d..aaa6fcf804 100644 --- a/core/ui/src/main/java/com/tangem/core/ui/components/appbar/AppBarWithBackButtonAndIcon.kt +++ b/core/ui/src/main/java/com/tangem/core/ui/components/appbar/AppBarWithBackButtonAndIcon.kt @@ -2,18 +2,14 @@ package com.tangem.core.ui.components.appbar import android.content.res.Configuration import androidx.annotation.DrawableRes -import androidx.compose.animation.* -import androidx.compose.foundation.clickable -import androidx.compose.foundation.layout.size -import androidx.compose.material.Icon import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color -import androidx.compose.ui.res.painterResource import androidx.compose.ui.tooling.preview.Preview import com.tangem.core.ui.R -import com.tangem.core.ui.res.TangemThemePreview +import com.tangem.core.ui.components.appbar.models.TopAppBarButtonUM import com.tangem.core.ui.res.TangemTheme +import com.tangem.core.ui.res.TangemThemePreview @Composable fun AppBarWithBackButtonAndIcon( @@ -26,30 +22,22 @@ fun AppBarWithBackButtonAndIcon( onIconClick: (() -> Unit)? = null, backgroundColor: Color = TangemTheme.colors.background.secondary, ) { - AppBarWithBackButtonAndIconContent( - onBackClick = onBackClick, + TangemTopAppBar( modifier = modifier, - text = text, + title = text, subtitle = subtitle, - backIconRes = backIconRes, - backgroundColor = backgroundColor, - iconContent = { - AnimatedContent( - targetState = iconRes, - transitionSpec = { (fadeIn() + scaleIn()).togetherWith(fadeOut() + scaleOut()) }, - label = "Toolbar icon change", - ) { - if (onIconClick != null && it != null) { - Icon( - painter = painterResource(it), - contentDescription = null, - modifier = Modifier - .size(size = TangemTheme.dimens.size24) - .clickable { onIconClick() }, - tint = TangemTheme.colors.icon.primary1, - ) - } - } + containerColor = backgroundColor, + startButton = TopAppBarButtonUM( + iconRes = backIconRes ?: R.drawable.ic_back_24, + onIconClicked = onBackClick, + ), + endButton = if (iconRes != null && onIconClick != null) { + TopAppBarButtonUM( + iconRes = iconRes, + onIconClicked = onIconClick, + ) + } else { + null }, ) } diff --git a/core/ui/src/main/java/com/tangem/core/ui/components/appbar/AppBarWithBackButtonAndIconContent.kt b/core/ui/src/main/java/com/tangem/core/ui/components/appbar/AppBarWithBackButtonAndIconContent.kt deleted file mode 100644 index fae3598a38..0000000000 --- a/core/ui/src/main/java/com/tangem/core/ui/components/appbar/AppBarWithBackButtonAndIconContent.kt +++ /dev/null @@ -1,127 +0,0 @@ -package com.tangem.core.ui.components.appbar - -import android.content.res.Configuration -import androidx.annotation.DrawableRes -import androidx.compose.animation.* -import androidx.compose.foundation.background -import androidx.compose.foundation.clickable -import androidx.compose.foundation.interaction.MutableInteractionSource -import androidx.compose.foundation.layout.* -import androidx.compose.material.Icon -import androidx.compose.material.Text -import androidx.compose.material.ripple.rememberRipple -import androidx.compose.runtime.Composable -import androidx.compose.runtime.remember -import androidx.compose.ui.Alignment -import androidx.compose.ui.Modifier -import androidx.compose.ui.graphics.Color -import androidx.compose.ui.res.painterResource -import androidx.compose.ui.tooling.preview.Preview -import com.tangem.core.ui.R -import com.tangem.core.ui.res.TangemThemePreview -import com.tangem.core.ui.res.TangemTheme - -/** - * App bar with back button and icon content for any possible number/style of icons - * - * @param onBackClick callback for back button - * @param modifier modifier - * @param text appbar title - * @param backIconRes icon for back button - * @param backgroundColor background color - * @param iconContent icon content - */ -@Composable -fun AppBarWithBackButtonAndIconContent( - onBackClick: () -> Unit, - modifier: Modifier = Modifier, - text: String? = null, - subtitle: String? = null, - @DrawableRes backIconRes: Int? = null, - backIconTint: Color = TangemTheme.colors.icon.primary1, - backgroundColor: Color = TangemTheme.colors.background.secondary, - iconContent: @Composable () -> Unit, -) { - Row( - modifier = modifier - .height(TangemTheme.dimens.size56) - .background(color = backgroundColor) - .fillMaxWidth() - .padding(horizontal = TangemTheme.dimens.spacing16), - horizontalArrangement = Arrangement.spacedBy(TangemTheme.dimens.spacing16), - verticalAlignment = Alignment.CenterVertically, - ) { - Icon( - painter = painterResource(backIconRes ?: R.drawable.ic_back_24), - contentDescription = null, - modifier = Modifier - .padding(vertical = TangemTheme.dimens.spacing16) - .size(size = TangemTheme.dimens.size24) - .clickable( - interactionSource = remember { MutableInteractionSource() }, - indication = rememberRipple(bounded = false), - ) { onBackClick() }, - tint = backIconTint, - ) - Column( - verticalArrangement = Arrangement.Center, - modifier = Modifier.weight(1f) - .animateContentSize(), - ) { - AnimatedVisibility( - visible = !text.isNullOrBlank(), - enter = fadeIn(), - exit = fadeOut(), - label = "Toolbar title change", - ) { - Text( - text = text.orEmpty(), - color = TangemTheme.colors.text.primary1, - maxLines = 1, - style = TangemTheme.typography.subtitle1, - ) - } - AnimatedVisibility( - visible = !subtitle.isNullOrBlank(), - enter = fadeIn().plus(expandVertically()), - exit = fadeOut().plus(shrinkVertically()), - label = "Toolbar subtitle change", - ) { - Text( - text = subtitle.orEmpty(), - color = TangemTheme.colors.text.secondary, - maxLines = 1, - style = TangemTheme.typography.caption2, - ) - } - } - iconContent() - } -} - -@Preview(widthDp = 360, heightDp = 56, showBackground = true) -@Preview(widthDp = 360, heightDp = 56, showBackground = true, uiMode = Configuration.UI_MODE_NIGHT_YES) -@Composable -private fun PreviewAppBarWithBackButtonAndIcon() { - TangemThemePreview { - AppBarWithBackButtonAndIconContent( - text = "Title", - subtitle = "Subtitle", - onBackClick = {}, - iconContent = { - Row { - Icon( - painter = painterResource(id = R.drawable.ic_qrcode_scan_24), - tint = TangemTheme.colors.icon.primary1, - contentDescription = null, - ) - Icon( - painter = painterResource(id = R.drawable.ic_flash_on_24), - tint = TangemTheme.colors.icon.primary1, - contentDescription = null, - ) - } - }, - ) - } -} \ No newline at end of file diff --git a/core/ui/src/main/java/com/tangem/core/ui/components/appbar/TangemTopAppBar.kt b/core/ui/src/main/java/com/tangem/core/ui/components/appbar/TangemTopAppBar.kt new file mode 100644 index 0000000000..716d79978f --- /dev/null +++ b/core/ui/src/main/java/com/tangem/core/ui/components/appbar/TangemTopAppBar.kt @@ -0,0 +1,336 @@ +package com.tangem.core.ui.components.appbar + +import android.content.res.Configuration +import androidx.compose.animation.* +import androidx.compose.foundation.background +import androidx.compose.foundation.layout.* +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.ReadOnlyComposable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.text.style.TextOverflow +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.tooling.preview.PreviewParameter +import androidx.compose.ui.tooling.preview.PreviewParameterProvider +import com.tangem.core.ui.R +import com.tangem.core.ui.components.appbar.models.TopAppBarButtonUM +import com.tangem.core.ui.extensions.TextReference +import com.tangem.core.ui.extensions.resolveReference +import com.tangem.core.ui.res.TangemTheme +import com.tangem.core.ui.res.TangemThemePreview + +/** + * [TangemTopAppBar] height options. + * */ +enum class TangemTopAppBarHeight { + BOTTOM_SHEET, DEFAULT, +} + +/** + * Top app bar with two optional buttons: [startButton] and [endButton]. + * + * @see + * Figma Component + */ +@Composable +fun TangemTopAppBar( + modifier: Modifier = Modifier, + startButton: TopAppBarButtonUM? = null, + endButton: TopAppBarButtonUM? = null, + textColor: Color = TangemTheme.colors.text.primary1, + iconTint: Color = TangemTheme.colors.icon.primary1, + containerColor: Color = Color.Transparent, + height: TangemTopAppBarHeight = TangemTopAppBarHeight.DEFAULT, +) { + TangemTopAppBar( + modifier = modifier, + title = null, + startButton = startButton, + endButton = endButton, + textColor = textColor, + iconTint = iconTint, + containerColor = containerColor, + height = height, + ) +} + +/** + * Top app bar with [title], optional [subtitle] and two optional buttons: [startButton] and [endButton]. + * + * Where [title] and [subtitle] are [TextReference]. + * + * @see + * Figma Component + */ +@Composable +fun TangemTopAppBar( + title: TextReference, + modifier: Modifier = Modifier, + subtitle: TextReference? = null, + startButton: TopAppBarButtonUM? = null, + endButton: TopAppBarButtonUM? = null, + textColor: Color = TangemTheme.colors.text.primary1, + iconTint: Color = TangemTheme.colors.icon.primary1, + titleAlignment: Alignment.Horizontal = Alignment.Start, + containerColor: Color = Color.Transparent, + height: TangemTopAppBarHeight = TangemTopAppBarHeight.DEFAULT, +) { + TangemTopAppBar( + modifier = modifier, + title = title.resolveReference(), + subtitle = subtitle?.resolveReference(), + startButton = startButton, + endButton = endButton, + textColor = textColor, + iconTint = iconTint, + titleAlignment = titleAlignment, + containerColor = containerColor, + height = height, + ) +} + +/** + * Top app bar with [title], optional [subtitle] and two optional buttons: [startButton] and [endButton]. + * + * Where [title] and [subtitle] are [String]. + * + * @see + * Figma Component + */ +@Composable +fun TangemTopAppBar( + title: String?, + modifier: Modifier = Modifier, + subtitle: String? = null, + startButton: TopAppBarButtonUM? = null, + endButton: TopAppBarButtonUM? = null, + textColor: Color = TangemTheme.colors.text.primary1, + iconTint: Color = TangemTheme.colors.icon.primary1, + titleAlignment: Alignment.Horizontal = Alignment.Start, + containerColor: Color = Color.Transparent, + height: TangemTopAppBarHeight = TangemTopAppBarHeight.DEFAULT, +) { + TangemTopAppBar( + title = title, + modifier = modifier, + subtitle = subtitle, + startButton = startButton, + textColor = textColor, + iconTint = iconTint, + titleAlignment = titleAlignment, + containerColor = containerColor, + height = height, + endContent = { + if (endButton != null) { + TopAppBarButton( + button = endButton, + tint = iconTint, + ) + } + }, + ) +} + +/** + * Top app bar with [title], optional [subtitle], optional [startButton] and [endContent]. + * + * Where [title] and [subtitle] are [String] and [endContent] is a lambda that provides a [RowScope] to build + * the end content. + * + * @see + * Figma Component + */ +@Composable +fun TangemTopAppBar( + title: String?, + modifier: Modifier = Modifier, + subtitle: String? = null, + startButton: TopAppBarButtonUM? = null, + textColor: Color = TangemTheme.colors.text.primary1, + iconTint: Color = TangemTheme.colors.icon.primary1, + titleAlignment: Alignment.Horizontal = Alignment.Start, + containerColor: Color = Color.Transparent, + height: TangemTopAppBarHeight = TangemTopAppBarHeight.DEFAULT, + endContent: @Composable RowScope.() -> Unit, +) { + Row( + modifier = modifier + .background(color = containerColor) + .fillMaxWidth() + .heightIn(min = height.dp), + verticalAlignment = Alignment.CenterVertically, + ) { + Box( + modifier = Modifier + .padding(horizontal = TangemTheme.dimens.spacing12) + .size(TangemTheme.dimens.size32), + contentAlignment = Alignment.Center, + ) { + if (startButton != null) { + TopAppBarButton( + button = startButton, + tint = iconTint, + ) + } + } + + TopAppBarTitle( + modifier = Modifier.weight(1f), + title = title, + subtitle = subtitle, + textColor = textColor, + titleAlignment = titleAlignment, + ) + + Row( + modifier = Modifier + .padding(horizontal = TangemTheme.dimens.spacing12) + .widthIn(min = TangemTheme.dimens.size32) + .height(TangemTheme.dimens.size32), + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.spacedBy(TangemTheme.dimens.spacing12, Alignment.End), + content = endContent, + ) + } +} + +@Composable +private fun TopAppBarTitle( + title: String?, + subtitle: String?, + textColor: Color, + titleAlignment: Alignment.Horizontal, + modifier: Modifier = Modifier, +) { + Box(modifier = modifier) { + AnimatedVisibility( + modifier = Modifier.fillMaxWidth(), + visible = !title.isNullOrBlank(), + enter = fadeIn() + expandVertically(), + exit = fadeOut() + shrinkVertically(), + ) { + Column( + modifier = Modifier.fillMaxWidth(), + verticalArrangement = Arrangement.Center, + horizontalAlignment = titleAlignment, + ) { + Text( + text = title.orEmpty(), + style = TangemTheme.typography.subtitle1, + color = textColor, + maxLines = 1, + overflow = TextOverflow.Ellipsis, + ) + + AnimatedVisibility( + visible = !subtitle.isNullOrBlank(), + enter = fadeIn() + expandVertically(), + exit = fadeOut() + shrinkVertically(), + label = "Toolbar subtitle visibility", + ) { + Text( + text = subtitle.orEmpty(), + style = TangemTheme.typography.caption2, + color = TangemTheme.colors.text.secondary, + maxLines = 1, + overflow = TextOverflow.Ellipsis, + ) + } + } + } + } +} + +private val TangemTopAppBarHeight.dp + @Composable + @ReadOnlyComposable + get() = when (this) { + TangemTopAppBarHeight.BOTTOM_SHEET -> TangemTheme.dimens.size44 + TangemTopAppBarHeight.DEFAULT -> TangemTheme.dimens.size56 + } + +// region Preview +@Composable +@Preview(showBackground = true, widthDp = 360) +@Preview(showBackground = true, widthDp = 360, uiMode = Configuration.UI_MODE_NIGHT_YES) +private fun Preview_BasicTopAppBar( + @PreviewParameter(BasicTopAppBarPMPreviewProvider::class) params: BasicTopAppBarPM, +) { + TangemThemePreview { + TangemTopAppBar( + title = params.title, + subtitle = params.subtitle, + startButton = params.startButton, + endButton = params.endButton, + titleAlignment = params.titleAlignment, + containerColor = TangemTheme.colors.background.secondary, + height = params.height, + ) + } +} + +private data class BasicTopAppBarPM( + val title: String? = "Tangem", + val subtitle: String? = null, + val startButton: TopAppBarButtonUM? = null, + val endButton: TopAppBarButtonUM? = null, + val titleAlignment: Alignment.Horizontal = Alignment.CenterHorizontally, + val height: TangemTopAppBarHeight = TangemTopAppBarHeight.DEFAULT, +) + +private class BasicTopAppBarPMPreviewProvider : PreviewParameterProvider { + override val values: Sequence + get() = sequenceOf( + BasicTopAppBarPM( + subtitle = "Subtitle", + titleAlignment = Alignment.Start, + startButton = TopAppBarButtonUM.Back { }, + ), + BasicTopAppBarPM( + title = null, + startButton = TopAppBarButtonUM.Back { }, + ), + BasicTopAppBarPM( + height = TangemTopAppBarHeight.BOTTOM_SHEET, + ), + BasicTopAppBarPM( + startButton = TopAppBarButtonUM( + iconRes = R.drawable.ic_scan_24, + onIconClicked = {}, + ), + endButton = TopAppBarButtonUM( + iconRes = R.drawable.ic_more_vertical_24, + onIconClicked = {}, + ), + ), + BasicTopAppBarPM( + startButton = TopAppBarButtonUM( + iconRes = R.drawable.ic_scan_24, + onIconClicked = {}, + ), + ), + BasicTopAppBarPM( + endButton = TopAppBarButtonUM( + iconRes = R.drawable.ic_more_vertical_24, + onIconClicked = {}, + ), + height = TangemTopAppBarHeight.BOTTOM_SHEET, + ), + BasicTopAppBarPM( + title = "1234567891011121314151617181920", + subtitle = "12345678910111213141516171819202122232425", + titleAlignment = Alignment.Start, + startButton = TopAppBarButtonUM( + iconRes = R.drawable.ic_scan_24, + onIconClicked = {}, + ), + endButton = TopAppBarButtonUM( + iconRes = R.drawable.ic_more_vertical_24, + onIconClicked = {}, + ), + ), + ) +} +// endregion Preview \ No newline at end of file diff --git a/core/ui/src/main/java/com/tangem/core/ui/components/appbar/TopAppBarButton.kt b/core/ui/src/main/java/com/tangem/core/ui/components/appbar/TopAppBarButton.kt new file mode 100644 index 0000000000..160e0148da --- /dev/null +++ b/core/ui/src/main/java/com/tangem/core/ui/components/appbar/TopAppBarButton.kt @@ -0,0 +1,26 @@ +package com.tangem.core.ui.components.appbar + +import androidx.compose.foundation.layout.size +import androidx.compose.material3.Icon +import androidx.compose.material3.IconButton +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.res.painterResource +import com.tangem.core.ui.components.appbar.models.TopAppBarButtonUM +import com.tangem.core.ui.res.TangemTheme + +@Composable +fun TopAppBarButton(button: TopAppBarButtonUM, tint: Color, modifier: Modifier = Modifier) { + IconButton( + modifier = modifier.size(TangemTheme.dimens.size32), + onClick = button.onIconClicked, + ) { + Icon( + modifier = Modifier.size(TangemTheme.dimens.size24), + painter = painterResource(id = button.iconRes), + tint = tint, + contentDescription = null, + ) + } +} \ No newline at end of file diff --git a/core/ui/src/main/java/com/tangem/core/ui/components/appbar/models/AdditionalButton.kt b/core/ui/src/main/java/com/tangem/core/ui/components/appbar/models/AdditionalButton.kt deleted file mode 100644 index 2517f5ef41..0000000000 --- a/core/ui/src/main/java/com/tangem/core/ui/components/appbar/models/AdditionalButton.kt +++ /dev/null @@ -1,8 +0,0 @@ -package com.tangem.core.ui.components.appbar.models - -import androidx.annotation.DrawableRes - -data class AdditionalButton( - @DrawableRes val iconRes: Int, - val onIconClicked: () -> Unit, -) \ No newline at end of file diff --git a/core/ui/src/main/java/com/tangem/core/ui/components/appbar/models/TopAppBarButtonUM.kt b/core/ui/src/main/java/com/tangem/core/ui/components/appbar/models/TopAppBarButtonUM.kt new file mode 100644 index 0000000000..61e3f25d39 --- /dev/null +++ b/core/ui/src/main/java/com/tangem/core/ui/components/appbar/models/TopAppBarButtonUM.kt @@ -0,0 +1,19 @@ +package com.tangem.core.ui.components.appbar.models + +import androidx.annotation.DrawableRes +import com.tangem.core.ui.R + +data class TopAppBarButtonUM( + @DrawableRes val iconRes: Int, + val onIconClicked: () -> Unit, +) { + + @Suppress("FunctionName") + companion object { + + fun Back(onBackClicked: () -> Unit) = TopAppBarButtonUM( + iconRes = R.drawable.ic_back_24, + onIconClicked = onBackClicked, + ) + } +} \ No newline at end of file diff --git a/core/ui/src/main/java/com/tangem/core/ui/components/appbar/models/TopAppBarMedium.kt b/core/ui/src/main/java/com/tangem/core/ui/components/appbar/models/TopAppBarMedium.kt deleted file mode 100644 index d50a8f5c75..0000000000 --- a/core/ui/src/main/java/com/tangem/core/ui/components/appbar/models/TopAppBarMedium.kt +++ /dev/null @@ -1,75 +0,0 @@ -package com.tangem.core.ui.components.appbar.models - -import androidx.compose.foundation.layout.size -import androidx.compose.material3.* -import androidx.compose.runtime.* -import androidx.compose.ui.Modifier -import androidx.compose.ui.res.painterResource -import androidx.compose.ui.text.style.TextOverflow -import com.tangem.core.ui.R -import com.tangem.core.ui.extensions.TextReference -import com.tangem.core.ui.extensions.resolveReference -import com.tangem.core.ui.res.TangemTheme - -private const val COLLAPSED_APP_BAR_THRESHOLD = 0.4f - -@OptIn(ExperimentalMaterial3Api::class) -@Composable -fun TopAppBarMedium( - title: TextReference, - scrollBehavior: TopAppBarScrollBehavior, - onBackClick: () -> Unit, - modifier: Modifier = Modifier, - navigationIconResId: Int = R.drawable.ic_back_24, - colors: TopAppBarColors = TangemTopAppBarColors, -) { - MediumTopAppBar( - modifier = modifier, - scrollBehavior = scrollBehavior, - colors = colors, - title = { - val collapsedStyle = TangemTheme.typography.subtitle1 - val expandedStyle = TangemTheme.typography.h1 - val style by remember(scrollBehavior.state.collapsedFraction) { - derivedStateOf { - if (scrollBehavior.state.collapsedFraction >= COLLAPSED_APP_BAR_THRESHOLD) { - collapsedStyle - } else { - expandedStyle - } - } - } - - Text( - text = title.resolveReference(), - style = style, - maxLines = 1, - overflow = TextOverflow.Ellipsis, - ) - }, - navigationIcon = { - IconButton( - modifier = Modifier.size(TangemTheme.dimens.size32), - onClick = onBackClick, - ) { - Icon( - modifier = Modifier.size(TangemTheme.dimens.size24), - painter = painterResource(id = navigationIconResId), - contentDescription = null, - ) - } - }, - ) -} - -@OptIn(ExperimentalMaterial3Api::class) -internal val TangemTopAppBarColors: TopAppBarColors - @Composable - @ReadOnlyComposable - get() = TopAppBarColors( - containerColor = TangemTheme.colors.background.secondary, - scrolledContainerColor = TangemTheme.colors.background.secondary, - navigationIconContentColor = TangemTheme.colors.icon.primary1, - titleContentColor = TangemTheme.colors.text.primary1, - actionIconContentColor = TangemTheme.colors.icon.primary1, - ) \ No newline at end of file From b3fe4cbe05b008a4b509df9ec3bb1439a56ba221 Mon Sep 17 00:00:00 2001 From: Tangem Date: Wed, 10 Jul 2024 17:19:17 +0400 Subject: [PATCH 3/5] Updated on 2026-08-14 --- .../features/details/ui/DetailsScreen.kt | 32 +++++--- .../disclaimer/impl/ui/DisclaimerScreen.kt | 12 +-- .../presentation/QrScanningContent.kt | 76 ++++++++----------- .../walletsettings/ui/WalletSettingsScreen.kt | 36 +++++---- 4 files changed, 81 insertions(+), 75 deletions(-) diff --git a/features/details/impl/src/main/kotlin/com/tangem/features/details/ui/DetailsScreen.kt b/features/details/impl/src/main/kotlin/com/tangem/features/details/ui/DetailsScreen.kt index c1db3e35bd..9132fff08b 100644 --- a/features/details/impl/src/main/kotlin/com/tangem/features/details/ui/DetailsScreen.kt +++ b/features/details/impl/src/main/kotlin/com/tangem/features/details/ui/DetailsScreen.kt @@ -9,18 +9,21 @@ import androidx.compose.foundation.layout.* import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.items import androidx.compose.foundation.rememberScrollState -import androidx.compose.material3.* +import androidx.compose.material3.Icon +import androidx.compose.material3.IconButton +import androidx.compose.material3.Scaffold +import androidx.compose.material3.Text import androidx.compose.runtime.* import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier -import androidx.compose.ui.input.nestedscroll.nestedScroll import androidx.compose.ui.res.painterResource +import androidx.compose.ui.res.stringResource import androidx.compose.ui.tooling.preview.Preview -import com.tangem.core.ui.components.appbar.models.TopAppBarMedium +import com.tangem.core.ui.components.appbar.TangemTopAppBar +import com.tangem.core.ui.components.appbar.models.TopAppBarButtonUM import com.tangem.core.ui.components.block.BlockItem import com.tangem.core.ui.components.snackbar.TangemSnackbarHost import com.tangem.core.ui.decompose.ComposableContentComponent -import com.tangem.core.ui.extensions.resourceReference import com.tangem.core.ui.res.LocalSnackbarHostState import com.tangem.core.ui.res.TangemTheme import com.tangem.core.ui.res.TangemThemePreview @@ -30,7 +33,6 @@ import com.tangem.features.details.entity.DetailsItemUM import com.tangem.features.details.entity.DetailsUM import com.tangem.features.details.impl.R -@OptIn(ExperimentalMaterial3Api::class) @Composable internal fun DetailsScreen( state: DetailsUM, @@ -38,12 +40,11 @@ internal fun DetailsScreen( modifier: Modifier = Modifier, ) { val backgroundColor = TangemTheme.colors.background.secondary - val scrollBehavior = TopAppBarDefaults.exitUntilCollapsedScrollBehavior() BackHandler(onBack = state.popBack) Scaffold( - modifier = modifier.nestedScroll(scrollBehavior.nestedScrollConnection), + modifier = modifier, containerColor = backgroundColor, snackbarHost = { TangemSnackbarHost( @@ -52,10 +53,9 @@ internal fun DetailsScreen( ) }, topBar = { - TopAppBarMedium( - title = resourceReference(R.string.details_title), - scrollBehavior = scrollBehavior, - onBackClick = state.popBack, + TangemTopAppBar( + modifier = Modifier.statusBarsPadding(), + startButton = TopAppBarButtonUM.Back(state.popBack), ) }, ) { paddingValues -> @@ -77,10 +77,18 @@ private fun Content( modifier = modifier, verticalArrangement = Arrangement.spacedBy(TangemTheme.dimens.spacing16), contentPadding = PaddingValues( - top = TangemTheme.dimens.spacing16, + top = TangemTheme.dimens.spacing12, bottom = TangemTheme.dimens.spacing16, ), ) { + item { + Text( + modifier = Modifier.padding(horizontal = TangemTheme.dimens.spacing16), + text = stringResource(R.string.details_title), + style = TangemTheme.typography.h1, + color = TangemTheme.colors.text.primary1, + ) + } items( items = state.items, key = DetailsItemUM::id, diff --git a/features/disclaimer/impl/src/main/java/com/tangem/features/disclaimer/impl/ui/DisclaimerScreen.kt b/features/disclaimer/impl/src/main/java/com/tangem/features/disclaimer/impl/ui/DisclaimerScreen.kt index 7567197f2d..fddb1a255b 100644 --- a/features/disclaimer/impl/src/main/java/com/tangem/features/disclaimer/impl/ui/DisclaimerScreen.kt +++ b/features/disclaimer/impl/src/main/java/com/tangem/features/disclaimer/impl/ui/DisclaimerScreen.kt @@ -25,8 +25,8 @@ import com.google.accompanist.permissions.rememberPermissionState import com.tangem.core.ui.components.BottomFade import com.tangem.core.ui.components.NavigationBar3ButtonsScrim import com.tangem.core.ui.components.PrimaryButton -import com.tangem.core.ui.components.appbar.AppBarWithAdditionalButtons -import com.tangem.core.ui.components.appbar.models.AdditionalButton +import com.tangem.core.ui.components.appbar.TangemTopAppBar +import com.tangem.core.ui.components.appbar.models.TopAppBarButtonUM import com.tangem.core.ui.components.buttons.common.TangemButtonColors import com.tangem.core.ui.extensions.resourceReference import com.tangem.core.ui.res.TangemColorPalette @@ -57,14 +57,14 @@ internal fun DisclaimerScreen(state: DisclaimerUM) { .statusBarsPadding(), ) { Column(modifier = Modifier.padding(bottom = bottomPadding)) { - AppBarWithAdditionalButtons( - text = resourceReference(R.string.disclaimer_title), - startButton = AdditionalButton( + TangemTopAppBar( + title = resourceReference(R.string.disclaimer_title), + startButton = TopAppBarButtonUM( iconRes = R.drawable.ic_back_24, onIconClicked = state.popBack, ).takeIf { state.isTosAccepted }, textColor = textColor, - iconColor = iconColor, + iconTint = iconColor, ) DisclaimerContent(state.url, state.isTosAccepted) } diff --git a/features/qr-scanning/impl/src/main/java/com/tangem/feature/qrscanning/presentation/QrScanningContent.kt b/features/qr-scanning/impl/src/main/java/com/tangem/feature/qrscanning/presentation/QrScanningContent.kt index 6dc9d3592b..019b7b6134 100644 --- a/features/qr-scanning/impl/src/main/java/com/tangem/feature/qrscanning/presentation/QrScanningContent.kt +++ b/features/qr-scanning/impl/src/main/java/com/tangem/feature/qrscanning/presentation/QrScanningContent.kt @@ -6,11 +6,9 @@ import androidx.compose.animation.fadeIn import androidx.compose.animation.fadeOut import androidx.compose.animation.togetherWith import androidx.compose.foundation.Canvas -import androidx.compose.foundation.clickable -import androidx.compose.foundation.interaction.MutableInteractionSource -import androidx.compose.foundation.layout.* -import androidx.compose.material.ripple.rememberRipple -import androidx.compose.material3.Icon +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.statusBarsPadding import androidx.compose.runtime.* import androidx.compose.ui.Modifier import androidx.compose.ui.geometry.Offset @@ -20,12 +18,13 @@ import androidx.compose.ui.graphics.PathEffect import androidx.compose.ui.graphics.StrokeJoin import androidx.compose.ui.graphics.drawscope.Stroke import androidx.compose.ui.platform.LocalDensity -import androidx.compose.ui.res.painterResource import androidx.compose.ui.text.drawText import androidx.compose.ui.text.rememberTextMeasurer import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.unit.Constraints -import com.tangem.core.ui.components.appbar.AppBarWithBackButtonAndIconContent +import com.tangem.core.ui.components.appbar.TangemTopAppBar +import com.tangem.core.ui.components.appbar.TopAppBarButton +import com.tangem.core.ui.components.appbar.models.TopAppBarButtonUM import com.tangem.core.ui.extensions.TextReference import com.tangem.core.ui.extensions.resolveReference import com.tangem.core.ui.res.TangemColorPalette @@ -59,46 +58,37 @@ internal fun QrScanningContent( Overlay( message = uiState.message, ) - AppBarWithBackButtonAndIconContent( - onBackClick = uiState.onBackClick, + + TangemTopAppBar( modifier = Modifier.statusBarsPadding(), - backgroundColor = Color.Transparent, - backIconTint = TangemColorPalette.White, - iconContent = { - Row { - AnimatedContent( - targetState = isFlash, - transitionSpec = { fadeIn().togetherWith(fadeOut()) }, - label = "Flash Change", - ) { - val flashIconRes = if (it) R.drawable.ic_flash_on_24 else R.drawable.ic_flash_off_24 - Icon( - painter = painterResource(flashIconRes), - contentDescription = null, - modifier = Modifier - .padding(end = TangemTheme.dimens.spacing20) - .size(size = TangemTheme.dimens.size24) - .clickable( - interactionSource = remember { MutableInteractionSource() }, - indication = rememberRipple(bounded = false), - onClick = { isFlash = !isFlash }, - ), - tint = TangemColorPalette.White, - ) - } - Icon( - painter = painterResource(R.drawable.ic_gallery_24), - contentDescription = null, - modifier = Modifier - .size(size = TangemTheme.dimens.size24) - .clickable( - interactionSource = remember { MutableInteractionSource() }, - indication = rememberRipple(bounded = false), - onClick = uiState.onGalleryClick, - ), + title = null, + startButton = TopAppBarButtonUM.Back(uiState.onBackClick), + iconTint = TangemColorPalette.White, + containerColor = Color.Transparent, + endContent = { + AnimatedContent( + targetState = isFlash, + transitionSpec = { fadeIn().togetherWith(fadeOut()) }, + label = "Flash Change", + ) { + TopAppBarButton( + button = TopAppBarButtonUM( + iconRes = if (it) R.drawable.ic_flash_on_24 else R.drawable.ic_flash_off_24, + onIconClicked = { + isFlash = !isFlash + }, + ), tint = TangemColorPalette.White, ) } + + TopAppBarButton( + button = TopAppBarButtonUM( + iconRes = R.drawable.ic_gallery_24, + onIconClicked = uiState.onGalleryClick, + ), + tint = TangemColorPalette.White, + ) }, ) if (uiState.bottomSheetConfig != null) { diff --git a/features/wallet-settings/impl/src/main/kotlin/com/tangem/feature/walletsettings/ui/WalletSettingsScreen.kt b/features/wallet-settings/impl/src/main/kotlin/com/tangem/feature/walletsettings/ui/WalletSettingsScreen.kt index 9dcfd53ddb..29223948a2 100644 --- a/features/wallet-settings/impl/src/main/kotlin/com/tangem/feature/walletsettings/ui/WalletSettingsScreen.kt +++ b/features/wallet-settings/impl/src/main/kotlin/com/tangem/feature/walletsettings/ui/WalletSettingsScreen.kt @@ -6,22 +6,20 @@ import androidx.compose.foundation.background import androidx.compose.foundation.layout.* import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.items -import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.Scaffold import androidx.compose.material3.Text -import androidx.compose.material3.TopAppBarDefaults import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier -import androidx.compose.ui.input.nestedscroll.nestedScroll +import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.tooling.preview.Preview -import com.tangem.core.ui.components.appbar.models.TopAppBarMedium +import com.tangem.core.ui.components.appbar.TangemTopAppBar +import com.tangem.core.ui.components.appbar.models.TopAppBarButtonUM import com.tangem.core.ui.components.block.BlockCard import com.tangem.core.ui.components.block.BlockItem import com.tangem.core.ui.components.snackbar.TangemSnackbarHost import com.tangem.core.ui.extensions.resolveReference -import com.tangem.core.ui.extensions.resourceReference import com.tangem.core.ui.res.LocalSnackbarHostState import com.tangem.core.ui.res.TangemTheme import com.tangem.core.ui.res.TangemThemePreview @@ -30,7 +28,6 @@ import com.tangem.feature.walletsettings.entity.WalletSettingsItemUM import com.tangem.feature.walletsettings.entity.WalletSettingsUM import com.tangem.feature.walletsettings.impl.R -@OptIn(ExperimentalMaterial3Api::class) @Composable internal fun WalletSettingsScreen( state: WalletSettingsUM, @@ -38,12 +35,11 @@ internal fun WalletSettingsScreen( modifier: Modifier = Modifier, ) { val backgroundColor = TangemTheme.colors.background.secondary - val scrollBehavior = TopAppBarDefaults.exitUntilCollapsedScrollBehavior() BackHandler(onBack = state.popBack) Scaffold( - modifier = modifier.nestedScroll(scrollBehavior.nestedScrollConnection), + modifier = modifier, containerColor = backgroundColor, snackbarHost = { TangemSnackbarHost( @@ -52,10 +48,9 @@ internal fun WalletSettingsScreen( ) }, topBar = { - TopAppBarMedium( - title = resourceReference(R.string.wallet_settings_title), - scrollBehavior = scrollBehavior, - onBackClick = state.popBack, + TangemTopAppBar( + modifier = Modifier.statusBarsPadding(), + startButton = TopAppBarButtonUM.Back(state.popBack), ) }, content = { paddingValues -> @@ -79,11 +74,21 @@ private fun Content(state: WalletSettingsUM, modifier: Modifier = Modifier) { bottom = TangemTheme.dimens.spacing16, ), ) { + item { + Text( + modifier = Modifier.padding(horizontal = TangemTheme.dimens.spacing16), + text = stringResource(id = R.string.wallet_settings_title), + style = TangemTheme.typography.h1, + color = TangemTheme.colors.text.primary1, + ) + } items( items = state.items, key = WalletSettingsItemUM::id, ) { item -> - val itemModifier = Modifier.padding(horizontal = TangemTheme.dimens.spacing16) + val itemModifier = Modifier + .padding(horizontal = TangemTheme.dimens.spacing16) + .fillMaxWidth() when (item) { is WalletSettingsItemUM.WithItems -> ItemsBlock( @@ -117,7 +122,10 @@ private fun ItemsBlock(model: WalletSettingsItemUM.WithItems, modifier: Modifier verticalArrangement = Arrangement.Top, ) { model.blocks.forEach { block -> - BlockItem(model = block) + BlockItem( + modifier = Modifier.fillMaxWidth(), + model = block, + ) } } From e1ee680173041c3217c77e360e16c6a086284916 Mon Sep 17 00:00:00 2001 From: Tangem Date: Wed, 10 Jul 2024 17:19:43 +0400 Subject: [PATCH 4/5] Updated on 2026-08-14 --- .../bottomsheets/TangemBottomSheet.kt | 163 +++++++++++++++--- .../TangemBottomSheetDraggableHeader.kt | 5 +- .../bottomsheets/TangemBottomSheetTitle.kt | 68 ++++++++ .../tangem/core/ui/res/TangemThemePreview.kt | 33 +++- 4 files changed, 230 insertions(+), 39 deletions(-) create mode 100644 core/ui/src/main/java/com/tangem/core/ui/components/bottomsheets/TangemBottomSheetTitle.kt diff --git a/core/ui/src/main/java/com/tangem/core/ui/components/bottomsheets/TangemBottomSheet.kt b/core/ui/src/main/java/com/tangem/core/ui/components/bottomsheets/TangemBottomSheet.kt index ec10ddfa0a..8b48fdcf60 100644 --- a/core/ui/src/main/java/com/tangem/core/ui/components/bottomsheets/TangemBottomSheet.kt +++ b/core/ui/src/main/java/com/tangem/core/ui/components/bottomsheets/TangemBottomSheet.kt @@ -1,11 +1,18 @@ package com.tangem.core.ui.components.bottomsheets import androidx.compose.foundation.layout.* -import androidx.compose.material3.* +import androidx.compose.material3.ExperimentalMaterial3Api +import androidx.compose.material3.ModalBottomSheet +import androidx.compose.material3.SheetState +import androidx.compose.material3.SheetValue.Expanded +import androidx.compose.material3.rememberModalBottomSheetState import androidx.compose.runtime.* import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color import androidx.compose.ui.platform.LocalDensity +import com.tangem.core.ui.components.appbar.models.TopAppBarButtonUM +import com.tangem.core.ui.extensions.TextReference +import com.tangem.core.ui.res.LocalBottomSheetAlwaysVisible import com.tangem.core.ui.res.LocalWindowSize import com.tangem.core.ui.res.TangemTheme import com.tangem.core.ui.utils.WindowInsetsZero @@ -13,45 +20,79 @@ import kotlinx.coroutines.coroutineScope import kotlinx.coroutines.launch /** - * Tangem bottom sheet with custom draggable header and config - * - * @param config data model containing logic and ui models - * @param - * @param content custom bottom sheet content + * Bottom sheet with [content], [titleText] and optional [titleAction]. + * */ +@Composable +inline fun TangemBottomSheet( + config: TangemBottomSheetConfig, + titleText: TextReference, + titleAction: TopAppBarButtonUM? = null, + containerColor: Color = TangemTheme.colors.background.primary, + addBottomInsets: Boolean = true, + crossinline content: @Composable ColumnScope.(T) -> Unit, +) { + TangemBottomSheet( + config = config, + containerColor = containerColor, + addBottomInsets = addBottomInsets, + title = { TangemBottomSheetTitle(title = titleText, endButton = titleAction) }, + content = content, + ) +} + +/** + * Bottom sheet with [content] and optional [title]. */ -@OptIn(ExperimentalMaterial3Api::class) @Composable inline fun TangemBottomSheet( config: TangemBottomSheetConfig, containerColor: Color = TangemTheme.colors.background.primary, addBottomInsets: Boolean = true, + crossinline title: @Composable BoxScope.(T) -> Unit = {}, crossinline content: @Composable ColumnScope.(T) -> Unit, +) { + val isAlwaysVisible = LocalBottomSheetAlwaysVisible.current + + if (isAlwaysVisible) { + PreviewBottomSheet( + config = config, + containerColor = containerColor, + addBottomInsets = addBottomInsets, + title = title, + content = content, + ) + } else { + DefaultBottomSheet( + config = config, + containerColor = containerColor, + addBottomInsets = addBottomInsets, + title = title, + content = content, + ) + } +} + +@Composable +@OptIn(ExperimentalMaterial3Api::class) +inline fun DefaultBottomSheet( + config: TangemBottomSheetConfig, + containerColor: Color, + addBottomInsets: Boolean, + crossinline title: @Composable (BoxScope.(T) -> Unit), + crossinline content: @Composable (ColumnScope.(T) -> Unit), ) { var isVisible by remember { mutableStateOf(value = config.isShow) } - val statusBarHeight = with(LocalDensity.current) { WindowInsets.statusBars.getTop(this).toDp() } val sheetState = rememberModalBottomSheetState(skipPartiallyExpanded = true) + if (isVisible && config.content is T) { - ModalBottomSheet( - // FIXME temporary solution to fix height of the bottom sheet - modifier = Modifier.sizeIn(maxHeight = LocalWindowSize.current.height - statusBarHeight), - onDismissRequest = config.onDismissRequest, + BasicBottomSheet( + config = config, sheetState = sheetState, containerColor = containerColor, - shape = TangemTheme.shapes.bottomSheetLarge, - windowInsets = WindowInsetsZero, - dragHandle = { TangemBottomSheetDraggableHeader(color = containerColor) }, - ) { - if (addBottomInsets) { - Column( - // FIXME temporary solution to fix height of the bottom sheet - modifier = Modifier.navigationBarsPadding(), - ) { - content(config.content) - } - } else { - content(config.content) - } - } + addBottomInsets = addBottomInsets, + title = title, + content = content, + ) } LaunchedEffect(key1 = config.isShow) { @@ -63,6 +104,74 @@ inline fun TangemBottomSheet( } } +@Composable +@OptIn(ExperimentalMaterial3Api::class) +inline fun PreviewBottomSheet( + config: TangemBottomSheetConfig, + containerColor: Color, + addBottomInsets: Boolean, + crossinline title: @Composable (BoxScope.(T) -> Unit), + crossinline content: @Composable (ColumnScope.(T) -> Unit), +) { + BasicBottomSheet( + config = config, + sheetState = SheetState( + skipPartiallyExpanded = true, + initialValue = Expanded, + density = LocalDensity.current, + ), + containerColor = containerColor, + addBottomInsets = addBottomInsets, + title = title, + content = content, + ) +} + +@Suppress("LongParameterList") +@OptIn(ExperimentalMaterial3Api::class) +@Composable +inline fun BasicBottomSheet( + config: TangemBottomSheetConfig, + sheetState: SheetState, + containerColor: Color, + addBottomInsets: Boolean, + crossinline title: @Composable (BoxScope.(T) -> Unit), + crossinline content: @Composable (ColumnScope.(T) -> Unit), +) { + val model = config.content as? T ?: return + + val statusBarHeight = with(LocalDensity.current) { WindowInsets.statusBars.getTop(this).toDp() } + + ModalBottomSheet( + // FIXME temporary solution to fix height of the bottom sheet + modifier = Modifier.sizeIn(maxHeight = LocalWindowSize.current.height - statusBarHeight), + onDismissRequest = config.onDismissRequest, + sheetState = sheetState, + containerColor = containerColor, + shape = TangemTheme.shapes.bottomSheetLarge, + windowInsets = WindowInsetsZero, + dragHandle = { TangemBottomSheetDraggableHeader(color = containerColor) }, + ) { + Column( + modifier = Modifier.let { + if (addBottomInsets) { + it.navigationBarsPadding() + } else { + it + } + }, + ) { + Box( + modifier = Modifier.fillMaxWidth(), + ) { + title(model) + } + + content(model) + } + } +} + @OptIn(ExperimentalMaterial3Api::class) suspend fun SheetState.collapse(onCollapsed: () -> Unit) { coroutineScope { diff --git a/core/ui/src/main/java/com/tangem/core/ui/components/bottomsheets/TangemBottomSheetDraggableHeader.kt b/core/ui/src/main/java/com/tangem/core/ui/components/bottomsheets/TangemBottomSheetDraggableHeader.kt index 0d2cbe9d4e..37bff1013a 100644 --- a/core/ui/src/main/java/com/tangem/core/ui/components/bottomsheets/TangemBottomSheetDraggableHeader.kt +++ b/core/ui/src/main/java/com/tangem/core/ui/components/bottomsheets/TangemBottomSheetDraggableHeader.kt @@ -5,7 +5,7 @@ import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size -import androidx.compose.material.Surface +import androidx.compose.material3.Surface import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color @@ -14,8 +14,7 @@ import com.tangem.core.ui.res.TangemTheme @Composable fun TangemBottomSheetDraggableHeader(color: Color = TangemTheme.colors.background.primary) { Surface( - modifier = Modifier - .height(TangemTheme.dimens.size20), + modifier = Modifier.height(TangemTheme.dimens.size20), color = color, ) { Box( diff --git a/core/ui/src/main/java/com/tangem/core/ui/components/bottomsheets/TangemBottomSheetTitle.kt b/core/ui/src/main/java/com/tangem/core/ui/components/bottomsheets/TangemBottomSheetTitle.kt new file mode 100644 index 0000000000..65e7c87924 --- /dev/null +++ b/core/ui/src/main/java/com/tangem/core/ui/components/bottomsheets/TangemBottomSheetTitle.kt @@ -0,0 +1,68 @@ +package com.tangem.core.ui.components.bottomsheets + +import android.content.res.Configuration +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.tooling.preview.Preview +import com.tangem.core.ui.R +import com.tangem.core.ui.components.appbar.TangemTopAppBar +import com.tangem.core.ui.components.appbar.TangemTopAppBarHeight +import com.tangem.core.ui.components.appbar.models.TopAppBarButtonUM +import com.tangem.core.ui.extensions.TextReference +import com.tangem.core.ui.extensions.resolveReference +import com.tangem.core.ui.res.TangemTheme +import com.tangem.core.ui.res.TangemThemePreview + +@Composable +fun TangemBottomSheetTitle( + title: TextReference?, + modifier: Modifier = Modifier, + endButton: TopAppBarButtonUM? = null, + containerColor: Color = Color.Transparent, +) { + TangemBottomSheetTitle( + modifier = modifier, + title = title?.resolveReference(), + endButton = endButton, + containerColor = containerColor, + ) +} + +@Composable +fun TangemBottomSheetTitle( + title: String?, + modifier: Modifier = Modifier, + endButton: TopAppBarButtonUM? = null, + containerColor: Color = Color.Transparent, +) { + TangemTopAppBar( + modifier = modifier, + title = title, + endButton = endButton, + textColor = TangemTheme.colors.text.primary1, + iconTint = TangemTheme.colors.icon.informative, + titleAlignment = Alignment.CenterHorizontally, + containerColor = containerColor, + height = TangemTopAppBarHeight.BOTTOM_SHEET, + ) +} + +// region Preview +@Composable +@Preview(showBackground = true, widthDp = 360) +@Preview(showBackground = true, widthDp = 360, uiMode = Configuration.UI_MODE_NIGHT_YES) +private fun Preview_TangemBottomSheetTitle() { + TangemThemePreview { + TangemBottomSheetTitle( + title = "Title", + endButton = TopAppBarButtonUM( + iconRes = R.drawable.ic_information_24, + onIconClicked = {}, + ), + containerColor = TangemTheme.colors.background.secondary, + ) + } +} +// endregion Preview \ No newline at end of file diff --git a/core/ui/src/main/java/com/tangem/core/ui/res/TangemThemePreview.kt b/core/ui/src/main/java/com/tangem/core/ui/res/TangemThemePreview.kt index 2135bbdff8..c3ed096dce 100644 --- a/core/ui/src/main/java/com/tangem/core/ui/res/TangemThemePreview.kt +++ b/core/ui/src/main/java/com/tangem/core/ui/res/TangemThemePreview.kt @@ -3,6 +3,9 @@ package com.tangem.core.ui.res import androidx.compose.foundation.isSystemInDarkTheme import androidx.compose.foundation.layout.BoxWithConstraints import androidx.compose.runtime.Composable +import androidx.compose.runtime.CompositionLocalProvider +import androidx.compose.runtime.ProvidableCompositionLocal +import androidx.compose.runtime.compositionLocalOf import androidx.compose.ui.platform.LocalHapticFeedback import com.tangem.core.ui.haptic.MockHapticManager import com.tangem.core.ui.windowsize.rememberWindowSizePreview @@ -12,18 +15,30 @@ fun TangemThemePreview( isDark: Boolean? = null, typography: TangemTypography = TangemTheme.typography, dimens: TangemDimens = TangemTheme.dimens, + alwaysShowBottomSheets: Boolean = true, content: @Composable () -> Unit, ) { val isDarkTheme = isDark ?: isSystemInDarkTheme() - BoxWithConstraints { - TangemTheme( - isDark = isDarkTheme, - typography = typography, - dimens = dimens, - windowSize = rememberWindowSizePreview(maxWidth, maxHeight), - hapticManager = MockHapticManager(LocalHapticFeedback.current), - content = content, - ) + CompositionLocalProvider( + LocalBottomSheetAlwaysVisible provides alwaysShowBottomSheets, + ) { + BoxWithConstraints { + TangemTheme( + isDark = isDarkTheme, + typography = typography, + dimens = dimens, + windowSize = rememberWindowSizePreview(maxWidth, maxHeight), + hapticManager = MockHapticManager(LocalHapticFeedback.current), + content = content, + ) + } } +} + +/** + * This is used to make the bottom sheet always visible in the Preview and should be `true` only in the Preview. + * */ +val LocalBottomSheetAlwaysVisible: ProvidableCompositionLocal = compositionLocalOf { + false } \ No newline at end of file From 53a56d94cb7a165df81702298a47088b6a14de45 Mon Sep 17 00:00:00 2001 From: Tangem Date: Wed, 10 Jul 2024 17:20:18 +0400 Subject: [PATCH 5/5] Updated on 2026-08-14 --- .../GiveTxPermisssionBottomSheet.kt | 59 ++++++++------- .../QrScanningCameraDeniedBottomSheet.kt | 74 +++++++++++++------ .../ui/AgreementBottomSheetContent.kt | 4 +- .../ui/bottomsheet/StakingInfoBottomSheet.kt | 46 ++++++++++-- .../feature/swap/ui/ChooseFeeBottomSheet.kt | 66 +++++++---------- .../swap/ui/ChooseProviderBottomSheet.kt | 38 +++++----- 6 files changed, 170 insertions(+), 117 deletions(-) diff --git a/common/ui/src/main/java/com/tangem/common/ui/bottomsheet/permission/GiveTxPermisssionBottomSheet.kt b/common/ui/src/main/java/com/tangem/common/ui/bottomsheet/permission/GiveTxPermisssionBottomSheet.kt index 9ced912bdf..f59c494895 100644 --- a/common/ui/src/main/java/com/tangem/common/ui/bottomsheet/permission/GiveTxPermisssionBottomSheet.kt +++ b/common/ui/src/main/java/com/tangem/common/ui/bottomsheet/permission/GiveTxPermisssionBottomSheet.kt @@ -27,8 +27,7 @@ import androidx.compose.ui.window.PopupProperties import com.tangem.common.ui.R import com.tangem.common.ui.bottomsheet.permission.state.* import com.tangem.core.ui.components.* -import com.tangem.core.ui.components.appbar.AppBarWithAdditionalButtons -import com.tangem.core.ui.components.appbar.models.AdditionalButton +import com.tangem.core.ui.components.appbar.models.TopAppBarButtonUM import com.tangem.core.ui.components.atoms.text.EllipsisText import com.tangem.core.ui.components.bottomsheets.TangemBottomSheet import com.tangem.core.ui.components.bottomsheets.TangemBottomSheetConfig @@ -42,17 +41,33 @@ import kotlinx.collections.immutable.ImmutableList @Composable fun GiveTxPermissionBottomSheet(config: TangemBottomSheetConfig) { + var isPermissionAlertShow by remember { mutableStateOf(false) } + TangemBottomSheet( config = config, containerColor = TangemTheme.colors.background.secondary, - ) { content: GiveTxPermissionBottomSheetConfig -> - GiveTxPermissionBottomSheetContent(content = content) - } + titleText = resourceReference(R.string.give_permission_title), + titleAction = TopAppBarButtonUM( + iconRes = R.drawable.ic_information_24, + onIconClicked = { isPermissionAlertShow = true }, + ), + content = { content: GiveTxPermissionBottomSheetConfig -> + GiveTxPermissionBottomSheetContent(content = content) + + if (isPermissionAlertShow) { + BasicDialog( + message = content.data.dialogText.resolveReference(), + title = stringResource(id = R.string.common_approve), + confirmButton = DialogButton { isPermissionAlertShow = false }, + onDismissDialog = {}, + ) + } + }, + ) } @Composable private fun GiveTxPermissionBottomSheetContent(content: GiveTxPermissionBottomSheetConfig) { - var isPermissionAlertShow by remember { mutableStateOf(false) } val data = content.data Column( modifier = Modifier @@ -60,14 +75,6 @@ private fun GiveTxPermissionBottomSheetContent(content: GiveTxPermissionBottomSh .fillMaxWidth(), horizontalAlignment = Alignment.CenterHorizontally, ) { - AppBarWithAdditionalButtons( - text = resourceReference(id = R.string.give_permission_title), - iconColor = TangemTheme.colors.text.tertiary, - endButton = AdditionalButton( - iconRes = R.drawable.ic_information_24, - onIconClicked = { isPermissionAlertShow = true }, - ), - ) Text( text = content.data.subtitle.resolveReference(), color = TangemTheme.colors.text.secondary, @@ -102,16 +109,6 @@ private fun GiveTxPermissionBottomSheetContent(content: GiveTxPermissionBottomSh ) SpacerH16() - - // region dialog - if (isPermissionAlertShow) { - BasicDialog( - message = content.data.dialogText.resolveReference(), - title = stringResource(id = R.string.common_approve), - confirmButton = DialogButton { isPermissionAlertShow = false }, - onDismissDialog = {}, - ) - } } } @@ -303,12 +300,18 @@ private fun DropdownSelector( } // region preview -@Preview(showBackground = true, widthDp = 360) -@Preview(showBackground = true, widthDp = 360, uiMode = Configuration.UI_MODE_NIGHT_YES) @Composable -private fun Preview_AgreementBottomSheet() { +@Preview(showBackground = true) +@Preview(showBackground = true, uiMode = Configuration.UI_MODE_NIGHT_YES) +private fun Preview_GiveTxPermissionBottomSheet() { TangemThemePreview { - GiveTxPermissionBottomSheetContent(content = previewData) + GiveTxPermissionBottomSheet( + config = TangemBottomSheetConfig( + isShow = true, + onDismissRequest = {}, + content = previewData, + ), + ) } } diff --git a/features/qr-scanning/impl/src/main/java/com/tangem/feature/qrscanning/presentation/QrScanningCameraDeniedBottomSheet.kt b/features/qr-scanning/impl/src/main/java/com/tangem/feature/qrscanning/presentation/QrScanningCameraDeniedBottomSheet.kt index 31f79da70e..cb06aa540c 100644 --- a/features/qr-scanning/impl/src/main/java/com/tangem/feature/qrscanning/presentation/QrScanningCameraDeniedBottomSheet.kt +++ b/features/qr-scanning/impl/src/main/java/com/tangem/feature/qrscanning/presentation/QrScanningCameraDeniedBottomSheet.kt @@ -1,25 +1,35 @@ package com.tangem.feature.qrscanning.presentation import android.content.Intent +import android.content.res.Configuration import android.net.Uri import android.provider.Settings +import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.padding import androidx.compose.material3.Text import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.stringResource +import androidx.compose.ui.tooling.preview.Preview import androidx.core.content.ContextCompat import com.tangem.core.ui.components.SimpleSettingsRow import com.tangem.core.ui.components.bottomsheets.TangemBottomSheet import com.tangem.core.ui.components.bottomsheets.TangemBottomSheetConfig import com.tangem.core.ui.res.TangemTheme +import com.tangem.core.ui.res.TangemThemePreview import com.tangem.feature.qrscanning.impl.R @Composable fun CameraDeniedBottomSheet(config: TangemBottomSheetConfig) { - TangemBottomSheet(config) { content: CameraDeniedBottomSheetConfig -> + TangemBottomSheet( + config = config, + title = { + CameraDeniedBottomSheetHeader() + }, + ) { content: CameraDeniedBottomSheetConfig -> CameraDeniedBottomSheet(content = content) } } @@ -28,7 +38,6 @@ fun CameraDeniedBottomSheet(config: TangemBottomSheetConfig) { private fun CameraDeniedBottomSheet(content: CameraDeniedBottomSheetConfig) { val context = LocalContext.current Column { - CameraDeniedBottomSheetHeader() SimpleSettingsRow( title = stringResource(id = R.string.qr_scanner_camera_denied_settings_button), icon = R.drawable.ic_settings_24, @@ -55,28 +64,45 @@ private fun CameraDeniedBottomSheet(content: CameraDeniedBottomSheetConfig) { } @Composable -private fun CameraDeniedBottomSheetHeader() { - Text( - text = stringResource(id = R.string.qr_scanner_camera_denied_title), - style = TangemTheme.typography.subtitle1, - color = TangemTheme.colors.text.primary1, - modifier = Modifier +private fun CameraDeniedBottomSheetHeader(modifier: Modifier = Modifier) { + Column( + modifier = modifier .padding( - start = TangemTheme.dimens.spacing20, - end = TangemTheme.dimens.spacing20, - top = TangemTheme.dimens.spacing16, + vertical = TangemTheme.dimens.spacing16, + horizontal = TangemTheme.dimens.spacing20, ), - ) - Text( - text = stringResource(id = R.string.qr_scanner_camera_denied_text), - style = TangemTheme.typography.body2, - color = TangemTheme.colors.text.secondary, - modifier = Modifier - .padding( - start = TangemTheme.dimens.spacing20, - end = TangemTheme.dimens.spacing20, - top = TangemTheme.dimens.spacing3, - bottom = TangemTheme.dimens.spacing16, + horizontalAlignment = Alignment.Start, + verticalArrangement = Arrangement.spacedBy(TangemTheme.dimens.spacing4), + ) { + Text( + text = stringResource(id = R.string.qr_scanner_camera_denied_title), + style = TangemTheme.typography.subtitle1, + color = TangemTheme.colors.text.primary1, + ) + Text( + text = stringResource(id = R.string.qr_scanner_camera_denied_text), + style = TangemTheme.typography.body2, + color = TangemTheme.colors.text.secondary, + ) + } +} + +// region Preview +@Composable +@Preview(showBackground = true) +@Preview(showBackground = true, uiMode = Configuration.UI_MODE_NIGHT_YES) +private fun Preview_CameraDeniedBottomSheet() { + TangemThemePreview { + CameraDeniedBottomSheet( + config = TangemBottomSheetConfig( + isShow = true, + onDismissRequest = {}, + content = CameraDeniedBottomSheetConfig( + onCancelClick = {}, + onGalleryClick = {}, + ), ), - ) -} \ No newline at end of file + ) + } +} +// endregion Preview \ No newline at end of file diff --git a/features/referral/presentation/src/main/java/com/tangem/feature/referral/ui/AgreementBottomSheetContent.kt b/features/referral/presentation/src/main/java/com/tangem/feature/referral/ui/AgreementBottomSheetContent.kt index 8d8b5aadfa..204393dc6a 100644 --- a/features/referral/presentation/src/main/java/com/tangem/feature/referral/ui/AgreementBottomSheetContent.kt +++ b/features/referral/presentation/src/main/java/com/tangem/feature/referral/ui/AgreementBottomSheetContent.kt @@ -13,7 +13,7 @@ import androidx.compose.ui.res.stringResource import androidx.compose.ui.tooling.preview.Preview import com.google.accompanist.web.WebView import com.google.accompanist.web.rememberWebViewState -import com.tangem.core.ui.components.appbar.AppBarWithAdditionalButtons +import com.tangem.core.ui.components.appbar.TangemTopAppBar import com.tangem.core.ui.res.TangemTheme import com.tangem.core.ui.res.TangemThemePreview import com.tangem.feature.referral.presentation.R @@ -32,7 +32,7 @@ internal fun AgreementBottomSheetContent(url: String) { .fillMaxSize() .verticalScroll(rememberScrollState()), ) { - AppBarWithAdditionalButtons(text = stringResource(id = R.string.details_referral_title)) + TangemTopAppBar(title = stringResource(id = R.string.details_referral_title)) AgreementHtmlView(url = url) Spacer(modifier = Modifier.height(bottomBarHeight)) } diff --git a/features/staking/impl/src/main/java/com/tangem/features/staking/impl/presentation/ui/bottomsheet/StakingInfoBottomSheet.kt b/features/staking/impl/src/main/java/com/tangem/features/staking/impl/presentation/ui/bottomsheet/StakingInfoBottomSheet.kt index 0b1104c35b..6e0b80bd18 100644 --- a/features/staking/impl/src/main/java/com/tangem/features/staking/impl/presentation/ui/bottomsheet/StakingInfoBottomSheet.kt +++ b/features/staking/impl/src/main/java/com/tangem/features/staking/impl/presentation/ui/bottomsheet/StakingInfoBottomSheet.kt @@ -1,5 +1,6 @@ package com.tangem.features.staking.impl.presentation.ui.bottomsheet +import android.content.res.Configuration import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.padding import androidx.compose.foundation.rememberScrollState @@ -7,23 +8,29 @@ import androidx.compose.foundation.verticalScroll import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier -import com.tangem.core.ui.components.appbar.AppBar +import androidx.compose.ui.tooling.preview.Preview import com.tangem.core.ui.components.bottomsheets.TangemBottomSheet import com.tangem.core.ui.components.bottomsheets.TangemBottomSheetConfig +import com.tangem.core.ui.components.bottomsheets.TangemBottomSheetTitle import com.tangem.core.ui.extensions.resolveReference +import com.tangem.core.ui.extensions.stringReference import com.tangem.core.ui.res.TangemTheme +import com.tangem.core.ui.res.TangemThemePreview import com.tangem.features.staking.impl.presentation.state.bottomsheet.StakingInfoBottomSheetConfig @Composable fun StakingInfoBottomSheet(config: TangemBottomSheetConfig) { val scrollState = rememberScrollState() - TangemBottomSheet( + + TangemBottomSheet( config = config, - ) { content: StakingInfoBottomSheetConfig -> + title = { content -> + TangemBottomSheetTitle(title = content.title) + }, + ) { content -> Column( modifier = Modifier.verticalScroll(scrollState), ) { - AppBar(text = content.title) Text( text = content.text.resolveReference(), color = TangemTheme.colors.text.secondary, @@ -35,4 +42,33 @@ fun StakingInfoBottomSheet(config: TangemBottomSheetConfig) { ) } } -} \ No newline at end of file +} + +// region Preview +@Composable +@Preview(showBackground = true) +@Preview(showBackground = true, uiMode = Configuration.UI_MODE_NIGHT_YES) +private fun Preview_StakingInfoBottomSheet() { + TangemThemePreview { + StakingInfoBottomSheet( + config = TangemBottomSheetConfig( + isShow = true, + onDismissRequest = {}, + content = StakingInfoBottomSheetConfig( + title = stringReference("Title"), + text = stringReference( + """ + Lorem ipsum dolor sit amet, consectetur adipiscing elit. Fusce varius neque vel ligula + tincidunt, nec faucibus nulla ultricies. Maecenas euismod arcu in nunc volutpat, + at bibendum eros lacinia. Proin hendrerit massa non velit congue, + in volutpat nisi consequat. Sed vitae justo nec orci tincidunt malesuada. + Nullam feugiat purus vel lectus efficitur, vel fringilla urna volutpat. + Donec sagittis enim in metus lacinia, vel tempor nunc bibendum. + """.trimIndent(), + ), + ), + ), + ) + } +} +// endregion Preview \ No newline at end of file diff --git a/features/swap/presentation/src/main/java/com/tangem/feature/swap/ui/ChooseFeeBottomSheet.kt b/features/swap/presentation/src/main/java/com/tangem/feature/swap/ui/ChooseFeeBottomSheet.kt index 8b1ac6f243..f183c74cbd 100644 --- a/features/swap/presentation/src/main/java/com/tangem/feature/swap/ui/ChooseFeeBottomSheet.kt +++ b/features/swap/presentation/src/main/java/com/tangem/feature/swap/ui/ChooseFeeBottomSheet.kt @@ -1,12 +1,11 @@ package com.tangem.feature.swap.ui +import android.content.res.Configuration import androidx.compose.foundation.background import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.padding import androidx.compose.foundation.text.ClickableText -import androidx.compose.material3.Text import androidx.compose.runtime.Composable -import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip import androidx.compose.ui.res.stringResource @@ -15,12 +14,12 @@ import androidx.compose.ui.text.buildAnnotatedString import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.text.withStyle import androidx.compose.ui.tooling.preview.Preview -import com.tangem.core.ui.components.SpacerH24 import com.tangem.core.ui.components.bottomsheets.TangemBottomSheet import com.tangem.core.ui.components.bottomsheets.TangemBottomSheetConfig import com.tangem.core.ui.components.rows.SelectorRowItem import com.tangem.core.ui.extensions.TextReference import com.tangem.core.ui.extensions.resolveReference +import com.tangem.core.ui.extensions.resourceReference import com.tangem.core.ui.extensions.stringReference import com.tangem.core.ui.res.TangemTheme import com.tangem.core.ui.res.TangemThemePreview @@ -35,6 +34,7 @@ fun ChooseFeeBottomSheet(config: TangemBottomSheetConfig) { TangemBottomSheet( config = config, containerColor = TangemTheme.colors.background.tertiary, + titleText = resourceReference(R.string.common_fee_selector_title), ) { content: ChooseFeeBottomSheetConfig -> ChooseFeeBottomSheetContent(content = content) } @@ -47,14 +47,6 @@ private fun ChooseFeeBottomSheetContent(content: ChooseFeeBottomSheetConfig) { .background(TangemTheme.colors.background.tertiary) .padding(bottom = TangemTheme.dimens.spacing8), ) { - Text( - text = stringResource(R.string.common_fee_selector_title), - style = TangemTheme.typography.subtitle1, - color = TangemTheme.colors.text.primary1, - modifier = Modifier - .padding(top = TangemTheme.dimens.spacing10) - .align(Alignment.CenterHorizontally), - ) Column( modifier = Modifier .padding(TangemTheme.dimens.spacing16) @@ -145,9 +137,11 @@ private fun FeeItemsBlock(content: ChooseFeeBottomSheetConfig) { } } -@Preview +// region Preview @Composable -private fun ChooseFeeBottomSheetContent_Preview() { +@Preview(showBackground = true) +@Preview(showBackground = true, uiMode = Configuration.UI_MODE_NIGHT_YES) +private fun Preview_ChooseFeeBottomSheet() { val feeItems = listOf( FeeItemState.Content( feeType = FeeType.NORMAL, @@ -168,33 +162,23 @@ private fun ChooseFeeBottomSheetContent_Preview() { onClick = {}, ), ).toImmutableList() - Column { - TangemThemePreview(isDark = true) { - ChooseFeeBottomSheetContent( - ChooseFeeBottomSheetConfig( - selectedFee = FeeType.NORMAL, - onSelectFeeType = {}, - feeItems = feeItems, - readMore = stringReference("Read more"), - readMoreUrl = "", - onReadMoreClick = {}, - ), - ) - } + val content = ChooseFeeBottomSheetConfig( + selectedFee = FeeType.NORMAL, + onSelectFeeType = {}, + feeItems = feeItems, + readMore = stringReference("Read more"), + readMoreUrl = "", + onReadMoreClick = {}, + ) - SpacerH24() - - TangemThemePreview(isDark = false) { - ChooseFeeBottomSheetContent( - ChooseFeeBottomSheetConfig( - selectedFee = FeeType.NORMAL, - onSelectFeeType = {}, - feeItems = feeItems, - readMore = stringReference("Read more"), - readMoreUrl = "", - onReadMoreClick = {}, - ), - ) - } + TangemThemePreview { + ChooseFeeBottomSheet( + config = TangemBottomSheetConfig( + isShow = true, + onDismissRequest = {}, + content = content, + ), + ) } -} \ No newline at end of file +} +// endregion Preview \ No newline at end of file diff --git a/features/swap/presentation/src/main/java/com/tangem/feature/swap/ui/ChooseProviderBottomSheet.kt b/features/swap/presentation/src/main/java/com/tangem/feature/swap/ui/ChooseProviderBottomSheet.kt index 960b9d3373..3663417055 100644 --- a/features/swap/presentation/src/main/java/com/tangem/feature/swap/ui/ChooseProviderBottomSheet.kt +++ b/features/swap/presentation/src/main/java/com/tangem/feature/swap/ui/ChooseProviderBottomSheet.kt @@ -1,5 +1,6 @@ package com.tangem.feature.swap.ui +import android.content.res.Configuration import androidx.compose.foundation.background import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Column @@ -16,6 +17,7 @@ import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.tooling.preview.Preview import com.tangem.core.ui.components.bottomsheets.TangemBottomSheet import com.tangem.core.ui.components.bottomsheets.TangemBottomSheetConfig +import com.tangem.core.ui.extensions.resourceReference import com.tangem.core.ui.extensions.stringReference import com.tangem.core.ui.res.TangemTheme import com.tangem.core.ui.res.TangemThemePreview @@ -23,13 +25,14 @@ import com.tangem.feature.swap.models.states.ChooseProviderBottomSheetConfig import com.tangem.feature.swap.models.states.PercentDifference import com.tangem.feature.swap.models.states.ProviderState import com.tangem.feature.swap.presentation.R -import kotlinx.collections.immutable.toImmutableList +import kotlinx.collections.immutable.persistentListOf @Composable fun ChooseProviderBottomSheet(config: TangemBottomSheetConfig) { TangemBottomSheet( config = config, containerColor = TangemTheme.colors.background.tertiary, + titleText = resourceReference(R.string.express_choose_providers_title), ) { content: ChooseProviderBottomSheetConfig -> ChooseProviderBottomSheetContent(content = content) } @@ -39,13 +42,6 @@ fun ChooseProviderBottomSheet(config: TangemBottomSheetConfig) { @Composable private fun ChooseProviderBottomSheetContent(content: ChooseProviderBottomSheetConfig) { Column(horizontalAlignment = Alignment.CenterHorizontally) { - Text( - text = stringResource(R.string.express_choose_providers_title), - style = TangemTheme.typography.subtitle1, - color = TangemTheme.colors.text.primary1, - modifier = Modifier - .padding(top = TangemTheme.dimens.spacing10), - ) Text( text = stringResource(R.string.express_choose_providers_subtitle), style = TangemTheme.typography.caption2, @@ -104,10 +100,12 @@ private fun ChooseProviderBottomSheetContent(content: ChooseProviderBottomSheetC } } -@Preview +// region Preview @Composable -private fun ChooseProviderBottomSheet_Preview() { - val providers = listOf( +@Preview(showBackground = true) +@Preview(showBackground = true, uiMode = Configuration.UI_MODE_NIGHT_YES) +private fun Preview_ChooseProviderBottomSheet() { + val providers = persistentListOf( ProviderState.Content( id = "1", name = "1inch", @@ -129,12 +127,18 @@ private fun ChooseProviderBottomSheet_Preview() { alertText = stringReference("Unavailable"), ), ) - TangemThemePreview(isDark = false) { - ChooseProviderBottomSheetContent( - ChooseProviderBottomSheetConfig( - selectedProviderId = "1", - providers = providers.toImmutableList(), + val content = ChooseProviderBottomSheetConfig( + selectedProviderId = "1", + providers = providers, + ) + TangemThemePreview { + ChooseProviderBottomSheet( + TangemBottomSheetConfig( + isShow = true, + onDismissRequest = {}, + content = content, ), ) } -} \ No newline at end of file +} +// endregion Preview \ No newline at end of file