Skip to content

Commit

Permalink
refactor openMF#2415: savings viewmodels to stateflow
Browse files Browse the repository at this point in the history
  • Loading branch information
PratyushSingh07 committed Oct 22, 2023
1 parent 4be93df commit ea787be
Show file tree
Hide file tree
Showing 15 changed files with 352 additions and 311 deletions.
12 changes: 6 additions & 6 deletions app/src/main/java/org/mifos/mobile/api/DataManager.kt
Original file line number Diff line number Diff line change
Expand Up @@ -92,41 +92,41 @@ class DataManager @Inject constructor(
suspend fun getSavingsWithAssociations(
accountId: Long?,
associationType: String?,
): Response<SavingsWithAssociations?>? {
): SavingsWithAssociations {
return baseApiManager
.savingAccountsListApi.getSavingsWithAssociations(accountId, associationType)
}

suspend fun accountTransferTemplate(): Response<AccountOptionsTemplate?>? =
suspend fun accountTransferTemplate(): AccountOptionsTemplate =
baseApiManager.savingAccountsListApi.accountTransferTemplate()

suspend fun makeTransfer(transferPayload: TransferPayload?): Response<ResponseBody?>? {
return baseApiManager.savingAccountsListApi.makeTransfer(transferPayload)
}

suspend fun getSavingAccountApplicationTemplate(client: Long?): Response<SavingsAccountTemplate?>? {
suspend fun getSavingAccountApplicationTemplate(client: Long?): SavingsAccountTemplate {
return baseApiManager.savingAccountsListApi
.getSavingsAccountApplicationTemplate(client)
}

suspend fun submitSavingAccountApplication(
payload: SavingsAccountApplicationPayload?,
): Response<ResponseBody?>? {
): ResponseBody {
return baseApiManager.savingAccountsListApi.submitSavingAccountApplication(payload)
}

suspend fun updateSavingsAccount(
accountId: Long?,
payload: SavingsAccountUpdatePayload?,
): Response<ResponseBody?>? {
): ResponseBody {
return baseApiManager.savingAccountsListApi
.updateSavingsAccountUpdate(accountId, payload)
}

suspend fun submitWithdrawSavingsAccount(
accountId: String?,
payload: SavingsAccountWithdrawPayload?,
): Response<ResponseBody?>? {
): ResponseBody {
return baseApiManager.savingAccountsListApi
.submitWithdrawSavingsAccount(accountId, payload)
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
package org.mifos.mobile.api.services

import io.reactivex.Observable
import okhttp3.ResponseBody
import org.mifos.mobile.api.ApiEndPoints
import org.mifos.mobile.models.accounts.savings.SavingsAccountApplicationPayload
Expand All @@ -22,33 +21,33 @@ interface SavingAccountsListService {
suspend fun getSavingsWithAssociations(
@Path("accountId") accountId: Long?,
@Query("associations") associationType: String?,
): Response<SavingsWithAssociations?>?
): SavingsWithAssociations

@GET(ApiEndPoints.ACCOUNT_TRANSFER + "/template")
suspend fun accountTransferTemplate(): Response<AccountOptionsTemplate?>?
suspend fun accountTransferTemplate(): AccountOptionsTemplate

@POST(ApiEndPoints.ACCOUNT_TRANSFER)
suspend fun makeTransfer(@Body transferPayload: TransferPayload?): Response<ResponseBody?>?

@GET(ApiEndPoints.SAVINGS_ACCOUNTS + "/template")
suspend fun getSavingsAccountApplicationTemplate(
@Query("clientId") clientId: Long?,
): Response<SavingsAccountTemplate?>?
): SavingsAccountTemplate

@POST(ApiEndPoints.SAVINGS_ACCOUNTS)
suspend fun submitSavingAccountApplication(
@Body payload: SavingsAccountApplicationPayload?,
): Response<ResponseBody?>?
): ResponseBody

@PUT(ApiEndPoints.SAVINGS_ACCOUNTS + "/{accountsId}")
suspend fun updateSavingsAccountUpdate(
@Path("accountsId") accountsId: Long?,
@Body payload: SavingsAccountUpdatePayload?,
): Response<ResponseBody?>?
): ResponseBody

@POST(ApiEndPoints.SAVINGS_ACCOUNTS + "/{savingsId}?command=withdrawnByApplicant")
suspend fun submitWithdrawSavingsAccount(
@Path("savingsId") savingsId: String?,
@Body payload: SavingsAccountWithdrawPayload?,
): Response<ResponseBody?>?
): ResponseBody
}
Original file line number Diff line number Diff line change
@@ -1,34 +1,34 @@
package org.mifos.mobile.repositories

