From 67503c6c1aedd767c00cbe19a171ecefc45648ec Mon Sep 17 00:00:00 2001 From: Tangem Date: Tue, 15 Jul 2025 18:32:16 +0700 Subject: [PATCH] Updated on 2026-08-14 --- .../modal/TangemModalBottomSheetTitle.kt | 53 +++++++++++++++---- data/wallet-connect/build.gradle.kts | 1 + .../pair/DefaultWcPairUseCase.kt | 2 + .../sessions/DefaultWcSessionsManager.kt | 12 ++++- .../walletconnect/DefaultWcPairUseCaseTest.kt | 10 ++-- .../WcSignUseCaseDelegateTest.kt | 1 + .../domain/walletconnect/model/WcSession.kt | 1 + .../walletconnect/model/WcSessionDTO.kt | 1 + .../entity/WcConnectedAppInfoUM.kt | 1 + .../model/WcConnectedAppInfoModel.kt | 1 + .../connections/ui/WcConnectedAppInfoBS.kt | 14 +++++ 11 files changed, 82 insertions(+), 15 deletions(-) diff --git a/core/ui/src/main/java/com/tangem/core/ui/components/bottomsheets/modal/TangemModalBottomSheetTitle.kt b/core/ui/src/main/java/com/tangem/core/ui/components/bottomsheets/modal/TangemModalBottomSheetTitle.kt index 7029f1c2e0..336bec808f 100644 --- a/core/ui/src/main/java/com/tangem/core/ui/components/bottomsheets/modal/TangemModalBottomSheetTitle.kt +++ b/core/ui/src/main/java/com/tangem/core/ui/components/bottomsheets/modal/TangemModalBottomSheetTitle.kt @@ -3,10 +3,7 @@ package com.tangem.core.ui.components.bottomsheets.modal import android.content.res.Configuration import androidx.annotation.DrawableRes import androidx.compose.foundation.background -import androidx.compose.foundation.layout.Box -import androidx.compose.foundation.layout.fillMaxWidth -import androidx.compose.foundation.layout.height -import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.* import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment @@ -20,6 +17,7 @@ import com.tangem.core.ui.components.buttons.small.TangemIconButton 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 @@ -30,6 +28,7 @@ import com.tangem.core.ui.res.TangemThemePreview fun TangemModalBottomSheetTitle( modifier: Modifier = Modifier, title: TextReference? = null, + subtitle: TextReference? = null, @DrawableRes startIconRes: Int? = null, onStartClick: (() -> Unit)? = null, @DrawableRes endIconRes: Int? = null, @@ -49,13 +48,23 @@ fun TangemModalBottomSheetTitle( .align(Alignment.CenterStart), ) } - if (title != null) { - Text( - text = title.resolveReference(), - style = TangemTheme.typography.subtitle1, - color = TangemTheme.colors.text.primary1, - modifier = Modifier.align(Alignment.Center), - ) + Column(modifier = Modifier.align(Alignment.Center)) { + if (title != null) { + Text( + text = title.resolveReference(), + style = TangemTheme.typography.subtitle1, + color = TangemTheme.colors.text.primary1, + modifier = Modifier.align(Alignment.CenterHorizontally), + ) + } + if (subtitle != null) { + Text( + text = subtitle.resolveReference(), + style = TangemTheme.typography.caption1, + color = TangemTheme.colors.text.tertiary, + modifier = Modifier.align(Alignment.CenterHorizontally), + ) + } } if (endIconRes != null && onEndClick != null) { TangemIconButton( @@ -79,6 +88,7 @@ private fun Preview_TangemModalBottomSheetTitle( TangemThemePreview { TangemModalBottomSheetTitle( title = params.title, + subtitle = params.subtitle, startIconRes = params.startIconRes, onStartClick = params.onStartClick, endIconRes = params.endIconRes, @@ -90,6 +100,7 @@ private fun Preview_TangemModalBottomSheetTitle( private data class TangemModalBottomSheetTitleData( val title: TextReference?, + val subtitle: TextReference?, val startIconRes: Int?, val onStartClick: (() -> Unit)?, val endIconRes: Int?, @@ -104,6 +115,7 @@ private class TangemModalBottomSheetTitleProvider : PreviewParameterProvider { @@ -89,6 +97,7 @@ internal class DefaultWcSessionsManager( sdkModel = WcSdkSessionConverter.convert(sdkSession), securityStatus = storedSession.securityStatus, networks = networks, + connectingTime = storedSession.connectingTime, ) } @@ -137,6 +146,7 @@ internal class DefaultWcSessionsManager( sdkModel = WcSdkSessionConverter.convert(sdkSession), securityStatus = session.securityStatus, networks = networks, + connectingTime = session.connectingTime, ) } return wcSessions diff --git a/data/wallet-connect/src/test/kotlin/com/tangem/domain/walletconnect/DefaultWcPairUseCaseTest.kt b/data/wallet-connect/src/test/kotlin/com/tangem/domain/walletconnect/DefaultWcPairUseCaseTest.kt index 81dd6ad575..caf657f919 100644 --- a/data/wallet-connect/src/test/kotlin/com/tangem/domain/walletconnect/DefaultWcPairUseCaseTest.kt +++ b/data/wallet-connect/src/test/kotlin/com/tangem/domain/walletconnect/DefaultWcPairUseCaseTest.kt @@ -95,6 +95,7 @@ internal class DefaultWcPairUseCaseTest { sdkModel = WcSdkSessionConverter.convert(this), securityStatus = CheckDAppResult.SAFE, networks = setOf(), + connectingTime = null, ) private fun useCaseFactory() = DefaultWcPairUseCase( @@ -144,7 +145,7 @@ internal class DefaultWcPairUseCaseTest { coEvery { sdkDelegate.pair(url) } returns sdkProposal.right() coEvery { sdkDelegate.approve(sdkApprove) } returns sdkApproveSuccess.right() - coEvery { sessionsManager.saveSession(sessionForSave) } returns Unit + coEvery { sessionsManager.saveSession(any()) } returns Unit coEvery { blockAidVerifier.verifyDApp(any()) } returns Either.catch { CheckDAppResult.SAFE } val useCase = useCaseFactory() @@ -162,9 +163,12 @@ internal class DefaultWcPairUseCaseTest { assertEquals(approveLoading, awaitItem()) coVerifyOrder { sdkDelegate.approve(sdkApprove) - sessionsManager.saveSession(sessionForSave) + sessionsManager.saveSession(any()) } - assertEquals(result, awaitItem()) + val actual: WcPairState = awaitItem() + assert(actual is WcPairState.Approving.Result) + actual as WcPairState.Approving.Result + assertEquals(result.session, actual.session) awaitComplete() } } diff --git a/data/wallet-connect/src/test/kotlin/com/tangem/domain/walletconnect/WcSignUseCaseDelegateTest.kt b/data/wallet-connect/src/test/kotlin/com/tangem/domain/walletconnect/WcSignUseCaseDelegateTest.kt index c78cc22391..34e1e8c848 100644 --- a/data/wallet-connect/src/test/kotlin/com/tangem/domain/walletconnect/WcSignUseCaseDelegateTest.kt +++ b/data/wallet-connect/src/test/kotlin/com/tangem/domain/walletconnect/WcSignUseCaseDelegateTest.kt @@ -51,6 +51,7 @@ internal class WcSignUseCaseDelegateTest { wallet = MockUserWalletFactory.create(), networks = setOf(), securityStatus = CheckDAppResult.FAILED_TO_VERIFY, + connectingTime = 0L, sdkModel = WcSdkSession( topic = "", appMetaData = WcAppMetaData( diff --git a/domain/wallet-connect/models/src/main/java/com/tangem/domain/walletconnect/model/WcSession.kt b/domain/wallet-connect/models/src/main/java/com/tangem/domain/walletconnect/model/WcSession.kt index 163e84cd6d..2aa9af657a 100644 --- a/domain/wallet-connect/models/src/main/java/com/tangem/domain/walletconnect/model/WcSession.kt +++ b/domain/wallet-connect/models/src/main/java/com/tangem/domain/walletconnect/model/WcSession.kt @@ -10,4 +10,5 @@ data class WcSession( val networks: Set, val sdkModel: WcSdkSession, val securityStatus: CheckDAppResult, + val connectingTime: Long?, ) \ No newline at end of file diff --git a/domain/wallet-connect/models/src/main/java/com/tangem/domain/walletconnect/model/WcSessionDTO.kt b/domain/wallet-connect/models/src/main/java/com/tangem/domain/walletconnect/model/WcSessionDTO.kt index a2dd9abd9e..06a471504f 100644 --- a/domain/wallet-connect/models/src/main/java/com/tangem/domain/walletconnect/model/WcSessionDTO.kt +++ b/domain/wallet-connect/models/src/main/java/com/tangem/domain/walletconnect/model/WcSessionDTO.kt @@ -9,4 +9,5 @@ data class WcSessionDTO( val topic: String, val walletId: UserWalletId, val securityStatus: CheckDAppResult = CheckDAppResult.FAILED_TO_VERIFY, + val connectingTime: Long? = null, ) \ No newline at end of file diff --git a/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/connections/entity/WcConnectedAppInfoUM.kt b/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/connections/entity/WcConnectedAppInfoUM.kt index 0871ed2cba..02928cb95d 100644 --- a/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/connections/entity/WcConnectedAppInfoUM.kt +++ b/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/connections/entity/WcConnectedAppInfoUM.kt @@ -11,6 +11,7 @@ data class WcConnectedAppInfoUM( val notification: WcAppInfoSecurityNotification? = null, val appSubtitle: String, val walletName: String, + val connectingTime: Long?, val networks: ImmutableList, val disconnectButtonConfig: WcPrimaryButtonConfig, val onDismiss: () -> Unit, diff --git a/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/connections/model/WcConnectedAppInfoModel.kt b/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/connections/model/WcConnectedAppInfoModel.kt index 303e583776..9e5b0ee9ce 100644 --- a/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/connections/model/WcConnectedAppInfoModel.kt +++ b/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/connections/model/WcConnectedAppInfoModel.kt @@ -69,6 +69,7 @@ internal class WcConnectedAppInfoModel @Inject constructor( verifiedDAppState = extractVerifiedState(session), appSubtitle = WcAppSubtitleConverter.convert(session.sdkModel.appMetaData), walletName = session.wallet.name, + connectingTime = session.connectingTime, networks = session.networks .map { WcNetworkInfoItem.Required( diff --git a/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/connections/ui/WcConnectedAppInfoBS.kt b/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/connections/ui/WcConnectedAppInfoBS.kt index 95f99d2965..f4662ea4ae 100644 --- a/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/connections/ui/WcConnectedAppInfoBS.kt +++ b/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/connections/ui/WcConnectedAppInfoBS.kt @@ -24,9 +24,13 @@ import com.tangem.core.ui.components.bottomsheets.modal.TangemModalBottomSheetTi import com.tangem.core.ui.components.notifications.Notification import com.tangem.core.ui.extensions.resourceReference import com.tangem.core.ui.extensions.stringResourceSafe +import com.tangem.core.ui.extensions.wrappedList import com.tangem.core.ui.res.TangemColorPalette import com.tangem.core.ui.res.TangemTheme import com.tangem.core.ui.res.TangemThemePreview +import com.tangem.core.ui.utils.DateTimeFormatters +import com.tangem.core.ui.utils.toDateFormatWithTodayYesterday +import com.tangem.core.ui.utils.toTimeFormat import com.tangem.features.walletconnect.connections.entity.* import com.tangem.features.walletconnect.impl.R import kotlinx.collections.immutable.ImmutableList @@ -44,6 +48,15 @@ internal fun WcConnectedAppInfoBS(state: WcConnectedAppInfoUM) { title = { TangemModalBottomSheetTitle( title = resourceReference(R.string.wc_wallet_connect), + subtitle = state.connectingTime?.let { timestamp -> + resourceReference( + R.string.send_date_format, + wrappedList( + timestamp.toDateFormatWithTodayYesterday(DateTimeFormatters.dateFormatter), + timestamp.toTimeFormat(), + ), + ) + }, endIconRes = R.drawable.ic_close_24, onEndClick = state.onDismiss, ) @@ -185,6 +198,7 @@ private fun WcConnectedAppInfoBS_Preview() { isVerified = true, appSubtitle = "react-app.walletconnect.com", walletName = "Tangem 2.0", + connectingTime = System.currentTimeMillis(), networks = persistentListOf( WcNetworkInfoItem.Required( id = "1",