Skip to content

Commit

Permalink
feat(feature:account): Migrate account module to CMP
Browse files Browse the repository at this point in the history
  • Loading branch information
HekmatullahAmin committed Feb 12, 2025
1 parent eb0c64b commit 633f78c
Show file tree
Hide file tree
Showing 16 changed files with 406 additions and 334 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -143,8 +143,9 @@ fun MifosOutlinedButton(
* clickable and will appear disabled to accessibility services.
* @param content The button content.
*/
// internal fun MifosTextButton(
@Composable
internal fun MifosTextButton(
fun MifosTextButton(
onClick: () -> Unit,
modifier: Modifier = Modifier,
enabled: Boolean = true,
Expand Down
6 changes: 0 additions & 6 deletions feature/account/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -24,11 +24,5 @@ kotlin {
api(projects.core.model)
api(projects.core.common)
}

androidMain.dependencies {
implementation(projects.libs.pullrefresh)
// Accompanist Pager Library
implementation(libs.accompanist.pager)
}
}
}
30 changes: 0 additions & 30 deletions feature/account/src/commonMain/composeResources/values/colors.xml

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
/*
* Copyright 2025 Mifos Initiative
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
*
* See https://github.com/openMF/mobile-mobile/blob/master/LICENSE.md
*/
package org.mifos.mobile.feature.account

import androidx.compose.ui.graphics.Color

val White = Color(0xFFFFFFFF)
val Black = Color(0xFF000000)
val Background = Color(0xFFEAEAEA)
val DepositGreen = Color(0xFF14C416)
val LightGreen = Color(0xFF8BF98A)
val LightYellow = Color(0xFFF9AC06)
val LightBlue = Color(0xFF87DBF9)
val LightRed = Color(0xFFF9393C)
val LightGrey = Color(0xFFD1D1D1)
val TransactionDetailBg = Color(0x8AD3DA44)
val TransactionDetailTableHeaderBg = Color(0x8ADA6134)
val Blue = Color(0xFF003FFF)
val Red = Color(0xFFFF0000)
val LightBlack = Color(0xFF1C1C1C)
val GrayDark = Color(0xBB666666)
val Purple = Color(0xFFAA66CC)
val RedLight = Color(0xFFFF4444)
val GrayLight = Color(0x33999999)
Original file line number Diff line number Diff line change
Expand Up @@ -10,46 +10,44 @@
package org.mifos.mobile.feature.account.account.screens

import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.pulltorefresh.PullToRefreshBox
import androidx.compose.material3.pulltorefresh.rememberPullToRefreshState
import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.getValue
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.LocalContext
import androidx.lifecycle.compose.collectAsStateWithLifecycle
import com.mifos.library.pullrefresh.PullRefreshIndicator
import com.mifos.library.pullrefresh.pullRefresh
import com.mifos.library.pullrefresh.rememberPullRefreshState
import mifos_mobile.feature.account.generated.resources.Res
import mifos_mobile.feature.account.generated.resources.feature_account_empty_loan_accounts
import mifos_mobile.feature.account.generated.resources.feature_account_empty_savings_accounts
import mifos_mobile.feature.account.generated.resources.feature_account_empty_share_accounts
import mifos_mobile.feature.account.generated.resources.feature_account_error_black
import org.jetbrains.compose.resources.vectorResource
import org.jetbrains.compose.ui.tooling.preview.Preview
import org.jetbrains.compose.ui.tooling.preview.PreviewParameter
import org.jetbrains.compose.ui.tooling.preview.PreviewParameterProvider
import org.koin.compose.viewmodel.koinViewModel
import org.mifos.mobile.core.common.Network
import org.mifos.mobile.core.designsystem.theme.MifosMobileTheme
import org.mifos.mobile.core.model.entity.accounts.loan.LoanAccount
import org.mifos.mobile.core.model.entity.accounts.savings.SavingAccount
import org.mifos.mobile.core.model.entity.accounts.share.ShareAccount
import org.mifos.mobile.core.ui.component.EmptyDataView
import org.mifos.mobile.core.ui.component.MifosErrorComponent
import org.mifos.mobile.core.ui.component.MifosProgressIndicatorOverlay
import org.mifos.mobile.feature.account.R
import org.mifos.mobile.feature.account.utils.AccountState
import org.mifos.mobile.feature.account.viewmodel.AccountsViewModel

@Composable
internal fun AccountsScreen(
isNetworkConnected: Boolean,
accountType: String,
onItemClick: (accountType: String, accountId: Long) -> Unit,
modifier: Modifier = Modifier,
viewModel: AccountsViewModel = koinViewModel(),
) {
val context = LocalContext.current

val uiState by viewModel.accountsUiState.collectAsStateWithLifecycle()
val isRefreshing by viewModel.isRefreshing.collectAsStateWithLifecycle()
val isSearching by viewModel.isSearching.collectAsStateWithLifecycle()
Expand All @@ -62,6 +60,7 @@ internal fun AccountsScreen(
}

AccountsScreen(
isNetworkConnected = isNetworkConnected,
uiState = uiState,
isRefreshing = isRefreshing,
isFiltered = isFiltered,
Expand Down Expand Up @@ -91,29 +90,28 @@ internal fun AccountsScreen(
viewModel.getFilterSavingsAccountList(
accountsList = accountsList,
filterList = filterList,
context = context,
)
},
filterLoanAccountList = { accountsList ->
viewModel.getFilterLoanAccountList(
accountsList = accountsList,
filterList = filterList,
context = context,
)
},
filterShareAccountList = { accountsList ->
viewModel.getFilterShareAccountList(
accountsList = accountsList,
filterList = filterList,
context = context,
)
},
onItemClick = onItemClick,
)
}

@OptIn(ExperimentalMaterial3Api::class)
@Composable
private fun AccountsScreen(
isNetworkConnected: Boolean,
uiState: AccountState,
isRefreshing: Boolean,
isFiltered: Boolean,
Expand All @@ -129,21 +127,21 @@ private fun AccountsScreen(
onItemClick: (accountType: String, accountId: Long) -> Unit,
modifier: Modifier = Modifier,
) {
val context = LocalContext.current
val pullRefreshState = rememberPullRefreshState(
refreshing = isRefreshing,
onRefresh = onRefresh,
)
val pullRefreshState = rememberPullToRefreshState()

Column(
modifier = modifier.fillMaxSize(),
verticalArrangement = Arrangement.Center,
) {
Box(modifier = Modifier.pullRefresh(pullRefreshState)) {
PullToRefreshBox(
isRefreshing = isRefreshing,
onRefresh = onRefresh,
state = pullRefreshState,
) {
when (uiState) {
is AccountState.Error -> {
MifosErrorComponent(
isNetworkConnected = Network.isConnected(context),
isNetworkConnected = isNetworkConnected,
isRetryEnabled = true,
onRetry = onRetry,
)
Expand All @@ -156,8 +154,8 @@ private fun AccountsScreen(
is AccountState.ShowSavingsAccounts -> {
if ((uiState.savingAccounts.isNullOrEmpty())) {
EmptyDataView(
icon = R.drawable.feature_account_error_black,
error = R.string.feature_account_empty_savings_accounts,
icon = vectorResource(resource = Res.drawable.feature_account_error_black),
error = Res.string.feature_account_empty_savings_accounts,
modifier = Modifier.fillMaxSize(),
)
} else {
Expand Down Expand Up @@ -194,8 +192,8 @@ private fun AccountsScreen(
is AccountState.ShowShareAccounts -> {
if ((uiState.shareAccounts.isNullOrEmpty())) {
EmptyDataView(
icon = R.drawable.feature_account_error_black,
error = R.string.feature_account_empty_share_accounts,
icon = vectorResource(Res.drawable.feature_account_error_black),
error = Res.string.feature_account_empty_share_accounts,
modifier = Modifier.fillMaxSize(),
)
} else {
Expand All @@ -209,12 +207,6 @@ private fun AccountsScreen(
}
}
}

PullRefreshIndicator(
refreshing = isRefreshing,
state = pullRefreshState,
modifier = Modifier.align(Alignment.TopCenter),
)
}
}
}
Expand All @@ -238,6 +230,7 @@ private fun AccountSavingsScreenPreview(
) {
MifosMobileTheme {
AccountsScreen(
isNetworkConnected = true,
uiState = accountUiState,
isRefreshing = true,
isFiltered = true,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,14 +27,25 @@ import androidx.compose.runtime.saveable.rememberSaveable
import androidx.compose.runtime.setValue
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.res.colorResource
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.unit.dp
import mifos_mobile.feature.account.generated.resources.Res
import mifos_mobile.feature.account.generated.resources.feature_account_approved
import mifos_mobile.feature.account.generated.resources.feature_account_closed
import mifos_mobile.feature.account.generated.resources.feature_account_disbursement
import mifos_mobile.feature.account.generated.resources.feature_account_submitted
import mifos_mobile.feature.account.generated.resources.feature_account_withdrawn
import org.jetbrains.compose.resources.stringResource
import org.mifos.mobile.core.common.Constants
import org.mifos.mobile.core.common.CurrencyFormatter
import org.mifos.mobile.core.common.DateHelper
import org.mifos.mobile.core.model.entity.accounts.loan.LoanAccount
import org.mifos.mobile.feature.account.R
import org.mifos.mobile.feature.account.Black
import org.mifos.mobile.feature.account.Blue
import org.mifos.mobile.feature.account.DepositGreen
import org.mifos.mobile.feature.account.GrayDark
import org.mifos.mobile.feature.account.LightYellow
import org.mifos.mobile.feature.account.Purple
import org.mifos.mobile.feature.account.Red
import org.mifos.mobile.feature.account.account.utils.AccountTypeItemIndicator

@Composable
Expand Down Expand Up @@ -91,68 +102,68 @@ private fun AccountScreenLoanListItem(
val (color, stringResource, numColor) = when {
loanAccount.status?.active == true && loanAccount.inArrears == true -> {
Triple(
colorResource(R.color.red),
"${stringResource(id = R.string.feature_account_disbursement)} " +
Red,
stringResource(resource = Res.string.feature_account_disbursement) +
loanAccount.timeline?.actualDisbursementDate?.let {
DateHelper.getDateAsString(it)
},
colorResource(R.color.red),
Red,
)
}

loanAccount.status?.active == true -> {
Triple(
colorResource(R.color.deposit_green),
"${stringResource(id = R.string.feature_account_disbursement)} " +
DepositGreen,
stringResource(resource = Res.string.feature_account_disbursement) +
loanAccount.timeline?.actualDisbursementDate?.let {
DateHelper.getDateAsString(it)
},
colorResource(R.color.deposit_green),
DepositGreen,
)
}

loanAccount.status?.waitingForDisbursal == true -> {
Triple(
colorResource(R.color.blue),
"${stringResource(id = R.string.feature_account_approved)} " +
Blue,
stringResource(resource = Res.string.feature_account_approved) +
loanAccount.timeline?.approvedOnDate?.let { DateHelper.getDateAsString(it) },
null,
)
}

loanAccount.status?.pendingApproval == true -> {
Triple(
colorResource(R.color.light_yellow),
"${stringResource(id = R.string.feature_account_submitted)} " +
LightYellow,
stringResource(resource = Res.string.feature_account_submitted) +
loanAccount.timeline?.submittedOnDate?.let { DateHelper.getDateAsString(it) },
null,
)
}

loanAccount.status?.overpaid == true -> {
Triple(
colorResource(R.color.purple),
"${stringResource(id = R.string.feature_account_approved)} " +
Purple,
stringResource(resource = Res.string.feature_account_approved) +
loanAccount.timeline?.actualDisbursementDate?.let {
DateHelper.getDateAsString(it)
},
colorResource(R.color.purple),
Purple,
)
}

loanAccount.status?.closed == true -> {
Triple(
colorResource(R.color.black),
"${stringResource(id = R.string.feature_account_closed)} " +
Black,
stringResource(resource = Res.string.feature_account_closed) +
loanAccount.timeline?.closedOnDate?.let { DateHelper.getDateAsString(it) },
null,
)
}

else -> {
Triple(
colorResource(R.color.gray_dark),
"${stringResource(id = R.string.feature_account_withdrawn)} " +
GrayDark,
stringResource(resource = Res.string.feature_account_withdrawn) +
loanAccount.timeline?.withdrawnOnDate?.let { DateHelper.getDateAsString(it) },
null,
)
Expand All @@ -179,14 +190,14 @@ private fun AccountScreenLoanListItem(
Text(
text = it,
style = MaterialTheme.typography.labelLarge,
color = colorResource(id = R.color.gray_dark),
color = GrayDark,
)
}

Text(
text = stringResource,
style = MaterialTheme.typography.labelLarge,
color = colorResource(id = R.color.gray_dark),
color = GrayDark,
)
}

Expand Down
Loading

0 comments on commit 633f78c

Please sign in to comment.