import kotlinx.coroutines.flow.Flow
import okhttp3.ResponseBody
import org.mifos.mobile.models.accounts.savings.SavingsAccountApplicationPayload
import org.mifos.mobile.models.accounts.savings.SavingsAccountUpdatePayload
import org.mifos.mobile.models.accounts.savings.SavingsAccountWithdrawPayload
import org.mifos.mobile.models.accounts.savings.SavingsWithAssociations
import org.mifos.mobile.models.templates.account.AccountOptionsTemplate
import org.mifos.mobile.models.templates.savings.SavingsAccountTemplate
import retrofit2.Response

interface SavingsAccountRepository {

suspend fun getSavingsWithAssociations(
accountId: Long?,
associationType: String?,
): Response<SavingsWithAssociations?>?
): Flow<SavingsWithAssociations>

suspend fun getSavingAccountApplicationTemplate(clientId: Long?): Response<SavingsAccountTemplate?>?
suspend fun getSavingAccountApplicationTemplate(clientId: Long?): Flow<SavingsAccountTemplate>

suspend fun submitSavingAccountApplication(payload: SavingsAccountApplicationPayload?): Response<ResponseBody?>?
suspend fun submitSavingAccountApplication(payload: SavingsAccountApplicationPayload?): Flow<ResponseBody>

suspend fun updateSavingsAccount(
accountId: Long?,
payload: SavingsAccountUpdatePayload?
): Response<ResponseBody?>?
): Flow<ResponseBody>

suspend fun submitWithdrawSavingsAccount(
accountId: String?,
payload: SavingsAccountWithdrawPayload?
): Response<ResponseBody?>?
): Flow<ResponseBody>

suspend fun loanAccountTransferTemplate(): Response<AccountOptionsTemplate?>?
suspend fun loanAccountTransferTemplate(): Flow<AccountOptionsTemplate>
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
package org.mifos.mobile.repositories

import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.flow
import okhttp3.ResponseBody
import org.mifos.mobile.api.DataManager
import org.mifos.mobile.models.accounts.savings.SavingsAccountApplicationPayload
Expand All @@ -8,7 +10,6 @@ import org.mifos.mobile.models.accounts.savings.SavingsAccountWithdrawPayload
import org.mifos.mobile.models.accounts.savings.SavingsWithAssociations
import org.mifos.mobile.models.templates.account.AccountOptionsTemplate
import org.mifos.mobile.models.templates.savings.SavingsAccountTemplate
import retrofit2.Response
import javax.inject.Inject

