NTP-20914 | Nikhil | MM passing bank filter from dashboard & spend analysis to transaction history (#14310)

Signed-off-by: kishan kumar <kishan.kumar@navi.com>
Co-authored-by: Shivam Goyal <shivam.goyal@navi.com>
Co-authored-by: Hitesh Kumar <hitesh.kumar@navi.com>
Co-authored-by: Venkat Praneeth Reddy <venkat.praneeth@navi.com>
Co-authored-by: Abhinav Gupta <abhinav.g@navi.com>
Co-authored-by: Ankit Yadav <ankit.yadav@navi.com>
Co-authored-by: Kishan Kumar <kishan.kumar@navi.com>
Co-authored-by: Soumya Ranjan Patra <soumya.ranjan@navi.com>
Co-authored-by: Naman Khurmi <naman.khurmi@navi.com>
Co-authored-by: Sanjay P <sanjay.p@navi.com>
Co-authored-by: Girish Suragani <girish.suragani@navi.com>
Co-authored-by: Aparna Vadlamani <aparna.vadlamani@navi.com>
Co-authored-by: Siddiboina Susai <siddiboina.susai@navi.com>
Co-authored-by: Ayushman Sharma <ayushman.sharma@navi.com>
Co-authored-by: Kamalesh Garnayak <kamalesh.garnayak@navi.com>
This commit is contained in:
nikhil kumar
2024-12-26 16:04:25 +05:30
committed by GitHub
parent 066de43a57
commit 4869b71d24
9 changed files with 113 additions and 54 deletions

View File

@@ -157,4 +157,26 @@ constructor(@ApplicationContext private val context: Context) {
ALL_BANK_ICON_SMALL
}
}
fun getSelectedBanksPillData(
availableBanks: List<AccountOverview>,
selectedBankReferenceIds: Set<String>
): List<String>? {
if (selectedBankReferenceIds.size == availableBanks.size)
return null // Null if all bank selected
// Filter the available banks whose reference IDs are in the selected set
val selectedBanks = availableBanks.filter { it.linkedAccRef in selectedBankReferenceIds }
// Map the selected banks to their names & maskedAccNo
val selectedBankNames =
selectedBanks.map {
"${it.bankCode.orEmpty()} - ${
it.maskedAccNumber?.takeLast(4).orEmpty()
}"
}
// Return the list of selected bank names, or null if the list is empty
return selectedBankNames.takeIf { it.isNotEmpty() }
}
}

View File

@@ -134,7 +134,12 @@ constructor(
selectedBankReferenceIds = updatedSelectedBankReferenceIds,
),
viewTransactionHistoryTitle =
context.resources.getString(R.string.mm_transaction_history)
context.resources.getString(R.string.mm_transaction_history),
selectedBanksPillData =
totalSpendSectionHelper.getSelectedBanksPillData(
availableBanks,
updatedSelectedBankReferenceIds
)
)
}
}

View File

