Skip to content

Commit

Permalink
feat(mvp): AND-6741 Prices filters (#4134)
Browse files Browse the repository at this point in the history
* prices

* prices filters

* prices filters

* signed in event

* ktlint
  • Loading branch information
antonis-bc committed Nov 22, 2022
1 parent 364444b commit d2d0c2a
Show file tree
Hide file tree
Showing 17 changed files with 394 additions and 75 deletions.
Expand Up @@ -19,6 +19,8 @@ import com.blockchain.preferences.CurrencyPrefs
import com.blockchain.preferences.WalletStatusPrefs
import com.blockchain.utils.rxCompletableOutcome
import com.blockchain.utils.then
import com.blockchain.walletmode.WalletMode
import com.blockchain.walletmode.WalletModeService
import info.blockchain.balance.AssetCatalogue
import info.blockchain.balance.FiatCurrency.Companion.Dollars
import info.blockchain.wallet.api.data.Settings
Expand All @@ -44,6 +46,7 @@ class LoaderInteractor(
private val settingsDataManager: SettingsDataManager,
private val notificationTokenManager: NotificationTokenManager,
private val currencyPrefs: CurrencyPrefs,
private val walletModeService: WalletModeService,
private val nabuUserDataManager: NabuUserDataManager,
private val walletPrefs: WalletStatusPrefs,
private val analytics: Analytics,
Expand Down Expand Up @@ -176,7 +179,7 @@ class LoaderInteractor(
}
emitter.onComplete()
walletPrefs.isAppUnlocked = true
analytics.logEvent(LoginAnalyticsEvent)
analytics.logEvent(LoginAnalyticsEvent(walletModeService.enabledWalletMode() != WalletMode.UNIVERSAL))
}

private fun updateUserFiatIfNotSet(): Completable {
Expand All @@ -203,10 +206,12 @@ class LoaderInteractor(
} else Completable.complete()
}

object LoginAnalyticsEvent : AnalyticsEvent {
class LoginAnalyticsEvent(private val isOnMvp: Boolean) : AnalyticsEvent {
override val event: String
get() = AnalyticsNames.SIGNED_IN.eventName
override val params: Map<String, Serializable>
get() = mapOf()
get() = mapOf(
"is_superapp_mvp" to isOnMvp
)
}
}
Expand Up @@ -36,6 +36,7 @@ val loaderModule = module {
notificationTokenManager = get(),
settingsDataManager = get(),
prerequisites = get(),
walletModeService = get(),
ioScheduler = Schedulers.io(),
deepLinkPersistence = get(),
referralService = get(),
Expand Down
Expand Up @@ -4,14 +4,17 @@ import com.blockchain.commonarch.presentation.mvi_v2.ModelState
import com.blockchain.core.price.Prices24HrWithDelta
import info.blockchain.balance.AssetInfo
import info.blockchain.balance.Currency
import piuk.blockchain.android.ui.prices.presentation.PricesFilter

data class PricesModelState(
val isLoadingData: Boolean = false,
val isError: Boolean = false,
val fiatCurrency: Currency? = null,
val filters: List<PricesFilter> = emptyList(),
val tradableCurrencies: List<String>,
val data: List<PricesItem> = listOf(),
val filterBy: String = ""
val queryBy: String = "",
val filterBy: PricesFilter = PricesFilter.All
) : ModelState

data class PricesItem(
Expand Down
Expand Up @@ -81,7 +81,14 @@ class PricesFragment :
viewState = it,
retryAction = ::loadAssetsAvailable,
pricesItemClicked = ::pricesItemClicked,
filterData = ::filterData
filterData = ::filterData,
filterAction = { filter ->
viewModel.onIntent(
PricesIntents.Filter(
filter
)
)
}
)
}
}
Expand All @@ -99,7 +106,7 @@ class PricesFragment :
}

private fun filterData(filter: String) {
viewModel.onIntent(PricesIntents.FilterData(filter))
viewModel.onIntent(PricesIntents.Search(filter))
}

companion object {
Expand Down
Expand Up @@ -12,7 +12,9 @@ sealed interface PricesIntents : Intent<PricesModelState> {
}
}

data class FilterData(val filter: String) : PricesIntents
data class Search(val query: String) : PricesIntents

data class Filter(val filter: PricesFilter) : PricesIntents

