NTP-38165 | Quick filter functionality for fund listing v4 (#15286)

This commit is contained in:
A Shrihari Raju
2025-03-06 16:21:10 +05:30
committed by GitHub
parent fd17d049a1
commit 1ff750ff28
5 changed files with 89 additions and 6 deletions

View File

@@ -334,16 +334,26 @@ class FundListingFragmentV2 : AmcBaseFragment(), WidgetCallback {
)
}
if (selectedItems.isNotNullAndNotEmpty()) {
selectedItems?.let { addFilterDataChips(it, isQuickFilter = false) }
if (viewModel.isEligibleForThemeChange == true) {
binding.filter.filterTitle.visibility = View.GONE
if (viewModel.isQuickFilterEnabled) {
viewModel.quickFilters?.let {
binding.filter.quickFilterTitle.setSpannableString(it.title)
it.suggestedItems?.let { it1 ->
addQuickFilterChips(it1, isQuickFilter = true)
}
}
} else {
selectedItems?.let { addFilterDataChips(it, isQuickFilter = false) }
binding.filter.quickFilterTitle.visibility = View.GONE
}
if (viewModel.isEligibleForThemeChange == true) {
binding.filter.filterTitle.visibility = View.GONE
}
} else {
viewModel.isQuickFilterEnabled = true
viewModel.quickFilters?.let {
binding.filter.quickFilterTitle.setSpannableString(it.title)
it.suggestedItems?.let { quickFilters ->
addFilterDataChips(quickFilters, isQuickFilter = true)
addQuickFilterChips(quickFilters, isQuickFilter = true)
}
}
}
@@ -439,6 +449,7 @@ class FundListingFragmentV2 : AmcBaseFragment(), WidgetCallback {
),
),
key = it.value,
isSelected = viewModel.isFilterAlreadyApplied(it.value),
)
}
binding.filter.chips.apply {
@@ -455,6 +466,63 @@ class FundListingFragmentV2 : AmcBaseFragment(), WidgetCallback {
if (viewModel.isEligibleForThemeChange != true) list.isNotEmpty() else false
}
private fun addQuickFilterChips(
quickFilterList: List<Identifier>,
isQuickFilter: Boolean = false,
) {
val chipUiData =
quickFilterList.map {
ChipData(
borderColor = PURPLE,
title =
TextWithStyle(
text = it.value,
style =
listOf(
NaviSpan(
fontSize = 14.0,
fontName = FontWeightEnum.NAVI_HEADLINE_REGULAR.name,
spanColor = PURPLE,
)
),
),
key = it.value,
isSelected = viewModel.isFilterAlreadyApplied(it.value),
)
}
binding.filter.chips.apply {
visibility = View.VISIBLE
setProperties(
chipUiData,
{ key ->
if (viewModel.isFilterAlreadyApplied(key)) {
sendEvent(
AmcAnalytics.AMC_QUICK_FILTER_TAG_TAGGED,
hashMapOf(
Pair(AmcAnalytics.SCREEN_NAME, screenName),
Pair(AmcAnalytics.TYPE, "remove"),
Pair(FUND_CATEGORY, key),
),
)
removeFilterDataKey(key)
} else {
sendEvent(
AmcAnalytics.AMC_QUICK_FILTER_TAG_TAGGED,
hashMapOf(
Pair(AmcAnalytics.SCREEN_NAME, screenName),
Pair(AmcAnalytics.TYPE, "add"),
Pair(FUND_CATEGORY, key),
),
)
addFilterDataKey(key)
}
},
isQuickFilter,
)
}
quickFilterList.let {}
}
private fun removeFilterDataKey(key: String) {
viewModel.removeFilterKey(key)
}
@@ -537,6 +605,10 @@ class FundListingFragmentV2 : AmcBaseFragment(), WidgetCallback {
strokeWidth = dpToPxInInt(1),
)
} else {
sendEvent(
AmcAnalytics.AMC_FUND_SEARCH_CLICKED,
hashMapOf(Pair(AmcAnalytics.SCREEN_NAME, screenName)),
)
binding.filter.searchField.background =
getNaviDrawable(
backgroundColor = WHITE.parseColorSafe(),
@@ -648,6 +720,7 @@ class FundListingFragmentV2 : AmcBaseFragment(), WidgetCallback {
}
private fun setFilterItemList(list: List<Identifier>) {
viewModel.isQuickFilterEnabled = false
viewModel.setSelectedFilterItems(list, screenName)
}

View File

@@ -14,4 +14,5 @@ data class ChipData(
@SerializedName("title") val title: TextWithStyle? = null,
@SerializedName("borderColor") val borderColor: String? = null,
@SerializedName("key") val key: String? = null,
@SerializedName("isSelected") var isSelected: Boolean = true,
)

View File

@@ -93,6 +93,7 @@ class FundListViewModel @Inject constructor(private val repository: FundListRepo
private var faqListItems: List<FaqItemData>? = null
var quickFilters: FilterItems? = null
var isQuickFilterEnabled: Boolean = true
fun fetchFundsData(fundCategory: String?, screenName: String) {
viewModelScope.launch {
@@ -441,6 +442,7 @@ class FundListViewModel @Inject constructor(private val repository: FundListRepo
response.errors.isNullOrEmpty() &&
response.data.isNotNull()
) {
fundCategory?.let { isQuickFilterEnabled = false }
_fundListDataV3.value = response.data
} else {
setErrorData(response.errors, response.error)
@@ -601,4 +603,8 @@ class FundListViewModel @Inject constructor(private val repository: FundListRepo
)
return null
}
fun isFilterAlreadyApplied(key: String?): Boolean {
return selectedFilterItems.value?.any { it.value == key }.orFalse()
}
}

View File

@@ -52,13 +52,13 @@ class HorizontalChipGroupView(context: Context, attributeSet: AttributeSet? = nu
DataBindingUtil.inflate(inflater, R.layout.chip_view, binding.group, false)
childBinding.apply {
title.setSpannableString(data.title)
if (!isQuickFilter) {
if (data.isSelected) {
icon.setColorFilter(data.borderColor.parseColorSafe())
} else {
icon.visibility = View.GONE
}
root.background =
if (isQuickFilter)
if (!data.isSelected)
getNaviDrawable(
cornerRadius = resources.getDimension(DesignR.dimen.dp_4).toInt(),
backgroundColor = WHITE.parseColorSafe(),

View File

@@ -278,6 +278,9 @@ object AmcAnalytics {
const val AMC_TARGET_SETUP_CTA_CLICK = "amc_target_setup_cta_click"
const val AMC_TARGET_SETUP_BOTTOMSHEET_CTA_CLICK = "amc_target_setup_bottom_sheet_cta_click"
const val AMC_FUND_SEARCH_CLICKED = "amc_fund_search_clicked"
const val AMC_QUICK_FILTER_TAG_TAGGED = "amc_quick_filter_tag_tagged"
fun sendEvent(
eventsData: GenericAnalyticsData?,
extraAttributes: HashMap<String, String>? = null,