@@ -52,6 +52,7 @@ object Constants {
const val PAGE_SIZE = 100
const val REVOKE_CONSENT_FINARKEIN_URL = "https://revokeconsent.finvu.in/"
const val CPS = "CPS"
const val ALL_BANKS = "All banks"
// datastore constants
const val IS_FIRST_MONTH_SYNC_COMPLETED = "IS_FIRST_MONTH_SYNC_COMPLETED"

View File

@@ -91,7 +91,6 @@ fun DashboardScaffoldRenderer(
onEffect: (DashboardScreenUiEffect) -> Unit,
getViewModel: () -> DashboardViewModel
) {
val scrollState = rememberScrollState()
val density = LocalDensity.current
var headerSectionHeight by remember { mutableIntStateOf(0) }
@@ -344,7 +343,11 @@ fun DashboardScaffoldRenderer(
},
onViewAllTransactionsClick = {
DashboardEventTrackerImpl.onDashboardViewAllTransactionsClicked()
onEffect(DashboardScreenUiEffect.Navigation.TransactionHistory())
onEffect(
DashboardScreenUiEffect.Navigation.TransactionHistory(
filterList = getViewModel().getTransactionFilterList()
)
)
},
trackDashboardBankChipCarouselView = { pillCount ->
DashboardEventTrackerImpl.onDashboardBankAccountsPillsViewed(

View File

@@ -15,9 +15,11 @@ import com.navi.moneymanager.base.viewmodel.MMBaseViewModel
import com.navi.moneymanager.common.analytics.DataProviderEventTrackerImpl
import com.navi.moneymanager.common.analytics.DataSyncEventTrackerImpl
import com.navi.moneymanager.common.dataprovider.data.datastore.DataStoreInfoProvider
import com.navi.moneymanager.common.model.FilterAttribute
import com.navi.moneymanager.common.model.SelectedMonth
import com.navi.moneymanager.common.model.bottomSheet.DashboardScreenBottomSheets
import com.navi.moneymanager.common.network.di.RoomDataStoreInfoProvider
import com.navi.moneymanager.common.utils.Constants.ALL_BANKS
import com.navi.moneymanager.common.utils.Constants.IS_FIRST_MONTH_SYNC_COMPLETED
import com.navi.moneymanager.common.utils.Constants.IS_TOTAL_SYNC_COMPLETED
import com.navi.moneymanager.common.utils.Constants.LAST_REFRESH_SUCCESSFUL_TIMESTAMP
@@ -25,8 +27,11 @@ import com.navi.moneymanager.common.utils.Constants.MM_IS_USER_ONBOARDED
import com.navi.moneymanager.common.utils.Constants.NEW_TRANSACTION_COUNT
import com.navi.moneymanager.common.utils.Constants.SYNC_THRESHOLD_TIME
import com.navi.moneymanager.common.utils.MonthConstants
import com.navi.moneymanager.common.utils.asList
import com.navi.moneymanager.common.utils.checkFinarkeinDataValidity
import com.navi.moneymanager.postonboard.dashboard.model.AddAccountState
import com.navi.moneymanager.postonboard.dashboard.model.BankAccount
import com.navi.moneymanager.postonboard.dashboard.model.BankAccountsState
import com.navi.moneymanager.postonboard.dashboard.model.DashboardScreenUiEffect
import com.navi.moneymanager.postonboard.dashboard.model.DashboardScreenUiEvent
import com.navi.moneymanager.postonboard.dashboard.model.DashboardScreenUiState
@@ -37,6 +42,8 @@ import com.navi.moneymanager.postonboard.dashboard.usecase.RefreshAndSyncDataUse
import com.navi.moneymanager.postonboard.dashboard.usecase.SyncPreviousDataUseCase
import com.navi.moneymanager.postonboard.help.model.HelpBottomSheetState
import com.navi.moneymanager.postonboard.help.usecase.ManageConsentUseCase
import com.navi.moneymanager.postonboard.transactionhistory.model.TransactionFilterData
import com.navi.moneymanager.postonboard.transactionhistory.model.TransactionFilterItem
import com.navi.moneymanager.preonboard.finarkein.model.FinarkeinDataState
import dagger.hilt.android.lifecycle.HiltViewModel
import javax.inject.Inject
@@ -355,4 +362,29 @@ constructor(
)
}
}
fun getTransactionFilterList(): List<TransactionFilterData> = buildList {
val selectedBank = state.value.screenData.recentTransactionsData.selectedBank.orEmpty()
if (selectedBank.isNotEmpty() && selectedBank != ALL_BANKS) {
val bankAccount: BankAccount? =
(state.value.screenData.bankSectionData.state as? BankAccountsState.Loaded)
?.data
?.accounts
?.first { account -> account.referenceId == selectedBank }
bankAccount?.let { account ->
add(
TransactionFilterData(
attributeKey = FilterAttribute.BANK.value,
itemList =
TransactionFilterItem(
valueName = account.bankChipContent,
isSelected = true
)
.asList()
)
)
}
}
}
}

View File

@@ -19,6 +19,7 @@ data class SpendAnalysisScreenData(
val spendCategorizationState: SpendCategorizationState,
val barGraphData: BarGraphData? = null,
val viewTransactionHistoryTitle: String? = null,
val selectedBanksPillData: List<String>? = null
)
data class TotalSpendSectionData(

View File

@@ -30,7 +30,6 @@ import com.navi.common.utils.Constants.WEB_URL
import com.navi.moneymanager.common.analytics.SpendAnalysisEventTrackerImpl
import com.navi.moneymanager.common.composable.bankselectionbottomsheet.BankSelectionBottomSheetContent
import com.navi.moneymanager.common.dataprovider.data.datastore.DataStoreInfoProvider
import com.navi.moneymanager.common.model.FilterAttribute
import com.navi.moneymanager.common.model.SelectedMonth
import com.navi.moneymanager.common.model.bottomSheet.SpendAnalysisScreenBottomSheets
import com.navi.moneymanager.common.navigation.utils.MMScreen
@@ -44,11 +43,8 @@ import com.navi.moneymanager.common.utils.Constants
import com.navi.moneymanager.common.utils.Constants.IS_TOTAL_SYNC_COMPLETED
import com.navi.moneymanager.common.utils.MMScreenEventLogger
import com.navi.moneymanager.common.utils.MonthConstants
import com.navi.moneymanager.common.utils.MonthConstants.monthNames
import com.navi.moneymanager.common.utils.asList
import com.navi.moneymanager.common.utils.getFaqCta
import com.navi.moneymanager.common.utils.getPastMonthDifferenceFromCurrentWithinOneYear
import com.navi.moneymanager.common.utils.getTransactionFilterMonthWithYear
import com.navi.moneymanager.entry.ui.activity.MMActivity
import com.navi.moneymanager.postonboard.categorydetails.model.CategoryDetailsScreenNavigationData
import com.navi.moneymanager.postonboard.help.ui.HelpBottomSheetContent
@@ -56,8 +52,6 @@ import com.navi.moneymanager.postonboard.spendanalysis.model.SpendAnalysisScreen
import com.navi.moneymanager.postonboard.spendanalysis.model.SpendAnalysisScreenUiEvent
import com.navi.moneymanager.postonboard.spendanalysis.model.SpendAnalysisScreenUiState
import com.navi.moneymanager.postonboard.spendanalysis.viewmodel.SpendAnalysisVM
import com.navi.moneymanager.postonboard.transactionhistory.model.TransactionFilterData
import com.navi.moneymanager.postonboard.transactionhistory.model.TransactionFilterItem
import com.navi.moneymanager.postonboard.transactionhistory.model.TransactionHistoryScreenNavigationData
import com.navi.naviwidgets.utils.URL
import com.ramcosta.composedestinations.annotation.Destination
@@ -115,32 +109,14 @@ fun SpendAnalysisScreen(
)
}
is SpendAnalysisScreenUiEffect.Navigation.TransactionHistory -> {
val transactionHistoryScreenData =
selectedMonth.value
.takeIf { it.month != null && it.year != null }
?.let {
TransactionHistoryScreenNavigationData(
TransactionFilterData(
attributeKey = FilterAttribute.MONTH.value,
itemList =
TransactionFilterItem(
valueName =
getTransactionFilterMonthWithYear(
it.month!!,
it.year!!
),
isSelected = true
)
.asList()
)
.asList()
)
}
activity.mmNavigator.navigateTo(
activity = activity,
ctaData = CtaData(url = MMScreen.TRANSACTION_HISTORY.screen),
navigationAction = NavigationAction.Default,
screenData = transactionHistoryScreenData
screenData =
TransactionHistoryScreenNavigationData(
viewModel.getSelectedMonthAndBankPills(selectedMonth.value)
)
)
}
is SpendAnalysisScreenUiEffect.Navigation.CategoryDetailsScreen -> {

View File

@@ -11,11 +11,14 @@ import androidx.lifecycle.viewModelScope
import com.navi.moneymanager.base.viewmodel.MMBaseViewModel
import com.navi.moneymanager.common.analytics.DataProviderEventTrackerImpl
import com.navi.moneymanager.common.dataprovider.data.datastore.DataStoreInfoProvider
import com.navi.moneymanager.common.model.FilterAttribute
import com.navi.moneymanager.common.model.SelectedMonth
import com.navi.moneymanager.common.model.SpendAnalysisScreenInputParams
import com.navi.moneymanager.common.model.bottomSheet.SpendAnalysisScreenBottomSheets
import com.navi.moneymanager.common.network.di.RoomDataStoreInfoProvider
import com.navi.moneymanager.common.utils.Constants.IS_TOTAL_SYNC_COMPLETED
import com.navi.moneymanager.common.utils.asList
import com.navi.moneymanager.common.utils.getTransactionFilterMonthWithYear
import com.navi.moneymanager.postonboard.help.model.HelpBottomSheetState
import com.navi.moneymanager.postonboard.help.usecase.ManageConsentUseCase
import com.navi.moneymanager.postonboard.spendanalysis.model.SpendAnalysisScreenUiEffect
@@ -23,6 +26,8 @@ import com.navi.moneymanager.postonboard.spendanalysis.model.SpendAnalysisScreen
import com.navi.moneymanager.postonboard.spendanalysis.model.SpendAnalysisScreenUiState
import com.navi.moneymanager.postonboard.spendanalysis.reducer.SpendAnalysisScreenReducer
import com.navi.moneymanager.postonboard.spendanalysis.repo.SpendAnalysisRepository
import com.navi.moneymanager.postonboard.transactionhistory.model.TransactionFilterData
import com.navi.moneymanager.postonboard.transactionhistory.model.TransactionFilterItem
import dagger.hilt.android.lifecycle.HiltViewModel
import javax.inject.Inject
import kotlinx.coroutines.Dispatchers
@@ -53,6 +58,7 @@ constructor(
reducer = SpendAnalysisScreenReducer()
) {
private var selectedBanksPillData = listOf<String>()
private val screenParams = MutableStateFlow<SpendAnalysisScreenInputParams?>(null)
@OptIn(ExperimentalCoroutinesApi::class)
@@ -89,6 +95,7 @@ constructor(
Timber.tag("money_manager")
.d("SpendAnalysisVM ${::handleSpendAnalysisScreenData.name}")
sendEvent(SpendAnalysisScreenUiEvent.RenderUI(it))
selectedBanksPillData = it.selectedBanksPillData.orEmpty()
}
}
}
@@ -211,4 +218,37 @@ constructor(
)
}
}
fun getSelectedMonthAndBankPills(selectedMonth: SelectedMonth): List<TransactionFilterData> =
buildList {
if (selectedMonth.month != null && selectedMonth.year != null) {
add(
TransactionFilterData(
attributeKey = FilterAttribute.MONTH.value,
itemList =
TransactionFilterItem(
valueName =
getTransactionFilterMonthWithYear(
selectedMonth.month,
selectedMonth.year
),
isSelected = true
)
.asList()
)
)
}
val bankPills =
selectedBanksPillData.map { bankName ->
TransactionFilterItem(valueName = bankName, isSelected = true)
}
if (bankPills.isNotEmpty()) {
add(
TransactionFilterData(
attributeKey = FilterAttribute.BANK.value,
itemList = bankPills
)
)
}
}
}