data class PricesItemClicked(
val cryptoCurrency: AssetInfo,
Expand Down
Expand Up @@ -11,7 +11,8 @@ val pricesPresentationModule = module {
walletModeService = get(),
coincore = get(),
exchangeRatesDataManager = get(),
custodialWalletManager = get()
custodialWalletManager = get(),
pricesPrefs = get()
)
}
}
Expand Down
Expand Up @@ -13,6 +13,9 @@ import androidx.compose.ui.res.dimensionResource
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.tooling.preview.Preview
import com.blockchain.componentlib.control.Search
import com.blockchain.componentlib.filter.FilterState
import com.blockchain.componentlib.filter.LabeledFilterState
import com.blockchain.componentlib.filter.LabeledFiltersGroup
import com.blockchain.componentlib.theme.AppTheme
import info.blockchain.balance.AssetInfo
import piuk.blockchain.android.R
Expand All @@ -24,59 +27,101 @@ import piuk.blockchain.android.ui.prices.presentation.composables.PricesScreenEr
fun PricesScreen(
viewState: PricesViewState,
retryAction: () -> Unit,
filterAction: (PricesFilter) -> Unit,
pricesItemClicked: (AssetInfo) -> Unit,
filterData: (String) -> Unit,
) {
with(viewState) {
when {
isLoading -> PriceScreenLoading()
isError -> PricesScreenError(retryAction)
else -> {
Column {
Box(
modifier = Modifier.padding(
start = AppTheme.dimensions.standardSpacing,
top = AppTheme.dimensions.tinySpacing,
end = AppTheme.dimensions.standardSpacing,
bottom = AppTheme.dimensions.smallSpacing
)
) {
Search(
label = stringResource(R.string.search_coins_hint),
onValueChange = filterData
)
}
else -> PricesScreenData(
pricesItemClicked,
filterData,
viewState.selectedFilter,
viewState.availableFilters,
filterAction,
viewState.data
)
}
}
}

@Composable
fun PricesScreenData(
pricesItemClicked: (AssetInfo) -> Unit,
filterData: (String) -> Unit,
selectedFilter: PricesFilter,
filters: List<PricesFilter>,
filterAction: (PricesFilter) -> Unit,
data: List<PriceItemViewState>
) {
Column {
Box(
modifier = Modifier.padding(
start = AppTheme.dimensions.standardSpacing,
top = AppTheme.dimensions.tinySpacing,
end = AppTheme.dimensions.standardSpacing,
bottom = AppTheme.dimensions.smallSpacing
)
) {
Search(
label = stringResource(R.string.search_coins_hint),
onValueChange = filterData
)
}
if (filters.isNotEmpty()) {
LabeledFiltersGroup(
filters = filters.map { filter ->
LabeledFilterState(
text = stringResource(id = filter.title()),
onSelected = { filterAction(filter) },
state = if (selectedFilter == filter) FilterState.SELECTED else FilterState.UNSELECTED
)
},
modifier = Modifier.padding(
horizontal = AppTheme.dimensions.standardSpacing,
vertical = AppTheme.dimensions.smallSpacing
)
)
}

LazyColumn {
items(
items = data,
) {
PriceListItem(
priceItem = it,
onClick = { pricesItemClicked(it.assetInfo) }
)
}
LazyColumn {
items(
items = data,
) {
PriceListItem(
priceItem = it,
onClick = { pricesItemClicked(it.assetInfo) }
)
}

item {
Spacer(Modifier.size(dimensionResource(R.dimen.standard_spacing)))
}
}
}
item {
Spacer(Modifier.size(dimensionResource(R.dimen.standard_spacing)))
}
}
}
}

private fun PricesFilter.title(): Int {
return when (this) {
PricesFilter.All -> R.string.all_prices
PricesFilter.Tradable -> R.string.tradable
}
}

@Preview(name = "Loading", showBackground = true)
@Composable
fun PreviewInterestDashboardScreenLoading() {
PricesScreen(
PricesViewState(
isLoading = true,
isError = false,
selectedFilter = PricesFilter.All,
availableFilters = emptyList(),
data = listOf()
),
{}, {}, {},
{}, {}, {}, {},
)
}

Expand All @@ -87,9 +132,11 @@ fun PreviewInterestDashboardScreenError() {
PricesViewState(
isLoading = false,
isError = true,
selectedFilter = PricesFilter.All,
availableFilters = emptyList(),
data = listOf()
),
{}, {}, {},
{}, {}, {}, {},
)
}

Expand All @@ -100,8 +147,10 @@ fun PreviewInterestDashboardScreenDataNoKyc() {
PricesViewState(
isLoading = false,
isError = false,
selectedFilter = PricesFilter.All,
availableFilters = emptyList(),
data = listOf()
),
{}, {}, {},
{}, {}, {}, {},
)
}

0 comments on commit d2d0c2a

Please sign in to comment.