Updated on 2026-08-14
This commit is contained in:
parent
1c71c2b112
commit
b34dd2cf84
7 changed files with 98 additions and 13 deletions
|
|
@ -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>> =
|
||||
|
|
|
|||
|
|
@ -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
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -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 -> {
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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 ->
|
||||
|
|
|
|||
|
|
@ -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(),
|
||||
)
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
)
|
||||
Loading…
Add table
Add a link
Reference in a new issue