View File

@@ -8,7 +8,6 @@
package com.navi.moneymanager.postonboard.transactiondetails.ui
import androidx.compose.foundation.BorderStroke
import androidx.compose.foundation.Canvas
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.Spacer
@@ -17,13 +16,10 @@ import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size
import androidx.compose.foundation.layout.width
import androidx.compose.material3.HorizontalDivider
import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.geometry.Offset
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.graphics.PathEffect
import androidx.compose.ui.graphics.StrokeCap
import androidx.compose.ui.text.style.TextOverflow
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
@@ -148,23 +144,6 @@ fun TransactionMetaDataSection(transactionMetadata: List<TransactionMetadataItem
@Composable
fun SectionWithDivider(content: @Composable () -> Unit) {
content()
DashedLineDivider()
HorizontalDivider(modifier = Modifier.fillMaxWidth(), color = MMColor.borderColor)
Spacer(modifier = Modifier.height(24.dp))
}
@Composable
fun DashedLineDivider() {
Canvas(modifier = Modifier.fillMaxWidth().height(3.dp)) {
val dashWidth = 15f
val dashGap = 10f
val strokeWidth = 3f
drawLine(
color = Color(0xFFE3E5E5),
start = Offset(0f, 0f),
end = Offset(size.width, 0f),
strokeWidth = strokeWidth,
pathEffect = PathEffect.dashPathEffect(floatArrayOf(dashWidth, dashGap), 0f),
cap = StrokeCap.Round
)
}
}