Skip to content

Commit 2402a47

Browse files
committed
chore: update remaining direct access of UserFlags and replace with coordinated controller
Signed-off-by: Brandon McAnsh <git@bmcreations.dev>
1 parent 26cfd7b commit 2402a47

9 files changed

Lines changed: 38 additions & 21 deletions

File tree

apps/flipcash/features/advanced/build.gradle.kts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ dependencies {
1010
implementation(project(":apps:flipcash:shared:bill-customization"))
1111
implementation(project(":apps:flipcash:shared:featureflags"))
1212
implementation(project(":apps:flipcash:shared:menu"))
13+
implementation(project(":apps:flipcash:shared:userflags"))
1314

1415
implementation(project(":libs:datetime"))
1516
implementation(project(":libs:messaging"))

apps/flipcash/features/advanced/src/main/kotlin/com/flipcash/app/advanced/internal/AdvancedFeaturesScreenViewModel.kt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import com.flipcash.app.core.AppRoute
55
import com.flipcash.app.featureflags.FeatureFlag
66
import com.flipcash.app.featureflags.FeatureFlagController
77
import com.flipcash.app.menu.MenuItem
8+
import com.flipcash.app.userflags.UserFlagsCoordinator
89
import com.flipcash.services.user.UserManager
910
import com.getcode.util.resources.ResourceHelper
1011
import com.flipcash.libs.coroutines.DispatcherProvider
@@ -25,6 +26,7 @@ private val FullMenuList = buildList {
2526
internal class AdvancedFeaturesScreenViewModel @Inject constructor(
2627
userManager: UserManager,
2728
featureFlagController: FeatureFlagController,
29+
userFlags: UserFlagsCoordinator,
2830
dispatchers: DispatcherProvider,
2931
) : BaseViewModel2<AdvancedFeaturesScreenViewModel.State, AdvancedFeaturesScreenViewModel.Event>(
3032
initialState = State(),
@@ -52,7 +54,7 @@ internal class AdvancedFeaturesScreenViewModel @Inject constructor(
5254

5355
combine(
5456
featureFlagController.observeOverride(),
55-
userManager.state.map { it.flags?.isStaff == true }
57+
userFlags.resolvedFlags.map { it.isStaff.effectiveValue }
5658
) { override, isStaff ->
5759
override || isStaff
5860
}.map {

apps/flipcash/features/balance/build.gradle.kts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ dependencies {
1313
implementation(project(":apps:flipcash:shared:onramp:common"))
1414
implementation(project(":apps:flipcash:shared:featureflags"))
1515
implementation(project(":apps:flipcash:shared:tokens"))
16+
implementation(project(":apps:flipcash:shared:userflags"))
1617
implementation(project(":libs:datetime"))
1718
implementation(project(":libs:messaging"))
1819
implementation(project(":libs:permissions:bindings"))

apps/flipcash/features/balance/src/main/kotlin/com/flipcash/app/balance/internal/BalanceViewModel.kt

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,16 @@ package com.flipcash.app.balance.internal
22

33
import androidx.lifecycle.viewModelScope
44
import com.flipcash.app.core.AppRoute
5+
import com.flipcash.app.userflags.UserFlagsCoordinator
56
import com.flipcash.services.internal.model.thirdparty.OnRampProvider
67
import com.flipcash.services.user.AuthState
78
import com.flipcash.services.user.UserManager
89
import com.flipcash.libs.coroutines.DispatcherProvider
910
import com.getcode.view.BaseViewModel2
1011
import dagger.hilt.android.lifecycle.HiltViewModel
1112
import kotlinx.coroutines.flow.filter
13+
import kotlinx.coroutines.flow.filterIsInstance
14+
import kotlinx.coroutines.flow.flatMapLatest
1215
import kotlinx.coroutines.flow.launchIn
1316
import kotlinx.coroutines.flow.map
1417
import kotlinx.coroutines.flow.mapNotNull
@@ -18,18 +21,19 @@ import javax.inject.Inject
1821
@HiltViewModel
1922
internal class BalanceViewModel @Inject constructor(
2023
userManager: UserManager,
24+
userFlags: UserFlagsCoordinator,
2125
dispatchers: DispatcherProvider,
2226
) : BaseViewModel2<BalanceViewModel.State, BalanceViewModel.Event>(
2327
initialState = State(),
2428
updateStateForEvent = updateStateForEvent,
2529
defaultDispatcher = dispatchers.Default,
2630
) {
2731
data class State(
28-
val preferredOnRampProvider: OnRampProvider? = null,
32+
val preferredOnRampProvider: OnRampProvider.Defined? = null,
2933
)
3034

3135
sealed interface Event {
32-
data class OnPreferredOnRampProviderChanged(val provider: OnRampProvider?) : Event
36+
data class OnPreferredOnRampProviderChanged(val provider: OnRampProvider.Defined?) : Event
3337

3438
data object OpenCurrencySelection : Event
3539

@@ -39,8 +43,9 @@ internal class BalanceViewModel @Inject constructor(
3943
init {
4044
userManager.state
4145
.filter { it.authState is AuthState.LoggedInWithUser }
42-
.mapNotNull { it.flags }
43-
.map { it.preferredOnRampProvider }
46+
.flatMapLatest { userFlags.resolvedFlags }
47+
.mapNotNull { it.preferredOnRampProvider.effectiveValue }
48+
.filterIsInstance<OnRampProvider.Defined>()
4449
.onEach { provider ->
4550
dispatchEvent(Event.OnPreferredOnRampProviderChanged(provider))
4651
}

apps/flipcash/features/lab/build.gradle.kts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,5 +8,6 @@ android {
88

99
dependencies {
1010
implementation(project(":apps:flipcash:shared:featureflags"))
11+
implementation(project(":apps:flipcash:shared:userflags"))
1112
implementation(project(":libs:messaging"))
1213
}

apps/flipcash/features/lab/src/main/kotlin/com/flipcash/app/lab/internal/LabsScreenViewModel.kt

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package com.flipcash.app.lab.internal
22

33
import androidx.lifecycle.ViewModel
44
import androidx.lifecycle.viewModelScope
5+
import com.flipcash.app.userflags.UserFlagsCoordinator
56
import com.flipcash.features.lab.R
67
import com.flipcash.services.controllers.ContactVerificationController
78
import com.flipcash.services.models.UserFlags
@@ -24,20 +25,19 @@ import javax.inject.Inject
2425
@HiltViewModel
2526
class LabsScreenViewModel @Inject constructor(
2627
private val userManager: UserManager,
28+
userFlags: UserFlagsCoordinator,
2729
private val contactController: ContactVerificationController,
2830
private val resources: ResourceHelper,
29-
): ViewModel() {
31+
) : ViewModel() {
3032

3133
val isLoggedIn = userManager
3234
.state.map { it.authState }
3335
.filterIsInstance<AuthState.LoggedInWithUser>()
3436
.map { true }
35-
.stateIn(viewModelScope, started = SharingStarted.Eagerly , initialValue = false)
37+
.stateIn(viewModelScope, started = SharingStarted.Eagerly, initialValue = false)
3638

37-
val isStaff = userManager
38-
.state.map { it.flags }
39-
.map { it?.isStaff == true }
40-
.stateIn(viewModelScope, started = SharingStarted.Eagerly , initialValue = false)
39+
val isStaff = userFlags.resolvedFlags.map { it.isStaff.effectiveValue }
40+
.stateIn(viewModelScope, started = SharingStarted.Eagerly, initialValue = false)
4141

4242
fun unlinkEmail() = viewModelScope.launch {
4343
val email = userManager.profile?.verifiedEmailAddress

apps/flipcash/features/menu/build.gradle.kts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ dependencies {
1313
implementation(project(":apps:flipcash:shared:featureflags"))
1414
implementation(project(":apps:flipcash:shared:menu"))
1515
implementation(project(":apps:flipcash:shared:onramp:common"))
16+
implementation(project(":apps:flipcash:shared:userflags"))
1617

1718
implementation(project(":libs:datetime"))
1819
implementation(project(":libs:messaging"))

apps/flipcash/features/menu/src/main/kotlin/com/flipcash/app/menu/internal/MenuScreenViewModel.kt

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import com.flipcash.app.menu.MenuItem
1414
import com.flipcash.app.onramp.ConfirmationEvent
1515
import com.flipcash.app.onramp.OnRampAmount
1616
import com.flipcash.app.onramp.OnRampAmountController
17+
import com.flipcash.app.userflags.UserFlagsCoordinator
1718
import com.flipcash.features.menu.R
1819
import com.flipcash.services.internal.model.thirdparty.OnRampProvider
1920
import com.flipcash.services.internal.model.thirdparty.OnRampType
@@ -53,6 +54,7 @@ private val FullMenuList = buildList {
5354
internal class MenuScreenViewModel @Inject constructor(
5455
private val resources: ResourceHelper,
5556
userManager: UserManager,
57+
userFlags: UserFlagsCoordinator,
5658
authManager: AuthManager,
5759
versionInfo: VersionInfo,
5860
mnemonicManager: MnemonicManager,
@@ -70,7 +72,7 @@ internal class MenuScreenViewModel @Inject constructor(
7072
val items: List<MenuItem<Event>> = FullMenuList,
7173
val logoTapCount: Int = 0,
7274
val isStaff: Boolean = false,
73-
val preferredOnRampProvider: OnRampProvider? = null,
75+
val preferredOnRampProvider: OnRampProvider.Defined? = null,
7476
val showQuickActions: Boolean = false,
7577
val flags: List<BetaFeature> = emptyList(),
7678
val unlockedBetaFeaturesManually: Boolean = false,
@@ -81,7 +83,7 @@ internal class MenuScreenViewModel @Inject constructor(
8183
data object OnLogoTapped: Event
8284
data class OnBetaFeaturesUnlocked(val unlocked: Boolean): Event
8385
data class OnFeatureFlagsUpdated(val flags: List<BetaFeature>): Event
84-
data class OnPreferredOnRampProviderChanged(val provider: OnRampProvider?): Event
86+
data class OnPreferredOnRampProviderChanged(val provider: OnRampProvider.Defined?): Event
8587
data class OnAppVersionUpdated(val versionInfo: VersionInfo) : Event
8688
data class OnStaffUserDetermined(val staff: Boolean) : Event
8789
data class OpenScreen(val screen: AppRoute) : Event
@@ -100,8 +102,8 @@ internal class MenuScreenViewModel @Inject constructor(
100102

101103
userManager.state
102104
.filter { it.authState is AuthState.LoggedInWithUser }
103-
.mapNotNull { it.flags }
104-
.map { it.isStaff }
105+
.flatMapLatest { userFlags.resolvedFlags }
106+
.mapNotNull { it.isStaff.effectiveValue }
105107
.onEach {
106108
dispatchEvent(Event.OnStaffUserDetermined(it))
107109
}.launchIn(viewModelScope)
@@ -116,8 +118,9 @@ internal class MenuScreenViewModel @Inject constructor(
116118

117119
userManager.state
118120
.filter { it.authState is AuthState.LoggedInWithUser }
119-
.mapNotNull { it.flags }
120-
.map { it.preferredOnRampProvider }
121+
.flatMapLatest { userFlags.resolvedFlags }
122+
.mapNotNull { it.preferredOnRampProvider.effectiveValue }
123+
.filterIsInstance<OnRampProvider.Defined>()
121124
.onEach { provider ->
122125
dispatchEvent(Event.OnPreferredOnRampProviderChanged(provider))
123126
}

apps/flipcash/shared/tokens/src/main/kotlin/com/flipcash/app/tokens/ui/SelectTokenViewModel.kt

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import com.flipcash.app.core.tokens.TokenPurpose
88
import com.flipcash.app.featureflags.FeatureFlag
99
import com.flipcash.app.featureflags.FeatureFlagController
1010
import com.flipcash.app.tokens.TokenCoordinator
11+
import com.flipcash.app.userflags.UserFlagsCoordinator
1112
import com.flipcash.services.internal.model.thirdparty.OnRampProvider
1213
import com.flipcash.services.internal.model.thirdparty.OnRampType
1314
import com.flipcash.services.user.AuthState
@@ -44,6 +45,7 @@ class SelectTokenViewModel @Inject constructor(
4445
exchange: Exchange,
4546
analytics: FlipcashAnalyticsService,
4647
featureFlags: FeatureFlagController,
48+
userFlags: UserFlagsCoordinator,
4749
resources: ResourceHelper,
4850
dispatchers: DispatcherProvider,
4951
) : BaseViewModel2<SelectTokenViewModel.State, SelectTokenViewModel.Event>(
@@ -57,7 +59,7 @@ class SelectTokenViewModel @Inject constructor(
5759
val rate: Rate = Rate.oneToOne,
5860
val reservesEnabled: Boolean = false,
5961
val discoveryEnabled: Boolean = false,
60-
val preferredOnRampProvider: OnRampProvider? = null,
62+
val preferredOnRampProvider: OnRampProvider.Defined? = null,
6163
val tokens: List<TokenWithLocalizedBalance>? = null,
6264
val selectedToken: Mint? = null,
6365
) {
@@ -80,7 +82,7 @@ class SelectTokenViewModel @Inject constructor(
8082
}
8183

8284
sealed interface Event {
83-
data class OnPreferredOnRampProviderChanged(val provider: OnRampProvider?) : Event
85+
data class OnPreferredOnRampProviderChanged(val provider: OnRampProvider.Defined?) : Event
8486
data class OnReservesEnabled(val enabled: Boolean) : Event
8587

8688
data class OnRateChanged(val rate: Rate): Event
@@ -102,8 +104,9 @@ class SelectTokenViewModel @Inject constructor(
102104
init {
103105
userManager.state
104106
.filter { it.authState is AuthState.LoggedInWithUser }
105-
.mapNotNull { it.flags }
106-
.map { it.preferredOnRampProvider }
107+
.flatMapLatest { userFlags.resolvedFlags }
108+
.mapNotNull { it.preferredOnRampProvider.effectiveValue }
109+
.filterIsInstance<OnRampProvider.Defined>()
107110
.onEach { provider ->
108111
dispatchEvent(Event.OnPreferredOnRampProviderChanged(provider))
109112
}

0 commit comments

Comments
 (0)