Skip to content

Commit 532b583

Browse files
authored
Merge pull request #1777 from novasamatech/myth_staking/bond_more
Bond more
2 parents 09be8fd + 201ced3 commit 532b583

File tree

13 files changed

+141
-14
lines changed

13 files changed

+141
-14
lines changed

app/src/main/java/io/novafoundation/nova/app/root/navigation/navigators/staking/mythos/MythosStakingNavigator.kt

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,13 @@ class MythosStakingNavigator(
2828
}
2929

3030
override fun openClaimRewards() {
31-
TODO("Not yet implemented")
31+
// TODO
32+
}
33+
34+
override fun openBondMore() {
35+
navigationBuilder()
36+
.action(R.id.action_open_MythosBondMoreGraph)
37+
.navigateInFirstAttachedContext()
3238
}
3339

3440
override fun returnToStartStaking() {

app/src/main/res/navigation/staking_main_graph.xml

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,14 @@
2929
app:popEnterAnim="@anim/fragment_close_enter"
3030
app:popExitAnim="@anim/fragment_close_exit" />
3131

32+
<action
33+
android:id="@+id/action_open_MythosBondMoreGraph"
34+
app:destination="@id/staking_mythos_start_graph"
35+
app:enterAnim="@anim/fragment_open_enter"
36+
app:exitAnim="@anim/fragment_open_exit"
37+
app:popEnterAnim="@anim/fragment_close_enter"
38+
app:popExitAnim="@anim/fragment_close_exit" />
39+
3240
<action
3341
android:id="@+id/action_open_addStakingProxyFragment"
3442
app:destination="@id/addStakingProxyFragment"
@@ -511,4 +519,6 @@
511519
android:id="@+id/nominationPoolsClaimRewardsFragment"
512520
android:name="io.novafoundation.nova.feature_staking_impl.presentation.nominationPools.claimRewards.NominationPoolsClaimRewardsFragment"
513521
android:label="NominationPoolsClaimRewardsFragment" />
522+
523+
<include app:graph="@navigation/staking_mythos_start_graph" />
514524
</navigation>

feature-staking-impl/src/main/java/io/novafoundation/nova/feature_staking_impl/domain/mythos/main/stakeSummary/MythosStakeSummaryInteractor.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ interface MythosStakeSummaryInteractor {
1717

1818
context(ComputationalScope)
1919
fun stakeSummaryFlow(
20-
delegatorState: MythosDelegatorState,
20+
delegatorState: MythosDelegatorState.Locked,
2121
stakingOption: StakingOption,
2222
): Flow<StakeSummary<MythosDelegatorStatus>>
2323
}
@@ -29,7 +29,7 @@ class RealMythosStakeSummaryInteractor @Inject constructor(
2929

3030
context(ComputationalScope)
3131
override fun stakeSummaryFlow(
32-
delegatorState: MythosDelegatorState,
32+
delegatorState: MythosDelegatorState.Locked,
3333
stakingOption: StakingOption,
3434
): Flow<StakeSummary<MythosDelegatorStatus>> {
3535
val chainId = stakingOption.assetWithChain.chain.id

feature-staking-impl/src/main/java/io/novafoundation/nova/feature_staking_impl/presentation/MythosStakingRouter.kt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,4 +10,8 @@ interface MythosStakingRouter : StarkingReturnableRouter {
1010
fun openConfirmStartStaking(payload: ConfirmStartMythosStakingPayload)
1111

1212
fun openClaimRewards()
13+
14+
fun returnToStartStaking()
15+
16+
fun openBondMore()
1317
}

feature-staking-impl/src/main/java/io/novafoundation/nova/feature_staking_impl/presentation/ParachainStakingRouter.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@ interface ParachainStakingRouter : StarkingReturnableRouter {
1212

1313
fun openStartStaking(payload: StartParachainStakingPayload)
1414

15+
fun returnToStartStaking()
16+
1517
fun openConfirmStartStaking(payload: ConfirmStartParachainStakingPayload)
1618

1719
fun openSearchCollator()

feature-staking-impl/src/main/java/io/novafoundation/nova/feature_staking_impl/presentation/StarkingReturnableRouter.kt

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,5 @@ import io.novafoundation.nova.common.navigation.ReturnableRouter
44

55
interface StarkingReturnableRouter : ReturnableRouter {
66

7-
fun returnToStartStaking()
8-
97
fun returnToStakingMain()
108
}

feature-staking-impl/src/main/java/io/novafoundation/nova/feature_staking_impl/presentation/mythos/start/confirm/ConfirmStartMythosStakingViewModel.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -147,7 +147,7 @@ class ConfirmStartMythosStakingViewModel(
147147
if (previousState.isNotStarted()) {
148148
startStakingRouter.returnToStakingDashboard()
149149
} else {
150-
mythosRouter.returnToStartStaking()
150+
mythosRouter.returnToStakingMain()
151151
}
152152
}
153153

feature-staking-impl/src/main/java/io/novafoundation/nova/feature_staking_impl/presentation/staking/main/components/common/mythos/loadUserStakeState.kt

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,17 +6,17 @@ import io.novafoundation.nova.feature_staking_impl.domain.mythos.common.model.My
66
import io.novafoundation.nova.feature_staking_impl.presentation.staking.main.components.ComponentHostContext
77
import io.novafoundation.nova.feature_staking_impl.presentation.staking.main.components.common.loadHasStakingComponentState
88
import kotlinx.coroutines.flow.Flow
9-
import kotlinx.coroutines.flow.distinctUntilChanged
9+
import kotlinx.coroutines.flow.map
1010

1111
fun <T> MythosSharedComputation.loadUserStakeState(
1212
hostContext: ComponentHostContext,
13-
stateProducer: suspend (MythosDelegatorState) -> Flow<T>,
14-
distinctUntilChanged: (MythosDelegatorState, MythosDelegatorState) -> Boolean = { _, _ -> false },
13+
stateProducer: suspend (MythosDelegatorState.Locked) -> Flow<T>,
1514
): Flow<LoadingState<T>?> = loadHasStakingComponentState(
1615
hostContext = hostContext,
1716
hasStakingStateProducer = {
1817
with(hostContext.scope) {
19-
delegatorStateFlow().distinctUntilChanged(distinctUntilChanged)
18+
delegatorStateFlow()
19+
.map { it as? MythosDelegatorState.Locked }
2020
}
2121
},
2222
componentStateProducer = stateProducer,

feature-staking-impl/src/main/java/io/novafoundation/nova/feature_staking_impl/presentation/staking/main/components/stakeActions/StakeActionsComponent.kt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ package io.novafoundation.nova.feature_staking_impl.presentation.staking.main.co
33
import io.novafoundation.nova.feature_staking_impl.presentation.staking.main.components.ComponentHostContext
44
import io.novafoundation.nova.feature_staking_impl.presentation.staking.main.components.CompoundStakingComponentFactory
55
import io.novafoundation.nova.feature_staking_impl.presentation.staking.main.components.StatefullComponent
6-
import io.novafoundation.nova.feature_staking_impl.presentation.staking.main.components.UnsupportedComponent
6+
import io.novafoundation.nova.feature_staking_impl.presentation.staking.main.components.stakeActions.mythos.MythosStakeActionsComponentFactory
77
import io.novafoundation.nova.feature_staking_impl.presentation.staking.main.components.stakeActions.nominationPools.NominationPoolsStakeActionsComponentFactory
88
import io.novafoundation.nova.feature_staking_impl.presentation.staking.main.components.stakeActions.parachain.ParachainStakeActionsComponentFactory
99
import io.novafoundation.nova.feature_staking_impl.presentation.staking.main.components.stakeActions.parachain.turing.TuringStakeActionsComponentFactory
@@ -27,6 +27,7 @@ class StakeActionsComponentFactory(
2727
private val parachainComponentFactory: ParachainStakeActionsComponentFactory,
2828
private val turingComponentFactory: TuringStakeActionsComponentFactory,
2929
private val nominationPoolsComponentFactory: NominationPoolsStakeActionsComponentFactory,
30+
private val mythosStakeActionsComponentFactory: MythosStakeActionsComponentFactory,
3031
private val compoundStakingComponentFactory: CompoundStakingComponentFactory,
3132
) {
3233

@@ -37,8 +38,7 @@ class StakeActionsComponentFactory(
3738
parachainComponentCreator = parachainComponentFactory::create,
3839
nominationPoolsCreator = nominationPoolsComponentFactory::create,
3940
turingComponentCreator = turingComponentFactory::create,
40-
// TODO stake actions
41-
mythosCreator = UnsupportedComponent.creator(),
41+
mythosCreator = mythosStakeActionsComponentFactory::create,
4242
hostContext = hostContext
4343
)
4444
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
package io.novafoundation.nova.feature_staking_impl.presentation.staking.main.components.stakeActions.mythos
2+
3+
import androidx.lifecycle.MutableLiveData
4+
import io.novafoundation.nova.common.presentation.dataOrNull
5+
import io.novafoundation.nova.common.resources.ResourceManager
6+
import io.novafoundation.nova.common.utils.Event
7+
import io.novafoundation.nova.common.utils.WithCoroutineScopeExtensions
8+
import io.novafoundation.nova.common.utils.flowOf
9+
import io.novafoundation.nova.feature_staking_impl.data.StakingOption
10+
import io.novafoundation.nova.feature_staking_impl.domain.mythos.common.MythosSharedComputation
11+
import io.novafoundation.nova.feature_staking_impl.domain.mythos.common.model.MythosDelegatorState
12+
import io.novafoundation.nova.feature_staking_impl.domain.validations.main.SYSTEM_MANAGE_STAKING_BOND_MORE
13+
import io.novafoundation.nova.feature_staking_impl.presentation.MythosStakingRouter
14+
import io.novafoundation.nova.feature_staking_impl.presentation.staking.main.components.ComponentHostContext
15+
import io.novafoundation.nova.feature_staking_impl.presentation.staking.main.components.common.mythos.loadUserStakeState
16+
import io.novafoundation.nova.feature_staking_impl.presentation.staking.main.components.stakeActions.ManageStakeAction
17+
import io.novafoundation.nova.feature_staking_impl.presentation.staking.main.components.stakeActions.StakeActionsAction
18+
import io.novafoundation.nova.feature_staking_impl.presentation.staking.main.components.stakeActions.StakeActionsComponent
19+
import io.novafoundation.nova.feature_staking_impl.presentation.staking.main.components.stakeActions.StakeActionsEvent
20+
import io.novafoundation.nova.feature_staking_impl.presentation.staking.main.components.stakeActions.StakeActionsState
21+
import io.novafoundation.nova.feature_staking_impl.presentation.staking.main.components.stakeActions.bondMore
22+
import kotlinx.coroutines.CoroutineScope
23+
import kotlinx.coroutines.flow.Flow
24+
import kotlinx.coroutines.flow.map
25+
26+
class MythosStakeActionsComponentFactory(
27+
private val mythosSharedComputation: MythosSharedComputation,
28+
private val resourceManager: ResourceManager,
29+
private val router: MythosStakingRouter,
30+
) {
31+
32+
fun create(
33+
stakingOption: StakingOption,
34+
hostContext: ComponentHostContext
35+
): StakeActionsComponent = MythosStakeActionsComponent(
36+
mythosSharedComputation = mythosSharedComputation,
37+
resourceManager = resourceManager,
38+
router = router,
39+
stakingOption = stakingOption,
40+
hostContext = hostContext
41+
)
42+
}
43+
44+
private class MythosStakeActionsComponent(
45+
private val mythosSharedComputation: MythosSharedComputation,
46+
private val resourceManager: ResourceManager,
47+
private val router: MythosStakingRouter,
48+
49+
private val stakingOption: StakingOption,
50+
private val hostContext: ComponentHostContext,
51+
) : StakeActionsComponent,
52+
CoroutineScope by hostContext.scope,
53+
WithCoroutineScopeExtensions by WithCoroutineScopeExtensions(hostContext.scope) {
54+
55+
override val events = MutableLiveData<Event<StakeActionsEvent>>()
56+
57+
override val state = mythosSharedComputation.loadUserStakeState(
58+
hostContext = hostContext,
59+
stateProducer = ::stateFor
60+
)
61+
.map { it?.dataOrNull }
62+
.shareInBackground()
63+
64+
override fun onAction(action: StakeActionsAction) {
65+
when (action) {
66+
is StakeActionsAction.ActionClicked -> {
67+
navigateToAction(action.action)
68+
}
69+
}
70+
}
71+
72+
private fun navigateToAction(action: ManageStakeAction) {
73+
when (action.id) {
74+
SYSTEM_MANAGE_STAKING_BOND_MORE -> router.openBondMore()
75+
}
76+
}
77+
78+
private fun stateFor(delegatorState: MythosDelegatorState.Locked): Flow<StakeActionsState> {
79+
return flowOf {
80+
val availableActions = availableStakingActionsFor(delegatorState)
81+
82+
StakeActionsState(availableActions)
83+
}
84+
}
85+
86+
private fun availableStakingActionsFor(delegatorState: MythosDelegatorState.Locked): List<ManageStakeAction> = buildList {
87+
add(ManageStakeAction.bondMore(resourceManager))
88+
}
89+
}

feature-staking-impl/src/main/java/io/novafoundation/nova/feature_staking_impl/presentation/staking/main/components/stakeSummary/mythos/MythosStakeSummaryComponent.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ private class MythosStakeSummaryComponent(
4747
)
4848
.shareInBackground()
4949

50-
private fun userStakeSummary(userStakeInfo: MythosDelegatorState): Flow<StakeSummaryModel> {
50+
private fun userStakeSummary(userStakeInfo: MythosDelegatorState.Locked): Flow<StakeSummaryModel> {
5151
return interactor.stakeSummaryFlow(userStakeInfo, stakingOption).flatMapLatest { stakeSummary ->
5252
val status = stakeSummary.status.toUi()
5353

feature-staking-impl/src/main/java/io/novafoundation/nova/feature_staking_impl/presentation/staking/main/di/components/ComponentsModule.kt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import io.novafoundation.nova.feature_staking_impl.presentation.staking.main.com
1313
import io.novafoundation.nova.feature_staking_impl.presentation.staking.main.components.networkInfo.parachain.ParachainNetworkInfoComponentFactory
1414
import io.novafoundation.nova.feature_staking_impl.presentation.staking.main.components.networkInfo.relaychain.RelaychainNetworkInfoComponentFactory
1515
import io.novafoundation.nova.feature_staking_impl.presentation.staking.main.components.stakeActions.StakeActionsComponentFactory
16+
import io.novafoundation.nova.feature_staking_impl.presentation.staking.main.components.stakeActions.mythos.MythosStakeActionsComponentFactory
1617
import io.novafoundation.nova.feature_staking_impl.presentation.staking.main.components.stakeActions.nominationPools.NominationPoolsStakeActionsComponentFactory
1718
import io.novafoundation.nova.feature_staking_impl.presentation.staking.main.components.stakeActions.parachain.ParachainStakeActionsComponentFactory
1819
import io.novafoundation.nova.feature_staking_impl.presentation.staking.main.components.stakeActions.parachain.turing.TuringStakeActionsComponentFactory
@@ -74,12 +75,14 @@ class ComponentsModule {
7475
parachainComponentFactory: ParachainStakeActionsComponentFactory,
7576
turingStakeActionsComponentFactory: TuringStakeActionsComponentFactory,
7677
nominationPoolsStakeActionsComponentFactory: NominationPoolsStakeActionsComponentFactory,
78+
mythosStakeActionsComponentFactory: MythosStakeActionsComponentFactory,
7779
compoundStakingComponentFactory: CompoundStakingComponentFactory,
7880
) = StakeActionsComponentFactory(
7981
relaychainComponentFactory = relaychainComponentFactory,
8082
parachainComponentFactory = parachainComponentFactory,
8183
turingComponentFactory = turingStakeActionsComponentFactory,
8284
nominationPoolsComponentFactory = nominationPoolsStakeActionsComponentFactory,
85+
mythosStakeActionsComponentFactory = mythosStakeActionsComponentFactory,
8386
compoundStakingComponentFactory = compoundStakingComponentFactory
8487
)
8588

feature-staking-impl/src/main/java/io/novafoundation/nova/feature_staking_impl/presentation/staking/main/di/components/MythosModule.kt

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,11 @@ package io.novafoundation.nova.feature_staking_impl.presentation.staking.main.di
33
import dagger.Module
44
import dagger.Provides
55
import io.novafoundation.nova.common.di.scope.ScreenScope
6+
import io.novafoundation.nova.common.resources.ResourceManager
67
import io.novafoundation.nova.feature_staking_impl.domain.mythos.common.MythosSharedComputation
78
import io.novafoundation.nova.feature_staking_impl.domain.mythos.main.stakeSummary.MythosStakeSummaryInteractor
9+
import io.novafoundation.nova.feature_staking_impl.presentation.MythosStakingRouter
10+
import io.novafoundation.nova.feature_staking_impl.presentation.staking.main.components.stakeActions.mythos.MythosStakeActionsComponentFactory
811
import io.novafoundation.nova.feature_staking_impl.presentation.staking.main.components.stakeSummary.mythos.MythosStakeSummaryComponentFactory
912

1013
@Module
@@ -19,4 +22,16 @@ class MythosModule {
1922
mythosSharedComputation = mythosSharedComputation,
2023
interactor = interactor
2124
)
25+
26+
@Provides
27+
@ScreenScope
28+
fun provideStakeActionsFactory(
29+
mythosSharedComputation: MythosSharedComputation,
30+
resourceManager: ResourceManager,
31+
router: MythosStakingRouter,
32+
) = MythosStakeActionsComponentFactory(
33+
mythosSharedComputation = mythosSharedComputation,
34+
resourceManager = resourceManager,
35+
router = router
36+
)
2237
}

0 commit comments

Comments
 (0)