class SavingsAccountRepositoryImp @Inject constructor(private val dataManager: DataManager) :
Expand All @@ -17,33 +18,45 @@ class SavingsAccountRepositoryImp @Inject constructor(private val dataManager: D
override suspend fun getSavingsWithAssociations(
accountId: Long?,
associationType: String?
): Response<SavingsWithAssociations?>? {
return dataManager.getSavingsWithAssociations(accountId, associationType)
): Flow<SavingsWithAssociations> {
return flow {
emit(dataManager.getSavingsWithAssociations(accountId, associationType))
}
}

override suspend fun getSavingAccountApplicationTemplate(clientId: Long?): Response<SavingsAccountTemplate?>? {
return dataManager.getSavingAccountApplicationTemplate(clientId)
override suspend fun getSavingAccountApplicationTemplate(clientId: Long?): Flow<SavingsAccountTemplate> {
return flow {
emit(dataManager.getSavingAccountApplicationTemplate(clientId))
}
}

override suspend fun submitSavingAccountApplication(payload: SavingsAccountApplicationPayload?): Response<ResponseBody?>? {
return dataManager.submitSavingAccountApplication(payload)
override suspend fun submitSavingAccountApplication(payload: SavingsAccountApplicationPayload?): Flow<ResponseBody> {
return flow {
emit(dataManager.submitSavingAccountApplication(payload))
}
}

override suspend fun updateSavingsAccount(
accountId: Long?,
payload: SavingsAccountUpdatePayload?
): Response<ResponseBody?>? {
return dataManager.updateSavingsAccount(accountId, payload)
): Flow<ResponseBody> {
return flow {
emit(dataManager.updateSavingsAccount(accountId, payload))
}
}

override suspend fun submitWithdrawSavingsAccount(
accountId: String?,
payload: SavingsAccountWithdrawPayload?
): Response<ResponseBody?>? {
return dataManager.submitWithdrawSavingsAccount(accountId, payload)
): Flow<ResponseBody> {
return flow {
emit(dataManager.submitWithdrawSavingsAccount(accountId, payload))
}
}

override suspend fun loanAccountTransferTemplate(): Response<AccountOptionsTemplate?>? {
return dataManager.accountTransferTemplate()
override suspend fun loanAccountTransferTemplate(): Flow<AccountOptionsTemplate> {
return flow {
emit(dataManager.accountTransferTemplate())
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -11,9 +11,13 @@ import android.view.MenuItem
import android.view.View
import android.view.ViewGroup
import android.widget.Toast
import androidx.lifecycle.ViewModelProvider
import androidx.fragment.app.viewModels
import androidx.lifecycle.Lifecycle
import androidx.lifecycle.lifecycleScope
import androidx.lifecycle.repeatOnLifecycle
import com.github.therajanmaurya.sweeterror.SweetUIErrorHandler
import dagger.hilt.android.AndroidEntryPoint
import kotlinx.coroutines.launch
import org.mifos.mobile.R
import org.mifos.mobile.api.local.PreferencesHelper
import org.mifos.mobile.databinding.FragmentSavingAccountDetailsBinding
Expand All @@ -34,7 +38,6 @@ import org.mifos.mobile.utils.SymbolsUtils
import org.mifos.mobile.utils.Toaster
import org.mifos.mobile.utils.Utils
import org.mifos.mobile.viewModels.SavingAccountsDetailViewModel
import java.lang.IllegalStateException
import javax.inject.Inject

/**
Expand All @@ -50,7 +53,7 @@ class SavingAccountsDetailFragment : BaseFragment() {
@JvmField
@Inject
var preferencesHelper: PreferencesHelper? = null
private lateinit var viewModel: SavingAccountsDetailViewModel
private val viewModel: SavingAccountsDetailViewModel by viewModels()
private var savingsId: Long? = 0
private var status: Status? = null
private var savingsWithAssociations: SavingsWithAssociations? = null
Expand All @@ -70,7 +73,6 @@ class SavingAccountsDetailFragment : BaseFragment() {
): View {
_binding = FragmentSavingAccountDetailsBinding.inflate(inflater, container, false)
setToolbarTitle(getString(R.string.saving_account_details))
viewModel = ViewModelProvider(this)[SavingAccountsDetailViewModel::class.java]
sweetUIErrorHandler = SweetUIErrorHandler(context, binding.root)
if (savedInstanceState == null && this.savingsWithAssociations == null) {
viewModel.loadSavingsWithAssociations(savingsId)
Expand All @@ -83,52 +85,63 @@ class SavingAccountsDetailFragment : BaseFragment() {

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
binding.tvHelpLineNumber.setOnClickListener {
dialHelpLineNumber()
}

binding.tvDeposit.setOnClickListener {
deposit()
}
with(binding) {
tvHelpLineNumber.setOnClickListener {
dialHelpLineNumber()
}

binding.tvMakeATransfer.setOnClickListener {
transfer()
}
binding.layoutError.btnTryAgain.setOnClickListener {
onRetry()
}
tvDeposit.setOnClickListener {
deposit()
}

binding.llSavingsTransactions.setOnClickListener {
transactionsClicked()
}
tvMakeATransfer.setOnClickListener {
transfer()
}

binding.llSavingsCharges.setOnClickListener {
chargeClicked()
}
layoutError.btnTryAgain.setOnClickListener {
onRetry()
}

binding.llSavingsQrCode.setOnClickListener {
qrCodeClicked()
llSavingsTransactions.setOnClickListener {
transactionsClicked()
}

llSavingsCharges.setOnClickListener {
chargeClicked()
}

llSavingsQrCode.setOnClickListener {
qrCodeClicked()
}
}

viewModel.savingAccountsDetailUiState.observe(viewLifecycleOwner) { state ->
when (state) {
SavingsAccountUiState.Loading -> showProgress()
viewLifecycleOwner.lifecycleScope.launch {
repeatOnLifecycle(Lifecycle.State.STARTED) {
viewModel.savingAccountsDetailUiState.collect { state ->
when (state) {
SavingsAccountUiState.Loading -> showProgress()

SavingsAccountUiState.Error -> {
hideProgress()
showErrorFetchingSavingAccountsDetail(
context?.getString(R.string.error_saving_account_details_loading),
)
}
SavingsAccountUiState.Error -> {
hideProgress()
showErrorFetchingSavingAccountsDetail(
context?.getString(R.string.error_saving_account_details_loading),
)
}

is SavingsAccountUiState.SuccessLoadingSavingsWithAssociations -> {
hideProgress()
showSavingAccountsDetail(state.savingAccount)
}
is SavingsAccountUiState.SuccessLoadingSavingsWithAssociations -> {
hideProgress()
showSavingAccountsDetail(state.savingAccount)
}

is SavingsAccountUiState.Initial -> {}

else -> throw IllegalStateException("Unexpected State: $state")
else -> throw IllegalStateException("Unexpected State: $state")
}
}
}
}

}

override fun onSaveInstanceState(outState: Bundle) {
Expand Down
Loading

0 comments on commit ea787be

Please sign in to comment.