Updated on 2026-08-14

This commit is contained in:
Tangem 2024-11-27 10:42:19 +03:00
parent 1c71c2b112
commit b34dd2cf84
7 changed files with 98 additions and 13 deletions

View file

@ -70,6 +70,7 @@ internal class DefaultOnboardingMultiWalletComponent @AssistedInject constructor
multiWalletState = model.state,
parentParams = params,
innerNavigation = innerNavigationStateFlow,
backups = model.backups,
)
private val childStack: Value<ChildStack<OnboardingMultiWalletState.Step, ComposableContentComponent>> =

View file

@ -8,5 +8,34 @@ import kotlinx.coroutines.flow.MutableStateFlow
class MultiWalletChildParams(
val multiWalletState: MutableStateFlow<OnboardingMultiWalletState>,
val innerNavigation: MutableStateFlow<MultiWalletInnerNavigationState>,
val backups: MutableStateFlow<Backup>,
val parentParams: OnboardingMultiWalletComponent.Params,
)
) {
data class Backup(
val card2: BackupCardInfo? = null,
val card3: BackupCardInfo? = null,
) {
data class BackupCardInfo(
val cardId: String,
val cardPublicKey: ByteArray,
) {
override fun equals(other: Any?): Boolean {
if (this === other) return true
if (javaClass != other?.javaClass) return false
other as BackupCardInfo
if (cardId != other.cardId) return false
if (!cardPublicKey.contentEquals(other.cardPublicKey)) return false
return true
}
override fun hashCode(): Int {
var result = cardId.hashCode()
result = 31 * result + cardPublicKey.contentHashCode()
return result
}
}
}
}

View file

