Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -1,18 +1,16 @@
package com.flipcash.app.advanced.internal

import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.AddCircle
import androidx.compose.material.icons.filled.Science
import androidx.compose.material.icons.outlined.Description
import androidx.compose.material.icons.outlined.Palette
import androidx.compose.runtime.Composable
import androidx.compose.ui.graphics.painter.Painter
import androidx.compose.ui.graphics.vector.rememberVectorPainter
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.res.stringResource
import com.flipcash.app.core.AppRoute
import com.flipcash.app.core.tokens.TokenPurpose
import com.flipcash.app.menu.FullMenuItem
import com.flipcash.features.advanced.R
import com.flipcash.core.R

internal data object BillCustomizer : FullMenuItem<AdvancedFeaturesScreenViewModel.Event>() {
override val icon: Painter
Expand All @@ -29,4 +27,14 @@ internal data object DeviceLogs : FullMenuItem<AdvancedFeaturesScreenViewModel.E
@Composable get() = stringResource(R.string.title_deviceLogs)
override val action: AdvancedFeaturesScreenViewModel.Event =
AdvancedFeaturesScreenViewModel.Event.OpenScreen(AppRoute.Menu.DeviceLogs)
}

internal data object BetaFlags : FullMenuItem<AdvancedFeaturesScreenViewModel.Event>() {
override val showBetaIndicator: Boolean = true
override val icon: Painter
@Composable get() = rememberVectorPainter(Icons.Filled.Science)
override val name: String
@Composable get() = stringResource(R.string.title_betaFlags)
override val action: AdvancedFeaturesScreenViewModel.Event =
AdvancedFeaturesScreenViewModel.Event.OpenScreen(AppRoute.Menu.Lab)
}
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ import javax.inject.Inject
private val FullMenuList = buildList {
add(BillCustomizer)
add(DeviceLogs)
add(BetaFlags)
}

@HiltViewModel
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -43,15 +43,18 @@ internal fun BalanceScreen(
viewModel: BalanceViewModel,
tokenViewModel: SelectTokenViewModel,
) {
val balanceState by viewModel.stateFlow.collectAsStateWithLifecycle()
val tokenState by tokenViewModel.stateFlow.collectAsStateWithLifecycle()
BalanceScreenContent(
depositFirstUx = balanceState.depositFirstUx,
tokenState = tokenState,
dispatchEvent = viewModel::dispatchEvent
)
}

@Composable
private fun BalanceScreenContent(
depositFirstUx: Boolean = false,
tokenState: SelectTokenViewModel.State,
dispatchEvent: (BalanceViewModel.Event) -> Unit
) {
Expand Down Expand Up @@ -97,7 +100,11 @@ private fun BalanceScreenContent(

Text(
modifier = Modifier.fillMaxWidth(0.6f),
text = stringResource(R.string.description_noBalanceYet),
text = if (depositFirstUx) {
stringResource(R.string.description_noBalanceYet)
} else {
stringResource(R.string.description_noBalanceYetDiscover)
},
style = CodeTheme.typography.textSmall,
color = CodeTheme.colors.textSecondary,
textAlign = TextAlign.Center,
Expand All @@ -111,7 +118,11 @@ private fun BalanceScreenContent(
.padding(top = CodeTheme.dimens.grid.x2)
.align(Alignment.CenterHorizontally),
contentPadding = PaddingValues(),
text = stringResource(R.string.action_depositFunds),
text = if (depositFirstUx) {
stringResource(R.string.action_depositFunds)
} else {
stringResource(R.string.action_discoverCurrencies)
},
shape = CircleShape,
)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@ package com.flipcash.app.balance.internal

import androidx.lifecycle.viewModelScope
import com.flipcash.app.core.AppRoute
import com.flipcash.app.featureflags.FeatureFlag
import com.flipcash.app.featureflags.FeatureFlagController
import com.flipcash.app.payments.PurchaseMethodController
import com.flipcash.app.userflags.UserFlagsCoordinator
import com.flipcash.services.internal.model.thirdparty.OnRampProvider
Expand All @@ -25,16 +27,19 @@ internal class BalanceViewModel @Inject constructor(
userFlags: UserFlagsCoordinator,
dispatchers: DispatcherProvider,
purchaseMethodController: PurchaseMethodController,
featureFlags: FeatureFlagController,
) : BaseViewModel<BalanceViewModel.State, BalanceViewModel.Event>(
initialState = State(),
updateStateForEvent = updateStateForEvent,
defaultDispatcher = dispatchers.Default,
) {
data class State(
val depositFirstUx: Boolean = false,
val preferredOnRampProvider: OnRampProvider.Defined? = null,
)

sealed interface Event {
data class DepositFirstUxEnabled(val enabled: Boolean): Event
data class OnPreferredOnRampProviderChanged(val provider: OnRampProvider.Defined?) : Event

data object OpenCurrencySelection : Event
Expand All @@ -44,17 +49,26 @@ internal class BalanceViewModel @Inject constructor(
}

init {
featureFlags.observe(FeatureFlag.DepositFirstUX)
.onEach { dispatchEvent(Event.DepositFirstUxEnabled(it)) }
.launchIn(viewModelScope)

userManager.state
.filter { it.authState is AuthState.Ready }
.flatMapLatest { userFlags.resolvedFlags }
.mapNotNull { it.preferredOnRampProvider.effectiveValue }
.filterIsInstance<OnRampProvider.Defined>()
.onEach { provider -> dispatchEvent(Event.OnPreferredOnRampProviderChanged(provider)) }
.launchIn(viewModelScope)

eventFlow
.filterIsInstance<Event.PresentDepositOptions>()
.mapNotNull { purchaseMethodController.presentDepositOptions(popToRoot = true) }
.map { stateFlow.value.depositFirstUx }
.mapNotNull { depositFirstUx ->
if (!depositFirstUx) {
dispatchEvent(Event.OpenScreen(AppRoute.Token.Discovery))
return@mapNotNull null
}
purchaseMethodController.presentDepositOptions(popToRoot = true) }
.onEach { route -> dispatchEvent(Event.OpenScreen(route)) }
.launchIn(viewModelScope)
}
Expand All @@ -68,6 +82,7 @@ internal class BalanceViewModel @Inject constructor(
}
Event.PresentDepositOptions -> { state -> state }
is Event.OpenScreen -> { state -> state }
is Event.DepositFirstUxEnabled -> { state -> state.copy(depositFirstUx = event.enabled) }
}
}
}
Expand Down
Loading
Loading