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:
@@ -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() }
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
)
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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(
|
||||
|
||||
@@ -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()
|
||||
)
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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(
|
||||
|
||||
@@ -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 -> {
|
||||
|
||||
@@ -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
|
||||
)
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user