@ -167,6 +167,18 @@ class MultiWalletBackupModel @Inject constructor(
backupCardsNumber = it.backupCardsNumber + 1,
)
}
val backupCardInfo = MultiWalletChildParams.Backup.BackupCardInfo(
cardId = result.data.cardId,
cardPublicKey = result.data.cardPublicKey,
)
params.backups.update {
it.copy(
card2 = if (state.value.backupCardsNumber == 1) backupCardInfo else it.card2,
card3 = if (state.value.backupCardsNumber == 2) backupCardInfo else it.card3,
)
}
setNumberOfBackupCards(state.value.backupCardsNumber)
}
is CompletionResult.Failure -> {

View file

@ -6,6 +6,7 @@ import com.tangem.core.decompose.model.ParamsContainer
import com.tangem.domain.models.scan.CardDTO
import com.tangem.domain.wallets.usecase.GetCardImageUseCase
import com.tangem.features.onboarding.v2.multiwallet.api.OnboardingMultiWalletComponent
import com.tangem.features.onboarding.v2.multiwallet.impl.child.MultiWalletChildParams
import com.tangem.features.onboarding.v2.multiwallet.impl.ui.state.OnboardingMultiWalletUM
import com.tangem.utils.coroutines.CoroutineDispatcherProvider
import kotlinx.coroutines.flow.*
@ -30,6 +31,7 @@ internal class OnboardingMultiWalletModel @Inject constructor(
resultUserWallet = null,
),
)
val backups = MutableStateFlow(MultiWalletChildParams.Backup())
val uiState = _uiState.asStateFlow()
@ -40,6 +42,30 @@ internal class OnboardingMultiWalletModel @Inject constructor(
// }
initScreenTitleSub()
loadCardArtwork()
subscribeToBackups()
}
private fun subscribeToBackups() {
modelScope.launch {
backups.collectLatest { bst ->
when {
_uiState.value.artwork2Url == null && bst.card2 != null -> {
val artwork =
getCardImageUseCase.invoke(bst.card2.cardId, bst.card2.cardPublicKey)
_uiState.update {
it.copy(artwork2Url = artwork)
}
}
_uiState.value.artwork3Url == null && bst.card3 != null -> {
val artwork =
getCardImageUseCase.invoke(bst.card3.cardId, bst.card3.cardPublicKey)
_uiState.update {
it.copy(artwork3Url = artwork)
}
}
}
}
}
}
private fun getInitialStep(): OnboardingMultiWalletState.Step {
@ -76,7 +102,7 @@ internal class OnboardingMultiWalletModel @Inject constructor(
if (artwork != getCardImageUseCase.getDefaultFallbackUrl()) {
_uiState.update {
it.copy(artworkUrl = artwork)
it.copy(artwork1Url = artwork)
}
}
}

View file

@ -25,7 +25,9 @@ internal fun OnboardingMultiWallet(
) {
if (isSeedPhraseState.not()) {
WalletArtworks(
url = state.artworkUrl,
url1 = state.artwork1Url,
url2 = state.artwork2Url,
url3 = state.artwork3Url,
modifier = Modifier
.weight(.56f)
.padding(horizontal = 34.dp)
@ -51,7 +53,7 @@ internal fun OnboardingMultiWallet(
private fun Preview() {
TangemThemePreview {
OnboardingMultiWallet(
state = OnboardingMultiWalletUM(artworkUrl = null),
state = OnboardingMultiWalletUM(artwork1Url = null),
artworksState = WalletArtworksState.Folded,
isSeedPhraseState = false,
childContent = { md ->
@ -71,7 +73,7 @@ private fun Preview() {
private fun Preview2() {
TangemThemePreview {
OnboardingMultiWallet(
state = OnboardingMultiWalletUM(artworkUrl = null),
state = OnboardingMultiWalletUM(artwork1Url = null),
artworksState = WalletArtworksState.Folded,
isSeedPhraseState = true,
childContent = { md ->

View file

@ -58,7 +58,13 @@ sealed class WalletArtworksState {
}
@Composable
fun WalletArtworks(url: String?, state: WalletArtworksState, modifier: Modifier = Modifier) {
fun WalletArtworks(
url1: String?,
url2: String?,
url3: String?,
state: WalletArtworksState,
modifier: Modifier = Modifier,
) {
if (state is WalletArtworksState.Hidden) return
BoxWithConstraints(
@ -116,7 +122,9 @@ fun WalletArtworks(url: String?, state: WalletArtworksState, modifier: Modifier
}
AnimatedWalletCards(
url = url,
url1 = url1,
url2 = url2,
url3 = url3,
modifier = Modifier
.widthIn(max = 450.dp)
.matchParentSize(),
@ -143,9 +151,12 @@ private data class WalletCardTransitionState(
val zIndex: Float = 0f,
)
@Suppress("LongParameterList")
@Composable
private fun AnimatedWalletCards(
url: String?,
url1: String?,
url2: String?,
url3: String?,
transition1: Transition<WalletCardTransitionState>,
transition2: Transition<WalletCardTransitionState>,
transition3: Transition<WalletCardTransitionState>,
@ -190,7 +201,7 @@ private fun AnimatedWalletCards(
scaleY = scaleY3
rotationZ = rotation3
},
url = url,
url = url3,
)
WalletCard(
@ -208,7 +219,7 @@ private fun AnimatedWalletCards(
scaleX = scaleX2
scaleY = scaleY2
},
url = url,
url = url2,
)
WalletCard(
@ -225,7 +236,7 @@ private fun AnimatedWalletCards(
translationY = translationY1
rotationZ = rotation1
},
url = url,
url = url1,
)
}
}
@ -450,7 +461,9 @@ private fun Preview() {
var state: WalletArtworksState by remember { mutableStateOf(WalletArtworksState.Folded) }
WalletArtworks(
url = null,
url1 = null,
url2 = null,
url3 = null,
state = state,
modifier = Modifier.fillMaxWidth(),
)

View file

@ -1,5 +1,7 @@
package com.tangem.features.onboarding.v2.multiwallet.impl.ui.state
internal data class OnboardingMultiWalletUM(
val artworkUrl: String? = null,
val artwork1Url: String? = null,
val artwork2Url: String? = null,
val artwork3Url: String? = null,
)