From ce86d3f87c3a1dc240ce29796dbdb6acc600cef5 Mon Sep 17 00:00:00 2001 From: Tangem Date: Mon, 9 Jun 2025 16:31:31 +0300 Subject: [PATCH] Updated on 2026-08-14 --- .../preview/PreviewDetailsComponent.kt | 4 +- .../features/details/model/DetailsModel.kt | 17 +++++++- .../features/details/utils/ItemsBuilder.kt | 42 +++++++++++++++---- 3 files changed, 52 insertions(+), 11 deletions(-) diff --git a/features/details/impl/src/main/kotlin/com/tangem/features/details/component/preview/PreviewDetailsComponent.kt b/features/details/impl/src/main/kotlin/com/tangem/features/details/component/preview/PreviewDetailsComponent.kt index 8efcb31776..f2915354c5 100644 --- a/features/details/impl/src/main/kotlin/com/tangem/features/details/component/preview/PreviewDetailsComponent.kt +++ b/features/details/impl/src/main/kotlin/com/tangem/features/details/component/preview/PreviewDetailsComponent.kt @@ -21,8 +21,10 @@ internal class PreviewDetailsComponent : DetailsComponent { router = DummyRouter(), ).buildAll( isWalletConnectAvailable = true, + isSupportChatAvailable = true, userWalletId = UserWalletId(""), - onSupportClick = {}, + onSupportEmailClick = {}, + onSupportChatClick = {}, onBuyClick = {}, ) } diff --git a/features/details/impl/src/main/kotlin/com/tangem/features/details/model/DetailsModel.kt b/features/details/impl/src/main/kotlin/com/tangem/features/details/model/DetailsModel.kt index 8c0878fae5..003b5605e6 100644 --- a/features/details/impl/src/main/kotlin/com/tangem/features/details/model/DetailsModel.kt +++ b/features/details/impl/src/main/kotlin/com/tangem/features/details/model/DetailsModel.kt @@ -2,6 +2,7 @@ package com.tangem.features.details.model import android.content.res.Resources import arrow.core.getOrElse +import com.tangem.common.routing.AppRoute import com.tangem.core.analytics.AppInstanceIdProvider import com.tangem.core.decompose.di.ModelScoped import com.tangem.core.decompose.model.Model @@ -14,6 +15,7 @@ import com.tangem.domain.feedback.GetCardInfoUseCase import com.tangem.domain.feedback.SendFeedbackEmailUseCase import com.tangem.domain.feedback.models.CardInfo import com.tangem.domain.feedback.models.FeedbackEmailType +import com.tangem.domain.feedback.repository.FeedbackFeatureToggles import com.tangem.domain.redux.LegacyAction import com.tangem.domain.redux.ReduxStateHolder import com.tangem.domain.walletconnect.CheckIsWalletConnectAvailableUseCase @@ -57,6 +59,7 @@ internal class DetailsModel @Inject constructor( private val getCardInfoUseCase: GetCardInfoUseCase, private val sendFeedbackEmailUseCase: SendFeedbackEmailUseCase, private val getWalletsUseCase: GetWalletsUseCase, + private val feedbackFeatureToggles: FeedbackFeatureToggles, override val dispatchers: CoroutineDispatcherProvider, ) : Model() { @@ -82,8 +85,10 @@ internal class DetailsModel @Inject constructor( items = MutableStateFlow( itemsBuilder.buildAll( isWalletConnectAvailable = isWalletConnectAvailable, + isSupportChatAvailable = feedbackFeatureToggles.isUsedeskEnabled, userWalletId = params.userWalletId, - onSupportClick = ::sendFeedback, + onSupportEmailClick = ::sendFeedback, + onSupportChatClick = ::openUseDesk, onBuyClick = ::onBuyClick, ), ) @@ -134,6 +139,16 @@ internal class DetailsModel @Inject constructor( } } + private fun openUseDesk() { + val scanResponse = + getSelectedWalletSyncUseCase().getOrNull()?.requireColdWallet()?.scanResponse // TODO [REDACTED_TASK_KEY] + ?: error("Selected wallet is null") + + val cardInfo = getCardInfoUseCase(scanResponse).getOrNull() ?: return + + router.push(AppRoute.Usedesk(cardInfo)) + } + private fun showFeedbackEmailTypeOptionBS(selectedCardInfo: CardInfo) { state.update { it.copy( diff --git a/features/details/impl/src/main/kotlin/com/tangem/features/details/utils/ItemsBuilder.kt b/features/details/impl/src/main/kotlin/com/tangem/features/details/utils/ItemsBuilder.kt index f0fd520172..93eee5750e 100644 --- a/features/details/impl/src/main/kotlin/com/tangem/features/details/utils/ItemsBuilder.kt +++ b/features/details/impl/src/main/kotlin/com/tangem/features/details/utils/ItemsBuilder.kt @@ -13,22 +13,30 @@ import com.tangem.features.details.impl.R import kotlinx.collections.immutable.ImmutableList import kotlinx.collections.immutable.persistentListOf import kotlinx.collections.immutable.toImmutableList +import kotlinx.collections.immutable.toPersistentList import javax.inject.Inject @ModelScoped internal class ItemsBuilder @Inject constructor(private val router: Router) { + @Suppress("LongParameterList") fun buildAll( isWalletConnectAvailable: Boolean, + isSupportChatAvailable: Boolean, userWalletId: UserWalletId, - onSupportClick: () -> Unit, + onSupportEmailClick: () -> Unit, + onSupportChatClick: () -> Unit, onBuyClick: () -> Unit, ): ImmutableList = buildList { buildWalletConnectBlock(isWalletConnectAvailable, userWalletId)?.let(::add) buildUserWalletListBlock().let(::add) buildShopBlock(onBuyClick).let(::add) buildSettingsBlock().let(::add) - buildSupportBlock(onSupportClick).let(::add) + buildSupportBlock( + onSupportEmailClick = onSupportEmailClick, + onSupportChatClick = onSupportChatClick, + isSupportChatAvailable = isSupportChatAvailable, + ).let(::add) }.toImmutableList() private fun buildWalletConnectBlock(isWalletConnectAvailable: Boolean, userWalletId: UserWalletId): DetailsItemUM? { @@ -82,17 +90,33 @@ internal class ItemsBuilder @Inject constructor(private val router: Router) { }.toImmutableList(), ) - private fun buildSupportBlock(onClick: () -> Unit): DetailsItemUM = DetailsItemUM.Basic( + private fun buildSupportBlock( + onSupportEmailClick: () -> Unit, + onSupportChatClick: () -> Unit, + isSupportChatAvailable: Boolean, + ): DetailsItemUM = DetailsItemUM.Basic( id = "support", - items = persistentListOf( + items = buildList { DetailsItemUM.Basic.Item( - id = "send_feedback", + id = "support_email", block = BlockUM( text = resourceReference(R.string.details_row_title_contact_to_support), iconRes = R.drawable.ic_comment_24, - onClick = onClick, + onClick = onSupportEmailClick, ), - ), + ).let(::add) + + if (isSupportChatAvailable) { + DetailsItemUM.Basic.Item( + id = "support_chat", + block = BlockUM( + text = resourceReference(R.string.details_row_title_contact_to_support_chat), + iconRes = R.drawable.ic_chat_24, + onClick = onSupportChatClick, + ), + ).let(::add) + } + DetailsItemUM.Basic.Item( id = "disclaimer", block = BlockUM( @@ -100,7 +124,7 @@ internal class ItemsBuilder @Inject constructor(private val router: Router) { iconRes = R.drawable.ic_text_24, onClick = { router.push(AppRoute.Disclaimer(isTosAccepted = true)) }, ), - ), - ), + ).let(::add) + }.toPersistentList(), ) } \ No newline at end of file