diff --git a/features/onboarding-v2/impl/src/main/kotlin/com/tangem/features/onboarding/v2/multiwallet/impl/DefaultOnboardingMultiWalletComponent.kt b/features/onboarding-v2/impl/src/main/kotlin/com/tangem/features/onboarding/v2/multiwallet/impl/DefaultOnboardingMultiWalletComponent.kt index 0cc5d5aa77..c549a8c051 100644 --- a/features/onboarding-v2/impl/src/main/kotlin/com/tangem/features/onboarding/v2/multiwallet/impl/DefaultOnboardingMultiWalletComponent.kt +++ b/features/onboarding-v2/impl/src/main/kotlin/com/tangem/features/onboarding/v2/multiwallet/impl/DefaultOnboardingMultiWalletComponent.kt @@ -70,6 +70,7 @@ internal class DefaultOnboardingMultiWalletComponent @AssistedInject constructor multiWalletState = model.state, parentParams = params, innerNavigation = innerNavigationStateFlow, + backups = model.backups, ) private val childStack: Value> = diff --git a/features/onboarding-v2/impl/src/main/kotlin/com/tangem/features/onboarding/v2/multiwallet/impl/child/MultiWalletChildParams.kt b/features/onboarding-v2/impl/src/main/kotlin/com/tangem/features/onboarding/v2/multiwallet/impl/child/MultiWalletChildParams.kt index f912a9b20c..8fee788c8b 100644 --- a/features/onboarding-v2/impl/src/main/kotlin/com/tangem/features/onboarding/v2/multiwallet/impl/child/MultiWalletChildParams.kt +++ b/features/onboarding-v2/impl/src/main/kotlin/com/tangem/features/onboarding/v2/multiwallet/impl/child/MultiWalletChildParams.kt @@ -8,5 +8,34 @@ import kotlinx.coroutines.flow.MutableStateFlow class MultiWalletChildParams( val multiWalletState: MutableStateFlow, val innerNavigation: MutableStateFlow, + val backups: MutableStateFlow, val parentParams: OnboardingMultiWalletComponent.Params, -) \ No newline at end of file +) { + 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 + } + } + } +} \ No newline at end of file diff --git a/features/onboarding-v2/impl/src/main/kotlin/com/tangem/features/onboarding/v2/multiwallet/impl/child/backup/model/MultiWalletBackupModel.kt b/features/onboarding-v2/impl/src/main/kotlin/com/tangem/features/onboarding/v2/multiwallet/impl/child/backup/model/MultiWalletBackupModel.kt index 1528ccd94d..6240bb5d02 100644 --- a/features/onboarding-v2/impl/src/main/kotlin/com/tangem/features/onboarding/v2/multiwallet/impl/child/backup/model/MultiWalletBackupModel.kt +++ b/features/onboarding-v2/impl/src/main/kotlin/com/tangem/features/onboarding/v2/multiwallet/impl/child/backup/model/MultiWalletBackupModel.kt @@ -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 -> { diff --git a/features/onboarding-v2/impl/src/main/kotlin/com/tangem/features/onboarding/v2/multiwallet/impl/model/OnboardingMultiWalletModel.kt b/features/onboarding-v2/impl/src/main/kotlin/com/tangem/features/onboarding/v2/multiwallet/impl/model/OnboardingMultiWalletModel.kt index cfd4d2429a..7101f44d92 100644 --- a/features/onboarding-v2/impl/src/main/kotlin/com/tangem/features/onboarding/v2/multiwallet/impl/model/OnboardingMultiWalletModel.kt +++ b/features/onboarding-v2/impl/src/main/kotlin/com/tangem/features/onboarding/v2/multiwallet/impl/model/OnboardingMultiWalletModel.kt @@ -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) } } } diff --git a/features/onboarding-v2/impl/src/main/kotlin/com/tangem/features/onboarding/v2/multiwallet/impl/ui/OnboardingMultiWallet.kt b/features/onboarding-v2/impl/src/main/kotlin/com/tangem/features/onboarding/v2/multiwallet/impl/ui/OnboardingMultiWallet.kt index c698e7e721..5bd08a64cc 100644 --- a/features/onboarding-v2/impl/src/main/kotlin/com/tangem/features/onboarding/v2/multiwallet/impl/ui/OnboardingMultiWallet.kt +++ b/features/onboarding-v2/impl/src/main/kotlin/com/tangem/features/onboarding/v2/multiwallet/impl/ui/OnboardingMultiWallet.kt @@ -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 -> diff --git a/features/onboarding-v2/impl/src/main/kotlin/com/tangem/features/onboarding/v2/multiwallet/impl/ui/WalletArtwork.kt b/features/onboarding-v2/impl/src/main/kotlin/com/tangem/features/onboarding/v2/multiwallet/impl/ui/WalletArtwork.kt index 2c1b7f784c..78d304117a 100644 --- a/features/onboarding-v2/impl/src/main/kotlin/com/tangem/features/onboarding/v2/multiwallet/impl/ui/WalletArtwork.kt +++ b/features/onboarding-v2/impl/src/main/kotlin/com/tangem/features/onboarding/v2/multiwallet/impl/ui/WalletArtwork.kt @@ -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, transition2: Transition, transition3: Transition, @@ -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(), ) diff --git a/features/onboarding-v2/impl/src/main/kotlin/com/tangem/features/onboarding/v2/multiwallet/impl/ui/state/OnboardingMultiWalletUM.kt b/features/onboarding-v2/impl/src/main/kotlin/com/tangem/features/onboarding/v2/multiwallet/impl/ui/state/OnboardingMultiWalletUM.kt index 1e4884ea7a..829828761d 100644 --- a/features/onboarding-v2/impl/src/main/kotlin/com/tangem/features/onboarding/v2/multiwallet/impl/ui/state/OnboardingMultiWalletUM.kt +++ b/features/onboarding-v2/impl/src/main/kotlin/com/tangem/features/onboarding/v2/multiwallet/impl/ui/state/OnboardingMultiWalletUM.kt @@ -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, ) \ No newline at end of file