Updated on 2026-08-14

This commit is contained in:
Tangem 2025-12-08 19:20:12 +03:00
parent dffa8b2658
commit 7f8592c007
3 changed files with 57 additions and 6 deletions

View file

@ -2,6 +2,7 @@ package com.tangem.tap.di.domain
import com.tangem.domain.hotwallet.GetAccessCodeSkippedUseCase
import com.tangem.domain.hotwallet.IsHotWalletCreationSupported
import com.tangem.domain.hotwallet.IsAccessCodeSimpleUseCase
import com.tangem.domain.hotwallet.SetAccessCodeSkippedUseCase
import com.tangem.domain.hotwallet.repository.HotWalletRepository
import dagger.Module
@ -26,6 +27,12 @@ internal object HotWalletDomainModule {
return SetAccessCodeSkippedUseCase(hotWalletRepository)
}
@Provides
@Singleton
fun provideIsAccessCodeSimpleUseCase(): IsAccessCodeSimpleUseCase {
return IsAccessCodeSimpleUseCase()
}
@Provides
@Singleton
fun provideIsWalletCreationSupportedUseCase(

View file

@ -0,0 +1,13 @@
package com.tangem.domain.hotwallet
class IsAccessCodeSimpleUseCase {
operator fun invoke(accessCode: String): Boolean {
return isSequential(accessCode) || isRepeatedCharacters(accessCode)
}
fun isSequential(code: String): Boolean = code.length > 1 &&
(code.zipWithNext().all { it.second == it.first + 1 } ||
code.zipWithNext().all { it.second == it.first - 1 })
fun isRepeatedCharacters(code: String): Boolean = code.isNotEmpty() && code.all { it == code.first() }
}

View file

@ -11,6 +11,7 @@ import com.tangem.core.ui.extensions.resourceReference
import com.tangem.core.ui.message.DialogMessage
import com.tangem.core.ui.message.EventMessageAction
import com.tangem.domain.common.wallets.UserWalletsListRepository
import com.tangem.domain.hotwallet.IsAccessCodeSimpleUseCase
import com.tangem.domain.models.wallet.UserWallet
import com.tangem.domain.models.wallet.UserWalletId
import com.tangem.domain.settings.CanUseBiometryUseCase
@ -56,6 +57,7 @@ internal class AccessCodeModel @Inject constructor(
private val shouldShowAskBiometryUseCase: ShouldShowAskBiometryUseCase,
private val setAskBiometryShownUseCase: SetAskBiometryShownUseCase,
private val canUseBiometryUseCase: CanUseBiometryUseCase,
private val isAccessCodeSimpleUseCase: IsAccessCodeSimpleUseCase,
private val uiMessageSender: UiMessageSender,
) : Model() {
@ -117,16 +119,45 @@ internal class AccessCodeModel @Inject constructor(
modelScope.launch {
delay(timeMillis = SUCCESS_DISPLAY_DURATION_MS)
params.callbacks.onNewAccessCodeInput(params.userWalletId, uiState.value.accessCode)
uiState.update { currentState ->
currentState.copy(
accessCode = "",
)
if (isAccessCodeSimpleUseCase(uiState.value.accessCode)) {
showSimpleAccessCodeDialog()
} else {
setNewCode()
}
}
}
private fun setNewCode() {
params.callbacks.onNewAccessCodeInput(params.userWalletId, uiState.value.accessCode)
uiState.update { currentState ->
currentState.copy(
accessCode = "",
)
}
}
private fun showSimpleAccessCodeDialog() {
uiMessageSender.send(
DialogMessage(
title = resourceReference(R.string.access_code_alert_validation_title),
message = resourceReference(R.string.access_code_alert_validation_description),
firstAction = EventMessageAction(
title = resourceReference(R.string.access_code_alert_validation_cancel),
onClick = {
uiState.update { currentState ->
currentState.copy(onAccessCodeChange = ::onAccessCodeChange)
}
},
),
secondAction = EventMessageAction(
title = resourceReference(R.string.access_code_alert_validation_ok),
onClick = ::setNewCode,
),
),
)
}
private suspend fun showErrorAndReset() {
uiState.update { currentState ->
currentState.copy(