diff --git a/screen/loans/src/main/java/com/ivy/loans/loan/TabularLoanBottomBar.kt b/screen/loans/src/main/java/com/ivy/loans/loan/LoanBottomBar.kt similarity index 98% rename from screen/loans/src/main/java/com/ivy/loans/loan/TabularLoanBottomBar.kt rename to screen/loans/src/main/java/com/ivy/loans/loan/LoanBottomBar.kt index b7c195fe69..a96c35d538 100644 --- a/screen/loans/src/main/java/com/ivy/loans/loan/TabularLoanBottomBar.kt +++ b/screen/loans/src/main/java/com/ivy/loans/loan/LoanBottomBar.kt @@ -48,7 +48,7 @@ val FAB_BUTTON_SIZE = 56.dp const val ZINDEX = 200f @Composable -internal fun BoxWithConstraintsScope.TabularLoanBottomBar( +internal fun BoxWithConstraintsScope.LoanBottomBar( tab: LoanTab, selectTab: (LoanTab) -> Unit, onAdd: () -> Unit @@ -158,7 +158,7 @@ private fun PreviewTabularBottomBar() { ) { } - TabularLoanBottomBar( + LoanBottomBar( tab = LoanTab.PENDING, selectTab = {}, onAdd = {} diff --git a/screen/loans/src/main/java/com/ivy/loans/loan/LoanScreenMode.kt b/screen/loans/src/main/java/com/ivy/loans/loan/LoanScreenMode.kt deleted file mode 100644 index 4d1102c2fc..0000000000 --- a/screen/loans/src/main/java/com/ivy/loans/loan/LoanScreenMode.kt +++ /dev/null @@ -1,6 +0,0 @@ -package com.ivy.loans.loan - -sealed interface LoanScreenMode { - data object TabularMode : LoanScreenMode - data object NonTabularMode : LoanScreenMode -} \ No newline at end of file diff --git a/screen/loans/src/main/java/com/ivy/loans/loan/LoanScreenState.kt b/screen/loans/src/main/java/com/ivy/loans/loan/LoanScreenState.kt index 42dcbf8877..875b2a8de2 100644 --- a/screen/loans/src/main/java/com/ivy/loans/loan/LoanScreenState.kt +++ b/screen/loans/src/main/java/com/ivy/loans/loan/LoanScreenState.kt @@ -8,7 +8,6 @@ import java.time.Instant data class LoanScreenState( val baseCurrency: String, - val loans: ImmutableList, val completedLoans: ImmutableList, val pendingLoans: ImmutableList, val accounts: ImmutableList, @@ -18,7 +17,6 @@ data class LoanScreenState( val totalOweAmount: String, val totalOwedAmount: String, val paidOffLoanVisibility: Boolean, - val screenMode: LoanScreenMode, val dateTime: Instant, val selectedTab: LoanTab ) \ No newline at end of file diff --git a/screen/loans/src/main/java/com/ivy/loans/loan/LoanViewModel.kt b/screen/loans/src/main/java/com/ivy/loans/loan/LoanViewModel.kt index af28d91863..af07cf750c 100644 --- a/screen/loans/src/main/java/com/ivy/loans/loan/LoanViewModel.kt +++ b/screen/loans/src/main/java/com/ivy/loans/loan/LoanViewModel.kt @@ -15,7 +15,6 @@ import com.ivy.data.db.dao.read.LoanRecordDao import com.ivy.data.db.dao.read.SettingsDao import com.ivy.data.db.dao.write.WriteLoanDao import com.ivy.data.model.LoanType -import com.ivy.domain.features.Features import com.ivy.frp.test.TestIdlingResource import com.ivy.legacy.datamodel.Account import com.ivy.legacy.datamodel.Loan @@ -58,12 +57,10 @@ class LoanViewModel @Inject constructor( private val loanWriter: WriteLoanDao, private val timeConverter: TimeConverter, private val timeProvider: TimeProvider, - private val dateTimePicker: DateTimePicker, - private val features: Features + private val dateTimePicker: DateTimePicker ) : ComposeViewModel() { private var baseCurrencyCode by mutableStateOf(getDefaultFIATCurrency().currencyCode) - private var loans by mutableStateOf>(persistentListOf()) private var completedLoans by mutableStateOf>(persistentListOf()) private var pendingLoans by mutableStateOf>(persistentListOf()) private var accounts by mutableStateOf>(persistentListOf()) @@ -90,7 +87,6 @@ class LoanViewModel @Inject constructor( return LoanScreenState( baseCurrency = getBaseCurrencyCode(), - loans = getLoans(), accounts = getAccounts(), selectedAccount = getSelectedAccount(), loanModalData = getLoanModalData(), @@ -98,7 +94,6 @@ class LoanViewModel @Inject constructor( totalOweAmount = getTotalOweAmount(totalOweAmount, defaultCurrencyCode), totalOwedAmount = getTotalOwedAmount(totalOwedAmount, defaultCurrencyCode), paidOffLoanVisibility = getPaidOffLoanVisibility(), - screenMode = getScreenMode(), dateTime = dateTime, selectedTab = getSelectedTab(), completedLoans = getCompletedLoans(), @@ -125,25 +120,12 @@ class LoanViewModel @Inject constructor( return pendingLoans } - @Composable - private fun getScreenMode(): LoanScreenMode { - return when (features.tabularLoanMode.asEnabledState()) { - true -> LoanScreenMode.TabularMode - else -> LoanScreenMode.NonTabularMode - } - } - @Composable private fun getReorderModalVisible() = reorderModalVisible @Composable private fun getLoanModalData() = loanModalData - @Composable - private fun getLoans(): ImmutableList { - return loans - } - @Composable private fun getBaseCurrencyCode(): String { return baseCurrencyCode @@ -258,7 +240,6 @@ class LoanViewModel @Inject constructor( ) }.toImmutableList() } - filterLoans() loadPendingLoans() loadCompletedLoans() @@ -367,14 +348,6 @@ class LoanViewModel @Inject constructor( } } - /** It filters [allLoans] and updates [loans] based on weather to show paid off loans or not */ - private fun filterLoans() { - loans = when (paidOffLoanVisibility) { - true -> allLoans - false -> allLoans.filter { loan -> loan.percentPaid < 1.0 }.toImmutableList() - } - } - private fun loadCompletedLoans() { completedLoans = allLoans.filter { loan -> loan.percentPaid == 1.0 }.toImmutableList() } @@ -437,6 +410,5 @@ class LoanViewModel @Inject constructor( private fun updatePaidOffLoanVisibility() { paidOffLoanVisibility = paidOffLoanVisibility.not() - filterLoans() } } diff --git a/screen/loans/src/main/java/com/ivy/loans/loan/LoansScreen.kt b/screen/loans/src/main/java/com/ivy/loans/loan/LoansScreen.kt index ea6bd7adbd..88ba8221ff 100644 --- a/screen/loans/src/main/java/com/ivy/loans/loan/LoansScreen.kt +++ b/screen/loans/src/main/java/com/ivy/loans/loan/LoansScreen.kt @@ -49,7 +49,6 @@ import com.ivy.ui.R import com.ivy.ui.rememberScrollPositionListState import com.ivy.wallet.ui.theme.Blue import com.ivy.wallet.ui.theme.Gray -import com.ivy.wallet.ui.theme.Red import com.ivy.wallet.ui.theme.components.BalanceRow import com.ivy.wallet.ui.theme.components.CircleButtonFilled import com.ivy.wallet.ui.theme.components.ItemIconSDefaultIcon @@ -89,7 +88,6 @@ private fun BoxWithConstraintsScope.UI( Spacer(Modifier.height(32.dp)) Toolbar( - isTabularModeOn = state.screenMode == LoanScreenMode.TabularMode, onDismiss = { nav.back() }, setReorderModalVisible = { onEventHandler.invoke(LoanScreenEvent.OnReOrderModalShow(show = it)) }, state.totalOweAmount, @@ -106,95 +104,53 @@ private fun BoxWithConstraintsScope.UI( .loanListState?.firstVisibleItemScrollOffset ?: 0 ) - if (state.screenMode == LoanScreenMode.TabularMode) { - val loans = if (state.selectedTab == LoanTab.PENDING) { - state.pendingLoans - } else { - state.completedLoans - } - - LazyColumn(state = scrollState) { - items(loans) { item -> - Spacer(Modifier.height(16.dp)) - - LoanItem( - displayLoan = item - ) { - nav.navigateTo( - screen = LoanDetailsScreen( - loanId = item.loan.id - ) - ) - } - } - } - - if (loans.isEmpty()) { - Spacer(Modifier.weight(1f)) + val loans = if (state.selectedTab == LoanTab.PENDING) { + state.pendingLoans + } else { + state.completedLoans + } - NoLoansEmptyState( - emptyStateTitle = stringResource(R.string.no_loans), - emptyStateText = stringResource(R.string.no_loans_description) - ) + LazyColumn(state = scrollState) { + items(loans) { item -> + Spacer(Modifier.height(16.dp)) - Spacer(Modifier.weight(1f)) - } - } else { - LazyColumn(state = scrollState) { - items(state.loans) { item -> - Spacer(Modifier.height(16.dp)) - - LoanItem( - displayLoan = item - ) { - nav.navigateTo( - screen = LoanDetailsScreen( - loanId = item.loan.id - ) + LoanItem( + displayLoan = item + ) { + nav.navigateTo( + screen = LoanDetailsScreen( + loanId = item.loan.id ) - } + ) } } - if (state.loans.isEmpty()) { - Spacer(Modifier.weight(1f)) + } - NoLoansEmptyState( - emptyStateTitle = stringResource(R.string.no_loans), - emptyStateText = stringResource(R.string.no_loans_description) - ) + if (loans.isEmpty()) { + Spacer(Modifier.weight(1f)) - Spacer(Modifier.weight(1f)) - } + NoLoansEmptyState( + emptyStateTitle = stringResource(R.string.no_loans), + emptyStateText = stringResource(R.string.no_loans_description) + ) + + Spacer(Modifier.weight(1f)) } + Spacer(Modifier.height(150.dp)) // scroll hack } - if (state.screenMode == LoanScreenMode.TabularMode) { - TabularLoanBottomBar( - tab = state.selectedTab, - selectTab = { onEventHandler.invoke(LoanScreenEvent.OnTabChanged(it)) }, - onAdd = { - onEventHandler.invoke(LoanScreenEvent.OnAddLoan) - } - ) - } else { - NonTabularLoanBottomBar( - isPaidOffLoanVisible = state.paidOffLoanVisibility, - onAdd = { - onEventHandler.invoke(LoanScreenEvent.OnAddLoan) - }, - onTogglePaidOffLoanVisibility = { - onEventHandler.invoke(LoanScreenEvent.OnTogglePaidOffLoanVisibility) - }, - onClose = { - nav.back() - }, - ) - } + LoanBottomBar( + tab = state.selectedTab, + selectTab = { onEventHandler.invoke(LoanScreenEvent.OnTabChanged(it)) }, + onAdd = { + onEventHandler.invoke(LoanScreenEvent.OnAddLoan) + } + ) ReorderModalSingleType( visible = state.reorderModalVisible, - initialItems = state.loans, + initialItems = if (state.selectedTab == LoanTab.PENDING) state.pendingLoans else state.completedLoans, dismiss = { onEventHandler.invoke(LoanScreenEvent.OnReOrderModalShow(show = false)) }, @@ -242,7 +198,6 @@ private fun BoxWithConstraintsScope.UI( @Composable private fun Toolbar( - isTabularModeOn: Boolean, onDismiss: () -> Unit, setReorderModalVisible: (Boolean) -> Unit, totalOweAmount: String, @@ -282,14 +237,13 @@ private fun Toolbar( } } - if (isTabularModeOn) { - CircleButtonFilled( - modifier = Modifier, - icon = R.drawable.ic_dismiss, - onClick = onDismiss - ) - Spacer(Modifier.width(8.dp)) - } + CircleButtonFilled( + modifier = Modifier, + icon = R.drawable.ic_dismiss, + onClick = onDismiss + ) + + Spacer(Modifier.width(8.dp)) ReorderButton { setReorderModalVisible(true) @@ -472,25 +426,10 @@ private val testDateTime = LocalDateTime.of(2023, 4, 20, 0, 35) @Preview @Composable -private fun PreviewInTabularMode(theme: Theme = Theme.LIGHT) { +private fun Preview(theme: Theme = Theme.LIGHT) { val state = LoanScreenState( baseCurrency = "BGN", selectedTab = LoanTab.PENDING, - loans = persistentListOf( - DisplayLoan( - loan = Loan( - name = "Loan 1", - icon = "rocket", - color = Red.toArgb(), - amount = 5000.0, - type = LoanType.BORROW, - dateTime = testDateTime - ), - loanTotalAmount = 5500.0, - amountPaid = 0.0, - percentPaid = 0.4 - ) - ), completedLoans = persistentListOf( DisplayLoan( loan = Loan( @@ -528,75 +467,6 @@ private fun PreviewInTabularMode(theme: Theme = Theme.LIGHT) { reorderModalVisible = false, selectedAccount = null, paidOffLoanVisibility = true, - screenMode = LoanScreenMode.TabularMode, - dateTime = Instant.now() - ) - IvyWalletPreview(theme) { - UI( - state = state - ) {} - } -} - -@Preview -@Composable -private fun PreviewInNonTabularMode(theme: Theme = Theme.LIGHT) { - val state = LoanScreenState( - baseCurrency = "BGN", - selectedTab = LoanTab.PENDING, - loans = persistentListOf( - DisplayLoan( - loan = Loan( - name = "Loan 3", - icon = "bank", - color = Blue.toArgb(), - amount = 7000.0, - type = LoanType.LEND, - dateTime = testDateTime - ), - loanTotalAmount = 7000.0, - amountPaid = 8000.0, - percentPaid = 0.8 - ), - ), - completedLoans = persistentListOf( - DisplayLoan( - loan = Loan( - name = "Loan 1", - icon = "rocket", - color = Red.toArgb(), - amount = 5000.0, - type = LoanType.BORROW, - dateTime = testDateTime - ), - loanTotalAmount = 5500.0, - amountPaid = 0.0, - percentPaid = 0.4 - ), - ), - pendingLoans = persistentListOf( - DisplayLoan( - loan = Loan( - name = "Loan 3", - icon = "bank", - color = Blue.toArgb(), - amount = 7000.0, - type = LoanType.LEND, - dateTime = testDateTime - ), - loanTotalAmount = 7000.0, - amountPaid = 8000.0, - percentPaid = 0.8 - ), - ), - accounts = persistentListOf(), - totalOweAmount = "1000.00 INR", - totalOwedAmount = "1500.0 INR", - loanModalData = null, - reorderModalVisible = false, - selectedAccount = null, - paidOffLoanVisibility = true, - screenMode = LoanScreenMode.NonTabularMode, dateTime = Instant.now() ) IvyWalletPreview(theme) { @@ -608,19 +478,10 @@ private fun PreviewInNonTabularMode(theme: Theme = Theme.LIGHT) { /** For screenshot testing */ @Composable -fun LoanScreenTabularModeUiTest(isDark: Boolean) { - val theme = when (isDark) { - true -> Theme.DARK - false -> Theme.LIGHT - } - PreviewInTabularMode(theme) -} - -@Composable -fun LoanScreenNonTabularModeUiTest(isDark: Boolean) { +fun LoanScreenUiTest(isDark: Boolean) { val theme = when (isDark) { true -> Theme.DARK false -> Theme.LIGHT } - PreviewInNonTabularMode(theme) + Preview(theme) } \ No newline at end of file diff --git a/screen/loans/src/main/java/com/ivy/loans/loan/NonTabularLoanBottomBar.kt b/screen/loans/src/main/java/com/ivy/loans/loan/NonTabularLoanBottomBar.kt deleted file mode 100644 index 8958cf673e..0000000000 --- a/screen/loans/src/main/java/com/ivy/loans/loan/NonTabularLoanBottomBar.kt +++ /dev/null @@ -1,73 +0,0 @@ -package com.ivy.loans.loan - -import androidx.compose.foundation.background -import androidx.compose.foundation.layout.BoxWithConstraintsScope -import androidx.compose.foundation.layout.Column -import androidx.compose.foundation.layout.Row -import androidx.compose.foundation.layout.Spacer -import androidx.compose.foundation.layout.fillMaxSize -import androidx.compose.foundation.layout.width -import androidx.compose.runtime.Composable -import androidx.compose.ui.Alignment -import androidx.compose.ui.Modifier -import androidx.compose.ui.res.stringResource -import androidx.compose.ui.tooling.preview.Preview -import androidx.compose.ui.unit.dp -import com.ivy.legacy.IvyWalletPreview -import com.ivy.ui.R -import com.ivy.wallet.ui.theme.Blue -import com.ivy.wallet.ui.theme.components.BackBottomBar -import com.ivy.wallet.ui.theme.components.IvyButton -import com.ivy.wallet.ui.theme.components.IvyCircleButton - -@Composable -internal fun BoxWithConstraintsScope.NonTabularLoanBottomBar( - isPaidOffLoanVisible: Boolean, - onClose: () -> Unit, - onAdd: () -> Unit, - onTogglePaidOffLoanVisibility: () -> Unit -) { - BackBottomBar(onBack = onClose) { - Row(verticalAlignment = Alignment.CenterVertically) { - // TODO: Add icon content description - need to update - IvyCircleButton( - icon = when (isPaidOffLoanVisible) { - true -> R.drawable.ic_visible - else -> R.drawable.ic_hidden - }, - backgroundPadding = 10.dp - ) { - onTogglePaidOffLoanVisibility() - } - - Spacer(Modifier.width(12.dp)) - - IvyButton( - text = stringResource(R.string.add_loan), - iconStart = R.drawable.ic_plus - ) { - onAdd() - } - } - } -} - -@Preview -@Composable -private fun PreviewNonTabularBottomBar() { - IvyWalletPreview { - Column( - Modifier - .fillMaxSize() - .background(Blue) - ) { - } - - NonTabularLoanBottomBar( - isPaidOffLoanVisible = false, - onAdd = {}, - onClose = {}, - onTogglePaidOffLoanVisibility = {} - ) - } -} diff --git a/screen/loans/src/test/java/com/ivy/loans/LoanScreenPaparazziTest.kt b/screen/loans/src/test/java/com/ivy/loans/LoanScreenPaparazziTest.kt index 2c3188fb95..992d2ac9b2 100644 --- a/screen/loans/src/test/java/com/ivy/loans/LoanScreenPaparazziTest.kt +++ b/screen/loans/src/test/java/com/ivy/loans/LoanScreenPaparazziTest.kt @@ -2,8 +2,7 @@ package com.ivy.loans import com.google.testing.junit.testparameterinjector.TestParameter import com.google.testing.junit.testparameterinjector.TestParameterInjector -import com.ivy.loans.loan.LoanScreenNonTabularModeUiTest -import com.ivy.loans.loan.LoanScreenTabularModeUiTest +import com.ivy.loans.loan.LoanScreenUiTest import com.ivy.ui.testing.PaparazziScreenshotTest import com.ivy.ui.testing.PaparazziTheme import org.junit.Test @@ -15,16 +14,9 @@ class LoanScreenPaparazziTest( private val theme: PaparazziTheme, ) : PaparazziScreenshotTest() { @Test - fun `snapshot loanScreen tabular composable`() { + fun `snapshot loanScreen composable`() { snapshot(theme) { - LoanScreenTabularModeUiTest(theme == PaparazziTheme.Dark) - } - } - - @Test - fun `snapshot loanScreen non tabular composable`() { - snapshot(theme) { - LoanScreenNonTabularModeUiTest(theme == PaparazziTheme.Dark) + LoanScreenUiTest(theme == PaparazziTheme.Dark) } } } \ No newline at end of file diff --git a/screen/loans/src/test/snapshots/images/com.ivy.loans_LoanScreenPaparazziTest_snapshot loanScreen composable[Dark].png b/screen/loans/src/test/snapshots/images/com.ivy.loans_LoanScreenPaparazziTest_snapshot loanScreen composable[Dark].png new file mode 100644 index 0000000000..2f4783c9ce Binary files /dev/null and b/screen/loans/src/test/snapshots/images/com.ivy.loans_LoanScreenPaparazziTest_snapshot loanScreen composable[Dark].png differ diff --git a/screen/loans/src/test/snapshots/images/com.ivy.loans_LoanScreenPaparazziTest_snapshot loanScreen composable[Light].png b/screen/loans/src/test/snapshots/images/com.ivy.loans_LoanScreenPaparazziTest_snapshot loanScreen composable[Light].png new file mode 100644 index 0000000000..a6cfd486b4 Binary files /dev/null and b/screen/loans/src/test/snapshots/images/com.ivy.loans_LoanScreenPaparazziTest_snapshot loanScreen composable[Light].png differ diff --git a/shared/domain/src/main/java/com/ivy/domain/features/Features.kt b/shared/domain/src/main/java/com/ivy/domain/features/Features.kt index 144268c025..fedb4c25f7 100644 --- a/shared/domain/src/main/java/com/ivy/domain/features/Features.kt +++ b/shared/domain/src/main/java/com/ivy/domain/features/Features.kt @@ -7,7 +7,6 @@ interface Features { val showTitleSuggestions: BoolFeature val showCategorySearchBar: BoolFeature val hideTotalBalance: BoolFeature - val tabularLoanMode: BoolFeature val allFeatures: List } diff --git a/shared/domain/src/main/java/com/ivy/domain/features/IvyFeatures.kt b/shared/domain/src/main/java/com/ivy/domain/features/IvyFeatures.kt index 37a5584bb1..a946c8a23e 100644 --- a/shared/domain/src/main/java/com/ivy/domain/features/IvyFeatures.kt +++ b/shared/domain/src/main/java/com/ivy/domain/features/IvyFeatures.kt @@ -46,13 +46,6 @@ class IvyFeatures @Inject constructor() : Features { defaultValue = false ) - override val tabularLoanMode = BoolFeature( - key = "tabular_loan_ui", - name = "Tabular Loan UI", - description = "Show Completed and Pending loans in separate tabs", - defaultValue = false - ) - override val allFeatures: List get() = listOf( sortCategoriesAlphabetically, @@ -60,7 +53,6 @@ class IvyFeatures @Inject constructor() : Features { compactCategoriesMode, showTitleSuggestions, showCategorySearchBar, - hideTotalBalance, - tabularLoanMode + hideTotalBalance ) }